diff --git a/.easignore b/.easignore index 0d4e09f..cb0100d 100644 --- a/.easignore +++ b/.easignore @@ -1,8 +1,8 @@ -.agents/ -.claude/ -node_modules/ -server/ -greenlns-landing/ -landing/ -*.sqlite -*.sqlite-* +.agents/ +.claude/ +node_modules/ +server/ +greenlns-landing/ +landing/ +*.sqlite +*.sqlite-* diff --git a/.edge-profile-render-1774474489727/Crashpad/metadata b/.edge-profile-render-1774474489727/Crashpad/metadata new file mode 100644 index 0000000..b4950e0 Binary files /dev/null and b/.edge-profile-render-1774474489727/Crashpad/metadata differ diff --git a/.edge-profile-render-1774474489727/Crashpad/reports/033089e1-bbf0-4b53-855a-7def4d4d3c35.dmp b/.edge-profile-render-1774474489727/Crashpad/reports/033089e1-bbf0-4b53-855a-7def4d4d3c35.dmp new file mode 100644 index 0000000..7b50284 Binary files /dev/null and b/.edge-profile-render-1774474489727/Crashpad/reports/033089e1-bbf0-4b53-855a-7def4d4d3c35.dmp differ diff --git a/.edge-profile-render-1774474489727/Crashpad/settings.dat b/.edge-profile-render-1774474489727/Crashpad/settings.dat new file mode 100644 index 0000000..2fa9123 Binary files /dev/null and b/.edge-profile-render-1774474489727/Crashpad/settings.dat differ diff --git a/.edge-profile-render-1774474489727/Crashpad/throttle_store.dat b/.edge-profile-render-1774474489727/Crashpad/throttle_store.dat new file mode 100644 index 0000000..9639e1b --- /dev/null +++ b/.edge-profile-render-1774474489727/Crashpad/throttle_store.dat @@ -0,0 +1 @@ +level=none expiry=0 diff --git a/.edge-profile-render-1774474489727/Local State b/.edge-profile-render-1774474489727/Local State new file mode 100644 index 0000000..1c379f3 --- /dev/null +++ b/.edge-profile-render-1774474489727/Local State @@ -0,0 +1 @@ +{"edge":{"perf_center":{"efficiency_mode_v2_is_active":false,"performance_mode":3,"performance_mode_is_on":false},"retrigger_features":[]},"legacy":{"profile":{"name":{"migrated":true}}},"metrics":{"client_id_hash_key_created":true},"os_crypt":{"audit_enabled":true,"encrypted_key":"RFBBUEkBAAAA0Iyd3wEV0RGMegDAT8KX6wEAAAAn89AMc7fOSbvGLGpOq+9IEAAAAB4AAABNAGkAYwByAG8AcwBvAGYAdAAgAEUAZABnAGUAAAAQZgAAAAEAACAAAABlYmAIg/tScz25WdWFM7e7VAS1NCiKulg5JijLwX3GOQAAAAAOgAAAAAIAACAAAABfnlWw7kVTJaAZ0MmyjQBeJ4H78Xz0yWh9vXafST4K4TAAAADMf+ChMUJI6LC5sXYYzjki7H+BdUYUxcXQkzA/uFOHGXok2Atx3jH/SiYv94rDZ+dAAAAA5j9mAmQCqVkZzHanRdVsKOrEeDFmWaMcIBHLltg85UH/q0cWvl66hQ6WVmEM9/s54lfP10SzQYINFkuvWcNVIg=="},"profile":{"info_cache":{},"profile_counts_reported":"13418948091498631","profiles_order":[]},"signin":{"active_accounts_last_emitted":"13418948091491913"},"startup_boost":{"last_browser_open_time":"13418948091624822"},"telemetry_client":{"governance":{"last_dma_change_date":"13418948091647922","last_known_cps":2048},"install_source_name":"windows","os_integration_level":5,"updater_version":"1.3.225.7","windows_update_applied":false},"uninstall_metrics":{"installation_date2":"1774474490"},"user_experience_metrics":{"client_id2":"88e8abb6-17d9-4acc-9c80-a27326b0fddd","diagnostics":{"last_data_collection_level_on_launch":1},"last_seen":{"CrashpadMetrics":"0"},"limited_entropy_randomization_source":"BDB14B06184397D44C5325D770286ABA","low_entropy_source3":2161,"pseudo_low_entropy_source":6602,"stability":{"browser_last_live_timestamp":"13418948090554606","stats_buildtime":"1773965981","stats_version":"146.0.3856.72-64","system_crash_count":0}}} \ No newline at end of file diff --git a/.edge-profile-render-1774474489727/Variations b/.edge-profile-render-1774474489727/Variations new file mode 100644 index 0000000..a157215 --- /dev/null +++ b/.edge-profile-render-1774474489727/Variations @@ -0,0 +1 @@ +{"user_experience_metrics.stability.exited_cleanly":false,"variations_crash_streak":0} \ No newline at end of file diff --git a/.edge-profile-render-1774474676521/Crashpad/metadata b/.edge-profile-render-1774474676521/Crashpad/metadata new file mode 100644 index 0000000..efe3aea Binary files /dev/null and b/.edge-profile-render-1774474676521/Crashpad/metadata differ diff --git a/.edge-profile-render-1774474676521/Crashpad/reports/6d6c7e25-fc91-4616-bdd1-1079f575c0bb.dmp b/.edge-profile-render-1774474676521/Crashpad/reports/6d6c7e25-fc91-4616-bdd1-1079f575c0bb.dmp new file mode 100644 index 0000000..62d9529 Binary files /dev/null and b/.edge-profile-render-1774474676521/Crashpad/reports/6d6c7e25-fc91-4616-bdd1-1079f575c0bb.dmp differ diff --git a/.edge-profile-render-1774474676521/Crashpad/settings.dat b/.edge-profile-render-1774474676521/Crashpad/settings.dat new file mode 100644 index 0000000..9170895 Binary files /dev/null and b/.edge-profile-render-1774474676521/Crashpad/settings.dat differ diff --git a/.edge-profile-render-1774474676521/Crashpad/throttle_store.dat b/.edge-profile-render-1774474676521/Crashpad/throttle_store.dat new file mode 100644 index 0000000..9639e1b --- /dev/null +++ b/.edge-profile-render-1774474676521/Crashpad/throttle_store.dat @@ -0,0 +1 @@ +level=none expiry=0 diff --git a/.edge-profile-render-1774474676521/Default/ClientCertificates/LOCK b/.edge-profile-render-1774474676521/Default/ClientCertificates/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474676521/Default/ClientCertificates/LOG b/.edge-profile-render-1774474676521/Default/ClientCertificates/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474676521/Default/Code Cache/js/index b/.edge-profile-render-1774474676521/Default/Code Cache/js/index new file mode 100644 index 0000000..79bd403 Binary files /dev/null and b/.edge-profile-render-1774474676521/Default/Code Cache/js/index differ diff --git a/.edge-profile-render-1774474676521/Default/Code Cache/js/index-dir/the-real-index b/.edge-profile-render-1774474676521/Default/Code Cache/js/index-dir/the-real-index new file mode 100644 index 0000000..679202a Binary files /dev/null and b/.edge-profile-render-1774474676521/Default/Code Cache/js/index-dir/the-real-index differ diff --git a/.edge-profile-render-1774474676521/Default/Code Cache/wasm/index b/.edge-profile-render-1774474676521/Default/Code Cache/wasm/index new file mode 100644 index 0000000..79bd403 Binary files /dev/null and b/.edge-profile-render-1774474676521/Default/Code Cache/wasm/index differ diff --git a/.edge-profile-render-1774474676521/Default/Code Cache/wasm/index-dir/the-real-index b/.edge-profile-render-1774474676521/Default/Code Cache/wasm/index-dir/the-real-index new file mode 100644 index 0000000..2fbf535 Binary files /dev/null and b/.edge-profile-render-1774474676521/Default/Code Cache/wasm/index-dir/the-real-index differ diff --git a/.edge-profile-render-1774474676521/Default/DawnGraphiteCache/data_0 b/.edge-profile-render-1774474676521/Default/DawnGraphiteCache/data_0 new file mode 100644 index 0000000..d76fb77 Binary files /dev/null and b/.edge-profile-render-1774474676521/Default/DawnGraphiteCache/data_0 differ diff --git a/.edge-profile-render-1774474676521/Default/DawnGraphiteCache/data_1 b/.edge-profile-render-1774474676521/Default/DawnGraphiteCache/data_1 new file mode 100644 index 0000000..035d06d Binary files /dev/null and b/.edge-profile-render-1774474676521/Default/DawnGraphiteCache/data_1 differ diff --git a/.edge-profile-render-1774474676521/Default/DawnGraphiteCache/data_2 b/.edge-profile-render-1774474676521/Default/DawnGraphiteCache/data_2 new file mode 100644 index 0000000..c7e2eb9 Binary files /dev/null and b/.edge-profile-render-1774474676521/Default/DawnGraphiteCache/data_2 differ diff --git a/.edge-profile-render-1774474676521/Default/DawnGraphiteCache/data_3 b/.edge-profile-render-1774474676521/Default/DawnGraphiteCache/data_3 new file mode 100644 index 0000000..5eec973 Binary files /dev/null and b/.edge-profile-render-1774474676521/Default/DawnGraphiteCache/data_3 differ diff --git a/.edge-profile-render-1774474676521/Default/DawnGraphiteCache/index b/.edge-profile-render-1774474676521/Default/DawnGraphiteCache/index new file mode 100644 index 0000000..3e007f4 Binary files /dev/null and b/.edge-profile-render-1774474676521/Default/DawnGraphiteCache/index differ diff --git a/.edge-profile-render-1774474676521/Default/DawnWebGPUCache/data_0 b/.edge-profile-render-1774474676521/Default/DawnWebGPUCache/data_0 new file mode 100644 index 0000000..d76fb77 Binary files /dev/null and b/.edge-profile-render-1774474676521/Default/DawnWebGPUCache/data_0 differ diff --git a/.edge-profile-render-1774474676521/Default/DawnWebGPUCache/data_1 b/.edge-profile-render-1774474676521/Default/DawnWebGPUCache/data_1 new file mode 100644 index 0000000..035d06d Binary files /dev/null and b/.edge-profile-render-1774474676521/Default/DawnWebGPUCache/data_1 differ diff --git a/.edge-profile-render-1774474676521/Default/DawnWebGPUCache/data_2 b/.edge-profile-render-1774474676521/Default/DawnWebGPUCache/data_2 new file mode 100644 index 0000000..c7e2eb9 Binary files /dev/null and b/.edge-profile-render-1774474676521/Default/DawnWebGPUCache/data_2 differ diff --git a/.edge-profile-render-1774474676521/Default/DawnWebGPUCache/data_3 b/.edge-profile-render-1774474676521/Default/DawnWebGPUCache/data_3 new file mode 100644 index 0000000..5eec973 Binary files /dev/null and b/.edge-profile-render-1774474676521/Default/DawnWebGPUCache/data_3 differ diff --git a/.edge-profile-render-1774474676521/Default/DawnWebGPUCache/index b/.edge-profile-render-1774474676521/Default/DawnWebGPUCache/index new file mode 100644 index 0000000..ea72dfe Binary files /dev/null and b/.edge-profile-render-1774474676521/Default/DawnWebGPUCache/index differ diff --git a/.edge-profile-render-1774474676521/Default/EdgePushStorageWithConnectTokenAndKey/LOCK b/.edge-profile-render-1774474676521/Default/EdgePushStorageWithConnectTokenAndKey/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474676521/Default/EdgePushStorageWithConnectTokenAndKey/LOG b/.edge-profile-render-1774474676521/Default/EdgePushStorageWithConnectTokenAndKey/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474676521/Default/EdgePushStorageWithConnectTokenAndKey/LOG.old b/.edge-profile-render-1774474676521/Default/EdgePushStorageWithConnectTokenAndKey/LOG.old new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474676521/Default/Extension Rules/CURRENT b/.edge-profile-render-1774474676521/Default/Extension Rules/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile-render-1774474676521/Default/Extension Rules/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile-render-1774474676521/Default/Extension Rules/LOCK b/.edge-profile-render-1774474676521/Default/Extension Rules/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474676521/Default/Extension Rules/LOG b/.edge-profile-render-1774474676521/Default/Extension Rules/LOG new file mode 100644 index 0000000..24d253d --- /dev/null +++ b/.edge-profile-render-1774474676521/Default/Extension Rules/LOG @@ -0,0 +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 diff --git a/.edge-profile-render-1774474676521/Default/Extension Rules/MANIFEST-000001 b/.edge-profile-render-1774474676521/Default/Extension Rules/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile-render-1774474676521/Default/Extension Rules/MANIFEST-000001 differ diff --git a/.edge-profile-render-1774474676521/Default/Extension Scripts/CURRENT b/.edge-profile-render-1774474676521/Default/Extension Scripts/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile-render-1774474676521/Default/Extension Scripts/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile-render-1774474676521/Default/Extension Scripts/LOCK b/.edge-profile-render-1774474676521/Default/Extension Scripts/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474676521/Default/Extension Scripts/LOG b/.edge-profile-render-1774474676521/Default/Extension Scripts/LOG new file mode 100644 index 0000000..ee28b5b --- /dev/null +++ b/.edge-profile-render-1774474676521/Default/Extension Scripts/LOG @@ -0,0 +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 diff --git a/.edge-profile-render-1774474676521/Default/Extension Scripts/MANIFEST-000001 b/.edge-profile-render-1774474676521/Default/Extension Scripts/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile-render-1774474676521/Default/Extension Scripts/MANIFEST-000001 differ diff --git a/.edge-profile-render-1774474676521/Default/Extension State/CURRENT b/.edge-profile-render-1774474676521/Default/Extension State/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile-render-1774474676521/Default/Extension State/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile-render-1774474676521/Default/Extension State/LOCK b/.edge-profile-render-1774474676521/Default/Extension State/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474676521/Default/Extension State/LOG b/.edge-profile-render-1774474676521/Default/Extension State/LOG new file mode 100644 index 0000000..ff5af17 --- /dev/null +++ b/.edge-profile-render-1774474676521/Default/Extension State/LOG @@ -0,0 +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 diff --git a/.edge-profile-render-1774474676521/Default/Extension State/MANIFEST-000001 b/.edge-profile-render-1774474676521/Default/Extension State/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile-render-1774474676521/Default/Extension State/MANIFEST-000001 differ diff --git a/.edge-profile-render-1774474676521/Default/Favicons b/.edge-profile-render-1774474676521/Default/Favicons new file mode 100644 index 0000000..e589db8 Binary files /dev/null and b/.edge-profile-render-1774474676521/Default/Favicons differ diff --git a/.edge-profile-render-1774474676521/Default/Favicons-journal b/.edge-profile-render-1774474676521/Default/Favicons-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474676521/Default/GPUCache/data_0 b/.edge-profile-render-1774474676521/Default/GPUCache/data_0 new file mode 100644 index 0000000..d76fb77 Binary files /dev/null and b/.edge-profile-render-1774474676521/Default/GPUCache/data_0 differ diff --git a/.edge-profile-render-1774474676521/Default/GPUCache/data_1 b/.edge-profile-render-1774474676521/Default/GPUCache/data_1 new file mode 100644 index 0000000..035d06d Binary files /dev/null and b/.edge-profile-render-1774474676521/Default/GPUCache/data_1 differ diff --git a/.edge-profile-render-1774474676521/Default/GPUCache/data_2 b/.edge-profile-render-1774474676521/Default/GPUCache/data_2 new file mode 100644 index 0000000..c7e2eb9 Binary files /dev/null and b/.edge-profile-render-1774474676521/Default/GPUCache/data_2 differ diff --git a/.edge-profile-render-1774474676521/Default/GPUCache/data_3 b/.edge-profile-render-1774474676521/Default/GPUCache/data_3 new file mode 100644 index 0000000..5eec973 Binary files /dev/null and b/.edge-profile-render-1774474676521/Default/GPUCache/data_3 differ diff --git a/.edge-profile-render-1774474676521/Default/GPUCache/index b/.edge-profile-render-1774474676521/Default/GPUCache/index new file mode 100644 index 0000000..e1c9011 Binary files /dev/null and b/.edge-profile-render-1774474676521/Default/GPUCache/index differ diff --git a/.edge-profile-render-1774474676521/Default/History b/.edge-profile-render-1774474676521/Default/History new file mode 100644 index 0000000..c02d277 Binary files /dev/null and b/.edge-profile-render-1774474676521/Default/History differ diff --git a/.edge-profile-render-1774474676521/Default/History-journal b/.edge-profile-render-1774474676521/Default/History-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474676521/Default/HubApps Icons b/.edge-profile-render-1774474676521/Default/HubApps Icons new file mode 100644 index 0000000..a838bbc Binary files /dev/null and b/.edge-profile-render-1774474676521/Default/HubApps Icons differ diff --git a/.edge-profile-render-1774474676521/Default/HubApps Icons-journal b/.edge-profile-render-1774474676521/Default/HubApps Icons-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474676521/Default/LOCK b/.edge-profile-render-1774474676521/Default/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474676521/Default/LOG b/.edge-profile-render-1774474676521/Default/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474676521/Default/Login Data b/.edge-profile-render-1774474676521/Default/Login Data new file mode 100644 index 0000000..0af13bc Binary files /dev/null and b/.edge-profile-render-1774474676521/Default/Login Data differ diff --git a/.edge-profile-render-1774474676521/Default/Login Data For Account b/.edge-profile-render-1774474676521/Default/Login Data For Account new file mode 100644 index 0000000..0af13bc Binary files /dev/null and b/.edge-profile-render-1774474676521/Default/Login Data For Account differ diff --git a/.edge-profile-render-1774474676521/Default/Login Data For Account-journal b/.edge-profile-render-1774474676521/Default/Login Data For Account-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474676521/Default/Login Data-journal b/.edge-profile-render-1774474676521/Default/Login Data-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474676521/Default/Nurturing/campaign_history b/.edge-profile-render-1774474676521/Default/Nurturing/campaign_history new file mode 100644 index 0000000..eab8517 Binary files /dev/null and b/.edge-profile-render-1774474676521/Default/Nurturing/campaign_history differ diff --git a/.edge-profile-render-1774474676521/Default/Nurturing/campaign_history-journal b/.edge-profile-render-1774474676521/Default/Nurturing/campaign_history-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474676521/Default/PersistentOriginTrials/LOCK b/.edge-profile-render-1774474676521/Default/PersistentOriginTrials/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474676521/Default/PersistentOriginTrials/LOG b/.edge-profile-render-1774474676521/Default/PersistentOriginTrials/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474676521/Default/README b/.edge-profile-render-1774474676521/Default/README new file mode 100644 index 0000000..4a34402 --- /dev/null +++ b/.edge-profile-render-1774474676521/Default/README @@ -0,0 +1 @@ +Microsoft Edge settings and storage represent user-selected preferences and information and MUST not be extracted, overwritten or modified except through Microsoft Edge defined APIs. \ No newline at end of file diff --git a/.edge-profile-render-1774474676521/Default/ServerCertificate b/.edge-profile-render-1774474676521/Default/ServerCertificate new file mode 100644 index 0000000..9587f64 Binary files /dev/null and b/.edge-profile-render-1774474676521/Default/ServerCertificate differ diff --git a/.edge-profile-render-1774474676521/Default/ServerCertificate-journal b/.edge-profile-render-1774474676521/Default/ServerCertificate-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474676521/Default/SharedStorage b/.edge-profile-render-1774474676521/Default/SharedStorage new file mode 100644 index 0000000..4410bda Binary files /dev/null and b/.edge-profile-render-1774474676521/Default/SharedStorage differ diff --git a/.edge-profile-render-1774474676521/Default/SharedStorage-wal b/.edge-profile-render-1774474676521/Default/SharedStorage-wal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474676521/Default/Site Characteristics Database/CURRENT b/.edge-profile-render-1774474676521/Default/Site Characteristics Database/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile-render-1774474676521/Default/Site Characteristics Database/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile-render-1774474676521/Default/Site Characteristics Database/LOCK b/.edge-profile-render-1774474676521/Default/Site Characteristics Database/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474676521/Default/Site Characteristics Database/LOG b/.edge-profile-render-1774474676521/Default/Site Characteristics Database/LOG new file mode 100644 index 0000000..88bb037 --- /dev/null +++ b/.edge-profile-render-1774474676521/Default/Site Characteristics Database/LOG @@ -0,0 +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 diff --git a/.edge-profile-render-1774474676521/Default/Site Characteristics Database/MANIFEST-000001 b/.edge-profile-render-1774474676521/Default/Site Characteristics Database/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile-render-1774474676521/Default/Site Characteristics Database/MANIFEST-000001 differ diff --git a/.edge-profile-render-1774474676521/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/js/index b/.edge-profile-render-1774474676521/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/js/index new file mode 100644 index 0000000..79bd403 Binary files /dev/null and b/.edge-profile-render-1774474676521/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/js/index differ diff --git a/.edge-profile-render-1774474676521/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/js/index-dir/the-real-index b/.edge-profile-render-1774474676521/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/js/index-dir/the-real-index new file mode 100644 index 0000000..9b568d7 Binary files /dev/null and b/.edge-profile-render-1774474676521/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/js/index-dir/the-real-index differ diff --git a/.edge-profile-render-1774474676521/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/wasm/index b/.edge-profile-render-1774474676521/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/wasm/index new file mode 100644 index 0000000..79bd403 Binary files /dev/null and b/.edge-profile-render-1774474676521/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/wasm/index differ diff --git a/.edge-profile-render-1774474676521/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/wasm/index-dir/the-real-index b/.edge-profile-render-1774474676521/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/wasm/index-dir/the-real-index new file mode 100644 index 0000000..ba27f2c Binary files /dev/null and b/.edge-profile-render-1774474676521/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/wasm/index-dir/the-real-index differ diff --git a/.edge-profile-render-1774474676521/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_0 b/.edge-profile-render-1774474676521/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_0 new file mode 100644 index 0000000..d76fb77 Binary files /dev/null and b/.edge-profile-render-1774474676521/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_0 differ diff --git a/.edge-profile-render-1774474676521/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_1 b/.edge-profile-render-1774474676521/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_1 new file mode 100644 index 0000000..035d06d Binary files /dev/null and b/.edge-profile-render-1774474676521/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_1 differ diff --git a/.edge-profile-render-1774474676521/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_2 b/.edge-profile-render-1774474676521/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_2 new file mode 100644 index 0000000..c7e2eb9 Binary files /dev/null and b/.edge-profile-render-1774474676521/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_2 differ diff --git a/.edge-profile-render-1774474676521/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_3 b/.edge-profile-render-1774474676521/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_3 new file mode 100644 index 0000000..5eec973 Binary files /dev/null and b/.edge-profile-render-1774474676521/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_3 differ diff --git a/.edge-profile-render-1774474676521/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/index b/.edge-profile-render-1774474676521/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/index new file mode 100644 index 0000000..e8219cd Binary files /dev/null and b/.edge-profile-render-1774474676521/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/index differ diff --git a/.edge-profile-render-1774474676521/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_0 b/.edge-profile-render-1774474676521/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_0 new file mode 100644 index 0000000..d76fb77 Binary files /dev/null and b/.edge-profile-render-1774474676521/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_0 differ diff --git a/.edge-profile-render-1774474676521/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_1 b/.edge-profile-render-1774474676521/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_1 new file mode 100644 index 0000000..035d06d Binary files /dev/null and b/.edge-profile-render-1774474676521/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_1 differ diff --git a/.edge-profile-render-1774474676521/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_2 b/.edge-profile-render-1774474676521/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_2 new file mode 100644 index 0000000..c7e2eb9 Binary files /dev/null and b/.edge-profile-render-1774474676521/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_2 differ diff --git a/.edge-profile-render-1774474676521/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_3 b/.edge-profile-render-1774474676521/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_3 new file mode 100644 index 0000000..5eec973 Binary files /dev/null and b/.edge-profile-render-1774474676521/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_3 differ diff --git a/.edge-profile-render-1774474676521/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/index b/.edge-profile-render-1774474676521/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/index new file mode 100644 index 0000000..a4c5fc2 Binary files /dev/null and b/.edge-profile-render-1774474676521/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/index differ diff --git a/.edge-profile-render-1774474676521/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_0 b/.edge-profile-render-1774474676521/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_0 new file mode 100644 index 0000000..d76fb77 Binary files /dev/null and b/.edge-profile-render-1774474676521/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_0 differ diff --git a/.edge-profile-render-1774474676521/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_1 b/.edge-profile-render-1774474676521/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_1 new file mode 100644 index 0000000..035d06d Binary files /dev/null and b/.edge-profile-render-1774474676521/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_1 differ diff --git a/.edge-profile-render-1774474676521/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_2 b/.edge-profile-render-1774474676521/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_2 new file mode 100644 index 0000000..c7e2eb9 Binary files /dev/null and b/.edge-profile-render-1774474676521/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_2 differ diff --git a/.edge-profile-render-1774474676521/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_3 b/.edge-profile-render-1774474676521/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_3 new file mode 100644 index 0000000..5eec973 Binary files /dev/null and b/.edge-profile-render-1774474676521/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_3 differ diff --git a/.edge-profile-render-1774474676521/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/index b/.edge-profile-render-1774474676521/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/index new file mode 100644 index 0000000..93f76a0 Binary files /dev/null and b/.edge-profile-render-1774474676521/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/index differ diff --git a/.edge-profile-render-1774474676521/Default/Sync Data/LevelDB/CURRENT b/.edge-profile-render-1774474676521/Default/Sync Data/LevelDB/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile-render-1774474676521/Default/Sync Data/LevelDB/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile-render-1774474676521/Default/Sync Data/LevelDB/LOCK b/.edge-profile-render-1774474676521/Default/Sync Data/LevelDB/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474676521/Default/Sync Data/LevelDB/LOG b/.edge-profile-render-1774474676521/Default/Sync Data/LevelDB/LOG new file mode 100644 index 0000000..d955c8f --- /dev/null +++ b/.edge-profile-render-1774474676521/Default/Sync Data/LevelDB/LOG @@ -0,0 +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 diff --git a/.edge-profile-render-1774474676521/Default/Sync Data/LevelDB/MANIFEST-000001 b/.edge-profile-render-1774474676521/Default/Sync Data/LevelDB/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile-render-1774474676521/Default/Sync Data/LevelDB/MANIFEST-000001 differ diff --git a/.edge-profile-render-1774474676521/Default/Top Sites b/.edge-profile-render-1774474676521/Default/Top Sites new file mode 100644 index 0000000..e700bd4 Binary files /dev/null and b/.edge-profile-render-1774474676521/Default/Top Sites differ diff --git a/.edge-profile-render-1774474676521/Default/Top Sites-journal b/.edge-profile-render-1774474676521/Default/Top Sites-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474676521/Default/Vpn Tokens b/.edge-profile-render-1774474676521/Default/Vpn Tokens new file mode 100644 index 0000000..2ba3b69 Binary files /dev/null and b/.edge-profile-render-1774474676521/Default/Vpn Tokens differ diff --git a/.edge-profile-render-1774474676521/Default/Vpn Tokens-journal b/.edge-profile-render-1774474676521/Default/Vpn Tokens-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474676521/Default/Web Data b/.edge-profile-render-1774474676521/Default/Web Data new file mode 100644 index 0000000..6097c32 Binary files /dev/null and b/.edge-profile-render-1774474676521/Default/Web Data differ diff --git a/.edge-profile-render-1774474676521/Default/Web Data-journal b/.edge-profile-render-1774474676521/Default/Web Data-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474676521/Default/arbitration_service_config.json b/.edge-profile-render-1774474676521/Default/arbitration_service_config.json new file mode 100644 index 0000000..fd7d0be --- /dev/null +++ b/.edge-profile-render-1774474676521/Default/arbitration_service_config.json @@ -0,0 +1,197 @@ +{ + "ArbitrationSignal": "notification_nsat_upper_ci-0.7", + "CopilotModeBypass": [ "cd4688a9-e888-48ea-ad81-76193d56b1be.IsVideoPage.Bubble", "cd4688a9-e888-48ea-ad81-76193d56b1be.IsKnowledgeCardQuery.Bubble", "PerformanceDetectorFeatureNotification", "AUTOFILL_PASSWORD_NON_FUNCTIONAL_FLYOUTS", "SHOPPING_AUTO_SHOW_LOWER_PRICE_FOUND", "SHOPPING_AUTO_SHOW_REBATES", "SHOPPING_AUTO_SHOW_REBATES_CONFIRMATION", "SHOPPING_AUTO_SHOW_REBATES_ORGANIC", "SHOPPING_AUTO_SHOW_REBATES_ORGANIC_NEW" ], + "CustomSuppressionPolicies": { + "8682d0fa-50b3-4ece-aa5b-e0b33f9919e2.f5b8c725-cb2e-4c12-accd-73e500d88d47.AutoOpen": { + "notification_max_quick_dismiss_count": 3 + }, + "bc25fcef-8964-4e72-8287-23e2b496c128.68b8a884-6e08-46e6-8a3b-7e06ffe48ecf.AutoOpen": { + "notification_max_quick_dismiss_count": 3 + }, + "cd4688a9-e888-48ea-ad81-76193d56b1be.e06e75c1-a59a-4ab6-8361-e8b038e00a8c.AutoOpen": { + "notification_max_quick_dismiss_count": 1 + } + }, + "DynamicSuppressionBypass": { + "ExperienceIDs": [ "Nurturing.Global.OnRamp_RetriggerFREOnEdgeVersionUpgradeViaExplicitLaunch", "Nurturing.Global.OnRamp_RetriggerFREOnExplicitProtocolPDFLaunchForEdgePostDMA", "Nurturing.Global.Bing_DefaultBrowserBannerCloseBtn", "Nurturing.Global.Bing_DefaultBrowserBannerCloseBtnUpdate", "Nurturing.Global.Bing_MSStartYJCompete", "Nurturing.Global.Bing_NtpHomeStartpageUpsellFlyout", "Nurturing.Global.Fundamentals_DefaultBrowserMonitor", "Nurturing.Global.Fundamentals_DefaultBrowserMonitorOnStart", "Nurturing.Global.Fundamentals_DefaultBrowserMonitorVariant2", "Nurturing.Global.RecommendedSettingsChina", "Nurturing.Global.ContinuousImport_PasswordZeroStateV2", "Nurturing.Global.OnRamp_CIExplicitLaunchBannerUpsell", "Nurturing.Global.OnRamp_CIUpsell_ProtocolLaunch_Banner", "Nurturing.Global.EdgeGrowth_SitePinningCITopSites", "Nurturing.Global.EdgeGrowth_SitePinningWithWindowsConsent", "Nurturing.Global.EdgeGrowth_GlobalSitePinningOnCloseModal" ], + "TeamIDs": [ "NTP" ] + }, + "ExperienceCohorts": { + "DefaultCohort": { + "21f3388b-c2a5-4791-8f6e-a4cad6d17f4f.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.BingHomePage.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Covid.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Finance.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Jobs.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.KnowledgeCard.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Local.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.NTP3PCLICK.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.NotifySearchPage.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Recipe.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.SearchPage.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Sports.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Travel.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Weather.Bubble": 1, + "2cb2db96-3bd0-403e-abe2-9269b3761041.AutoOpen": 1, + "2cb2db96-3bd0-403e-abe2-9269b3761041.Bubble": 1, + "439642fc-998d-4a64-8bb6-940ecaf6b60b.AutoOpen": 1, + "439642fc-998d-4a64-8bb6-940ecaf6b60b.Bubble": 1, + "523b5ef3-0b10-4154-8b62-10b2ebd00921.Bubble": 1, + "64be4f9b-3b81-4b6e-b354-0ba00d6ba485.AutoOpen": 1, + "64be4f9b-3b81-4b6e-b354-0ba00d6ba485.Bubble": 1, + "76b926d6-3738-46bf-82d7-2ab896ddf70b.MM2UpSellPopup.Bubble": 1, + "8682d0fa-50b3-4ece-aa5b-e0b33f9919e2.Bubble": 1, + "8682d0fa-50b3-4ece-aa5b-e0b33f9919e2.f5b8c725-cb2e-4c12-accd-73e500d88d47.AutoOpen": 1, + "8ac719c5-140b-4bf2-a0b7-c71617f1f377.3662f1e2-66ae-464f-b690-e7e3dc4fc662.AutoOpen": 1, + "8ac719c5-140b-4bf2-a0b7-c71617f1f377.93e5b5cd-15fc-4253-9728-d80685da304e.AutoOpen": 1, + "8ac719c5-140b-4bf2-a0b7-c71617f1f377.AutoOpen": 1, + "8ac719c5-140b-4bf2-a0b7-c71617f1f377.gaokao.Bubble": 1, + "92f1b743-e26b-433b-a1ec-912d1f0ad1fa.Bubble": 1, + "96defd79-4015-4a32-bd09-794ff72183ef.0bdde3c3-7be8-49f1-971b-e6e2cfd62643.AutoOpen": 1, + "96defd79-4015-4a32-bd09-794ff72183ef.128c39c6-6f70-4ce5-9d01-78978e60d666.AutoOpen": 1, + "96defd79-4015-4a32-bd09-794ff72183ef.5ac63306-e962-42e6-8313-7e5a5b707d65.AutoOpen": 1, + "96defd79-4015-4a32-bd09-794ff72183ef.AutoOpen": 1, + "96defd79-4015-4a32-bd09-794ff72183ef.Bubble": 1, + "96defd79-4015-4a32-bd09-794ff72183ef.Is1PGameDomain.Bubble": 1, + "96defd79-4015-4a32-bd09-794ff72183ef.Is3PGameDomain.Bubble": 1, + "9ce3c9c2-462f-4cc9-bbd7-57d656445be0.Bubble": 1, + "AUTOFILL_PASSWORD_NON_FUNCTIONAL_FLYOUTS": 1, + "DefaultExperience": 1, + "EdgeDownloadChromeInterceptDialog": 2, + "PerformanceDetectorFeatureNotification": 1, + "RewardsPromotionNotifications": 1, + "RewardsReminderNotifications": 1, + "SAN.Personalization.ConsentPrompt": 1, + "SHOPPING_AA_CONSENT": 1, + "SHOPPING_AUTO_PRODUCT_TRACKING_EXP_PRICE_DROP": 1, + "SHOPPING_AUTO_PRODUCT_TRACKING_IMP_PRICE_DROP": 1, + "SHOPPING_AUTO_PRODUCT_TRACKING_OUT_OF_STOCK": 1, + "SHOPPING_AUTO_SHOW_ABANDONED_CART": 1, + "SHOPPING_AUTO_SHOW_ADD_SPB_TO_CART_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_AMAZON_SEARCH_PC": 1, + "SHOPPING_AUTO_SHOW_ATTAINABLE_COUPONS": 1, + "SHOPPING_AUTO_SHOW_AUTOS_MARKETPLACE": 1, + "SHOPPING_AUTO_SHOW_AWARENESSEXP": 1, + "SHOPPING_AUTO_SHOW_AWARENESS_EXPANSION": 1, + "SHOPPING_AUTO_SHOW_CAMPAIGN_AWARENESS_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_CAMPAIGN_PDP_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_CASHBACK_PDP_PLUS_COUPONS": 1, + "SHOPPING_AUTO_SHOW_CJK_COUPON_FOUND": 1, + "SHOPPING_AUTO_SHOW_CJK_PRICE_DROP": 1, + "SHOPPING_AUTO_SHOW_CODEX_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_CONFIRMATION_SCRIPT": 1, + "SHOPPING_AUTO_SHOW_CONTROLLER": 1, + "SHOPPING_AUTO_SHOW_COUPONS_BACKGROUND_AUTO_APPLY": 1, + "SHOPPING_AUTO_SHOW_COUPONS_CHECKOUT": 1, + "SHOPPING_AUTO_SHOW_COUPONS_CHECKOUT_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_COUPONS_CLIPPING": 1, + "SHOPPING_AUTO_SHOW_DISCOVER_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_DISCOVER_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_EXPRESS_CHECKOUT": 1, + "SHOPPING_AUTO_SHOW_GIFT_CARD": 1, + "SHOPPING_AUTO_SHOW_GOODRX": 1, + "SHOPPING_AUTO_SHOW_GROCERY_ITEMIZED_CASHBACK": 1, + "SHOPPING_AUTO_SHOW_GROCERY_ITEMIZED_CASHBACK_LANDING": 1, + "SHOPPING_AUTO_SHOW_GUEST_DOMAIN_COUPONS": 1, + "SHOPPING_AUTO_SHOW_IBC_UPSELL": 1, + "SHOPPING_AUTO_SHOW_LOWER_PRICE_FOUND": 1, + "SHOPPING_AUTO_SHOW_LOWER_PRICE_PLUS_CASHBACK_PLUS_COUPONS": 1, + "SHOPPING_AUTO_SHOW_MOMENT_IN_TIME": 1, + "SHOPPING_AUTO_SHOW_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_ORGANIC_CASHBACK_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_OTHER_SELLER": 1, + "SHOPPING_AUTO_SHOW_OUT_OF_STOCK": 1, + "SHOPPING_AUTO_SHOW_PACKAGE_TRACKING": 1, + "SHOPPING_AUTO_SHOW_PACKAGE_TRACKING_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_PERSONALIZED_CASHBACK_ADDRESSBAR": 1, + "SHOPPING_AUTO_SHOW_PERSONALIZED_CASHBACK_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_POST_PURCHASE_TRACKING": 1, + "SHOPPING_AUTO_SHOW_PRICE_DROP_PLUS_CASHBACK": 1, + "SHOPPING_AUTO_SHOW_PRICE_DROP_PLUS_COUPONS": 1, + "SHOPPING_AUTO_SHOW_PRICE_HISTORY": 1, + "SHOPPING_AUTO_SHOW_PRICE_HISTORY_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_PRINT_GROCERY": 1, + "SHOPPING_AUTO_SHOW_PRODUCT_BEST_COUPON_CONSENT": 1, + "SHOPPING_AUTO_SHOW_PRODUCT_TRACKING_BACK_IN_STOCK": 1, + "SHOPPING_AUTO_SHOW_PRODUCT_TRACKING_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_PROFESSIONAL_REVIEWS": 1, + "SHOPPING_AUTO_SHOW_REBATES": 1, + "SHOPPING_AUTO_SHOW_REBATES_CHECKOUT": 1, + "SHOPPING_AUTO_SHOW_REBATES_ORGANIC": 1, + "SHOPPING_AUTO_SHOW_REBATES_ORGANIC_NEW": 1, + "SHOPPING_AUTO_SHOW_REBATES_PDP": 1, + "SHOPPING_AUTO_SHOW_RECOMMENDATIONS_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_SAN_CONSENT_CONFIRMATION": 1, + "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_ALL_PAGES": 1, + "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_CHECKOUT": 1, + "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_CONFIRMATION_PAGE": 1, + "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_HOME_PAGE": 1, + "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_REWARDS": 1, + "SHOPPING_AUTO_SHOW_SHOPRUNNER": 1, + "SHOPPING_AUTO_SHOW_SIDEPANE_CASHBACK_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_SPB_CASHBACK_LANDING": 1, + "SHOPPING_AUTO_SHOW_SPB_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_SPB_NUDGE_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_SURFACE_UPSELL": 1, + "SHOPPING_AUTO_SHOW_SUSTAINABILITY_LANDING": 1, + "SHOPPING_AUTO_SHOW_TRAVEL_NOTIFICATION_CHEAPER_FLIGHTS": 1, + "SHOPPING_AUTO_SHOW_TRAVEL_NOTIFICATION_CHEAPER_HOTEL_ROOM": 1, + "SHOPPING_AUTO_SHOW_TRENDING_COUPONS": 1, + "ShorelinePrivilegedExperienceID": 1, + "TabActionsMenuVerticalTabsPromotion": 1, + "VPNFeatureNotification": 1, + "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.75a774c2-6075-ae4f-09f9-e5f5d9bef6e1.AutoOpen": 1, + "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.AutoOpen": 1, + "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.a5e9f5e1-fcee-c07b-2c44-b707ded020a3.AutoOpen": 1, + "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.c8ebbf64-e3b8-41d9-925f-4e3754151ff7.AutoOpen": 1, + "bc25fcef-8964-4e72-8287-23e2b496c128.68b8a884-6e08-46e6-8a3b-7e06ffe48ecf.AutoOpen": 1, + "bc25fcef-8964-4e72-8287-23e2b496c128.Bubble": 1, + "c8ebd871-9f47-4a0d-abd3-c1c02b4f8f53.2cfab14c-ebd6-4548-9401-30ab5afe5061.AutoOpen": 1, + "c8ebd871-9f47-4a0d-abd3-c1c02b4f8f53.AutoOpen": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.5b853177-a0be-4237-bda0-4fce5cd165c2.AutoOpen": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.8d3a928d-e911-40f0-9852-f63f6434dc7e.AutoOpen": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.AutoOpen": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.AutoOpen.PDF": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.AutoOpen.PersistentChat": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsCompeteAISite.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsCopilotJitEduAcademicAI.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsCopilotJitEduArticleAI.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsCopilotJitEduStudyAI.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsKnowledgeCardQuery.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsMsnArticleUrlFromNtpP1P2.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsShoppingNotificationNudge.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsTextPage.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsTopNewsDomain.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsTwitchNonStreamPage.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsTwitchSubPage.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsVideoPage.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.e06e75c1-a59a-4ab6-8361-e8b038e00a8c.AutoOpen": 1, + "e6723537-66ff-4f4e-ab56-a4cbaddf4e0f.MM2UpSellPopup.Bubble": 1 + } + }, + "FunctionalCohort": [ "EdgeDownloadChromeInterceptFunctionalDialog", "8682d0fa-50b3-4ece-aa5b-e0b33f9919e2.AutoOpen.Functional", "8682d0fa-50b3-4ece-aa5b-e0b33f9919e2.f5b8c725-cb2e-4c12-accd-73e500d88d47.AutoOpen.Functional", "bc25fcef-8964-4e72-8287-23e2b496c128.AutoOpen.Functional", "bc25fcef-8964-4e72-8287-23e2b496c128.68b8a884-6e08-46e6-8a3b-7e06ffe48ecf.AutoOpen.Functional", "WPOFunctionalEvent.AutofillAccountChooser.Bubble", "WPOFunctionalEvent.AutofillAutoSignin.Bubble", "WPOFunctionalEvent.AutofillPassword.Bubble", "SHOPPING_AUTO_SHOW_BING_SEARCH", "SHOPPING_AUTO_SHOW_REBATES_CONFIRMATION", "SHOPPING_AUTO_SHOW_REBATES_DEACTIVATED", "SHOPPING_AUTO_SHOW_REBATES_BING", "SHOPPING_AUTO_SHOW_PERSONALIZED_CASHBACK", "SHOPPING_AUTO_SHOW_PERSONALIZED_CASHBACK_CONFIRMATION", "SHOPPING_AUTO_SHOW_URL_PARAM_REBATES", "SHOPPING_AUTO_SHOW_URL_PARAM_PRICE_COMPARISON", "SHOPPING_AUTO_SHOW_URL_PARAM_PRICE_HISTORY", "SHOPPING_AUTO_SHOW_REBATES_ACTIVATION_FAILED", "SHOPPING_AUTO_SHOW_REBATES_SWITCHED_TO_MSA", "SHOPPING_AUTO_SHOW_ITEM_ADDED_TO_CART_FROM_OTHER_SELLER", "SHOPPING_AUTO_SHOW_VIRTUAL_CARD", "SHOPPING_AUTO_SHOW_BING_CAMPAIGN", "SHOPPING_OPEN_FLYOUT_FROM_EDGE_DRIVER", "SHOPPING_AUTO_SHOW_SUSTAINABILITY_PURCHASE", "SHOPPING_AUTO_SHOW_REWARDS_ACTIVATION_FAILED", "SHOPPING_AUTO_SHOW_REWARDS_SWITCHED_TO_MSA", "SHOPPING_AUTO_SHOW_SHOPRUNNER_CONFIRMATION", "SHOPPING_AUTO_SHOW_ENROLL_TO_CASHBACK_CONFIRMATION_NOTIFICATION", "SHOPPING_AUTO_SHOW_POST_PURCHASE_REWARDS_NOTIFICATION", "694efa4f-a304-4214-aaf7-90444bc887f5.c1c025d9-a620-4f6b-bebb-eff0cf19a671.AutoOpen.Functional" ], + "GlobalSuppressedExperiences": [ "Teams.Bubble", "Nurturing.Global.EdgeVpn_VpnFre", "Nurturing.Global.Rewards_RedemptionCoachmark_2", "Nurturing.Global.Rewards_RedemptionCoachmark_25", "Nurturing.Global.EdgeCBUD_SanPersonalizationConsentWave1Variant0", "Nurturing.Global.Bing_NewBingChatFlyout", "Copilot.AutoOpen.PDF.v2", "Nurturing.Global.PWA_SidebarSearchPromotion", "Nurturing.Global.FC_NetworkWarningFlyout", "Nurturing.Global.EdgeMobile_MobileUpsell_ChatGpt_Flyout", "E-tree.Bubble", "Nurturing.Global.EdgeEDU_BrowserFocusedTranslateNudge", "Games.Bubble", "Nurturing.Global.OnRamp_RetriggerFRECodexCoPilotAutoAprd", "Nurturing.Global.OnRamp_NurturingViaProng_Experiment", "Nurturing.Global.OnRamp_ReTriggerOnWinUpgrade", "Nurturing.Global.EdgeGrowth_CIShoppingUpsell", "Nurturing.Global.Shopping_EnableShoppingAssistance_Optin_Generic", "Nurturing.Global.Shopping_EnableShoppingAssistance", "Nurturing.Global.BrowserExperiences_TryVerticalTabs" ], + "IgnoredFunctionalNotifications": [ "Nurturing.Functional.NTP_CourtesyEngineCampaign", "Nurturing.Functional.NTP_FunctionalCampaign", "Nurturing.Functional.NTP_SettingsCampaign", "Nurturing.Functional.NTP_UpsellCampaign", "Nurturing.Functional.FN_SmartSwitchFeatureInfoView" ], + "ModelInfo": { + "segment_id": 515, + "signals": [ "notification_triggered_count", "notification_click_rate", "notification_click_rate_lower_ci", "notification_click_rate_upper_ci", "notification_dismiss_rate", "notification_dismiss_rate_lower_ci", "notification_dismiss_rate_upper_ci", "notification_ignored_rate", "notification_ignored_rate_lower_ci", "notification_ignored_rate_upper_ci", "notification_quick_dismiss_rate", "notification_quick_dismiss_rate_lower_ci", "notification_quick_dismiss_rate_upper_ci", "notification_disable_rate", "notification_disable_rate_lower_ci", "notification_disable_rate_upper_ci", "notification_snooze_rate", "notification_snooze_rate_lower_ci", "notification_snooze_rate_upper_ci" ], + "threshold_value": 0.5 + }, + "ModelSuppressionBypass": [ "Nurturing.Local.SHOPPING_AUTO_SHOW_LOWER_PRICE_FOUND", "Nurturing.Local.SHOPPING_AUTO_SHOW_REBATES_ORGANIC", "Nurturing.Local.SHOPPING_AUTO_SHOW_REBATES_CHECKOUT", "Nurturing.Local.SHOPPING_AUTO_SHOW_SPB_CASHBACK_LANDING" ], + "NotificationsAllowLists": { + }, + "PrivilegedExperiences": [ "ShorelinePrivilegedExperienceID", "SHOPPING_AUTO_SHOW_COUPONS_CHECKOUT", "SHOPPING_AUTO_SHOW_LOWER_PRICE_FOUND", "SHOPPING_AUTO_SHOW_REBATES", "SHOPPING_AUTO_SHOW_REBATES_ORGANIC", "SHOPPING_AUTO_SHOW_PRICE_HISTORY", "SHOPPING_AUTO_SHOW_REBATES_ORGANIC_NEW", "SHOPPING_AUTO_SHOW_REBATES_CHECKOUT", "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_CHECKOUT", "SHOPPING_AUTO_SHOW_EXPRESS_CHECKOUT", "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_ALL_PAGES", "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_CONFIRMATION_PAGE", "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_HOME_PAGE", "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_REWARDS", "SHOPPING_AUTO_SHOW_COUPONS_CLIPPING", "SHOPPING_AUTO_SHOW_NOTIFICATION", "SHOPPING_AUTO_SHOW_OTHER_SELLER", "SHOPPING_AUTO_SHOW_PROFESSIONAL_REVIEWS", "SHOPPING_AUTO_SHOW_PACKAGE_TRACKING", "SHOPPING_AUTO_SHOW_GUEST_DOMAIN_COUPONS", "SHOPPING_AUTO_SHOW_SUSTAINABILITY_LANDING", "SHOPPING_AUTO_SHOW_ATTAINABLE_COUPONS", "SHOPPING_AUTO_SHOW_GIFT_CARD", "SHOPPING_AUTO_SHOW_PRINT_GROCERY", "SHOPPING_AUTO_SHOW_GROCERY_ITEMIZED_CASHBACK", "SHOPPING_AUTO_SHOW_CONTROLLER", "SHOPPING_AUTO_SHOW_AUTOS_MARKETPLACE", "SHOPPING_AUTO_SHOW_SHOPRUNNER", "SHOPPING_AUTO_SHOW_ABANDONED_CART", "SHOPPING_AUTO_SHOW_OUT_OF_STOCK", "SHOPPING_AUTO_SHOW_GROCERY_ITEMIZED_CASHBACK_LANDING", "SHOPPING_AUTO_SHOW_SPB_CASHBACK_LANDING", "SHOPPING_AUTO_SHOW_AWARENESSEXP", "SHOPPING_AA_CONSENT", "SHOPPING_AUTO_SHOW_SAN_CONSENT_CONFIRMATION", "SHOPPING_AUTO_SHOW_CONFIRMATION_SCRIPT", "SHOPPING_AUTO_SHOW_MOMENT_IN_TIME", "SHOPPING_AUTO_SHOW_COUPONS_CHECKOUT_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_TRENDING_COUPONS", "SHOPPING_AUTO_SHOW_RECOMMENDATIONS_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_PRODUCT_TRACKING_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_SURFACE_UPSELL", "SHOPPING_AUTO_SHOW_PRODUCT_TRACKING_BACK_IN_STOCK", "SHOPPING_AUTO_PRODUCT_TRACKING_EXP_PRICE_DROP", "SHOPPING_AUTO_PRODUCT_TRACKING_IMP_PRICE_DROP", "SHOPPING_AUTO_PRODUCT_TRACKING_OUT_OF_STOCK", "SHOPPING_AUTO_SHOW_CODEX_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_PERSONALIZED_CASHBACK_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_PRICE_HISTORY_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_ORGANIC_CASHBACK_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_GOODRX", "SHOPPING_AUTO_SHOW_SIDEPANE_CASHBACK_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_DISCOVER_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_REBATES_PDP", "SHOPPING_AUTO_SHOW_PRODUCT_BEST_COUPON_CONSENT", "SHOPPING_AUTO_SHOW_CAMPAIGN_PDP_NOTIFICATION", "SHOPPING_AUTO_SHOW_CAMPAIGN_AWARENESS_NOTIFICATION", "SHOPPING_AUTO_SHOW_SPB_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_PRICE_DROP_PLUS_COUPONS", "SHOPPING_AUTO_SHOW_SPB_NUDGE_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_ADD_SPB_TO_CART_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_CASHBACK_PDP_PLUS_COUPONS", "SHOPPING_AUTO_SHOW_PRICE_DROP_PLUS_CASHBACK", "SHOPPING_AUTO_SHOW_DISCOVER_NOTIFICATION", "SHOPPING_AUTO_SHOW_AMAZON_SEARCH_PC", "SHOPPING_AUTO_SHOW_COUPONS_BACKGROUND_AUTO_APPLY", "SHOPPING_AUTO_SHOW_PERSONALIZED_CASHBACK_ADDRESSBAR", "SHOPPING_AUTO_SHOW_TRAVEL_NOTIFICATION_CHEAPER_FLIGHTS", "SHOPPING_AUTO_SHOW_TRAVEL_NOTIFICATION_CHEAPER_HOTEL_ROOM", "SHOPPING_AUTO_SHOW_CJK_PRICE_DROP", "SHOPPING_AUTO_SHOW_CJK_COUPON_FOUND", "AUTOFILL_PASSWORD_NON_FUNCTIONAL_FLYOUTS", "76b926d6-3738-46bf-82d7-2ab896ddf70b.MM2UpSellPopup.Bubble", "e6723537-66ff-4f4e-ab56-a4cbaddf4e0f.MM2UpSellPopup.Bubble", "8ac719c5-140b-4bf2-a0b7-c71617f1f377.3662f1e2-66ae-464f-b690-e7e3dc4fc662.AutoOpen", "8ac719c5-140b-4bf2-a0b7-c71617f1f377.gaokao.Bubble", "c8ebd871-9f47-4a0d-abd3-c1c02b4f8f53.AutoOpen", "c8ebd871-9f47-4a0d-abd3-c1c02b4f8f53.2cfab14c-ebd6-4548-9401-30ab5afe5061.AutoOpen", "cd4688a9-e888-48ea-ad81-76193d56b1be.AutoOpen.PersistentChat", "cd4688a9-e888-48ea-ad81-76193d56b1be.AutoOpen.PDF", "cd4688a9-e888-48ea-ad81-76193d56b1be.8d3a928d-e911-40f0-9852-f63f6434dc7e.AutoOpen", "cd4688a9-e888-48ea-ad81-76193d56b1be.e06e75c1-a59a-4ab6-8361-e8b038e00a8c.AutoOpen", "cd4688a9-e888-48ea-ad81-76193d56b1be.5b853177-a0be-4237-bda0-4fce5cd165c2.AutoOpen", "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.AutoOpen", "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.c8ebbf64-e3b8-41d9-925f-4e3754151ff7.AutoOpen", "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.75a774c2-6075-ae4f-09f9-e5f5d9bef6e1.AutoOpen", "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.a5e9f5e1-fcee-c07b-2c44-b707ded020a3.AutoOpen", "8682d0fa-50b3-4ece-aa5b-e0b33f9919e2.f5b8c725-cb2e-4c12-accd-73e500d88d47.AutoOpen", "bc25fcef-8964-4e72-8287-23e2b496c128.68b8a884-6e08-46e6-8a3b-7e06ffe48ecf.AutoOpen", "EdgeDownloadChromeInterceptDialog", "439642fc-998d-4a64-8bb6-940ecaf6b60b.AutoOpen", "694efa4f-a304-4214-aaf7-90444bc887f5.c1c025d9-a620-4f6b-bebb-eff0cf19a671.AutoOpen" ], + "ReserveApproved": { + "ExperienceIDs": [ "Nurturing.Global.Edge_SpawnNtpOptIn", "Nurturing.Global.Edge_SpawnNtpOptOut" ], + "SourceIDs": [ 3 ], + "TeamIDs": [ "Edge Consumer Content and Verticals" ] + }, + "ScenarioSuppressLists": { + }, + "SuppressedExperiences": [ ], + "TimeDelta": 5000000, + "baseConfigVersion": "40.0.1", + "configVersion": "40.0.1" +} diff --git a/.edge-profile-render-1774474676521/Default/commerce_subscription_db/LOCK b/.edge-profile-render-1774474676521/Default/commerce_subscription_db/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474676521/Default/commerce_subscription_db/LOG b/.edge-profile-render-1774474676521/Default/commerce_subscription_db/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474676521/Default/discount_infos_db/LOCK b/.edge-profile-render-1774474676521/Default/discount_infos_db/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474676521/Default/discount_infos_db/LOG b/.edge-profile-render-1774474676521/Default/discount_infos_db/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474676521/Default/discounts_db/LOCK b/.edge-profile-render-1774474676521/Default/discounts_db/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474676521/Default/discounts_db/LOG b/.edge-profile-render-1774474676521/Default/discounts_db/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474676521/Default/load_statistics.db b/.edge-profile-render-1774474676521/Default/load_statistics.db new file mode 100644 index 0000000..4410bda Binary files /dev/null and b/.edge-profile-render-1774474676521/Default/load_statistics.db differ diff --git a/.edge-profile-render-1774474676521/Default/load_statistics.db-shm b/.edge-profile-render-1774474676521/Default/load_statistics.db-shm new file mode 100644 index 0000000..09ead18 Binary files /dev/null and b/.edge-profile-render-1774474676521/Default/load_statistics.db-shm differ diff --git a/.edge-profile-render-1774474676521/Default/load_statistics.db-wal b/.edge-profile-render-1774474676521/Default/load_statistics.db-wal new file mode 100644 index 0000000..4f61435 Binary files /dev/null and b/.edge-profile-render-1774474676521/Default/load_statistics.db-wal differ diff --git a/.edge-profile-render-1774474676521/Default/parcel_tracking_db/LOCK b/.edge-profile-render-1774474676521/Default/parcel_tracking_db/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474676521/Default/parcel_tracking_db/LOG b/.edge-profile-render-1774474676521/Default/parcel_tracking_db/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474676521/Default/shared_proto_db/CURRENT b/.edge-profile-render-1774474676521/Default/shared_proto_db/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile-render-1774474676521/Default/shared_proto_db/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile-render-1774474676521/Default/shared_proto_db/LOCK b/.edge-profile-render-1774474676521/Default/shared_proto_db/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474676521/Default/shared_proto_db/LOG b/.edge-profile-render-1774474676521/Default/shared_proto_db/LOG new file mode 100644 index 0000000..f147242 --- /dev/null +++ b/.edge-profile-render-1774474676521/Default/shared_proto_db/LOG @@ -0,0 +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 diff --git a/.edge-profile-render-1774474676521/Default/shared_proto_db/MANIFEST-000001 b/.edge-profile-render-1774474676521/Default/shared_proto_db/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile-render-1774474676521/Default/shared_proto_db/MANIFEST-000001 differ diff --git a/.edge-profile-render-1774474676521/Default/shared_proto_db/metadata/CURRENT b/.edge-profile-render-1774474676521/Default/shared_proto_db/metadata/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile-render-1774474676521/Default/shared_proto_db/metadata/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile-render-1774474676521/Default/shared_proto_db/metadata/LOCK b/.edge-profile-render-1774474676521/Default/shared_proto_db/metadata/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474676521/Default/shared_proto_db/metadata/LOG b/.edge-profile-render-1774474676521/Default/shared_proto_db/metadata/LOG new file mode 100644 index 0000000..4d8e7a2 --- /dev/null +++ b/.edge-profile-render-1774474676521/Default/shared_proto_db/metadata/LOG @@ -0,0 +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 diff --git a/.edge-profile-render-1774474676521/Default/shared_proto_db/metadata/MANIFEST-000001 b/.edge-profile-render-1774474676521/Default/shared_proto_db/metadata/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile-render-1774474676521/Default/shared_proto_db/metadata/MANIFEST-000001 differ diff --git a/.edge-profile-render-1774474676521/FirstLaunchAfterInstallation b/.edge-profile-render-1774474676521/FirstLaunchAfterInstallation new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474676521/Last Version b/.edge-profile-render-1774474676521/Last Version new file mode 100644 index 0000000..a887bff --- /dev/null +++ b/.edge-profile-render-1774474676521/Last Version @@ -0,0 +1 @@ +146.0.3856.72 \ No newline at end of file diff --git a/.edge-profile-render-1774474676521/Local State b/.edge-profile-render-1774474676521/Local State new file mode 100644 index 0000000..4b41b85 --- /dev/null +++ b/.edge-profile-render-1774474676521/Local State @@ -0,0 +1 @@ +{"breadcrumbs":{"enabled":true,"enabled_time":"13418948277132748"},"edge":{"app_user_model_id":"MSEdge","perf_center":{"efficiency_mode_v2_is_active":false,"performance_mode":3,"performance_mode_is_on":false},"retrigger_features":[],"tab_stabs":{"closed_without_unfreeze_never_unfrozen":0,"closed_without_unfreeze_previously_unfrozen":0,"discard_without_unfreeze_never_unfrozen":0,"discard_without_unfreeze_previously_unfrozen":0},"tab_stats":{"frozen_daily":0,"unfrozen_daily":0}},"edge_copilot_mode_enabled_state":{"Default":{"enabled":false,"last_set":"13418948277270769"}},"hardware_acceleration_mode_previous":true,"legacy":{"profile":{"name":{"migrated":true}}},"local":{"password_hash_data_list":[]},"metrics":{"client_id_hash_key_created":true},"optimization_guide":{"model_execution":{"last_usage_by_feature":{}},"model_store_metadata":{},"on_device":{"last_version":"146.0.3856.72","model_crash_count":0}},"os_crypt":{"audit_enabled":true,"encrypted_key":"RFBBUEkBAAAA0Iyd3wEV0RGMegDAT8KX6wEAAAAn89AMc7fOSbvGLGpOq+9IEAAAAB4AAABNAGkAYwByAG8AcwBvAGYAdAAgAEUAZABnAGUAAAAQZgAAAAEAACAAAACTr878ENKwi/QH8azmjkV1ltjErRByACWtfzm7BfrCOAAAAAAOgAAAAAIAACAAAACgvOlpHn/R/dfCwcsRYAlhLsjwklO3Yg7Ed4oxqqPuhDAAAADyxE9hvyXIAU61QV4cr3F0oi+8HQqMM2D5cwtjrwrK8wiGnsQDFsj8j6mb2nI/T5VAAAAALkefzsJ2J5Ia+M3nSF9sO6gLHf5irfgTphV1jUYCiOVQSATKCcolq0fpI8me3LGMFCXbKRrYv2ZRaVNsgtQdlQ=="},"policy":{"last_statistics_update":"13418948277129916"},"profile":{"info_cache":{"Default":{"avatar_icon":"chrome://theme/IDR_PROFILE_AVATAR_20","background_apps":false,"edge_account_cid":"","edge_account_environment":0,"edge_account_environment_string":"","edge_account_first_name":"","edge_account_last_name":"","edge_account_oid":"","edge_account_sovereignty":0,"edge_account_tenant_id":"","edge_account_type":0,"edge_create_profile_shortcut":false,"edge_profile_can_be_deleted":true,"edge_profile_can_be_edited":true,"edge_test_on_premises":false,"edge_wam_aad_for_app_account_type":0,"force_signin_profile_locked":false,"gaia_id":"","is_consented_primary_account":false,"is_ephemeral":false,"is_using_default_avatar":true,"is_using_default_name":true,"managed_user_id":"","name":"Profile 1","signin.with_credential_provider":false,"user_name":""}},"profile_counts_reported":"13418948277031665","profiles_order":["Default"]},"profile_network_context_service":{"http_cache_finch_experiment_groups":"None None None None"},"profiles":{"edge":{"multiple_profiles_with_same_account":false},"edge_sso_info":{"aad_sso_algo_state":1,"first_profile_key":"Default","msa_first_profile_key":"Default","msa_sso_algo_state":1},"signin_last_seen_version":"146.0.3856.72","signin_last_updated_time":1774474677.375647},"sentinel_creation_time":"0","session_id_generator_last_value":"1075426296","signin":{"active_accounts_last_emitted":"13418948277028430"},"startup_boost":{"last_browser_open_time":"13418948277097581"},"subresource_filter":{"ruleset_version":{"checksum":0,"content":"","format":0}},"tab_stats":{"discards_expired":0,"discards_external":0,"discards_proactive":0,"discards_urgent":0,"last_daily_sample":"13418948277114744","reloads_expired":0,"reloads_external":0,"reloads_urgent":0},"telemetry_client":{"governance":{"last_dma_change_date":"13418948277109019","last_known_cps":2048},"install_source_name":"windows","os_integration_level":5,"sample_id":26567154,"updater_version":"1.3.225.7","windows_update_applied":false},"ukm":{"persisted_logs":[]},"uninstall_metrics":{"installation_date2":"1774474676"},"user_experience_metrics":{"client_id2":"a6a3f659-9773-4fd9-add0-36aa64019e7f","diagnostics":{"last_data_collection_level_on_launch":1},"last_seen":{"CrashpadMetrics":"0"},"limited_entropy_randomization_source":"2344DCB5F4EF56065DF9CAEFA880A121","log_record_id":1,"low_entropy_source3":6456,"payload_counter":1,"pseudo_low_entropy_source":6803,"session_id":0,"stability":{"browser_last_live_timestamp":"13418948276759131","saved_system_profile":"CJ2l8s0GEhAxNDYuMC4zODU2LjcyLTY0GAAiBWVuLVVTKhgKCldpbmRvd3MgTlQSCjEwLjAuMjYyMDAybQoGeDg2XzY0EIdfGICAjNGN/x8iE0hQIExhcHRvcCAxNy1ieTB4eHgoATCgBjjYBEIKCAAQABoAMgA6AGUAAIA/ahgKDEdlbnVpbmVJbnRlbBDqjSAYCCABKACCAQCKAQCqAQZ4ODZfNjSwAQFKCg3ZeE7NFV5v0thKCg1sO7s6FV5v0thKCg1Ak3CxFV5v0thKCg0T5AAxFV5v0thKCg1ZIj2uFV5v0thKCg0XBxSpFV5v0thKCg0T2ptcFV5v0thKCg2Q6as/FV5v0thKCg1DO2FuFV5v0thQBGIESU5CWGoICAAQADgAQACAAdCZkc4GmAEA+AG4MoAC////////////AYgCAagCkzWyAjDRJfNWC4+9L/K351oQADyTN0RE6rqF3y+rE8bwOQvdoidEg0lfDgvA6BJXNkzzDV3xAqUYDyh8W9njyj7nAgoECAAQABIIIgQIAhACKAEiAggCMgYIACIAKgA6Cwjz///v9/////8BQigSCTEuMy4yMjUuNxgFIAAqDlJlZ0tleU5vdEZvdW5kMgd3aW5kb3dzUgIIAFr8AQnByqFFtltSQBGmm8QgsKpXQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAADwPxkAAAAAAADwPxkAAAAAAAAAABkAAAAAAADwPxkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAAAAABkAAAAAAABZQBkAAAAAAADwPxkAAAAAAABZQBkAAAAAAADwPxkAAAAAAADwPxkAAAAAAAA0QBkAAAAAAADwPxkAAAAAAABZQBkAAAAAAABZQHoCCAGCAQIYAKoBAgoAsAEA","saved_system_profile_hash":"E46E4C07D82E46DE1FE964F5786FD9EF5E6134E0","stats_buildtime":"1773965981","stats_version":"146.0.3856.72-64","system_crash_count":0}},"variations_google_groups":{"Default":[]},"was":{"restarted":false}} \ No newline at end of file diff --git a/.edge-profile-render-1774474676521/Nurturing/campaign_history b/.edge-profile-render-1774474676521/Nurturing/campaign_history new file mode 100644 index 0000000..eab8517 Binary files /dev/null and b/.edge-profile-render-1774474676521/Nurturing/campaign_history differ diff --git a/.edge-profile-render-1774474676521/Nurturing/campaign_history-journal b/.edge-profile-render-1774474676521/Nurturing/campaign_history-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474676521/ShaderCache/data_0 b/.edge-profile-render-1774474676521/ShaderCache/data_0 new file mode 100644 index 0000000..d76fb77 Binary files /dev/null and b/.edge-profile-render-1774474676521/ShaderCache/data_0 differ diff --git a/.edge-profile-render-1774474676521/ShaderCache/data_1 b/.edge-profile-render-1774474676521/ShaderCache/data_1 new file mode 100644 index 0000000..035d06d Binary files /dev/null and b/.edge-profile-render-1774474676521/ShaderCache/data_1 differ diff --git a/.edge-profile-render-1774474676521/ShaderCache/data_2 b/.edge-profile-render-1774474676521/ShaderCache/data_2 new file mode 100644 index 0000000..c7e2eb9 Binary files /dev/null and b/.edge-profile-render-1774474676521/ShaderCache/data_2 differ diff --git a/.edge-profile-render-1774474676521/ShaderCache/data_3 b/.edge-profile-render-1774474676521/ShaderCache/data_3 new file mode 100644 index 0000000..5eec973 Binary files /dev/null and b/.edge-profile-render-1774474676521/ShaderCache/data_3 differ diff --git a/.edge-profile-render-1774474676521/ShaderCache/index b/.edge-profile-render-1774474676521/ShaderCache/index new file mode 100644 index 0000000..faebf24 Binary files /dev/null and b/.edge-profile-render-1774474676521/ShaderCache/index differ diff --git a/.edge-profile-render-1774474676521/SmartScreen/RemoteData/customSettings b/.edge-profile-render-1774474676521/SmartScreen/RemoteData/customSettings new file mode 100644 index 0000000..997f02d --- /dev/null +++ b/.edge-profile-render-1774474676521/SmartScreen/RemoteData/customSettings @@ -0,0 +1 @@ +customSettings_F95BA787499AB4FA9EFFF472CE383A14 \ No newline at end of file diff --git a/.edge-profile-render-1774474676521/SmartScreen/RemoteData/customSettings_F95BA787499AB4FA9EFFF472CE383A14 b/.edge-profile-render-1774474676521/SmartScreen/RemoteData/customSettings_F95BA787499AB4FA9EFFF472CE383A14 new file mode 100644 index 0000000..ae2fefa --- /dev/null +++ b/.edge-profile-render-1774474676521/SmartScreen/RemoteData/customSettings_F95BA787499AB4FA9EFFF472CE383A14 @@ -0,0 +1 @@ +{"forceServiceDetermination":false} \ No newline at end of file diff --git a/.edge-profile-render-1774474676521/Variations b/.edge-profile-render-1774474676521/Variations new file mode 100644 index 0000000..a157215 --- /dev/null +++ b/.edge-profile-render-1774474676521/Variations @@ -0,0 +1 @@ +{"user_experience_metrics.stability.exited_cleanly":false,"variations_crash_streak":0} \ No newline at end of file diff --git a/.edge-profile-render-1774474724122/Crashpad/metadata b/.edge-profile-render-1774474724122/Crashpad/metadata new file mode 100644 index 0000000..4645b1e Binary files /dev/null and b/.edge-profile-render-1774474724122/Crashpad/metadata differ diff --git a/.edge-profile-render-1774474724122/Crashpad/reports/043f70ee-731e-4244-9639-b93f4b4b1fc4.dmp b/.edge-profile-render-1774474724122/Crashpad/reports/043f70ee-731e-4244-9639-b93f4b4b1fc4.dmp new file mode 100644 index 0000000..56767aa Binary files /dev/null and b/.edge-profile-render-1774474724122/Crashpad/reports/043f70ee-731e-4244-9639-b93f4b4b1fc4.dmp differ diff --git a/.edge-profile-render-1774474724122/Crashpad/settings.dat b/.edge-profile-render-1774474724122/Crashpad/settings.dat new file mode 100644 index 0000000..233de2a Binary files /dev/null and b/.edge-profile-render-1774474724122/Crashpad/settings.dat differ diff --git a/.edge-profile-render-1774474724122/Crashpad/throttle_store.dat b/.edge-profile-render-1774474724122/Crashpad/throttle_store.dat new file mode 100644 index 0000000..9639e1b --- /dev/null +++ b/.edge-profile-render-1774474724122/Crashpad/throttle_store.dat @@ -0,0 +1 @@ +level=none expiry=0 diff --git a/.edge-profile-render-1774474724122/Default/ClientCertificates/LOCK b/.edge-profile-render-1774474724122/Default/ClientCertificates/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474724122/Default/ClientCertificates/LOG b/.edge-profile-render-1774474724122/Default/ClientCertificates/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474724122/Default/Code Cache/js/index b/.edge-profile-render-1774474724122/Default/Code Cache/js/index new file mode 100644 index 0000000..79bd403 Binary files /dev/null and b/.edge-profile-render-1774474724122/Default/Code Cache/js/index differ diff --git a/.edge-profile-render-1774474724122/Default/Code Cache/js/index-dir/the-real-index b/.edge-profile-render-1774474724122/Default/Code Cache/js/index-dir/the-real-index new file mode 100644 index 0000000..a9d6c6a Binary files /dev/null and b/.edge-profile-render-1774474724122/Default/Code Cache/js/index-dir/the-real-index differ diff --git a/.edge-profile-render-1774474724122/Default/Code Cache/wasm/index b/.edge-profile-render-1774474724122/Default/Code Cache/wasm/index new file mode 100644 index 0000000..79bd403 Binary files /dev/null and b/.edge-profile-render-1774474724122/Default/Code Cache/wasm/index differ diff --git a/.edge-profile-render-1774474724122/Default/Code Cache/wasm/index-dir/the-real-index b/.edge-profile-render-1774474724122/Default/Code Cache/wasm/index-dir/the-real-index new file mode 100644 index 0000000..8d6518c Binary files /dev/null and b/.edge-profile-render-1774474724122/Default/Code Cache/wasm/index-dir/the-real-index differ diff --git a/.edge-profile-render-1774474724122/Default/DawnGraphiteCache/data_0 b/.edge-profile-render-1774474724122/Default/DawnGraphiteCache/data_0 new file mode 100644 index 0000000..d76fb77 Binary files /dev/null and b/.edge-profile-render-1774474724122/Default/DawnGraphiteCache/data_0 differ diff --git a/.edge-profile-render-1774474724122/Default/DawnGraphiteCache/data_1 b/.edge-profile-render-1774474724122/Default/DawnGraphiteCache/data_1 new file mode 100644 index 0000000..035d06d Binary files /dev/null and b/.edge-profile-render-1774474724122/Default/DawnGraphiteCache/data_1 differ diff --git a/.edge-profile-render-1774474724122/Default/DawnGraphiteCache/data_2 b/.edge-profile-render-1774474724122/Default/DawnGraphiteCache/data_2 new file mode 100644 index 0000000..c7e2eb9 Binary files /dev/null and b/.edge-profile-render-1774474724122/Default/DawnGraphiteCache/data_2 differ diff --git a/.edge-profile-render-1774474724122/Default/DawnGraphiteCache/data_3 b/.edge-profile-render-1774474724122/Default/DawnGraphiteCache/data_3 new file mode 100644 index 0000000..5eec973 Binary files /dev/null and b/.edge-profile-render-1774474724122/Default/DawnGraphiteCache/data_3 differ diff --git a/.edge-profile-render-1774474724122/Default/DawnGraphiteCache/index b/.edge-profile-render-1774474724122/Default/DawnGraphiteCache/index new file mode 100644 index 0000000..907e3fe Binary files /dev/null and b/.edge-profile-render-1774474724122/Default/DawnGraphiteCache/index differ diff --git a/.edge-profile-render-1774474724122/Default/DawnWebGPUCache/data_0 b/.edge-profile-render-1774474724122/Default/DawnWebGPUCache/data_0 new file mode 100644 index 0000000..d76fb77 Binary files /dev/null and b/.edge-profile-render-1774474724122/Default/DawnWebGPUCache/data_0 differ diff --git a/.edge-profile-render-1774474724122/Default/DawnWebGPUCache/data_1 b/.edge-profile-render-1774474724122/Default/DawnWebGPUCache/data_1 new file mode 100644 index 0000000..035d06d Binary files /dev/null and b/.edge-profile-render-1774474724122/Default/DawnWebGPUCache/data_1 differ diff --git a/.edge-profile-render-1774474724122/Default/DawnWebGPUCache/data_2 b/.edge-profile-render-1774474724122/Default/DawnWebGPUCache/data_2 new file mode 100644 index 0000000..c7e2eb9 Binary files /dev/null and b/.edge-profile-render-1774474724122/Default/DawnWebGPUCache/data_2 differ diff --git a/.edge-profile-render-1774474724122/Default/DawnWebGPUCache/data_3 b/.edge-profile-render-1774474724122/Default/DawnWebGPUCache/data_3 new file mode 100644 index 0000000..5eec973 Binary files /dev/null and b/.edge-profile-render-1774474724122/Default/DawnWebGPUCache/data_3 differ diff --git a/.edge-profile-render-1774474724122/Default/DawnWebGPUCache/index b/.edge-profile-render-1774474724122/Default/DawnWebGPUCache/index new file mode 100644 index 0000000..7624d93 Binary files /dev/null and b/.edge-profile-render-1774474724122/Default/DawnWebGPUCache/index differ diff --git a/.edge-profile-render-1774474724122/Default/EdgePushStorageWithConnectTokenAndKey/LOCK b/.edge-profile-render-1774474724122/Default/EdgePushStorageWithConnectTokenAndKey/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474724122/Default/EdgePushStorageWithConnectTokenAndKey/LOG b/.edge-profile-render-1774474724122/Default/EdgePushStorageWithConnectTokenAndKey/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474724122/Default/EdgePushStorageWithConnectTokenAndKey/LOG.old b/.edge-profile-render-1774474724122/Default/EdgePushStorageWithConnectTokenAndKey/LOG.old new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474724122/Default/Extension Rules/CURRENT b/.edge-profile-render-1774474724122/Default/Extension Rules/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile-render-1774474724122/Default/Extension Rules/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile-render-1774474724122/Default/Extension Rules/LOCK b/.edge-profile-render-1774474724122/Default/Extension Rules/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474724122/Default/Extension Rules/LOG b/.edge-profile-render-1774474724122/Default/Extension Rules/LOG new file mode 100644 index 0000000..663e809 --- /dev/null +++ b/.edge-profile-render-1774474724122/Default/Extension Rules/LOG @@ -0,0 +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 diff --git a/.edge-profile-render-1774474724122/Default/Extension Rules/MANIFEST-000001 b/.edge-profile-render-1774474724122/Default/Extension Rules/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile-render-1774474724122/Default/Extension Rules/MANIFEST-000001 differ diff --git a/.edge-profile-render-1774474724122/Default/Extension Scripts/CURRENT b/.edge-profile-render-1774474724122/Default/Extension Scripts/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile-render-1774474724122/Default/Extension Scripts/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile-render-1774474724122/Default/Extension Scripts/LOCK b/.edge-profile-render-1774474724122/Default/Extension Scripts/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474724122/Default/Extension Scripts/LOG b/.edge-profile-render-1774474724122/Default/Extension Scripts/LOG new file mode 100644 index 0000000..3aa487b --- /dev/null +++ b/.edge-profile-render-1774474724122/Default/Extension Scripts/LOG @@ -0,0 +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 diff --git a/.edge-profile-render-1774474724122/Default/Extension Scripts/MANIFEST-000001 b/.edge-profile-render-1774474724122/Default/Extension Scripts/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile-render-1774474724122/Default/Extension Scripts/MANIFEST-000001 differ diff --git a/.edge-profile-render-1774474724122/Default/Extension State/CURRENT b/.edge-profile-render-1774474724122/Default/Extension State/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile-render-1774474724122/Default/Extension State/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile-render-1774474724122/Default/Extension State/LOCK b/.edge-profile-render-1774474724122/Default/Extension State/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474724122/Default/Extension State/LOG b/.edge-profile-render-1774474724122/Default/Extension State/LOG new file mode 100644 index 0000000..f735083 --- /dev/null +++ b/.edge-profile-render-1774474724122/Default/Extension State/LOG @@ -0,0 +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 diff --git a/.edge-profile-render-1774474724122/Default/Extension State/MANIFEST-000001 b/.edge-profile-render-1774474724122/Default/Extension State/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile-render-1774474724122/Default/Extension State/MANIFEST-000001 differ diff --git a/.edge-profile-render-1774474724122/Default/Favicons b/.edge-profile-render-1774474724122/Default/Favicons new file mode 100644 index 0000000..e589db8 Binary files /dev/null and b/.edge-profile-render-1774474724122/Default/Favicons differ diff --git a/.edge-profile-render-1774474724122/Default/Favicons-journal b/.edge-profile-render-1774474724122/Default/Favicons-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474724122/Default/GPUCache/data_0 b/.edge-profile-render-1774474724122/Default/GPUCache/data_0 new file mode 100644 index 0000000..d76fb77 Binary files /dev/null and b/.edge-profile-render-1774474724122/Default/GPUCache/data_0 differ diff --git a/.edge-profile-render-1774474724122/Default/GPUCache/data_1 b/.edge-profile-render-1774474724122/Default/GPUCache/data_1 new file mode 100644 index 0000000..035d06d Binary files /dev/null and b/.edge-profile-render-1774474724122/Default/GPUCache/data_1 differ diff --git a/.edge-profile-render-1774474724122/Default/GPUCache/data_2 b/.edge-profile-render-1774474724122/Default/GPUCache/data_2 new file mode 100644 index 0000000..c7e2eb9 Binary files /dev/null and b/.edge-profile-render-1774474724122/Default/GPUCache/data_2 differ diff --git a/.edge-profile-render-1774474724122/Default/GPUCache/data_3 b/.edge-profile-render-1774474724122/Default/GPUCache/data_3 new file mode 100644 index 0000000..5eec973 Binary files /dev/null and b/.edge-profile-render-1774474724122/Default/GPUCache/data_3 differ diff --git a/.edge-profile-render-1774474724122/Default/GPUCache/index b/.edge-profile-render-1774474724122/Default/GPUCache/index new file mode 100644 index 0000000..0e39948 Binary files /dev/null and b/.edge-profile-render-1774474724122/Default/GPUCache/index differ diff --git a/.edge-profile-render-1774474724122/Default/History b/.edge-profile-render-1774474724122/Default/History new file mode 100644 index 0000000..c02d277 Binary files /dev/null and b/.edge-profile-render-1774474724122/Default/History differ diff --git a/.edge-profile-render-1774474724122/Default/History-journal b/.edge-profile-render-1774474724122/Default/History-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474724122/Default/HubApps Icons b/.edge-profile-render-1774474724122/Default/HubApps Icons new file mode 100644 index 0000000..a838bbc Binary files /dev/null and b/.edge-profile-render-1774474724122/Default/HubApps Icons differ diff --git a/.edge-profile-render-1774474724122/Default/HubApps Icons-journal b/.edge-profile-render-1774474724122/Default/HubApps Icons-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474724122/Default/LOCK b/.edge-profile-render-1774474724122/Default/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474724122/Default/LOG b/.edge-profile-render-1774474724122/Default/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474724122/Default/Login Data b/.edge-profile-render-1774474724122/Default/Login Data new file mode 100644 index 0000000..0af13bc Binary files /dev/null and b/.edge-profile-render-1774474724122/Default/Login Data differ diff --git a/.edge-profile-render-1774474724122/Default/Login Data For Account b/.edge-profile-render-1774474724122/Default/Login Data For Account new file mode 100644 index 0000000..0af13bc Binary files /dev/null and b/.edge-profile-render-1774474724122/Default/Login Data For Account differ diff --git a/.edge-profile-render-1774474724122/Default/Login Data For Account-journal b/.edge-profile-render-1774474724122/Default/Login Data For Account-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474724122/Default/Login Data-journal b/.edge-profile-render-1774474724122/Default/Login Data-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474724122/Default/Nurturing/campaign_history b/.edge-profile-render-1774474724122/Default/Nurturing/campaign_history new file mode 100644 index 0000000..eab8517 Binary files /dev/null and b/.edge-profile-render-1774474724122/Default/Nurturing/campaign_history differ diff --git a/.edge-profile-render-1774474724122/Default/Nurturing/campaign_history-journal b/.edge-profile-render-1774474724122/Default/Nurturing/campaign_history-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474724122/Default/PersistentOriginTrials/LOCK b/.edge-profile-render-1774474724122/Default/PersistentOriginTrials/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474724122/Default/PersistentOriginTrials/LOG b/.edge-profile-render-1774474724122/Default/PersistentOriginTrials/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474724122/Default/README b/.edge-profile-render-1774474724122/Default/README new file mode 100644 index 0000000..4a34402 --- /dev/null +++ b/.edge-profile-render-1774474724122/Default/README @@ -0,0 +1 @@ +Microsoft Edge settings and storage represent user-selected preferences and information and MUST not be extracted, overwritten or modified except through Microsoft Edge defined APIs. \ No newline at end of file diff --git a/.edge-profile-render-1774474724122/Default/ServerCertificate b/.edge-profile-render-1774474724122/Default/ServerCertificate new file mode 100644 index 0000000..9587f64 Binary files /dev/null and b/.edge-profile-render-1774474724122/Default/ServerCertificate differ diff --git a/.edge-profile-render-1774474724122/Default/ServerCertificate-journal b/.edge-profile-render-1774474724122/Default/ServerCertificate-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474724122/Default/Sessions/Session_13418948328578253 b/.edge-profile-render-1774474724122/Default/Sessions/Session_13418948328578253 new file mode 100644 index 0000000..080fac5 Binary files /dev/null and b/.edge-profile-render-1774474724122/Default/Sessions/Session_13418948328578253 differ diff --git a/.edge-profile-render-1774474724122/Default/SharedStorage b/.edge-profile-render-1774474724122/Default/SharedStorage new file mode 100644 index 0000000..4410bda Binary files /dev/null and b/.edge-profile-render-1774474724122/Default/SharedStorage differ diff --git a/.edge-profile-render-1774474724122/Default/SharedStorage-wal b/.edge-profile-render-1774474724122/Default/SharedStorage-wal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474724122/Default/Site Characteristics Database/CURRENT b/.edge-profile-render-1774474724122/Default/Site Characteristics Database/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile-render-1774474724122/Default/Site Characteristics Database/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile-render-1774474724122/Default/Site Characteristics Database/LOCK b/.edge-profile-render-1774474724122/Default/Site Characteristics Database/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474724122/Default/Site Characteristics Database/LOG b/.edge-profile-render-1774474724122/Default/Site Characteristics Database/LOG new file mode 100644 index 0000000..238e628 --- /dev/null +++ b/.edge-profile-render-1774474724122/Default/Site Characteristics Database/LOG @@ -0,0 +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 diff --git a/.edge-profile-render-1774474724122/Default/Site Characteristics Database/MANIFEST-000001 b/.edge-profile-render-1774474724122/Default/Site Characteristics Database/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile-render-1774474724122/Default/Site Characteristics Database/MANIFEST-000001 differ diff --git a/.edge-profile-render-1774474724122/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/js/index b/.edge-profile-render-1774474724122/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/js/index new file mode 100644 index 0000000..79bd403 Binary files /dev/null and b/.edge-profile-render-1774474724122/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/js/index differ diff --git a/.edge-profile-render-1774474724122/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/js/index-dir/the-real-index b/.edge-profile-render-1774474724122/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/js/index-dir/the-real-index new file mode 100644 index 0000000..6815c94 Binary files /dev/null and b/.edge-profile-render-1774474724122/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/js/index-dir/the-real-index differ diff --git a/.edge-profile-render-1774474724122/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/wasm/index b/.edge-profile-render-1774474724122/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/wasm/index new file mode 100644 index 0000000..79bd403 Binary files /dev/null and b/.edge-profile-render-1774474724122/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/wasm/index differ diff --git a/.edge-profile-render-1774474724122/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/wasm/index-dir/the-real-index b/.edge-profile-render-1774474724122/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/wasm/index-dir/the-real-index new file mode 100644 index 0000000..2edc53f Binary files /dev/null and b/.edge-profile-render-1774474724122/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/wasm/index-dir/the-real-index differ diff --git a/.edge-profile-render-1774474724122/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_0 b/.edge-profile-render-1774474724122/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_0 new file mode 100644 index 0000000..d76fb77 Binary files /dev/null and b/.edge-profile-render-1774474724122/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_0 differ diff --git a/.edge-profile-render-1774474724122/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_1 b/.edge-profile-render-1774474724122/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_1 new file mode 100644 index 0000000..035d06d Binary files /dev/null and b/.edge-profile-render-1774474724122/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_1 differ diff --git a/.edge-profile-render-1774474724122/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_2 b/.edge-profile-render-1774474724122/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_2 new file mode 100644 index 0000000..c7e2eb9 Binary files /dev/null and b/.edge-profile-render-1774474724122/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_2 differ diff --git a/.edge-profile-render-1774474724122/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_3 b/.edge-profile-render-1774474724122/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_3 new file mode 100644 index 0000000..5eec973 Binary files /dev/null and b/.edge-profile-render-1774474724122/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_3 differ diff --git a/.edge-profile-render-1774474724122/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/index b/.edge-profile-render-1774474724122/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/index new file mode 100644 index 0000000..42a2839 Binary files /dev/null and b/.edge-profile-render-1774474724122/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/index differ diff --git a/.edge-profile-render-1774474724122/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_0 b/.edge-profile-render-1774474724122/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_0 new file mode 100644 index 0000000..d76fb77 Binary files /dev/null and b/.edge-profile-render-1774474724122/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_0 differ diff --git a/.edge-profile-render-1774474724122/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_1 b/.edge-profile-render-1774474724122/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_1 new file mode 100644 index 0000000..035d06d Binary files /dev/null and b/.edge-profile-render-1774474724122/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_1 differ diff --git a/.edge-profile-render-1774474724122/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_2 b/.edge-profile-render-1774474724122/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_2 new file mode 100644 index 0000000..c7e2eb9 Binary files /dev/null and b/.edge-profile-render-1774474724122/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_2 differ diff --git a/.edge-profile-render-1774474724122/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_3 b/.edge-profile-render-1774474724122/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_3 new file mode 100644 index 0000000..5eec973 Binary files /dev/null and b/.edge-profile-render-1774474724122/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_3 differ diff --git a/.edge-profile-render-1774474724122/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/index b/.edge-profile-render-1774474724122/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/index new file mode 100644 index 0000000..a56fdf7 Binary files /dev/null and b/.edge-profile-render-1774474724122/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/index differ diff --git a/.edge-profile-render-1774474724122/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_0 b/.edge-profile-render-1774474724122/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_0 new file mode 100644 index 0000000..d76fb77 Binary files /dev/null and b/.edge-profile-render-1774474724122/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_0 differ diff --git a/.edge-profile-render-1774474724122/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_1 b/.edge-profile-render-1774474724122/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_1 new file mode 100644 index 0000000..035d06d Binary files /dev/null and b/.edge-profile-render-1774474724122/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_1 differ diff --git a/.edge-profile-render-1774474724122/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_2 b/.edge-profile-render-1774474724122/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_2 new file mode 100644 index 0000000..c7e2eb9 Binary files /dev/null and b/.edge-profile-render-1774474724122/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_2 differ diff --git a/.edge-profile-render-1774474724122/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_3 b/.edge-profile-render-1774474724122/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_3 new file mode 100644 index 0000000..5eec973 Binary files /dev/null and b/.edge-profile-render-1774474724122/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_3 differ diff --git a/.edge-profile-render-1774474724122/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/index b/.edge-profile-render-1774474724122/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/index new file mode 100644 index 0000000..0c3dfbe Binary files /dev/null and b/.edge-profile-render-1774474724122/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/index differ diff --git a/.edge-profile-render-1774474724122/Default/Sync Data/LevelDB/CURRENT b/.edge-profile-render-1774474724122/Default/Sync Data/LevelDB/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile-render-1774474724122/Default/Sync Data/LevelDB/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile-render-1774474724122/Default/Sync Data/LevelDB/LOCK b/.edge-profile-render-1774474724122/Default/Sync Data/LevelDB/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474724122/Default/Sync Data/LevelDB/LOG b/.edge-profile-render-1774474724122/Default/Sync Data/LevelDB/LOG new file mode 100644 index 0000000..515c5d7 --- /dev/null +++ b/.edge-profile-render-1774474724122/Default/Sync Data/LevelDB/LOG @@ -0,0 +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 diff --git a/.edge-profile-render-1774474724122/Default/Sync Data/LevelDB/MANIFEST-000001 b/.edge-profile-render-1774474724122/Default/Sync Data/LevelDB/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile-render-1774474724122/Default/Sync Data/LevelDB/MANIFEST-000001 differ diff --git a/.edge-profile-render-1774474724122/Default/Top Sites b/.edge-profile-render-1774474724122/Default/Top Sites new file mode 100644 index 0000000..e700bd4 Binary files /dev/null and b/.edge-profile-render-1774474724122/Default/Top Sites differ diff --git a/.edge-profile-render-1774474724122/Default/Top Sites-journal b/.edge-profile-render-1774474724122/Default/Top Sites-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474724122/Default/Vpn Tokens b/.edge-profile-render-1774474724122/Default/Vpn Tokens new file mode 100644 index 0000000..2ba3b69 Binary files /dev/null and b/.edge-profile-render-1774474724122/Default/Vpn Tokens differ diff --git a/.edge-profile-render-1774474724122/Default/Vpn Tokens-journal b/.edge-profile-render-1774474724122/Default/Vpn Tokens-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474724122/Default/Web Data b/.edge-profile-render-1774474724122/Default/Web Data new file mode 100644 index 0000000..6097c32 Binary files /dev/null and b/.edge-profile-render-1774474724122/Default/Web Data differ diff --git a/.edge-profile-render-1774474724122/Default/Web Data-journal b/.edge-profile-render-1774474724122/Default/Web Data-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474724122/Default/arbitration_service_config.json b/.edge-profile-render-1774474724122/Default/arbitration_service_config.json new file mode 100644 index 0000000..fd7d0be --- /dev/null +++ b/.edge-profile-render-1774474724122/Default/arbitration_service_config.json @@ -0,0 +1,197 @@ +{ + "ArbitrationSignal": "notification_nsat_upper_ci-0.7", + "CopilotModeBypass": [ "cd4688a9-e888-48ea-ad81-76193d56b1be.IsVideoPage.Bubble", "cd4688a9-e888-48ea-ad81-76193d56b1be.IsKnowledgeCardQuery.Bubble", "PerformanceDetectorFeatureNotification", "AUTOFILL_PASSWORD_NON_FUNCTIONAL_FLYOUTS", "SHOPPING_AUTO_SHOW_LOWER_PRICE_FOUND", "SHOPPING_AUTO_SHOW_REBATES", "SHOPPING_AUTO_SHOW_REBATES_CONFIRMATION", "SHOPPING_AUTO_SHOW_REBATES_ORGANIC", "SHOPPING_AUTO_SHOW_REBATES_ORGANIC_NEW" ], + "CustomSuppressionPolicies": { + "8682d0fa-50b3-4ece-aa5b-e0b33f9919e2.f5b8c725-cb2e-4c12-accd-73e500d88d47.AutoOpen": { + "notification_max_quick_dismiss_count": 3 + }, + "bc25fcef-8964-4e72-8287-23e2b496c128.68b8a884-6e08-46e6-8a3b-7e06ffe48ecf.AutoOpen": { + "notification_max_quick_dismiss_count": 3 + }, + "cd4688a9-e888-48ea-ad81-76193d56b1be.e06e75c1-a59a-4ab6-8361-e8b038e00a8c.AutoOpen": { + "notification_max_quick_dismiss_count": 1 + } + }, + "DynamicSuppressionBypass": { + "ExperienceIDs": [ "Nurturing.Global.OnRamp_RetriggerFREOnEdgeVersionUpgradeViaExplicitLaunch", "Nurturing.Global.OnRamp_RetriggerFREOnExplicitProtocolPDFLaunchForEdgePostDMA", "Nurturing.Global.Bing_DefaultBrowserBannerCloseBtn", "Nurturing.Global.Bing_DefaultBrowserBannerCloseBtnUpdate", "Nurturing.Global.Bing_MSStartYJCompete", "Nurturing.Global.Bing_NtpHomeStartpageUpsellFlyout", "Nurturing.Global.Fundamentals_DefaultBrowserMonitor", "Nurturing.Global.Fundamentals_DefaultBrowserMonitorOnStart", "Nurturing.Global.Fundamentals_DefaultBrowserMonitorVariant2", "Nurturing.Global.RecommendedSettingsChina", "Nurturing.Global.ContinuousImport_PasswordZeroStateV2", "Nurturing.Global.OnRamp_CIExplicitLaunchBannerUpsell", "Nurturing.Global.OnRamp_CIUpsell_ProtocolLaunch_Banner", "Nurturing.Global.EdgeGrowth_SitePinningCITopSites", "Nurturing.Global.EdgeGrowth_SitePinningWithWindowsConsent", "Nurturing.Global.EdgeGrowth_GlobalSitePinningOnCloseModal" ], + "TeamIDs": [ "NTP" ] + }, + "ExperienceCohorts": { + "DefaultCohort": { + "21f3388b-c2a5-4791-8f6e-a4cad6d17f4f.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.BingHomePage.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Covid.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Finance.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Jobs.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.KnowledgeCard.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Local.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.NTP3PCLICK.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.NotifySearchPage.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Recipe.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.SearchPage.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Sports.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Travel.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Weather.Bubble": 1, + "2cb2db96-3bd0-403e-abe2-9269b3761041.AutoOpen": 1, + "2cb2db96-3bd0-403e-abe2-9269b3761041.Bubble": 1, + "439642fc-998d-4a64-8bb6-940ecaf6b60b.AutoOpen": 1, + "439642fc-998d-4a64-8bb6-940ecaf6b60b.Bubble": 1, + "523b5ef3-0b10-4154-8b62-10b2ebd00921.Bubble": 1, + "64be4f9b-3b81-4b6e-b354-0ba00d6ba485.AutoOpen": 1, + "64be4f9b-3b81-4b6e-b354-0ba00d6ba485.Bubble": 1, + "76b926d6-3738-46bf-82d7-2ab896ddf70b.MM2UpSellPopup.Bubble": 1, + "8682d0fa-50b3-4ece-aa5b-e0b33f9919e2.Bubble": 1, + "8682d0fa-50b3-4ece-aa5b-e0b33f9919e2.f5b8c725-cb2e-4c12-accd-73e500d88d47.AutoOpen": 1, + "8ac719c5-140b-4bf2-a0b7-c71617f1f377.3662f1e2-66ae-464f-b690-e7e3dc4fc662.AutoOpen": 1, + "8ac719c5-140b-4bf2-a0b7-c71617f1f377.93e5b5cd-15fc-4253-9728-d80685da304e.AutoOpen": 1, + "8ac719c5-140b-4bf2-a0b7-c71617f1f377.AutoOpen": 1, + "8ac719c5-140b-4bf2-a0b7-c71617f1f377.gaokao.Bubble": 1, + "92f1b743-e26b-433b-a1ec-912d1f0ad1fa.Bubble": 1, + "96defd79-4015-4a32-bd09-794ff72183ef.0bdde3c3-7be8-49f1-971b-e6e2cfd62643.AutoOpen": 1, + "96defd79-4015-4a32-bd09-794ff72183ef.128c39c6-6f70-4ce5-9d01-78978e60d666.AutoOpen": 1, + "96defd79-4015-4a32-bd09-794ff72183ef.5ac63306-e962-42e6-8313-7e5a5b707d65.AutoOpen": 1, + "96defd79-4015-4a32-bd09-794ff72183ef.AutoOpen": 1, + "96defd79-4015-4a32-bd09-794ff72183ef.Bubble": 1, + "96defd79-4015-4a32-bd09-794ff72183ef.Is1PGameDomain.Bubble": 1, + "96defd79-4015-4a32-bd09-794ff72183ef.Is3PGameDomain.Bubble": 1, + "9ce3c9c2-462f-4cc9-bbd7-57d656445be0.Bubble": 1, + "AUTOFILL_PASSWORD_NON_FUNCTIONAL_FLYOUTS": 1, + "DefaultExperience": 1, + "EdgeDownloadChromeInterceptDialog": 2, + "PerformanceDetectorFeatureNotification": 1, + "RewardsPromotionNotifications": 1, + "RewardsReminderNotifications": 1, + "SAN.Personalization.ConsentPrompt": 1, + "SHOPPING_AA_CONSENT": 1, + "SHOPPING_AUTO_PRODUCT_TRACKING_EXP_PRICE_DROP": 1, + "SHOPPING_AUTO_PRODUCT_TRACKING_IMP_PRICE_DROP": 1, + "SHOPPING_AUTO_PRODUCT_TRACKING_OUT_OF_STOCK": 1, + "SHOPPING_AUTO_SHOW_ABANDONED_CART": 1, + "SHOPPING_AUTO_SHOW_ADD_SPB_TO_CART_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_AMAZON_SEARCH_PC": 1, + "SHOPPING_AUTO_SHOW_ATTAINABLE_COUPONS": 1, + "SHOPPING_AUTO_SHOW_AUTOS_MARKETPLACE": 1, + "SHOPPING_AUTO_SHOW_AWARENESSEXP": 1, + "SHOPPING_AUTO_SHOW_AWARENESS_EXPANSION": 1, + "SHOPPING_AUTO_SHOW_CAMPAIGN_AWARENESS_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_CAMPAIGN_PDP_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_CASHBACK_PDP_PLUS_COUPONS": 1, + "SHOPPING_AUTO_SHOW_CJK_COUPON_FOUND": 1, + "SHOPPING_AUTO_SHOW_CJK_PRICE_DROP": 1, + "SHOPPING_AUTO_SHOW_CODEX_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_CONFIRMATION_SCRIPT": 1, + "SHOPPING_AUTO_SHOW_CONTROLLER": 1, + "SHOPPING_AUTO_SHOW_COUPONS_BACKGROUND_AUTO_APPLY": 1, + "SHOPPING_AUTO_SHOW_COUPONS_CHECKOUT": 1, + "SHOPPING_AUTO_SHOW_COUPONS_CHECKOUT_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_COUPONS_CLIPPING": 1, + "SHOPPING_AUTO_SHOW_DISCOVER_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_DISCOVER_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_EXPRESS_CHECKOUT": 1, + "SHOPPING_AUTO_SHOW_GIFT_CARD": 1, + "SHOPPING_AUTO_SHOW_GOODRX": 1, + "SHOPPING_AUTO_SHOW_GROCERY_ITEMIZED_CASHBACK": 1, + "SHOPPING_AUTO_SHOW_GROCERY_ITEMIZED_CASHBACK_LANDING": 1, + "SHOPPING_AUTO_SHOW_GUEST_DOMAIN_COUPONS": 1, + "SHOPPING_AUTO_SHOW_IBC_UPSELL": 1, + "SHOPPING_AUTO_SHOW_LOWER_PRICE_FOUND": 1, + "SHOPPING_AUTO_SHOW_LOWER_PRICE_PLUS_CASHBACK_PLUS_COUPONS": 1, + "SHOPPING_AUTO_SHOW_MOMENT_IN_TIME": 1, + "SHOPPING_AUTO_SHOW_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_ORGANIC_CASHBACK_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_OTHER_SELLER": 1, + "SHOPPING_AUTO_SHOW_OUT_OF_STOCK": 1, + "SHOPPING_AUTO_SHOW_PACKAGE_TRACKING": 1, + "SHOPPING_AUTO_SHOW_PACKAGE_TRACKING_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_PERSONALIZED_CASHBACK_ADDRESSBAR": 1, + "SHOPPING_AUTO_SHOW_PERSONALIZED_CASHBACK_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_POST_PURCHASE_TRACKING": 1, + "SHOPPING_AUTO_SHOW_PRICE_DROP_PLUS_CASHBACK": 1, + "SHOPPING_AUTO_SHOW_PRICE_DROP_PLUS_COUPONS": 1, + "SHOPPING_AUTO_SHOW_PRICE_HISTORY": 1, + "SHOPPING_AUTO_SHOW_PRICE_HISTORY_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_PRINT_GROCERY": 1, + "SHOPPING_AUTO_SHOW_PRODUCT_BEST_COUPON_CONSENT": 1, + "SHOPPING_AUTO_SHOW_PRODUCT_TRACKING_BACK_IN_STOCK": 1, + "SHOPPING_AUTO_SHOW_PRODUCT_TRACKING_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_PROFESSIONAL_REVIEWS": 1, + "SHOPPING_AUTO_SHOW_REBATES": 1, + "SHOPPING_AUTO_SHOW_REBATES_CHECKOUT": 1, + "SHOPPING_AUTO_SHOW_REBATES_ORGANIC": 1, + "SHOPPING_AUTO_SHOW_REBATES_ORGANIC_NEW": 1, + "SHOPPING_AUTO_SHOW_REBATES_PDP": 1, + "SHOPPING_AUTO_SHOW_RECOMMENDATIONS_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_SAN_CONSENT_CONFIRMATION": 1, + "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_ALL_PAGES": 1, + "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_CHECKOUT": 1, + "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_CONFIRMATION_PAGE": 1, + "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_HOME_PAGE": 1, + "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_REWARDS": 1, + "SHOPPING_AUTO_SHOW_SHOPRUNNER": 1, + "SHOPPING_AUTO_SHOW_SIDEPANE_CASHBACK_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_SPB_CASHBACK_LANDING": 1, + "SHOPPING_AUTO_SHOW_SPB_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_SPB_NUDGE_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_SURFACE_UPSELL": 1, + "SHOPPING_AUTO_SHOW_SUSTAINABILITY_LANDING": 1, + "SHOPPING_AUTO_SHOW_TRAVEL_NOTIFICATION_CHEAPER_FLIGHTS": 1, + "SHOPPING_AUTO_SHOW_TRAVEL_NOTIFICATION_CHEAPER_HOTEL_ROOM": 1, + "SHOPPING_AUTO_SHOW_TRENDING_COUPONS": 1, + "ShorelinePrivilegedExperienceID": 1, + "TabActionsMenuVerticalTabsPromotion": 1, + "VPNFeatureNotification": 1, + "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.75a774c2-6075-ae4f-09f9-e5f5d9bef6e1.AutoOpen": 1, + "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.AutoOpen": 1, + "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.a5e9f5e1-fcee-c07b-2c44-b707ded020a3.AutoOpen": 1, + "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.c8ebbf64-e3b8-41d9-925f-4e3754151ff7.AutoOpen": 1, + "bc25fcef-8964-4e72-8287-23e2b496c128.68b8a884-6e08-46e6-8a3b-7e06ffe48ecf.AutoOpen": 1, + "bc25fcef-8964-4e72-8287-23e2b496c128.Bubble": 1, + "c8ebd871-9f47-4a0d-abd3-c1c02b4f8f53.2cfab14c-ebd6-4548-9401-30ab5afe5061.AutoOpen": 1, + "c8ebd871-9f47-4a0d-abd3-c1c02b4f8f53.AutoOpen": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.5b853177-a0be-4237-bda0-4fce5cd165c2.AutoOpen": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.8d3a928d-e911-40f0-9852-f63f6434dc7e.AutoOpen": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.AutoOpen": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.AutoOpen.PDF": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.AutoOpen.PersistentChat": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsCompeteAISite.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsCopilotJitEduAcademicAI.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsCopilotJitEduArticleAI.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsCopilotJitEduStudyAI.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsKnowledgeCardQuery.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsMsnArticleUrlFromNtpP1P2.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsShoppingNotificationNudge.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsTextPage.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsTopNewsDomain.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsTwitchNonStreamPage.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsTwitchSubPage.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsVideoPage.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.e06e75c1-a59a-4ab6-8361-e8b038e00a8c.AutoOpen": 1, + "e6723537-66ff-4f4e-ab56-a4cbaddf4e0f.MM2UpSellPopup.Bubble": 1 + } + }, + "FunctionalCohort": [ "EdgeDownloadChromeInterceptFunctionalDialog", "8682d0fa-50b3-4ece-aa5b-e0b33f9919e2.AutoOpen.Functional", "8682d0fa-50b3-4ece-aa5b-e0b33f9919e2.f5b8c725-cb2e-4c12-accd-73e500d88d47.AutoOpen.Functional", "bc25fcef-8964-4e72-8287-23e2b496c128.AutoOpen.Functional", "bc25fcef-8964-4e72-8287-23e2b496c128.68b8a884-6e08-46e6-8a3b-7e06ffe48ecf.AutoOpen.Functional", "WPOFunctionalEvent.AutofillAccountChooser.Bubble", "WPOFunctionalEvent.AutofillAutoSignin.Bubble", "WPOFunctionalEvent.AutofillPassword.Bubble", "SHOPPING_AUTO_SHOW_BING_SEARCH", "SHOPPING_AUTO_SHOW_REBATES_CONFIRMATION", "SHOPPING_AUTO_SHOW_REBATES_DEACTIVATED", "SHOPPING_AUTO_SHOW_REBATES_BING", "SHOPPING_AUTO_SHOW_PERSONALIZED_CASHBACK", "SHOPPING_AUTO_SHOW_PERSONALIZED_CASHBACK_CONFIRMATION", "SHOPPING_AUTO_SHOW_URL_PARAM_REBATES", "SHOPPING_AUTO_SHOW_URL_PARAM_PRICE_COMPARISON", "SHOPPING_AUTO_SHOW_URL_PARAM_PRICE_HISTORY", "SHOPPING_AUTO_SHOW_REBATES_ACTIVATION_FAILED", "SHOPPING_AUTO_SHOW_REBATES_SWITCHED_TO_MSA", "SHOPPING_AUTO_SHOW_ITEM_ADDED_TO_CART_FROM_OTHER_SELLER", "SHOPPING_AUTO_SHOW_VIRTUAL_CARD", "SHOPPING_AUTO_SHOW_BING_CAMPAIGN", "SHOPPING_OPEN_FLYOUT_FROM_EDGE_DRIVER", "SHOPPING_AUTO_SHOW_SUSTAINABILITY_PURCHASE", "SHOPPING_AUTO_SHOW_REWARDS_ACTIVATION_FAILED", "SHOPPING_AUTO_SHOW_REWARDS_SWITCHED_TO_MSA", "SHOPPING_AUTO_SHOW_SHOPRUNNER_CONFIRMATION", "SHOPPING_AUTO_SHOW_ENROLL_TO_CASHBACK_CONFIRMATION_NOTIFICATION", "SHOPPING_AUTO_SHOW_POST_PURCHASE_REWARDS_NOTIFICATION", "694efa4f-a304-4214-aaf7-90444bc887f5.c1c025d9-a620-4f6b-bebb-eff0cf19a671.AutoOpen.Functional" ], + "GlobalSuppressedExperiences": [ "Teams.Bubble", "Nurturing.Global.EdgeVpn_VpnFre", "Nurturing.Global.Rewards_RedemptionCoachmark_2", "Nurturing.Global.Rewards_RedemptionCoachmark_25", "Nurturing.Global.EdgeCBUD_SanPersonalizationConsentWave1Variant0", "Nurturing.Global.Bing_NewBingChatFlyout", "Copilot.AutoOpen.PDF.v2", "Nurturing.Global.PWA_SidebarSearchPromotion", "Nurturing.Global.FC_NetworkWarningFlyout", "Nurturing.Global.EdgeMobile_MobileUpsell_ChatGpt_Flyout", "E-tree.Bubble", "Nurturing.Global.EdgeEDU_BrowserFocusedTranslateNudge", "Games.Bubble", "Nurturing.Global.OnRamp_RetriggerFRECodexCoPilotAutoAprd", "Nurturing.Global.OnRamp_NurturingViaProng_Experiment", "Nurturing.Global.OnRamp_ReTriggerOnWinUpgrade", "Nurturing.Global.EdgeGrowth_CIShoppingUpsell", "Nurturing.Global.Shopping_EnableShoppingAssistance_Optin_Generic", "Nurturing.Global.Shopping_EnableShoppingAssistance", "Nurturing.Global.BrowserExperiences_TryVerticalTabs" ], + "IgnoredFunctionalNotifications": [ "Nurturing.Functional.NTP_CourtesyEngineCampaign", "Nurturing.Functional.NTP_FunctionalCampaign", "Nurturing.Functional.NTP_SettingsCampaign", "Nurturing.Functional.NTP_UpsellCampaign", "Nurturing.Functional.FN_SmartSwitchFeatureInfoView" ], + "ModelInfo": { + "segment_id": 515, + "signals": [ "notification_triggered_count", "notification_click_rate", "notification_click_rate_lower_ci", "notification_click_rate_upper_ci", "notification_dismiss_rate", "notification_dismiss_rate_lower_ci", "notification_dismiss_rate_upper_ci", "notification_ignored_rate", "notification_ignored_rate_lower_ci", "notification_ignored_rate_upper_ci", "notification_quick_dismiss_rate", "notification_quick_dismiss_rate_lower_ci", "notification_quick_dismiss_rate_upper_ci", "notification_disable_rate", "notification_disable_rate_lower_ci", "notification_disable_rate_upper_ci", "notification_snooze_rate", "notification_snooze_rate_lower_ci", "notification_snooze_rate_upper_ci" ], + "threshold_value": 0.5 + }, + "ModelSuppressionBypass": [ "Nurturing.Local.SHOPPING_AUTO_SHOW_LOWER_PRICE_FOUND", "Nurturing.Local.SHOPPING_AUTO_SHOW_REBATES_ORGANIC", "Nurturing.Local.SHOPPING_AUTO_SHOW_REBATES_CHECKOUT", "Nurturing.Local.SHOPPING_AUTO_SHOW_SPB_CASHBACK_LANDING" ], + "NotificationsAllowLists": { + }, + "PrivilegedExperiences": [ "ShorelinePrivilegedExperienceID", "SHOPPING_AUTO_SHOW_COUPONS_CHECKOUT", "SHOPPING_AUTO_SHOW_LOWER_PRICE_FOUND", "SHOPPING_AUTO_SHOW_REBATES", "SHOPPING_AUTO_SHOW_REBATES_ORGANIC", "SHOPPING_AUTO_SHOW_PRICE_HISTORY", "SHOPPING_AUTO_SHOW_REBATES_ORGANIC_NEW", "SHOPPING_AUTO_SHOW_REBATES_CHECKOUT", "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_CHECKOUT", "SHOPPING_AUTO_SHOW_EXPRESS_CHECKOUT", "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_ALL_PAGES", "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_CONFIRMATION_PAGE", "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_HOME_PAGE", "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_REWARDS", "SHOPPING_AUTO_SHOW_COUPONS_CLIPPING", "SHOPPING_AUTO_SHOW_NOTIFICATION", "SHOPPING_AUTO_SHOW_OTHER_SELLER", "SHOPPING_AUTO_SHOW_PROFESSIONAL_REVIEWS", "SHOPPING_AUTO_SHOW_PACKAGE_TRACKING", "SHOPPING_AUTO_SHOW_GUEST_DOMAIN_COUPONS", "SHOPPING_AUTO_SHOW_SUSTAINABILITY_LANDING", "SHOPPING_AUTO_SHOW_ATTAINABLE_COUPONS", "SHOPPING_AUTO_SHOW_GIFT_CARD", "SHOPPING_AUTO_SHOW_PRINT_GROCERY", "SHOPPING_AUTO_SHOW_GROCERY_ITEMIZED_CASHBACK", "SHOPPING_AUTO_SHOW_CONTROLLER", "SHOPPING_AUTO_SHOW_AUTOS_MARKETPLACE", "SHOPPING_AUTO_SHOW_SHOPRUNNER", "SHOPPING_AUTO_SHOW_ABANDONED_CART", "SHOPPING_AUTO_SHOW_OUT_OF_STOCK", "SHOPPING_AUTO_SHOW_GROCERY_ITEMIZED_CASHBACK_LANDING", "SHOPPING_AUTO_SHOW_SPB_CASHBACK_LANDING", "SHOPPING_AUTO_SHOW_AWARENESSEXP", "SHOPPING_AA_CONSENT", "SHOPPING_AUTO_SHOW_SAN_CONSENT_CONFIRMATION", "SHOPPING_AUTO_SHOW_CONFIRMATION_SCRIPT", "SHOPPING_AUTO_SHOW_MOMENT_IN_TIME", "SHOPPING_AUTO_SHOW_COUPONS_CHECKOUT_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_TRENDING_COUPONS", "SHOPPING_AUTO_SHOW_RECOMMENDATIONS_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_PRODUCT_TRACKING_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_SURFACE_UPSELL", "SHOPPING_AUTO_SHOW_PRODUCT_TRACKING_BACK_IN_STOCK", "SHOPPING_AUTO_PRODUCT_TRACKING_EXP_PRICE_DROP", "SHOPPING_AUTO_PRODUCT_TRACKING_IMP_PRICE_DROP", "SHOPPING_AUTO_PRODUCT_TRACKING_OUT_OF_STOCK", "SHOPPING_AUTO_SHOW_CODEX_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_PERSONALIZED_CASHBACK_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_PRICE_HISTORY_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_ORGANIC_CASHBACK_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_GOODRX", "SHOPPING_AUTO_SHOW_SIDEPANE_CASHBACK_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_DISCOVER_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_REBATES_PDP", "SHOPPING_AUTO_SHOW_PRODUCT_BEST_COUPON_CONSENT", "SHOPPING_AUTO_SHOW_CAMPAIGN_PDP_NOTIFICATION", "SHOPPING_AUTO_SHOW_CAMPAIGN_AWARENESS_NOTIFICATION", "SHOPPING_AUTO_SHOW_SPB_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_PRICE_DROP_PLUS_COUPONS", "SHOPPING_AUTO_SHOW_SPB_NUDGE_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_ADD_SPB_TO_CART_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_CASHBACK_PDP_PLUS_COUPONS", "SHOPPING_AUTO_SHOW_PRICE_DROP_PLUS_CASHBACK", "SHOPPING_AUTO_SHOW_DISCOVER_NOTIFICATION", "SHOPPING_AUTO_SHOW_AMAZON_SEARCH_PC", "SHOPPING_AUTO_SHOW_COUPONS_BACKGROUND_AUTO_APPLY", "SHOPPING_AUTO_SHOW_PERSONALIZED_CASHBACK_ADDRESSBAR", "SHOPPING_AUTO_SHOW_TRAVEL_NOTIFICATION_CHEAPER_FLIGHTS", "SHOPPING_AUTO_SHOW_TRAVEL_NOTIFICATION_CHEAPER_HOTEL_ROOM", "SHOPPING_AUTO_SHOW_CJK_PRICE_DROP", "SHOPPING_AUTO_SHOW_CJK_COUPON_FOUND", "AUTOFILL_PASSWORD_NON_FUNCTIONAL_FLYOUTS", "76b926d6-3738-46bf-82d7-2ab896ddf70b.MM2UpSellPopup.Bubble", "e6723537-66ff-4f4e-ab56-a4cbaddf4e0f.MM2UpSellPopup.Bubble", "8ac719c5-140b-4bf2-a0b7-c71617f1f377.3662f1e2-66ae-464f-b690-e7e3dc4fc662.AutoOpen", "8ac719c5-140b-4bf2-a0b7-c71617f1f377.gaokao.Bubble", "c8ebd871-9f47-4a0d-abd3-c1c02b4f8f53.AutoOpen", "c8ebd871-9f47-4a0d-abd3-c1c02b4f8f53.2cfab14c-ebd6-4548-9401-30ab5afe5061.AutoOpen", "cd4688a9-e888-48ea-ad81-76193d56b1be.AutoOpen.PersistentChat", "cd4688a9-e888-48ea-ad81-76193d56b1be.AutoOpen.PDF", "cd4688a9-e888-48ea-ad81-76193d56b1be.8d3a928d-e911-40f0-9852-f63f6434dc7e.AutoOpen", "cd4688a9-e888-48ea-ad81-76193d56b1be.e06e75c1-a59a-4ab6-8361-e8b038e00a8c.AutoOpen", "cd4688a9-e888-48ea-ad81-76193d56b1be.5b853177-a0be-4237-bda0-4fce5cd165c2.AutoOpen", "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.AutoOpen", "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.c8ebbf64-e3b8-41d9-925f-4e3754151ff7.AutoOpen", "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.75a774c2-6075-ae4f-09f9-e5f5d9bef6e1.AutoOpen", "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.a5e9f5e1-fcee-c07b-2c44-b707ded020a3.AutoOpen", "8682d0fa-50b3-4ece-aa5b-e0b33f9919e2.f5b8c725-cb2e-4c12-accd-73e500d88d47.AutoOpen", "bc25fcef-8964-4e72-8287-23e2b496c128.68b8a884-6e08-46e6-8a3b-7e06ffe48ecf.AutoOpen", "EdgeDownloadChromeInterceptDialog", "439642fc-998d-4a64-8bb6-940ecaf6b60b.AutoOpen", "694efa4f-a304-4214-aaf7-90444bc887f5.c1c025d9-a620-4f6b-bebb-eff0cf19a671.AutoOpen" ], + "ReserveApproved": { + "ExperienceIDs": [ "Nurturing.Global.Edge_SpawnNtpOptIn", "Nurturing.Global.Edge_SpawnNtpOptOut" ], + "SourceIDs": [ 3 ], + "TeamIDs": [ "Edge Consumer Content and Verticals" ] + }, + "ScenarioSuppressLists": { + }, + "SuppressedExperiences": [ ], + "TimeDelta": 5000000, + "baseConfigVersion": "40.0.1", + "configVersion": "40.0.1" +} diff --git a/.edge-profile-render-1774474724122/Default/commerce_subscription_db/LOCK b/.edge-profile-render-1774474724122/Default/commerce_subscription_db/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474724122/Default/commerce_subscription_db/LOG b/.edge-profile-render-1774474724122/Default/commerce_subscription_db/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474724122/Default/discount_infos_db/LOCK b/.edge-profile-render-1774474724122/Default/discount_infos_db/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474724122/Default/discount_infos_db/LOG b/.edge-profile-render-1774474724122/Default/discount_infos_db/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474724122/Default/discounts_db/LOCK b/.edge-profile-render-1774474724122/Default/discounts_db/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474724122/Default/discounts_db/LOG b/.edge-profile-render-1774474724122/Default/discounts_db/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474724122/Default/load_statistics.db b/.edge-profile-render-1774474724122/Default/load_statistics.db new file mode 100644 index 0000000..4410bda Binary files /dev/null and b/.edge-profile-render-1774474724122/Default/load_statistics.db differ diff --git a/.edge-profile-render-1774474724122/Default/load_statistics.db-shm b/.edge-profile-render-1774474724122/Default/load_statistics.db-shm new file mode 100644 index 0000000..f29458a Binary files /dev/null and b/.edge-profile-render-1774474724122/Default/load_statistics.db-shm differ diff --git a/.edge-profile-render-1774474724122/Default/load_statistics.db-wal b/.edge-profile-render-1774474724122/Default/load_statistics.db-wal new file mode 100644 index 0000000..fc69f0a Binary files /dev/null and b/.edge-profile-render-1774474724122/Default/load_statistics.db-wal differ diff --git a/.edge-profile-render-1774474724122/Default/parcel_tracking_db/LOCK b/.edge-profile-render-1774474724122/Default/parcel_tracking_db/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474724122/Default/parcel_tracking_db/LOG b/.edge-profile-render-1774474724122/Default/parcel_tracking_db/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474724122/Default/shared_proto_db/CURRENT b/.edge-profile-render-1774474724122/Default/shared_proto_db/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile-render-1774474724122/Default/shared_proto_db/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile-render-1774474724122/Default/shared_proto_db/LOCK b/.edge-profile-render-1774474724122/Default/shared_proto_db/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474724122/Default/shared_proto_db/LOG b/.edge-profile-render-1774474724122/Default/shared_proto_db/LOG new file mode 100644 index 0000000..9ec4a15 --- /dev/null +++ b/.edge-profile-render-1774474724122/Default/shared_proto_db/LOG @@ -0,0 +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 diff --git a/.edge-profile-render-1774474724122/Default/shared_proto_db/MANIFEST-000001 b/.edge-profile-render-1774474724122/Default/shared_proto_db/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile-render-1774474724122/Default/shared_proto_db/MANIFEST-000001 differ diff --git a/.edge-profile-render-1774474724122/Default/shared_proto_db/metadata/CURRENT b/.edge-profile-render-1774474724122/Default/shared_proto_db/metadata/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile-render-1774474724122/Default/shared_proto_db/metadata/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile-render-1774474724122/Default/shared_proto_db/metadata/LOCK b/.edge-profile-render-1774474724122/Default/shared_proto_db/metadata/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474724122/Default/shared_proto_db/metadata/LOG b/.edge-profile-render-1774474724122/Default/shared_proto_db/metadata/LOG new file mode 100644 index 0000000..4d4c8a1 --- /dev/null +++ b/.edge-profile-render-1774474724122/Default/shared_proto_db/metadata/LOG @@ -0,0 +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 diff --git a/.edge-profile-render-1774474724122/Default/shared_proto_db/metadata/MANIFEST-000001 b/.edge-profile-render-1774474724122/Default/shared_proto_db/metadata/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile-render-1774474724122/Default/shared_proto_db/metadata/MANIFEST-000001 differ diff --git a/.edge-profile-render-1774474724122/FirstLaunchAfterInstallation b/.edge-profile-render-1774474724122/FirstLaunchAfterInstallation new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474724122/Last Version b/.edge-profile-render-1774474724122/Last Version new file mode 100644 index 0000000..a887bff --- /dev/null +++ b/.edge-profile-render-1774474724122/Last Version @@ -0,0 +1 @@ +146.0.3856.72 \ No newline at end of file diff --git a/.edge-profile-render-1774474724122/Local State b/.edge-profile-render-1774474724122/Local State new file mode 100644 index 0000000..ecde8a2 --- /dev/null +++ b/.edge-profile-render-1774474724122/Local State @@ -0,0 +1 @@ +{"breadcrumbs":{"enabled":true,"enabled_time":"13418948325689413"},"edge":{"app_user_model_id":"MSEdge","perf_center":{"efficiency_mode_v2_is_active":false,"performance_mode":3,"performance_mode_is_on":false},"retrigger_features":[],"tab_stabs":{"closed_without_unfreeze_never_unfrozen":0,"closed_without_unfreeze_previously_unfrozen":0,"discard_without_unfreeze_never_unfrozen":0,"discard_without_unfreeze_previously_unfrozen":0},"tab_stats":{"frozen_daily":0,"unfrozen_daily":0}},"edge_copilot_mode_enabled_state":{"Default":{"enabled":false,"last_set":"13418948325948174"}},"hardware_acceleration_mode_previous":true,"legacy":{"profile":{"name":{"migrated":true}}},"local":{"password_hash_data_list":[]},"metrics":{"client_id_hash_key_created":true},"optimization_guide":{"model_execution":{"last_usage_by_feature":{}},"model_store_metadata":{},"on_device":{"last_version":"146.0.3856.72","model_crash_count":0}},"os_crypt":{"audit_enabled":true,"encrypted_key":"RFBBUEkBAAAA0Iyd3wEV0RGMegDAT8KX6wEAAAAn89AMc7fOSbvGLGpOq+9IEAAAAB4AAABNAGkAYwByAG8AcwBvAGYAdAAgAEUAZABnAGUAAAAQZgAAAAEAACAAAAB6hXHa2ASAo3yVX//QTAEmPNtDvPlwiT2NBwQgP7MwxAAAAAAOgAAAAAIAACAAAABSQNqesMJMp0kzjnl0d9Ta0R4TOJAGjLZ98r84Fn1bNTAAAAAxTFBko1nZbJdaNQEvnezpxhl/ABtjztOvExNu/ozLVq/qAuRnkMC+HXDR/qJKUtpAAAAA8evEQ/sj2FWPC2KvNRtxOxGi0hQOWvLOFEUfHSDSSQ3L4G98XmOGVnDQzau9icwdNZqksrL5E4hTGRtarNuifA=="},"policy":{"last_statistics_update":"13418948325684267"},"profile":{"info_cache":{"Default":{"avatar_icon":"chrome://theme/IDR_PROFILE_AVATAR_20","background_apps":false,"edge_account_cid":"","edge_account_environment":0,"edge_account_environment_string":"","edge_account_first_name":"","edge_account_last_name":"","edge_account_oid":"","edge_account_sovereignty":0,"edge_account_tenant_id":"","edge_account_type":0,"edge_create_profile_shortcut":false,"edge_profile_can_be_deleted":true,"edge_profile_can_be_edited":true,"edge_test_on_premises":false,"edge_wam_aad_for_app_account_type":0,"force_signin_profile_locked":false,"gaia_id":"","is_consented_primary_account":false,"is_ephemeral":false,"is_using_default_avatar":true,"is_using_default_name":true,"managed_user_id":"","name":"Profile 1","signin.with_credential_provider":false,"user_name":""}},"profile_counts_reported":"13418948325462333","profiles_order":["Default"]},"profile_network_context_service":{"http_cache_finch_experiment_groups":"None None None None"},"profiles":{"edge":{"multiple_profiles_with_same_account":false},"edge_sso_info":{"aad_sso_algo_state":1,"first_profile_key":"Default","msa_first_profile_key":"Default","msa_sso_algo_state":1},"signin_last_seen_version":"146.0.3856.72","signin_last_updated_time":1774474726.265318},"sentinel_creation_time":"0","session_id_generator_last_value":"29644982","signin":{"active_accounts_last_emitted":"13418948325455712"},"startup_boost":{"last_browser_open_time":"13418948325606958"},"subresource_filter":{"ruleset_version":{"checksum":0,"content":"","format":0}},"tab_stats":{"discards_expired":0,"discards_external":0,"discards_proactive":0,"discards_urgent":0,"last_daily_sample":"13418948325651844","reloads_expired":0,"reloads_external":0,"reloads_urgent":0},"telemetry_client":{"governance":{"last_dma_change_date":"13418948325638280","last_known_cps":2048},"install_source_name":"windows","os_integration_level":5,"sample_id":80134458,"updater_version":"1.3.225.7","windows_update_applied":false},"ukm":{"persisted_logs":[]},"uninstall_metrics":{"installation_date2":"1774474724"},"user_experience_metrics":{"client_id2":"0d60e666-6f8e-4f60-9994-6b8e43699169","diagnostics":{"last_data_collection_level_on_launch":1},"last_seen":{"CrashpadMetrics":"0"},"limited_entropy_randomization_source":"60C63DFDA651483C37AD97FD9FE0AAF1","log_record_id":1,"low_entropy_source3":4189,"payload_counter":1,"pseudo_low_entropy_source":7694,"session_id":0,"stability":{"browser_last_live_timestamp":"13418948324609196","saved_system_profile":"CJ2l8s0GEhAxNDYuMC4zODU2LjcyLTY0GAAiBWVuLVVTKhgKCldpbmRvd3MgTlQSCjEwLjAuMjYyMDAybQoGeDg2XzY0EIdfGICAjNGN/x8iE0hQIExhcHRvcCAxNy1ieTB4eHgoATCgBjjYBEIKCAAQABoAMgA6AGUAAIA/ahgKDEdlbnVpbmVJbnRlbBDqjSAYCCABKACCAQCKAQCqAQZ4ODZfNjSwAQFKCg3ZeE7NFV5v0thKCg1sO7s6FV5v0thKCg1Ak3CxFV5v0thKCg0T5AAxFV5v0thKCg1ZIj2uFV5v0thKCg0XBxSpFV5v0thKCg0T2ptcFV5v0thKCg2Q6as/FV5v0thKCg1DO2FuFV5v0thQBGIESU5CWGoICAAQADgAQACAAdCZkc4GmAEA+AHdIIAC////////////AYgCAagCjjyyAjDRJfNWC4+9L/K351oQADyTN0RE6rqF3y+rE8bwOQvdoidEg0lfDgvA6BJXNkzzDV3xAn9nfbtKEJ/0yj7nAgoECAAQABIIIgQIAhACKAEiAggCMgYIACIAKgA6Cwjz///v9/////8BQigSCTEuMy4yMjUuNxgFIAAqDlJlZ0tleU5vdEZvdW5kMgd3aW5kb3dzUgIIAFr8AQkEVg4tst0zQBGmm8QgsKpXQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAADwPxkAAAAAAADwPxkAAAAAAAAAABkAAAAAAADwPxkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAAAAABkAAAAAAABZQBkAAAAAAADwPxkAAAAAAABZQBkAAAAAAADwPxkAAAAAAADwPxkAAAAAAAA0QBkAAAAAAADwPxkAAAAAAABZQBkAAAAAAABZQHoCCAGCAQIYAKoBAgoAsAEA","saved_system_profile_hash":"B57397D00B908A3F57A55028D527DC42BCFD6255","stats_buildtime":"1773965981","stats_version":"146.0.3856.72-64","system_crash_count":0}},"variations_google_groups":{"Default":[]},"was":{"restarted":false}} \ No newline at end of file diff --git a/.edge-profile-render-1774474724122/Nurturing/campaign_history b/.edge-profile-render-1774474724122/Nurturing/campaign_history new file mode 100644 index 0000000..eab8517 Binary files /dev/null and b/.edge-profile-render-1774474724122/Nurturing/campaign_history differ diff --git a/.edge-profile-render-1774474724122/Nurturing/campaign_history-journal b/.edge-profile-render-1774474724122/Nurturing/campaign_history-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474724122/ShaderCache/data_0 b/.edge-profile-render-1774474724122/ShaderCache/data_0 new file mode 100644 index 0000000..d76fb77 Binary files /dev/null and b/.edge-profile-render-1774474724122/ShaderCache/data_0 differ diff --git a/.edge-profile-render-1774474724122/ShaderCache/data_1 b/.edge-profile-render-1774474724122/ShaderCache/data_1 new file mode 100644 index 0000000..035d06d Binary files /dev/null and b/.edge-profile-render-1774474724122/ShaderCache/data_1 differ diff --git a/.edge-profile-render-1774474724122/ShaderCache/data_2 b/.edge-profile-render-1774474724122/ShaderCache/data_2 new file mode 100644 index 0000000..c7e2eb9 Binary files /dev/null and b/.edge-profile-render-1774474724122/ShaderCache/data_2 differ diff --git a/.edge-profile-render-1774474724122/ShaderCache/data_3 b/.edge-profile-render-1774474724122/ShaderCache/data_3 new file mode 100644 index 0000000..5eec973 Binary files /dev/null and b/.edge-profile-render-1774474724122/ShaderCache/data_3 differ diff --git a/.edge-profile-render-1774474724122/ShaderCache/index b/.edge-profile-render-1774474724122/ShaderCache/index new file mode 100644 index 0000000..15408e5 Binary files /dev/null and b/.edge-profile-render-1774474724122/ShaderCache/index differ diff --git a/.edge-profile-render-1774474724122/SmartScreen/RemoteData/customSettings b/.edge-profile-render-1774474724122/SmartScreen/RemoteData/customSettings new file mode 100644 index 0000000..997f02d --- /dev/null +++ b/.edge-profile-render-1774474724122/SmartScreen/RemoteData/customSettings @@ -0,0 +1 @@ +customSettings_F95BA787499AB4FA9EFFF472CE383A14 \ No newline at end of file diff --git a/.edge-profile-render-1774474724122/SmartScreen/RemoteData/customSettings_F95BA787499AB4FA9EFFF472CE383A14 b/.edge-profile-render-1774474724122/SmartScreen/RemoteData/customSettings_F95BA787499AB4FA9EFFF472CE383A14 new file mode 100644 index 0000000..ae2fefa --- /dev/null +++ b/.edge-profile-render-1774474724122/SmartScreen/RemoteData/customSettings_F95BA787499AB4FA9EFFF472CE383A14 @@ -0,0 +1 @@ +{"forceServiceDetermination":false} \ No newline at end of file diff --git a/.edge-profile-render-1774474724122/Variations b/.edge-profile-render-1774474724122/Variations new file mode 100644 index 0000000..a157215 --- /dev/null +++ b/.edge-profile-render-1774474724122/Variations @@ -0,0 +1 @@ +{"user_experience_metrics.stability.exited_cleanly":false,"variations_crash_streak":0} \ No newline at end of file diff --git a/.edge-profile-render-1774474761516/Crashpad/metadata b/.edge-profile-render-1774474761516/Crashpad/metadata new file mode 100644 index 0000000..44d22a5 Binary files /dev/null and b/.edge-profile-render-1774474761516/Crashpad/metadata differ diff --git a/.edge-profile-render-1774474761516/Crashpad/reports/cdd3c811-db91-4e79-85e9-5d3bc70b67ee.dmp b/.edge-profile-render-1774474761516/Crashpad/reports/cdd3c811-db91-4e79-85e9-5d3bc70b67ee.dmp new file mode 100644 index 0000000..88d6cad Binary files /dev/null and b/.edge-profile-render-1774474761516/Crashpad/reports/cdd3c811-db91-4e79-85e9-5d3bc70b67ee.dmp differ diff --git a/.edge-profile-render-1774474761516/Crashpad/settings.dat b/.edge-profile-render-1774474761516/Crashpad/settings.dat new file mode 100644 index 0000000..d0df0a9 Binary files /dev/null and b/.edge-profile-render-1774474761516/Crashpad/settings.dat differ diff --git a/.edge-profile-render-1774474761516/Crashpad/throttle_store.dat b/.edge-profile-render-1774474761516/Crashpad/throttle_store.dat new file mode 100644 index 0000000..9639e1b --- /dev/null +++ b/.edge-profile-render-1774474761516/Crashpad/throttle_store.dat @@ -0,0 +1 @@ +level=none expiry=0 diff --git a/.edge-profile-render-1774474761516/Local State b/.edge-profile-render-1774474761516/Local State new file mode 100644 index 0000000..331b1d8 --- /dev/null +++ b/.edge-profile-render-1774474761516/Local State @@ -0,0 +1 @@ +{"edge":{"perf_center":{"efficiency_mode_v2_is_active":false,"performance_mode":3,"performance_mode_is_on":false},"retrigger_features":[]},"legacy":{"profile":{"name":{"migrated":true}}},"metrics":{"client_id_hash_key_created":true},"os_crypt":{"audit_enabled":true,"encrypted_key":"RFBBUEkBAAAA0Iyd3wEV0RGMegDAT8KX6wEAAAAn89AMc7fOSbvGLGpOq+9IEAAAAB4AAABNAGkAYwByAG8AcwBvAGYAdAAgAEUAZABnAGUAAAAQZgAAAAEAACAAAAC3O5fLfOXXhzp391EuXKJZQzGgmMlylvSUAuUyW4CnEQAAAAAOgAAAAAIAACAAAAAKCR+N99fQt0x7AEFR9ORTVMmhnP2Uc+f41mkaJoTM/zAAAABsn5zZjeTCuHw5rn0LYi7XzDvy7anmrnGL2GzuUdgST6rA9IFZNPe9ANBBfyPZqaVAAAAAqfJSG/CTrrC1l0j3YrhJegAi/tRBXWvKwzXH9+NOzMlxfi8Y0mW8TL1fUisSM+xEQYHO+nqV4HiEc8SyIXNIQQ=="},"profile":{"info_cache":{},"profile_counts_reported":"13418948363068231","profiles_order":[]},"signin":{"active_accounts_last_emitted":"13418948363061376"},"startup_boost":{"last_browser_open_time":"13418948363205259"},"telemetry_client":{"governance":{"last_dma_change_date":"13418948363228251","last_known_cps":2048},"install_source_name":"windows","os_integration_level":5,"updater_version":"1.3.225.7","windows_update_applied":false},"uninstall_metrics":{"installation_date2":"1774474762"},"user_experience_metrics":{"client_id2":"5cc632cb-1064-4bee-bf84-3eb80950fbfa","diagnostics":{"last_data_collection_level_on_launch":1},"last_seen":{"CrashpadMetrics":"0"},"limited_entropy_randomization_source":"E92336994E7F2057EE1559A7E6A86D0F","low_entropy_source3":1203,"pseudo_low_entropy_source":419,"stability":{"browser_last_live_timestamp":"13418948362227091","stats_buildtime":"1773965981","stats_version":"146.0.3856.72-64","system_crash_count":0}}} \ No newline at end of file diff --git a/.edge-profile-render-1774474761516/Variations b/.edge-profile-render-1774474761516/Variations new file mode 100644 index 0000000..a157215 --- /dev/null +++ b/.edge-profile-render-1774474761516/Variations @@ -0,0 +1 @@ +{"user_experience_metrics.stability.exited_cleanly":false,"variations_crash_streak":0} \ No newline at end of file diff --git a/.edge-profile-render-1774474922711/Crashpad/metadata b/.edge-profile-render-1774474922711/Crashpad/metadata new file mode 100644 index 0000000..640ee88 Binary files /dev/null and b/.edge-profile-render-1774474922711/Crashpad/metadata differ diff --git a/.edge-profile-render-1774474922711/Crashpad/reports/7c0fc618-c13b-44a4-a6fa-1aa349e7abb3.dmp b/.edge-profile-render-1774474922711/Crashpad/reports/7c0fc618-c13b-44a4-a6fa-1aa349e7abb3.dmp new file mode 100644 index 0000000..a135bdf Binary files /dev/null and b/.edge-profile-render-1774474922711/Crashpad/reports/7c0fc618-c13b-44a4-a6fa-1aa349e7abb3.dmp differ diff --git a/.edge-profile-render-1774474922711/Crashpad/settings.dat b/.edge-profile-render-1774474922711/Crashpad/settings.dat new file mode 100644 index 0000000..694f79e Binary files /dev/null and b/.edge-profile-render-1774474922711/Crashpad/settings.dat differ diff --git a/.edge-profile-render-1774474922711/Crashpad/throttle_store.dat b/.edge-profile-render-1774474922711/Crashpad/throttle_store.dat new file mode 100644 index 0000000..9639e1b --- /dev/null +++ b/.edge-profile-render-1774474922711/Crashpad/throttle_store.dat @@ -0,0 +1 @@ +level=none expiry=0 diff --git a/.edge-profile-render-1774474922711/Default/AutofillAiModelCache/LOCK b/.edge-profile-render-1774474922711/Default/AutofillAiModelCache/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Default/AutofillAiModelCache/LOG b/.edge-profile-render-1774474922711/Default/AutofillAiModelCache/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Default/AutofillStrikeDatabase/LOCK b/.edge-profile-render-1774474922711/Default/AutofillStrikeDatabase/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Default/AutofillStrikeDatabase/LOG b/.edge-profile-render-1774474922711/Default/AutofillStrikeDatabase/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Default/BookmarkMergedSurfaceOrdering b/.edge-profile-render-1774474922711/Default/BookmarkMergedSurfaceOrdering new file mode 100644 index 0000000..f3ee419 --- /dev/null +++ b/.edge-profile-render-1774474922711/Default/BookmarkMergedSurfaceOrdering @@ -0,0 +1,2 @@ +{ +} diff --git a/.edge-profile-render-1774474922711/Default/BrowsingTopicsSiteData b/.edge-profile-render-1774474922711/Default/BrowsingTopicsSiteData new file mode 100644 index 0000000..c41f9b3 Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/BrowsingTopicsSiteData differ diff --git a/.edge-profile-render-1774474922711/Default/BrowsingTopicsSiteData-journal b/.edge-profile-render-1774474922711/Default/BrowsingTopicsSiteData-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Default/BrowsingTopicsState b/.edge-profile-render-1774474922711/Default/BrowsingTopicsState new file mode 100644 index 0000000..2eed6ef --- /dev/null +++ b/.edge-profile-render-1774474922711/Default/BrowsingTopicsState @@ -0,0 +1,12 @@ +{ + "epochs": [ { + "calculation_time": "13418948530961413", + "config_version": 0, + "model_version": "0", + "padded_top_topics_start_index": 0, + "taxonomy_version": 0, + "top_topics_and_observing_domains": [ ] + } ], + "hex_encoded_hmac_key": "BDE2143DD48C1B04382908CE4A1698B2E2621423014D72F63EFBD143C907CAF6", + "next_scheduled_calculation_time": "13419553330961473" +} diff --git a/.edge-profile-render-1774474922711/Default/BudgetDatabase/LOCK b/.edge-profile-render-1774474922711/Default/BudgetDatabase/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Default/BudgetDatabase/LOG b/.edge-profile-render-1774474922711/Default/BudgetDatabase/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Default/ClientCertificates/LOCK b/.edge-profile-render-1774474922711/Default/ClientCertificates/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Default/ClientCertificates/LOG b/.edge-profile-render-1774474922711/Default/ClientCertificates/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Default/Code Cache/js/index b/.edge-profile-render-1774474922711/Default/Code Cache/js/index new file mode 100644 index 0000000..79bd403 Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/Code Cache/js/index differ diff --git a/.edge-profile-render-1774474922711/Default/Code Cache/js/index-dir/the-real-index b/.edge-profile-render-1774474922711/Default/Code Cache/js/index-dir/the-real-index new file mode 100644 index 0000000..1954332 Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/Code Cache/js/index-dir/the-real-index differ diff --git a/.edge-profile-render-1774474922711/Default/Code Cache/wasm/index b/.edge-profile-render-1774474922711/Default/Code Cache/wasm/index new file mode 100644 index 0000000..79bd403 Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/Code Cache/wasm/index differ diff --git a/.edge-profile-render-1774474922711/Default/Code Cache/wasm/index-dir/the-real-index b/.edge-profile-render-1774474922711/Default/Code Cache/wasm/index-dir/the-real-index new file mode 100644 index 0000000..715e357 Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/Code Cache/wasm/index-dir/the-real-index differ diff --git a/.edge-profile-render-1774474922711/Default/DIPS b/.edge-profile-render-1774474922711/Default/DIPS new file mode 100644 index 0000000..4410bda Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/DIPS differ diff --git a/.edge-profile-render-1774474922711/Default/DIPS-wal b/.edge-profile-render-1774474922711/Default/DIPS-wal new file mode 100644 index 0000000..3a65183 Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/DIPS-wal differ diff --git a/.edge-profile-render-1774474922711/Default/DawnGraphiteCache/data_0 b/.edge-profile-render-1774474922711/Default/DawnGraphiteCache/data_0 new file mode 100644 index 0000000..d76fb77 Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/DawnGraphiteCache/data_0 differ diff --git a/.edge-profile-render-1774474922711/Default/DawnGraphiteCache/data_1 b/.edge-profile-render-1774474922711/Default/DawnGraphiteCache/data_1 new file mode 100644 index 0000000..035d06d Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/DawnGraphiteCache/data_1 differ diff --git a/.edge-profile-render-1774474922711/Default/DawnGraphiteCache/data_2 b/.edge-profile-render-1774474922711/Default/DawnGraphiteCache/data_2 new file mode 100644 index 0000000..c7e2eb9 Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/DawnGraphiteCache/data_2 differ diff --git a/.edge-profile-render-1774474922711/Default/DawnGraphiteCache/data_3 b/.edge-profile-render-1774474922711/Default/DawnGraphiteCache/data_3 new file mode 100644 index 0000000..5eec973 Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/DawnGraphiteCache/data_3 differ diff --git a/.edge-profile-render-1774474922711/Default/DawnGraphiteCache/index b/.edge-profile-render-1774474922711/Default/DawnGraphiteCache/index new file mode 100644 index 0000000..4993277 Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/DawnGraphiteCache/index differ diff --git a/.edge-profile-render-1774474922711/Default/DawnWebGPUCache/data_0 b/.edge-profile-render-1774474922711/Default/DawnWebGPUCache/data_0 new file mode 100644 index 0000000..d76fb77 Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/DawnWebGPUCache/data_0 differ diff --git a/.edge-profile-render-1774474922711/Default/DawnWebGPUCache/data_1 b/.edge-profile-render-1774474922711/Default/DawnWebGPUCache/data_1 new file mode 100644 index 0000000..035d06d Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/DawnWebGPUCache/data_1 differ diff --git a/.edge-profile-render-1774474922711/Default/DawnWebGPUCache/data_2 b/.edge-profile-render-1774474922711/Default/DawnWebGPUCache/data_2 new file mode 100644 index 0000000..c7e2eb9 Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/DawnWebGPUCache/data_2 differ diff --git a/.edge-profile-render-1774474922711/Default/DawnWebGPUCache/data_3 b/.edge-profile-render-1774474922711/Default/DawnWebGPUCache/data_3 new file mode 100644 index 0000000..5eec973 Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/DawnWebGPUCache/data_3 differ diff --git a/.edge-profile-render-1774474922711/Default/DawnWebGPUCache/index b/.edge-profile-render-1774474922711/Default/DawnWebGPUCache/index new file mode 100644 index 0000000..82cdfef Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/DawnWebGPUCache/index differ diff --git a/.edge-profile-render-1774474922711/Default/DualEngine/SiteList-Consumer.json b/.edge-profile-render-1774474922711/Default/DualEngine/SiteList-Consumer.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/.edge-profile-render-1774474922711/Default/DualEngine/SiteList-Consumer.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/.edge-profile-render-1774474922711/Default/DualEngine/SiteList-Enterprise.json b/.edge-profile-render-1774474922711/Default/DualEngine/SiteList-Enterprise.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/.edge-profile-render-1774474922711/Default/DualEngine/SiteList-Enterprise.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/.edge-profile-render-1774474922711/Default/EdgeCoupons/coupons_data.db/CURRENT b/.edge-profile-render-1774474922711/Default/EdgeCoupons/coupons_data.db/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile-render-1774474922711/Default/EdgeCoupons/coupons_data.db/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile-render-1774474922711/Default/EdgeCoupons/coupons_data.db/LOCK b/.edge-profile-render-1774474922711/Default/EdgeCoupons/coupons_data.db/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Default/EdgeCoupons/coupons_data.db/LOG b/.edge-profile-render-1774474922711/Default/EdgeCoupons/coupons_data.db/LOG new file mode 100644 index 0000000..e79f046 --- /dev/null +++ b/.edge-profile-render-1774474922711/Default/EdgeCoupons/coupons_data.db/LOG @@ -0,0 +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 diff --git a/.edge-profile-render-1774474922711/Default/EdgeCoupons/coupons_data.db/MANIFEST-000001 b/.edge-profile-render-1774474922711/Default/EdgeCoupons/coupons_data.db/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/EdgeCoupons/coupons_data.db/MANIFEST-000001 differ diff --git a/.edge-profile-render-1774474922711/Default/EdgeEDrop/EdgeEDropSQLite.db b/.edge-profile-render-1774474922711/Default/EdgeEDrop/EdgeEDropSQLite.db new file mode 100644 index 0000000..65a59e0 Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/EdgeEDrop/EdgeEDropSQLite.db differ diff --git a/.edge-profile-render-1774474922711/Default/EdgeEDrop/EdgeEDropSQLite.db-journal b/.edge-profile-render-1774474922711/Default/EdgeEDrop/EdgeEDropSQLite.db-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Default/EdgeHubAppUsage/EdgeHubAppUsageSQLite.db b/.edge-profile-render-1774474922711/Default/EdgeHubAppUsage/EdgeHubAppUsageSQLite.db new file mode 100644 index 0000000..ef7db5b Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/EdgeHubAppUsage/EdgeHubAppUsageSQLite.db differ diff --git a/.edge-profile-render-1774474922711/Default/EdgeHubAppUsage/EdgeHubAppUsageSQLite.db-journal b/.edge-profile-render-1774474922711/Default/EdgeHubAppUsage/EdgeHubAppUsageSQLite.db-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Default/EdgeJourneys/EdgeJourneys.db b/.edge-profile-render-1774474922711/Default/EdgeJourneys/EdgeJourneys.db new file mode 100644 index 0000000..8ad0e11 Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/EdgeJourneys/EdgeJourneys.db differ diff --git a/.edge-profile-render-1774474922711/Default/EdgeJourneys/EdgeJourneys.db-wal b/.edge-profile-render-1774474922711/Default/EdgeJourneys/EdgeJourneys.db-wal new file mode 100644 index 0000000..7e778f3 Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/EdgeJourneys/EdgeJourneys.db-wal differ diff --git a/.edge-profile-render-1774474922711/Default/EdgePushStorageWithConnectTokenAndKey/LOCK b/.edge-profile-render-1774474922711/Default/EdgePushStorageWithConnectTokenAndKey/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Default/EdgePushStorageWithConnectTokenAndKey/LOG b/.edge-profile-render-1774474922711/Default/EdgePushStorageWithConnectTokenAndKey/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Default/EdgePushStorageWithConnectTokenAndKey/LOG.old b/.edge-profile-render-1774474922711/Default/EdgePushStorageWithConnectTokenAndKey/LOG.old new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Default/Extension Rules/CURRENT b/.edge-profile-render-1774474922711/Default/Extension Rules/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile-render-1774474922711/Default/Extension Rules/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile-render-1774474922711/Default/Extension Rules/LOCK b/.edge-profile-render-1774474922711/Default/Extension Rules/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Default/Extension Rules/LOG b/.edge-profile-render-1774474922711/Default/Extension Rules/LOG new file mode 100644 index 0000000..7d94a5f --- /dev/null +++ b/.edge-profile-render-1774474922711/Default/Extension Rules/LOG @@ -0,0 +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 diff --git a/.edge-profile-render-1774474922711/Default/Extension Rules/MANIFEST-000001 b/.edge-profile-render-1774474922711/Default/Extension Rules/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/Extension Rules/MANIFEST-000001 differ diff --git a/.edge-profile-render-1774474922711/Default/Extension Scripts/CURRENT b/.edge-profile-render-1774474922711/Default/Extension Scripts/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile-render-1774474922711/Default/Extension Scripts/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile-render-1774474922711/Default/Extension Scripts/LOCK b/.edge-profile-render-1774474922711/Default/Extension Scripts/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Default/Extension Scripts/LOG b/.edge-profile-render-1774474922711/Default/Extension Scripts/LOG new file mode 100644 index 0000000..e53d36d --- /dev/null +++ b/.edge-profile-render-1774474922711/Default/Extension Scripts/LOG @@ -0,0 +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 diff --git a/.edge-profile-render-1774474922711/Default/Extension Scripts/MANIFEST-000001 b/.edge-profile-render-1774474922711/Default/Extension Scripts/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/Extension Scripts/MANIFEST-000001 differ diff --git a/.edge-profile-render-1774474922711/Default/Extension State/CURRENT b/.edge-profile-render-1774474922711/Default/Extension State/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile-render-1774474922711/Default/Extension State/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile-render-1774474922711/Default/Extension State/LOCK b/.edge-profile-render-1774474922711/Default/Extension State/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Default/Extension State/LOG b/.edge-profile-render-1774474922711/Default/Extension State/LOG new file mode 100644 index 0000000..b2f2c07 --- /dev/null +++ b/.edge-profile-render-1774474922711/Default/Extension State/LOG @@ -0,0 +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 diff --git a/.edge-profile-render-1774474922711/Default/Extension State/MANIFEST-000001 b/.edge-profile-render-1774474922711/Default/Extension State/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/Extension State/MANIFEST-000001 differ diff --git a/.edge-profile-render-1774474922711/Default/ExtensionActivityComp b/.edge-profile-render-1774474922711/Default/ExtensionActivityComp new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Default/ExtensionActivityEdge b/.edge-profile-render-1774474922711/Default/ExtensionActivityEdge new file mode 100644 index 0000000..8ac5d91 Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/ExtensionActivityEdge differ diff --git a/.edge-profile-render-1774474922711/Default/ExtensionActivityEdge-journal b/.edge-profile-render-1774474922711/Default/ExtensionActivityEdge-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Default/Favicons b/.edge-profile-render-1774474922711/Default/Favicons new file mode 100644 index 0000000..e589db8 Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/Favicons differ diff --git a/.edge-profile-render-1774474922711/Default/Favicons-journal b/.edge-profile-render-1774474922711/Default/Favicons-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Default/Feature Engagement Tracker/AvailabilityDB/LOCK b/.edge-profile-render-1774474922711/Default/Feature Engagement Tracker/AvailabilityDB/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Default/Feature Engagement Tracker/AvailabilityDB/LOG b/.edge-profile-render-1774474922711/Default/Feature Engagement Tracker/AvailabilityDB/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Default/Feature Engagement Tracker/EventDB/LOCK b/.edge-profile-render-1774474922711/Default/Feature Engagement Tracker/EventDB/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Default/Feature Engagement Tracker/EventDB/LOG b/.edge-profile-render-1774474922711/Default/Feature Engagement Tracker/EventDB/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Default/GPUCache/data_0 b/.edge-profile-render-1774474922711/Default/GPUCache/data_0 new file mode 100644 index 0000000..d76fb77 Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/GPUCache/data_0 differ diff --git a/.edge-profile-render-1774474922711/Default/GPUCache/data_1 b/.edge-profile-render-1774474922711/Default/GPUCache/data_1 new file mode 100644 index 0000000..035d06d Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/GPUCache/data_1 differ diff --git a/.edge-profile-render-1774474922711/Default/GPUCache/data_2 b/.edge-profile-render-1774474922711/Default/GPUCache/data_2 new file mode 100644 index 0000000..c7e2eb9 Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/GPUCache/data_2 differ diff --git a/.edge-profile-render-1774474922711/Default/GPUCache/data_3 b/.edge-profile-render-1774474922711/Default/GPUCache/data_3 new file mode 100644 index 0000000..5eec973 Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/GPUCache/data_3 differ diff --git a/.edge-profile-render-1774474922711/Default/GPUCache/index b/.edge-profile-render-1774474922711/Default/GPUCache/index new file mode 100644 index 0000000..a512edd Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/GPUCache/index differ diff --git a/.edge-profile-render-1774474922711/Default/History b/.edge-profile-render-1774474922711/Default/History new file mode 100644 index 0000000..c02d277 Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/History differ diff --git a/.edge-profile-render-1774474922711/Default/History-journal b/.edge-profile-render-1774474922711/Default/History-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Default/HubApps Icons b/.edge-profile-render-1774474922711/Default/HubApps Icons new file mode 100644 index 0000000..a838bbc Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/HubApps Icons differ diff --git a/.edge-profile-render-1774474922711/Default/HubApps Icons-journal b/.edge-profile-render-1774474922711/Default/HubApps Icons-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Default/LOCK b/.edge-profile-render-1774474922711/Default/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Default/LOG b/.edge-profile-render-1774474922711/Default/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Default/Login Data b/.edge-profile-render-1774474922711/Default/Login Data new file mode 100644 index 0000000..0af13bc Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/Login Data differ diff --git a/.edge-profile-render-1774474922711/Default/Login Data For Account b/.edge-profile-render-1774474922711/Default/Login Data For Account new file mode 100644 index 0000000..0af13bc Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/Login Data For Account differ diff --git a/.edge-profile-render-1774474922711/Default/Login Data For Account-journal b/.edge-profile-render-1774474922711/Default/Login Data For Account-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Default/Login Data-journal b/.edge-profile-render-1774474922711/Default/Login Data-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Default/Network Action Predictor b/.edge-profile-render-1774474922711/Default/Network Action Predictor new file mode 100644 index 0000000..79744b2 Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/Network Action Predictor differ diff --git a/.edge-profile-render-1774474922711/Default/Network Action Predictor-journal b/.edge-profile-render-1774474922711/Default/Network Action Predictor-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Default/Nurturing/campaign_history b/.edge-profile-render-1774474922711/Default/Nurturing/campaign_history new file mode 100644 index 0000000..eab8517 Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/Nurturing/campaign_history differ diff --git a/.edge-profile-render-1774474922711/Default/Nurturing/campaign_history-journal b/.edge-profile-render-1774474922711/Default/Nurturing/campaign_history-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Default/PersistentOriginTrials/LOCK b/.edge-profile-render-1774474922711/Default/PersistentOriginTrials/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Default/PersistentOriginTrials/LOG b/.edge-profile-render-1774474922711/Default/PersistentOriginTrials/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Default/Preferences b/.edge-profile-render-1774474922711/Default/Preferences new file mode 100644 index 0000000..532d0ee --- /dev/null +++ b/.edge-profile-render-1774474922711/Default/Preferences @@ -0,0 +1 @@ +{"aadc_info":{"age_group":0},"accessibility":{"captions":{"headless_caption_enabled":false}},"account_tracker_service_last_update":"13418948525852513","apps":{"shortcuts_arch":"","shortcuts_version":1},"autocomplete":{"retention_policy_last_version":146},"autofill":{"edge_autofill_advanced_ml_enabled":true,"edge_autofill_purge_low_quality_profiles_by_timeline":false,"last_version_deduped":146},"bookmark":{"storage_computation_last_update":"13418948525839658"},"browser":{"available_dark_theme_options":"All","edge_sidebar_visibility":{"add_app_to_bottom":true},"enable_text_prediction_v2":true,"recent_theme_color_list":[4293914607.0,4293914607.0,4293914607.0,4293914607.0,4293914607.0]},"browser_content_container_height":492,"browser_content_container_width":764,"browser_content_container_x":0,"browser_content_container_y":80,"commerce_daily_metrics_last_update_time":"13418948525861976","continuous_migration":{"equal_opt_out_users_data":{"backfilled":true}},"countryid_at_install":21843,"custom_links":{"list":[]},"default_apps_install_state":3,"dual_engine":{"consumer_site_list_with_ie_entries":false,"consumer_sitelist_location":"","consumer_sitelist_version":"","shared_cookie_data":{},"sitelist_has_consumer_data":false,"sitelist_has_enterprise_data":false,"sitelist_location":"","sitelist_source":0,"sitelist_version":""},"edge":{"bookmarks":{"last_dup_info_record_time":"13418948535852423"},"msa_sso_info":{"allow_for_non_msa_profile":true},"profile_sso_info":{"aad_sso_algo_state":1,"is_first_profile":true,"is_msa_first_profile":true,"msa_sso_algo_state":1},"services":{"signin_scoped_device_id":"dd855c34-3133-4649-a718-ad305b200231"},"workspaces":{"migration":{"stampede_time":"13418961705208597"}}},"edge_journeys":{"latest_journeys_count":0},"edge_pinning_campaign":{"precomputed_campaign_data":{}},"edge_rewards":{"cache_data":"CAA=","hva_webui_action_status_dict":{},"refresh_status_muted_until":"13419553324212219"},"edge_triggering":{"config_version":"1.42.0"},"edge_vpn":{"available":true},"edge_wallet":{"trigger_funnel":{"records":[]}},"enterprise_profile_guid":"a851eef6-ffc7-4d38-838d-0546a297575b","extension":{"installed_extension_count":9},"extensions":{"alerts":{"initialized":true},"chrome_url_overrides":{},"last_chrome_version":"146.0.3856.72","pdf_upsell_triggered":false,"pinned_extension_migration":true,"pinned_extensions":[]},"family_safety":{"activity_reporting_enabled":false,"web_filtering_enabled":false},"gaia_cookie":{"periodic_report_time_2":"13418948524211196"},"intl":{"selected_languages":"en-US,en"},"media":{"engagement":{"schema_version":5}},"media_router":{"receiver_id_hash_token":"qEu96rcHNUJtX0lwBFp6vNOX/x9UaODVAGmv9w9NhOl5ZPNtaSIPsE4GWGKy2FyJto6JPvhtWGpfnS9pAndPNQ=="},"migrated_user_scripts_toggle":true,"muid":{"last_sync":"13418948525840762"},"ntp":{"next_site_suggestions_available":false,"num_personal_suggestions":1},"optimization_guide":{"hintsfetcher":{"hosts_successfully_fetched":{}},"previously_registered_optimization_types":{"ABOUT_THIS_SITE":true,"AUTOFILL_ACTOR_IFRAME_ORIGIN_ALLOWLIST":true,"GLIC_ACTION_PAGE_BLOCK":true,"HISTORY_CLUSTERS":true,"LOADING_PREDICTOR":true,"MERCHANT_TRUST_SIGNALS_V2":true,"PAGE_ENTITIES":true,"PRICE_INSIGHTS":true,"PRICE_TRACKING":true,"SALIENT_IMAGE":true,"SAVED_TAB_GROUP":true,"SHOPPING_DISCOUNTS":true,"SHOPPING_PAGE_TYPES":true,"V8_COMPILE_HINTS":true}},"personalization_data_consent":{"personalization_in_context_consent_can_prompt":true,"personalization_in_context_count":0},"privacy_sandbox":{"first_party_sets_data_access_allowed_initialized":true},"profile":{"avatar_index":20,"background_password_check":{"check_fri_weight":9,"check_interval":"2592000000000","check_mon_weight":6,"check_sat_weight":6,"check_sun_weight":6,"check_thu_weight":9,"check_tue_weight":9,"check_wed_weight":9,"next_check_time":"13419603328836008"},"content_settings":{"exceptions":{"3pcd_heuristics_grants":{},"abusive_notification_permissions":{},"access_to_get_all_screens_media_in_session":{},"anti_abuse":{},"app_banner":{},"ar":{},"are_suspicious_notifications_allowlisted_by_user":{},"auto_picture_in_picture":{},"auto_select_certificate":{},"automatic_downloads":{},"automatic_fullscreen":{},"autoplay":{},"background_sync":{},"bluetooth_chooser_data":{},"bluetooth_guard":{},"bluetooth_scanning":{},"camera_pan_tilt_zoom":{},"captured_surface_control":{},"clear_browsing_data_cookies_exceptions":{},"client_hints":{},"clipboard":{},"controlled_frame":{},"cookie_controls_metadata":{},"cookies":{},"direct_sockets":{},"direct_sockets_private_network_access":{},"display_media_system_audio":{},"disruptive_notification_permissions":{},"durable_storage":{},"edge_ad_targeting":{},"edge_ad_targeting_data":{},"edge_all_file_read_access":{},"edge_browser_action":{},"edge_sdsm":{},"edge_split_screen":{},"edge_tech_scam_detection":{},"edge_u2f_api_request":{},"edge_user_agent_token":{},"fedcm_idp_registration":{},"fedcm_idp_signin":{},"fedcm_share":{},"file_system_access_chooser_data":{},"file_system_access_extended_permission":{},"file_system_access_restore_permission":{},"file_system_last_picked_directory":{},"file_system_read_guard":{},"file_system_write_guard":{},"formfill_metadata":{},"geolocation":{},"geolocation_with_options":{},"hand_tracking":{},"has_migrated_local_network_access":true,"hid_chooser_data":{},"hid_guard":{},"http_allowed":{},"https_enforced":{},"idle_detection":{},"images":{},"important_site_info":{},"initialized_translations":{},"intent_picker_auto_display":{},"javascript":{},"javascript_jit":{},"javascript_optimizer":{},"keyboard_lock":{},"legacy_cookie_access":{},"legacy_cookie_scope":{},"local_fonts":{},"local_network":{},"local_network_access":{},"loopback_network":{},"media_engagement":{},"media_stream_camera":{},"media_stream_mic":{},"midi_sysex":{},"mixed_script":{},"nfc_devices":{},"notification_interactions":{},"notification_permission_review":{},"notifications":{},"ondevice_languages_downloaded":{},"password_protection":{},"payment_handler":{},"permission_actions_history":{},"permission_autoblocking_data":{},"permission_autorevocation_data":{},"pointer_lock":{},"popups":{},"protected_media_identifier":{},"protocol_handler":{},"reduced_accept_language":{},"safe_browsing_url_check_data":{},"secure_network":{},"secure_network_sites":{},"sensors":{},"serial_chooser_data":{},"serial_guard":{},"site_engagement":{},"sleeping_tabs":{},"sound":{},"speaker_selection":{},"ssl_cert_decisions":{},"storage_access":{},"storage_access_header_origin_trial":{},"subresource_filter":{},"subresource_filter_data":{},"suspicious_notification_ids":{},"suspicious_notification_show_original":{},"top_level_storage_access":{},"trackers":{},"trackers_data":{},"tracking_org_exceptions":{},"tracking_org_relationships":{},"typosquatting":{},"unused_site_permissions":{},"usb_chooser_data":{},"usb_guard":{},"vr":{},"web_app_installation":{},"webid_api":{},"webid_auto_reauthn":{},"window_placement":{}},"pref_version":1},"created_by_version":"146.0.3856.72","creation_time":"13418948523952276","default_content_setting_values":{"has_migrated_local_network_access":true},"edge_password_is_using_new_login_db_path":false,"edge_password_login_db_path_flip_flop_count":0,"edge_profile_id":"86fc8262-17fe-443e-b60a-9da51132630d","edge_user_with_non_zero_passwords":false,"has_seen_signin_fre":false,"is_relative_to_aad":false,"managed_user_id":"","name":"Profile 1","network_pbs":{},"password_hash_data_list":[],"signin_fre_seen_time":"13418948524166525"},"reset_prepopulated_engines":false,"safety_hub":{"unused_site_permissions_revocation":{"migration_completed":true}},"saved_tab_groups":{"did_enable_shared_tab_groups_in_last_session":false,"specifics_to_data_migration":true},"sessions":{"event_log":[{"crashed":false,"time":"13418948524245820","type":0}],"session_data_status":1},"shopping":{"contextual_features_enabled":true,"dma_telemetry_expiration_time":"13419034924992185"},"signin":{"accounts_metadata_dict":{},"allowed":true},"spellcheck":{"dictionaries":["en-US"],"dictionary":""},"sync":{"apps":true,"autofill":true,"bookmarks":true,"collections":true,"collections_edge_re_evaluated":true,"collections_edge_supported":true,"edge_account_type":0,"edge_wallet":true,"edge_wallet_edge_supported":true,"edge_workspaces":true,"edge_workspaces_edge_supported":true,"encryption_bootstrap_token_per_account_migration_done":true,"extensions":true,"extensions_edge_supported":true,"history_edge_supported":true,"keep_everything_synced":false,"passwords":true,"preferences":true,"tabs":true,"tabs_edge_supported":true,"typed_urls":true},"syncing_theme_prefs_migrated_to_non_syncing":true,"toolbar":{"pinned_cast_migration_complete":true,"pinned_chrome_labs_migration_complete":true},"toolbar_declutter":{"new_user_cleanup_triggered":true,"undo":{"last_time":"13418948540066171"}},"translate_site_blacklist":[],"translate_site_blocklist_with_time":{},"typosquatting":{"allowlist_migration_done":true},"user_experience_metrics":{"personalization_data_consent_enabled_last_known_value":false},"web_apps":{"did_migrate_default_chrome_apps":["MigrateDefaultChromeAppToWebAppsGSuite","MigrateDefaultChromeAppToWebAppsNonGSuite"],"last_preinstall_synchronize_version":"146","link_handling_info":{"enabled_for_installed_apps":true}}} \ No newline at end of file diff --git a/.edge-profile-render-1774474922711/Default/PreferredApps b/.edge-profile-render-1774474922711/Default/PreferredApps new file mode 100644 index 0000000..7d3a425 --- /dev/null +++ b/.edge-profile-render-1774474922711/Default/PreferredApps @@ -0,0 +1 @@ +{"preferred_apps":[],"version":1} \ No newline at end of file diff --git a/.edge-profile-render-1774474922711/Default/README b/.edge-profile-render-1774474922711/Default/README new file mode 100644 index 0000000..4a34402 --- /dev/null +++ b/.edge-profile-render-1774474922711/Default/README @@ -0,0 +1 @@ +Microsoft Edge settings and storage represent user-selected preferences and information and MUST not be extracted, overwritten or modified except through Microsoft Edge defined APIs. \ No newline at end of file diff --git a/.edge-profile-render-1774474922711/Default/Secure Preferences b/.edge-profile-render-1774474922711/Default/Secure Preferences new file mode 100644 index 0000000..2585043 --- /dev/null +++ b/.edge-profile-render-1774474922711/Default/Secure Preferences @@ -0,0 +1 @@ +{"edge_fundamentals_appdefaults":{"enclave_version":101},"ess_kv_states":{"restore_on_startup":{"closed_notification":false,"decrypt_success":true,"key":"restore_on_startup","notification_popup_count":0},"startup_urls":{"closed_notification":false,"decrypt_success":true,"key":"startup_urls","notification_popup_count":0},"template_url_data":{"closed_notification":false,"decrypt_success":true,"key":"template_url_data","notification_popup_count":0}},"extensions":{"settings":{"ahfgeienlihckogmohjhadlkjgocpleb":{"account_extension_type":0,"active_permissions":{"api":["management","system.display","system.storage","webstorePrivate","system.cpu","system.memory","system.network"],"explicit_host":[],"manifest_permissions":[],"scriptable_host":[]},"app_launcher_ordinal":"t","commands":{},"content_settings":[],"creation_flags":1,"disable_reasons":[],"events":[],"first_install_time":"13418948524401971","from_webstore":false,"incognito_content_settings":[],"incognito_preferences":{},"last_update_time":"13418948524401971","location":5,"manifest":{"app":{"launch":{"web_url":"https://chrome.google.com/webstore"},"urls":["https://chrome.google.com/webstore"]},"description":"Discover extensions for Microsoft Edge.","icons":{"128":"webstore_icon_128.png","16":"webstore_icon_16.png"},"key":"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCtl3tO0osjuzRsf6xtD2SKxPlTfuoy7AWoObysitBPvH5fE1NaAA1/2JkPWkVDhdLBWLaIBPYeXbzlHp3y4Vv/4XG+aN5qFE3z+1RU/NqkzVYHtIpVScf3DjTYtKVL66mzVGijSoAIwbFCC3LpGdaoe6Q1rSRDp76wR6jjFzsYwQIDAQAB","name":"Web Store","permissions":["webstorePrivate","management","system.cpu","system.display","system.memory","system.network","system.storage"],"version":"0.2"},"needs_sync":true,"page_ordinal":"n","path":"C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\146.0.3856.72\\resources\\web_store","preferences":{},"regular_only_preferences":{},"was_installed_by_default":false,"was_installed_by_oem":false},"dgiklkfkllikcanfonkcabmbdfmgleag":{"account_extension_type":0,"active_permissions":{"api":[],"explicit_host":[],"manifest_permissions":[],"scriptable_host":[]},"commands":{},"content_settings":[],"creation_flags":1,"disable_reasons":[],"events":[],"first_install_time":"13418948524416629","from_webstore":false,"incognito_content_settings":[],"incognito_preferences":{},"last_update_time":"13418948524416629","location":5,"manifest":{"content_capabilities":{"include_globs":["https://*excel.officeapps.live.com/*","https://*onenote.officeapps.live.com/*","https://*powerpoint.officeapps.live.com/*","https://*word-edit.officeapps.live.com/*","https://*excel.officeapps.live.com.mcas.ms/*","https://*onenote.officeapps.live.com.mcas.ms/*","https://*word-edit.officeapps.live.com.mcas.ms/*","https://*excel.partner.officewebapps.cn/*","https://*onenote.partner.officewebapps.cn/*","https://*powerpoint.partner.officewebapps.cn/*","https://*word-edit.partner.officewebapps.cn/*","https://*excel.gov.online.office365.us/*","https://*onenote.gov.online.office365.us/*","https://*powerpoint.gov.online.office365.us/*","https://*word-edit.gov.online.office365.us/*","https://*excel.dod.online.office365.us/*","https://*onenote.dod.online.office365.us/*","https://*powerpoint.dod.online.office365.us/*","https://*word-edit.dod.online.office365.us/*","https://*visio.partner.officewebapps.cn/*","https://*visio.gov.online.office365.us/*","https://*visio.dod.online.office365.us/*"],"matches":["https://*.officeapps.live.com/*","https://*.officeapps.live.com.mcas.ms/*","https://*.partner.officewebapps.cn/*","https://*.gov.online.office365.us/*","https://*.dod.online.office365.us/*","https://*.app.whiteboard.microsoft.com/*","https://*.whiteboard.office.com/*","https://*.app.int.whiteboard.microsoft.com/*","https://*.whiteboard.office365.us/*","https://*.dev.whiteboard.microsoft.com/*"],"permissions":["clipboardRead","clipboardWrite"]},"default_locale":"en","description":"This extension grants Microsoft web sites permission to read and write from the clipboard.","key":"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCz4t/X7GeuP6GBpjmxndrjtzF//4CWeHlC68rkoV7hP3h5Ka6eX7ZMNlYJkSjmB5iRmPHO5kR1y7rGY8JXnRPDQh/CQNLVA7OsKeV6w+UO+vx8KGI+TrTAhzH8YGcMIsxsUjxtC4cBmprja+xDr0zVp2EMgqHu+GBKgwSRHTkDuwIDAQAB","manifest_version":2,"minimum_chrome_version":"77","name":"Microsoft Clipboard Extension","version":"1.0"},"path":"C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\146.0.3856.72\\resources\\edge_clipboard","preferences":{},"regular_only_preferences":{},"was_installed_by_default":false,"was_installed_by_oem":false},"fikbjbembnmfhppjfnmfkahdhfohhjmg":{"account_extension_type":0,"active_permissions":{"api":[],"explicit_host":[],"manifest_permissions":[],"scriptable_host":[]},"commands":{},"content_settings":[],"creation_flags":1,"disable_reasons":[],"events":[],"first_install_time":"13418948524431251","from_webstore":false,"incognito_content_settings":[],"incognito_preferences":{},"last_update_time":"13418948524431251","location":5,"manifest":{"background":{"persistent":false,"scripts":["background.js"]},"externally_connectable":{"matches":["https://*.microsoftstream.com/*"]},"incognito":"split","key":"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsAmDrYmQaYQlLxSAn/jTQTGNt1IffJGIJeKucE/B42d8QIyFD2RCarmHP1bmbY1YuTng2dL3J//qyvUNwXPt9cmxH9WKwi512tzOa5r2zYaCuOgP2vAIrah/bKnpO3XmUfFWj+LRcbZahOmMDMQxzPKxFKuIz2eOiakBXDE6Ok7azHJ13LLQTte1JgZIPmyFrAciPABLp/IKLfsfnebVW1YgaOyxBNyp/7bhSmoyZI3kBv8InKOpGE8pttrBg6l5zkvD67a7ViNAYkqZIpJJV5ZTQtVWCWSG0xU2y+3zXZtx8KbGbDiWUAcwNYDVPpsV+IQXVpgAplHvrZme+hAl6QIDAQAB","manifest_version":2,"name":"Media Internals Services Extension","permissions":["mediaInternalsPrivate"],"version":"2.0.0"},"path":"C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\146.0.3856.72\\resources\\media_internals_services","preferences":{},"regular_only_preferences":{},"was_installed_by_default":false,"was_installed_by_oem":false},"iglcjdemknebjbklcgkfaebgojjphkec":{"account_extension_type":0,"active_permissions":{"api":["identity","management","metricsPrivate","webstorePrivate","hubPrivate"],"explicit_host":[],"manifest_permissions":[],"scriptable_host":[]},"app_launcher_ordinal":"w","commands":{},"content_settings":[],"creation_flags":1,"disable_reasons":[],"events":[],"first_install_time":"13418948524412253","from_webstore":false,"incognito_content_settings":[],"incognito_preferences":{},"last_update_time":"13418948524412253","location":5,"manifest":{"app":{"launch":{"web_url":"https://microsoftedge.microsoft.com"},"urls":["https://microsoftedge.microsoft.com"]},"description":"Discover extensions for Microsoft Edge.","icons":{"128":"webstore_icon_128.png","16":"webstore_icon_16.png"},"key":"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtMvN4+y6cd3el/A/NT5eUnrz1WiD1WJRaJfMBvaMtJHIuFGEmYdYL/YuE74J19+pwhjOHeFZ3XUSMTdOa5moOaXXvdMr5wWaaN2frHewtAnNDO64NGbbZvdsfGm/kRkHKVGNV6dacZsAkylcz5CkwTmq97wOZ7ETaShHvhZEGwRQIt4K1poxurOkDYQw9ERZNf3fgYJ9ZTrLZMAFDLJY+uSF03pClWrr8VGc8LUQ4Naktb8QSgVUlrS14AdF/ESdbhnTvvdB0e7peNWRyoNtCqLJsbtTtBL6sOnqfusnwPowuueOFI+XskOT9TvLo6PcgxhLX5+d0mM+Jtn6PFTU8QIDAQAB","name":"Microsoft Store","permissions":["webstorePrivate","management","metricsPrivate","identity","hubPrivate"],"version":"0.2"},"needs_sync":true,"page_ordinal":"n","path":"C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\146.0.3856.72\\resources\\microsoft_web_store","preferences":{},"regular_only_preferences":{},"was_installed_by_default":false,"was_installed_by_oem":false},"ihmafllikibpmigkcoadcmckbfhibefp":{"account_extension_type":0,"active_permissions":{"api":["debugger","feedbackPrivate","fileSystem","fileSystem.write","app.window.fullscreen","metricsPrivate","storage","tabs","fileSystem.readFullPath","edgeInternetConnectivityPrivate"],"explicit_host":["edge://resources/*"],"manifest_permissions":[],"scriptable_host":[]},"commands":{},"content_settings":[],"creation_flags":1,"disable_reasons":[],"events":[],"first_install_time":"13418948524426718","from_webstore":false,"incognito_content_settings":[],"incognito_preferences":{},"last_update_time":"13418948524426718","location":5,"manifest":{"app":{"background":{"scripts":["js/event_handler.js"]},"content_security_policy":"default-src 'none'; script-src 'self' blob: filesystem: chrome://resources; style-src 'unsafe-inline' blob: chrome: file: filesystem: data: *; img-src * blob: chrome: file: filesystem: data:; media-src 'self' blob: filesystem:; connect-src data:"},"description":"User feedback extension","display_in_launcher":false,"display_in_new_tab_page":false,"icons":{"128":"images/icon128.png","16":"images/icon16.png","192":"images/icon192.png","32":"images/icon32.png","48":"images/icon48.png"},"incognito":"split","key":"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAl3vxWwvLjcMIFK4OfG6C8PmJkMhFYDKRnx+SqG23YlMG1A+bOkiNmAN1TWpFPPp1f2PpbiZGNq1y29u/QfkD+PC4bnO7GbNw/2X5tGoP0n2K+KGGAxhnr0ki/oyo2eiFGSTOXlQvTRo5q1vB+Lbg+9TbFsWKlHZyAkeZ/YGz/iijHTqw8Q4RWdl5Tp8SlUhS/92EsWhveNJLW22veaT/Up2iSeSSwfyoHVYy8LUPaD4fbyLvPQacVLJq1dac2bNDqjaNvSPgPWCnkZtDmawZrgxT53otLCES/e96xfAf8I24VHIc1pVP8LqdqKr1AV1Yxn93h3VJ2QejtEhIAWHU6QIDAQAB","manifest_version":2,"name":"Edge Feedback","permissions":["chrome://resources/","debugger","edgeInternetConnectivityPrivate","feedbackPrivate",{"fileSystem":["readFullPath","write"]},"fullscreen","metricsPrivate","storage","windows"],"version":"1.0.0.1"},"path":"C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\146.0.3856.72\\resources\\edge_feedback","preferences":{},"regular_only_preferences":{},"was_installed_by_default":false,"was_installed_by_oem":false},"jdiccldimpdaibmpdkjnbmckianbfold":{"account_extension_type":0,"active_permissions":{"api":["activeTab","metricsPrivate","storage","systemPrivate","ttsEngine","errorReporting"],"explicit_host":["https://*.bing.com/*"],"manifest_permissions":[],"scriptable_host":[]},"commands":{},"content_settings":[],"creation_flags":1,"disable_reasons":[],"events":[],"first_install_time":"13418948524441988","from_webstore":false,"incognito_content_settings":[],"incognito_preferences":{},"last_update_time":"13418948524441988","location":5,"manifest":{"background":{"persistent":false,"scripts":["lifetimeHelper.js","telemetryHelper.js","errorHelper.js","voiceList/voiceListRequester.js","voiceList/voiceListSingleton.js","voiceList/voiceModel.js","manifestHelper.js","config.js","ssml.js","uuid.js","wordBoundary.js","audioStreamer.js","wordBoundaryEventManager.js","audioViewModel.js","background.js"]},"description":"Provides access to Microsoft's online text-to-speech voices","key":"AAAAB3NzaC1yc2EAAAADAQABAAAAgQDjGOAV6/3fmEtQmFqlmqm5cZ+jlNhd6XikwMDp0I7BKh+AjG3aBIG/qqwlsF/7LAGatnSxBwUwZC0qMnGXtcOPVl26Q8OvMx0gt5Va5gxca+ae0Skluj9WN9TNxPFVhw21WbCt4D9q3kb+XXDlx/7v1ktYus4Fwr/skkjADG9cIQ==","manifest_version":2,"name":"Microsoft Voices","permissions":["activeTab","errorReporting","metricsPrivate","storage","systemPrivate","ttsEngine","https://*.bing.com/"],"tts_engine":{"voices":[{"codec":"audio-24khz-48kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"en-US","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (en-US, AriaNeural)","voice_name":"Microsoft Aria Online (Natural) - English (United States)"},{"codec":"audio-24khz-48kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"en-US","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (en-US, GuyNeural)","voice_name":"Microsoft Guy Online (Natural) - English (United States)"},{"codec":"audio-24khz-48kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"zh-CN","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (zh-CN, XiaoxiaoNeural)","voice_name":"Microsoft Xiaoxiao Online (Natural) - Chinese (Mainland)"},{"codec":"audio-24khz-48kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"zh-CN","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (zh-CN, YunyangNeural)","voice_name":"Microsoft Yunyang Online (Natural) - Chinese (Mainland)"},{"codec":"audio-16khz-32kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"zh-TW","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (zh-TW, HanHanRUS)","voice_name":"Microsoft HanHan Online - Chinese (Taiwan)"},{"codec":"audio-16khz-32kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"zh-HK","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (zh-HK, TracyRUS)","voice_name":"Microsoft Tracy Online - Chinese (Hong Kong)"},{"codec":"audio-24khz-48kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"ja-JP","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (ja-JP, NanamiNeural)","voice_name":"Microsoft Nanami Online (Natural) - Japanese (Japan)"},{"codec":"audio-24khz-48kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"en-GB","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (en-GB, LibbyNeural)","voice_name":"Microsoft Libby Online (Natural) - English (United Kingdom)"},{"codec":"audio-24khz-48kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"pt-BR","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (pt-BR, FranciscaNeural)","voice_name":"Microsoft Francisca Online (Natural) - Portuguese (Brazil)"},{"codec":"audio-24khz-48kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"es-MX","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (es-MX, DaliaNeural)","voice_name":"Microsoft Dalia Online (Natural) - Spanish (Mexico)"},{"codec":"audio-16khz-32kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"en-IN","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (en-IN, PriyaRUS)","voice_name":"Microsoft Priya Online - English (India)"},{"codec":"audio-16khz-32kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"en-CA","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (en-CA, HeatherRUS)","voice_name":"Microsoft Heather Online - English (Canada)"},{"codec":"audio-24khz-48kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"fr-CA","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (fr-CA, SylvieNeural)","voice_name":"Microsoft Sylvie Online (Natural) - French (Canada)"},{"codec":"audio-24khz-48kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"fr-FR","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (fr-FR, DeniseNeural)","voice_name":"Microsoft Denise Online (Natural) - French (France)"},{"codec":"audio-24khz-48kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"de-DE","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (de-DE, KatjaNeural)","voice_name":"Microsoft Katja Online (Natural) - German (Germany)"},{"codec":"audio-16khz-32kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"ru-RU","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (ru-RU, EkaterinaRUS)","voice_name":"Microsoft Ekaterina Online - Russian (Russia)"},{"codec":"audio-16khz-32kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"en-AU","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (en-AU, HayleyRUS)","voice_name":"Microsoft Hayley Online - English (Australia)"},{"codec":"audio-24khz-48kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"it-IT","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (it-IT, ElsaNeural)","voice_name":"Microsoft Elsa Online (Natural) - Italian (Italy)"},{"codec":"audio-24khz-48kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"ko-KR","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (ko-KR, SunHiNeural)","voice_name":"Microsoft SunHi Online (Natural) - Korean (Korea)"},{"codec":"audio-16khz-32kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"nl-NL","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (nl-NL, HannaRUS)","voice_name":"Microsoft Hanna Online - Dutch (Netherlands)"},{"codec":"audio-24khz-48kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"es-ES","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (es-ES, ElviraNeural)","voice_name":"Microsoft Elvira Online (Natural) - Spanish (Spain)"},{"codec":"audio-24khz-48kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"tr-TR","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (tr-TR, EmelNeural)","voice_name":"Microsoft Emel Online (Natural) - Turkish (Turkey)"},{"codec":"audio-16khz-32kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"pl-PL","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (pl-PL, PaulinaRUS)","voice_name":"Microsoft Paulina Online - Polish (Poland)"}]},"version":"1.0"},"path":"C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\146.0.3856.72\\resources\\microsoft_voices","preferences":{},"regular_only_preferences":{},"was_installed_by_default":false,"was_installed_by_oem":false},"mhjfbmdgcfjbbpaeojofohoefgiehjai":{"account_extension_type":0,"active_permissions":{"api":["contentSettings","fileSystem","fileSystem.write","metricsPrivate","tabs","resourcesPrivate","pdfViewerPrivate","fileSystem.readFullPath","errorReporting","edgeLearningToolsPrivate","fileSystem.getCurrentEntry","edgePdfPrivate","edgeCertVerifierPrivate"],"explicit_host":["edge://resources/*","edge://webui-test/*"],"manifest_permissions":[],"scriptable_host":[]},"commands":{},"content_settings":[],"creation_flags":1,"disable_reasons":[],"events":[],"first_install_time":"13418948524407756","from_webstore":false,"incognito_content_settings":[],"incognito_preferences":{},"last_update_time":"13418948524407756","location":5,"manifest":{"content_security_policy":"script-src 'self' 'wasm-eval' blob: filesystem: chrome://resources chrome://webui-test; object-src * blob: externalfile: file: filesystem: data:; trusted-types edge-internal fast-html pdf-url edge-pdf-static-policy;","description":"","incognito":"split","key":"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDN6hM0rsDYGbzQPQfOygqlRtQgKUXMfnSjhIBL7LnReAVBEd7ZmKtyN2qmSasMl4HZpMhVe2rPWVVwBDl6iyNE/Kok6E6v6V3vCLGsOpQAuuNVye/3QxzIldzG/jQAdWZiyXReRVapOhZtLjGfywCvlWq7Sl/e3sbc0vWybSDI2QIDAQAB","manifest_version":2,"mime_types":["application/pdf"],"mime_types_handler":"edge_pdf/index.html","name":"Microsoft Edge PDF Viewer","offline_enabled":true,"permissions":["errorReporting","chrome://resources/","chrome://webui-test/","contentSettings","metricsPrivate","edgeCertVerifierPrivate","edgeLearningToolsPrivate","edgePdfPrivate","pdfViewerPrivate","resourcesPrivate","tabs",{"fileSystem":["write","readFullPath","getCurrentEntry"]}],"version":"1"},"path":"C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\146.0.3856.72\\resources\\edge_pdf","preferences":{},"regular_only_preferences":{},"was_installed_by_default":false,"was_installed_by_oem":false},"ncbjelpjchkpbikbpkcchkhkblodoama":{"account_extension_type":0,"active_permissions":{"api":[],"explicit_host":[],"manifest_permissions":[],"scriptable_host":[]},"commands":{},"content_settings":[],"creation_flags":1,"disable_reasons":[],"events":[],"first_install_time":"13418948524434644","from_webstore":false,"incognito_content_settings":[],"incognito_preferences":{},"last_update_time":"13418948524434644","location":5,"manifest":{"background":{"persistent":false,"scripts":["background.js"]},"externally_connectable":{"matches":["https://*.teams.cloud.microsoft/*","https://*.teams.cloud.microsoft.com/*","https://*.teams.microsoft.com/*","https://*.skype.com/*","https://*.teams.live.com/*"]},"incognito":"split","key":"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtAdFAR3ckd5c7G8VSzUj4Ltt/QRInUOD00StG95LweksGcLBlFlYL46cHFVgHHj1gmzcpBtgsURdcrAC3V8yiE7GY4wtpOP+9l+adUGR+cyOG0mw9fLjyH+2Il0QqktsNXzkNiE1ogW4l0h4+PJc262j0vtm4hBzMvR0QScFWcAIcAErlUiWTt4jefXCAYqubV99ed5MvVMWBxe97wOa9hYwAhbCminOepA4RRTg9eyi0TiuHpq/bNI8C5qZgKIQNBAjgiFBaIx9hiMBFlK4NHUbFdgY6Qp/hSCMNurctwz1jpsXEnT4eHg1YWXfquoH8s4swIjkFCMBF6Ejc3cUkQIDAQAB","manifest_version":2,"name":"WebRTC Internals Extension","permissions":["webrtcInternalsPrivate"],"version":"2.0.4"},"path":"C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\146.0.3856.72\\resources\\webrtc_internals","preferences":{},"regular_only_preferences":{},"was_installed_by_default":false,"was_installed_by_oem":false},"nkeimhogjdpnpccoofpliimaahmaaome":{"account_extension_type":0,"active_permissions":{"api":["processes","webrtcLoggingPrivate","system.cpu","enterprise.hardwarePlatform"],"explicit_host":[],"manifest_permissions":[],"scriptable_host":[]},"commands":{},"content_settings":[],"creation_flags":1,"disable_reasons":[],"events":[],"first_install_time":"13418948524421663","from_webstore":false,"incognito_content_settings":[],"incognito_preferences":{},"last_update_time":"13418948524421663","location":5,"manifest":{"background":{"page":"background.html","persistent":false},"externally_connectable":{"matches":["https://*.teams.cloud.microsoft/*","https://*.teams.cloud.microsoft.com/*","https://*.teams.microsoft.com/*","https://*.teams.live.com/*","https://*.skype.com/*"]},"incognito":"split","key":"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDAQt2ZDdPfoSe/JI6ID5bgLHRCnCu9T36aYczmhw/tnv6QZB2I6WnOCMZXJZlRdqWc7w9jo4BWhYS50Vb4weMfh/I0On7VcRwJUgfAxW2cHB+EkmtI1v4v/OU24OqIa1Nmv9uRVeX0GjhQukdLNhAE6ACWooaf5kqKlCeK+1GOkQIDAQAB","manifest_version":2,"name":"WebRTC Extension","permissions":["enterprise.hardwarePlatform","processes","system.cpu","webrtcLoggingPrivate"],"version":"4.3.26"},"path":"C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\146.0.3856.72\\resources\\hangout_services","preferences":{},"regular_only_preferences":{},"was_installed_by_default":false,"was_installed_by_oem":false}}},"protection":{"macs":{"browser":{"show_home_button":"31FF5D80FE6A795FE2CB19889367FD90F977BC3792C5CC4B7F2C871F9EC65B51","show_home_button_encrypted_hash":"djEwWs1MiHX11PJvIYw3zJCKn9yeeSySDt+YUkwLtvXJfTIy+Sgzliqz2h+v+28haoDxCO75gPOaJVJtmCnP"},"default_search_provider_data":{"template_url_data":"C29C79C4E396626377D93F0CFE362AE38EB2CF777B47270A973AB0832BE2C44A","template_url_data_encrypted_hash":"djEwu3YHbnSQXelCULrtAX9zNiF3F8v2wtprfiNjJsRdnZdTcY7jbyAgY3m3hNywIkEq1qUw4jL8Qy1kZG2y"},"edge":{"services":{"account_id":"F2F1D19FB2E3FD8E78B68415325EA250902A6D7D62358524F0149F48D60C5283","account_id_encrypted_hash":"djEwdjL7JMjho5LttFz5/+yOqErqf44fLJS2LiEdT+WkJUzNPxUB2C0i/e/hRBJoOyxLdlRtm2EjA+VCQvXQ","last_username":"FB026645C5CB39FB3C6A7DC05C3F440DAEF903369418370ABD00B5A8FC6FCDD6","last_username_encrypted_hash":"djEwpL2728v1hGDNlbVDBwljlX0vhFUAldPdev86l9pkVPvzVj6A4P6W32zIiQs3BxXMCJffeRCuwor8D0m6"}},"enterprise_signin":{"policy_recovery_token":"6830661AD96A6D2C8A4FFEEC044717FD0B40D619B1F7D796AC98415846694E66","policy_recovery_token_encrypted_hash":"djEw7xM7RkSrvMIDC7ImyaC8bCTViPcPCTry6Au4DXCFV3PW7+l9ctZsoaBQ+VczcvUZnSavTnTHoGG0ufC4"},"extensions":{"install":{"initiallist":"0E4D11D8EA5F952E24A14420326E68E050F617EA12021912C6698B74F7D96CC0","initiallist_encrypted_hash":"djEwfMtJKQDsDUYmt83pr8YRBr+Ua0/YBQgSmU5AdxRdoDlukZ7PP6JLkXSP0FzN9a0TPfKsBwOnQ2QaeUC5","initialprovidername":"EA3F27681ED6AE05BE9BACE91C7A3736C7F214783B2C8898C6EA51C4B998428C","initialprovidername_encrypted_hash":"djEwlaQl+piWCqMuDQbLXbqix9Sudz2eVimW6+z2lGSxNX+KZqPN3Q/OwE0JeHPuwCpjkru7H3VhOY5S1m+I"},"settings":{"ahfgeienlihckogmohjhadlkjgocpleb":"6D765A739898E9BADD882103E5D2B9FC364D897B91BFB9289A28B68C362452A6","dgiklkfkllikcanfonkcabmbdfmgleag":"A9780A8405181440FF25250B9442979500C69ADD12EE4E4A2431A4884D112587","fikbjbembnmfhppjfnmfkahdhfohhjmg":"C0745B184F2A05D334A178D0E06AE26E382D41CB5EDB2437472C4ADC3A798CF4","iglcjdemknebjbklcgkfaebgojjphkec":"78E8D63F1DEC02EC5E556708615A252CF9FC6C6EF38A06877E4A2615E492FC89","ihmafllikibpmigkcoadcmckbfhibefp":"24C08C6EEC49A3E288AB4BD009E8B7E27F2F96420A1949BA059281F394593CC1","jdiccldimpdaibmpdkjnbmckianbfold":"256B4C00EC0D40E7B141A233A16E26E03A5E395AF52ADF1A796944A95507916E","mhjfbmdgcfjbbpaeojofohoefgiehjai":"F25F7B26711D5AEAA312E0B5929381D65955FEF1F5284AEE73B613BB794564A9","ncbjelpjchkpbikbpkcchkhkblodoama":"BC24ADFB053D0EA744B8087661BBE3A95222564E2B768BCBE4FDFBEA978BC437","nkeimhogjdpnpccoofpliimaahmaaome":"991DB26DDA4CC8BB90893FDC1EA7D625FA402B81102A01A3B185D4726FAA46B4"},"settings_encrypted_hash":{"ahfgeienlihckogmohjhadlkjgocpleb":"djEwektgyElRh9EIi67rESG/pgOE04QD/G0TwY3/T2azp6U5lq9bb8h925AGe62y5AU6CiNfEMHueDfSLduN","dgiklkfkllikcanfonkcabmbdfmgleag":"djEw0Zb0H3MdcEIjTUh0wxRhYrM25ax6FbmfjxuNXpIzOOrjy9jy3DQDOPg04fJFyetMpTz3o51POaJPMOgH","fikbjbembnmfhppjfnmfkahdhfohhjmg":"djEw6YmFdiVZdREZgLiUQMsNTnfKBQLAQ56HVjGBWkHj2asamAyG5na372obux6mOFgMIJQSS4uWt5AK4Elo","iglcjdemknebjbklcgkfaebgojjphkec":"djEw7/I9RlN5YALqRIrui/y3tW2cocSF7FHPVjwz9ClB8d0W1gebIt0A4UZdQhi4+9+E6RBbkJ1cHs4fYA8y","ihmafllikibpmigkcoadcmckbfhibefp":"djEwwGH7SsZQBJ0G6I9YXGIwO4vkSMOc3/0s8RZmJzNCa5sbAUIAKJxf4ap0zkhZWDZ3FrF/Tv0FXrNWw4OR","jdiccldimpdaibmpdkjnbmckianbfold":"djEwZZjv6qOI+EDAmvFcqegdpVd9cT16cuEZlFhewNo+FZ6aHTnCsMYPtaYWzs3to3r6PrhU9fVhtUBiYAk+","mhjfbmdgcfjbbpaeojofohoefgiehjai":"djEw1l/2DJW7rFAPjZOX7wl1I0Jqkv95/X3dQcspA0P1eEtnQuCnALlzS3SQXXVH29dzZk4F8qoyXZ3WKQdU","ncbjelpjchkpbikbpkcchkhkblodoama":"djEwHminAC+Lja8McYScaLStLwXhCCh018WRgsnEjV21MpYRZGRfju5h2ybJaIv2lY79cT98BrfJSNDn60kq","nkeimhogjdpnpccoofpliimaahmaaome":"djEwo3e9PlcFxKBxKplrvstkK3m5Ncl7XrmV3hkc65ne35BJ7FmzrY/VIQkkse/Cq9bRMsdB09BCgszjsw6J"},"ui":{"developer_mode":"C56CAEDE4F773F33F6AA11ED3B55DB5AD6A79944D966D3FAC1E9453157EF4B18","developer_mode_encrypted_hash":"djEwVFqcVngK9FTuwFuv8+4NGdQ0W9Fakl4vXxFo+OeebQdNvABEi5Y8t9pcQ9NEmlvQE3BM/2g7RUzrYXtN"}},"google":{"services":{"last_signed_in_username":"2EE81834DB0B6D8AB9FD660F0A7C98EBD4A8B40A74118150DD2893194EB8A60C","last_signed_in_username_encrypted_hash":"djEwiN8QAIgTpNPsjzV8ZZ1ceB3WN7WBIwxxYkVCF4RW1FYWBxJHk4hJf3sinuH2PVxsZXyhkNf2fFK/WMcn"}},"homepage":"2C46CB79C277992F901435D45CCDA37D9176019676D60FCE7C7939C59063EDEE","homepage_encrypted_hash":"djEwCU4xUgs0srEzcvxXK/9HP2pID2aen3sS6SGb/VFa7Qvm5HelNTqEAlfyQ9+9JH2qpVbDxPZQxSm2nyJI","homepage_is_newtabpage":"30436771E0E4D9590DD1363343DD7F37A3E00DAA38D260FA94A455B233AEB744","homepage_is_newtabpage_encrypted_hash":"djEw4F81iKeBq7tygAD/5nfkqLdmNufqPXXLMh8/6JHqUEuSyigDdEiO2674dayl5wJwQ0Xlq9TCJA9F2xFY","media":{"cdm":{"origin_data":"DC74BF09FCACFE9E058BC4A62275D82145C4F64C0BB55FBCC13287C1856D2085","origin_data_encrypted_hash":"djEw8YfXFvN44OvyvAqDaT+07vrsPUAqfrEFTLG2qCKob3EScMH31mY9CcipdVrEr6nUbXajGtv51KVtU1+/"},"storage_id_salt":"838B681888FC88C8EA74E985DE45075E76611EC1BD17C92C675A24F41A103D20","storage_id_salt_encrypted_hash":"djEwCewJe3i9ahF//QLzxscSpO1fp1x0co8I9njoUzlr3tLigrioPVBu2wBT1vytcCjUjsza9Ykp5+9uEHeJ"},"pinned_tabs":"D9B2ADF8FE923DA216C09DA91C85011B0807A3BDC4D17D1B900481B183B2023C","pinned_tabs_encrypted_hash":"djEwyvJoAPubTaRsnJ8V2gZ3gG0CG/wfcKr32irEaboGiovN44sAAFINUpvcdP4BeF4WhkmCipjocwCP1G7u","prefs":{"preference_reset_time":"C755211BE9000AE8E8418A0B43B236E11E395162C56317F814A7C1C1F5FA37DB","preference_reset_time_encrypted_hash":"djEwdvorm5Xr3RObyFu4yzuC6IxV/2GqogcXbnDD1KJ9+fSOzBHCOwOOIUaPtOQRobCc57yaGqsjceoSzaZp"},"safebrowsing":{"incidents_sent":"C27E7B6414757EC7B69237008F3609C63D8B3E0D3022C6F8AC1BB28D821F9680","incidents_sent_encrypted_hash":"djEwx2AUqcAsR07H6/Xndd/raJVgjDGMj4NRDxiRMgw5iMjllI6L8MiYftO9PAs3GZGy7oQfcyJYr8YBice1"},"schedule_to_flush_to_disk":"5DBF1F3493F281166A9CD61FF0091A0435B5F38A264C01A9D1D6D93D6C43C740","schedule_to_flush_to_disk_encrypted_hash":"djEwJ8r2FddMHW5VgTAiXj3uRk9OB0WK9g5mlcLpHLH1em2Tz9IDOehYMToceN8dPN9wC/vjTNEnuffl2f6Z","search_provider_overrides":"2C79C4955D5E2C0AC3644E8A29357FD7DB1C6DCFDB7556E1B5641E31FB0F57DB","search_provider_overrides_encrypted_hash":"djEwm8nBxCbkXahvCsa5tPt0iYiD7hN6d/PF6wZVhsrYJxslCtXQRhfMe5fVRM5oNs739azHSyrPsWIk+gJv","session":{"restore_on_startup":"BF14AE9EDA027778E3C2047056BE1B321AE63B933A29FA05B30E76FE780AD0CE","restore_on_startup_encrypted_hash":"djEw5UUSImedwLl//BXYSF2yQVtqerjRriJYNLWejSHWRz2afH7PdtUgzeUruHkN5Szo5WTOHgsULdQd18WW","startup_urls":"4266BB085D3346F8626C812970D202685455DEC0CBBB807690923BAE5510C65E","startup_urls_encrypted_hash":"djEwVY/qtsNa9ndoV+F/+sjEffRmdoGZ+vujGD6JbpQ2ZDggyGqZOzSEsfJWSa5ExP6MiUPpvTK+l4fSfN74"}},"super_mac":"3CFE07FC9A6912E91CB4012E999278EFAD98D84B541D8F632A52FD96758C613F"},"schedule_to_flush_to_disk":"13418948525837394"} \ No newline at end of file diff --git a/.edge-profile-render-1774474922711/Default/Segmentation Platform/SegmentInfoDB/LOCK b/.edge-profile-render-1774474922711/Default/Segmentation Platform/SegmentInfoDB/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Default/Segmentation Platform/SegmentInfoDB/LOG b/.edge-profile-render-1774474922711/Default/Segmentation Platform/SegmentInfoDB/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Default/Segmentation Platform/SignalDB/LOCK b/.edge-profile-render-1774474922711/Default/Segmentation Platform/SignalDB/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Default/Segmentation Platform/SignalDB/LOG b/.edge-profile-render-1774474922711/Default/Segmentation Platform/SignalDB/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Default/Segmentation Platform/SignalStorageConfigDB/LOCK b/.edge-profile-render-1774474922711/Default/Segmentation Platform/SignalStorageConfigDB/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Default/Segmentation Platform/SignalStorageConfigDB/LOG b/.edge-profile-render-1774474922711/Default/Segmentation Platform/SignalStorageConfigDB/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Default/ServerCertificate b/.edge-profile-render-1774474922711/Default/ServerCertificate new file mode 100644 index 0000000..9587f64 Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/ServerCertificate differ diff --git a/.edge-profile-render-1774474922711/Default/ServerCertificate-journal b/.edge-profile-render-1774474922711/Default/ServerCertificate-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Default/Sessions/Session_13418948526749724 b/.edge-profile-render-1774474922711/Default/Sessions/Session_13418948526749724 new file mode 100644 index 0000000..a84f658 Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/Sessions/Session_13418948526749724 differ diff --git a/.edge-profile-render-1774474922711/Default/SharedStorage b/.edge-profile-render-1774474922711/Default/SharedStorage new file mode 100644 index 0000000..4410bda Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/SharedStorage differ diff --git a/.edge-profile-render-1774474922711/Default/SharedStorage-wal b/.edge-profile-render-1774474922711/Default/SharedStorage-wal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Default/Shortcuts b/.edge-profile-render-1774474922711/Default/Shortcuts new file mode 100644 index 0000000..6dbc636 Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/Shortcuts differ diff --git a/.edge-profile-render-1774474922711/Default/Shortcuts-journal b/.edge-profile-render-1774474922711/Default/Shortcuts-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Default/Site Characteristics Database/CURRENT b/.edge-profile-render-1774474922711/Default/Site Characteristics Database/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile-render-1774474922711/Default/Site Characteristics Database/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile-render-1774474922711/Default/Site Characteristics Database/LOCK b/.edge-profile-render-1774474922711/Default/Site Characteristics Database/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Default/Site Characteristics Database/LOG b/.edge-profile-render-1774474922711/Default/Site Characteristics Database/LOG new file mode 100644 index 0000000..d74a780 --- /dev/null +++ b/.edge-profile-render-1774474922711/Default/Site Characteristics Database/LOG @@ -0,0 +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 diff --git a/.edge-profile-render-1774474922711/Default/Site Characteristics Database/MANIFEST-000001 b/.edge-profile-render-1774474922711/Default/Site Characteristics Database/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/Site Characteristics Database/MANIFEST-000001 differ diff --git a/.edge-profile-render-1774474922711/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/js/index b/.edge-profile-render-1774474922711/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/js/index new file mode 100644 index 0000000..79bd403 Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/js/index differ diff --git a/.edge-profile-render-1774474922711/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/js/index-dir/the-real-index b/.edge-profile-render-1774474922711/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/js/index-dir/the-real-index new file mode 100644 index 0000000..067e2f0 Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/js/index-dir/the-real-index differ diff --git a/.edge-profile-render-1774474922711/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/wasm/index b/.edge-profile-render-1774474922711/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/wasm/index new file mode 100644 index 0000000..79bd403 Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/wasm/index differ diff --git a/.edge-profile-render-1774474922711/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/wasm/index-dir/the-real-index b/.edge-profile-render-1774474922711/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/wasm/index-dir/the-real-index new file mode 100644 index 0000000..007440f Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/wasm/index-dir/the-real-index differ diff --git a/.edge-profile-render-1774474922711/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_0 b/.edge-profile-render-1774474922711/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_0 new file mode 100644 index 0000000..d76fb77 Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_0 differ diff --git a/.edge-profile-render-1774474922711/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_1 b/.edge-profile-render-1774474922711/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_1 new file mode 100644 index 0000000..035d06d Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_1 differ diff --git a/.edge-profile-render-1774474922711/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_2 b/.edge-profile-render-1774474922711/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_2 new file mode 100644 index 0000000..c7e2eb9 Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_2 differ diff --git a/.edge-profile-render-1774474922711/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_3 b/.edge-profile-render-1774474922711/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_3 new file mode 100644 index 0000000..5eec973 Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_3 differ diff --git a/.edge-profile-render-1774474922711/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/index b/.edge-profile-render-1774474922711/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/index new file mode 100644 index 0000000..d59ae7f Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/index differ diff --git a/.edge-profile-render-1774474922711/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_0 b/.edge-profile-render-1774474922711/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_0 new file mode 100644 index 0000000..d76fb77 Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_0 differ diff --git a/.edge-profile-render-1774474922711/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_1 b/.edge-profile-render-1774474922711/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_1 new file mode 100644 index 0000000..035d06d Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_1 differ diff --git a/.edge-profile-render-1774474922711/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_2 b/.edge-profile-render-1774474922711/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_2 new file mode 100644 index 0000000..c7e2eb9 Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_2 differ diff --git a/.edge-profile-render-1774474922711/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_3 b/.edge-profile-render-1774474922711/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_3 new file mode 100644 index 0000000..5eec973 Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_3 differ diff --git a/.edge-profile-render-1774474922711/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/index b/.edge-profile-render-1774474922711/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/index new file mode 100644 index 0000000..e3ef668 Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/index differ diff --git a/.edge-profile-render-1774474922711/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_0 b/.edge-profile-render-1774474922711/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_0 new file mode 100644 index 0000000..d76fb77 Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_0 differ diff --git a/.edge-profile-render-1774474922711/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_1 b/.edge-profile-render-1774474922711/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_1 new file mode 100644 index 0000000..035d06d Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_1 differ diff --git a/.edge-profile-render-1774474922711/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_2 b/.edge-profile-render-1774474922711/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_2 new file mode 100644 index 0000000..c7e2eb9 Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_2 differ diff --git a/.edge-profile-render-1774474922711/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_3 b/.edge-profile-render-1774474922711/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_3 new file mode 100644 index 0000000..5eec973 Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_3 differ diff --git a/.edge-profile-render-1774474922711/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/index b/.edge-profile-render-1774474922711/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/index new file mode 100644 index 0000000..03785c9 Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/index differ diff --git a/.edge-profile-render-1774474922711/Default/Sync Data/LevelDB/CURRENT b/.edge-profile-render-1774474922711/Default/Sync Data/LevelDB/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile-render-1774474922711/Default/Sync Data/LevelDB/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile-render-1774474922711/Default/Sync Data/LevelDB/LOCK b/.edge-profile-render-1774474922711/Default/Sync Data/LevelDB/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Default/Sync Data/LevelDB/LOG b/.edge-profile-render-1774474922711/Default/Sync Data/LevelDB/LOG new file mode 100644 index 0000000..cf96ad9 --- /dev/null +++ b/.edge-profile-render-1774474922711/Default/Sync Data/LevelDB/LOG @@ -0,0 +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 diff --git a/.edge-profile-render-1774474922711/Default/Sync Data/LevelDB/MANIFEST-000001 b/.edge-profile-render-1774474922711/Default/Sync Data/LevelDB/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/Sync Data/LevelDB/MANIFEST-000001 differ diff --git a/.edge-profile-render-1774474922711/Default/Top Sites b/.edge-profile-render-1774474922711/Default/Top Sites new file mode 100644 index 0000000..e700bd4 Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/Top Sites differ diff --git a/.edge-profile-render-1774474922711/Default/Top Sites-journal b/.edge-profile-render-1774474922711/Default/Top Sites-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Default/Vpn Tokens b/.edge-profile-render-1774474922711/Default/Vpn Tokens new file mode 100644 index 0000000..2ba3b69 Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/Vpn Tokens differ diff --git a/.edge-profile-render-1774474922711/Default/Vpn Tokens-journal b/.edge-profile-render-1774474922711/Default/Vpn Tokens-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Default/Web Data b/.edge-profile-render-1774474922711/Default/Web Data new file mode 100644 index 0000000..a326359 Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/Web Data differ diff --git a/.edge-profile-render-1774474922711/Default/Web Data-journal b/.edge-profile-render-1774474922711/Default/Web Data-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Default/arbitration_service_config.json b/.edge-profile-render-1774474922711/Default/arbitration_service_config.json new file mode 100644 index 0000000..fd7d0be --- /dev/null +++ b/.edge-profile-render-1774474922711/Default/arbitration_service_config.json @@ -0,0 +1,197 @@ +{ + "ArbitrationSignal": "notification_nsat_upper_ci-0.7", + "CopilotModeBypass": [ "cd4688a9-e888-48ea-ad81-76193d56b1be.IsVideoPage.Bubble", "cd4688a9-e888-48ea-ad81-76193d56b1be.IsKnowledgeCardQuery.Bubble", "PerformanceDetectorFeatureNotification", "AUTOFILL_PASSWORD_NON_FUNCTIONAL_FLYOUTS", "SHOPPING_AUTO_SHOW_LOWER_PRICE_FOUND", "SHOPPING_AUTO_SHOW_REBATES", "SHOPPING_AUTO_SHOW_REBATES_CONFIRMATION", "SHOPPING_AUTO_SHOW_REBATES_ORGANIC", "SHOPPING_AUTO_SHOW_REBATES_ORGANIC_NEW" ], + "CustomSuppressionPolicies": { + "8682d0fa-50b3-4ece-aa5b-e0b33f9919e2.f5b8c725-cb2e-4c12-accd-73e500d88d47.AutoOpen": { + "notification_max_quick_dismiss_count": 3 + }, + "bc25fcef-8964-4e72-8287-23e2b496c128.68b8a884-6e08-46e6-8a3b-7e06ffe48ecf.AutoOpen": { + "notification_max_quick_dismiss_count": 3 + }, + "cd4688a9-e888-48ea-ad81-76193d56b1be.e06e75c1-a59a-4ab6-8361-e8b038e00a8c.AutoOpen": { + "notification_max_quick_dismiss_count": 1 + } + }, + "DynamicSuppressionBypass": { + "ExperienceIDs": [ "Nurturing.Global.OnRamp_RetriggerFREOnEdgeVersionUpgradeViaExplicitLaunch", "Nurturing.Global.OnRamp_RetriggerFREOnExplicitProtocolPDFLaunchForEdgePostDMA", "Nurturing.Global.Bing_DefaultBrowserBannerCloseBtn", "Nurturing.Global.Bing_DefaultBrowserBannerCloseBtnUpdate", "Nurturing.Global.Bing_MSStartYJCompete", "Nurturing.Global.Bing_NtpHomeStartpageUpsellFlyout", "Nurturing.Global.Fundamentals_DefaultBrowserMonitor", "Nurturing.Global.Fundamentals_DefaultBrowserMonitorOnStart", "Nurturing.Global.Fundamentals_DefaultBrowserMonitorVariant2", "Nurturing.Global.RecommendedSettingsChina", "Nurturing.Global.ContinuousImport_PasswordZeroStateV2", "Nurturing.Global.OnRamp_CIExplicitLaunchBannerUpsell", "Nurturing.Global.OnRamp_CIUpsell_ProtocolLaunch_Banner", "Nurturing.Global.EdgeGrowth_SitePinningCITopSites", "Nurturing.Global.EdgeGrowth_SitePinningWithWindowsConsent", "Nurturing.Global.EdgeGrowth_GlobalSitePinningOnCloseModal" ], + "TeamIDs": [ "NTP" ] + }, + "ExperienceCohorts": { + "DefaultCohort": { + "21f3388b-c2a5-4791-8f6e-a4cad6d17f4f.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.BingHomePage.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Covid.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Finance.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Jobs.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.KnowledgeCard.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Local.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.NTP3PCLICK.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.NotifySearchPage.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Recipe.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.SearchPage.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Sports.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Travel.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Weather.Bubble": 1, + "2cb2db96-3bd0-403e-abe2-9269b3761041.AutoOpen": 1, + "2cb2db96-3bd0-403e-abe2-9269b3761041.Bubble": 1, + "439642fc-998d-4a64-8bb6-940ecaf6b60b.AutoOpen": 1, + "439642fc-998d-4a64-8bb6-940ecaf6b60b.Bubble": 1, + "523b5ef3-0b10-4154-8b62-10b2ebd00921.Bubble": 1, + "64be4f9b-3b81-4b6e-b354-0ba00d6ba485.AutoOpen": 1, + "64be4f9b-3b81-4b6e-b354-0ba00d6ba485.Bubble": 1, + "76b926d6-3738-46bf-82d7-2ab896ddf70b.MM2UpSellPopup.Bubble": 1, + "8682d0fa-50b3-4ece-aa5b-e0b33f9919e2.Bubble": 1, + "8682d0fa-50b3-4ece-aa5b-e0b33f9919e2.f5b8c725-cb2e-4c12-accd-73e500d88d47.AutoOpen": 1, + "8ac719c5-140b-4bf2-a0b7-c71617f1f377.3662f1e2-66ae-464f-b690-e7e3dc4fc662.AutoOpen": 1, + "8ac719c5-140b-4bf2-a0b7-c71617f1f377.93e5b5cd-15fc-4253-9728-d80685da304e.AutoOpen": 1, + "8ac719c5-140b-4bf2-a0b7-c71617f1f377.AutoOpen": 1, + "8ac719c5-140b-4bf2-a0b7-c71617f1f377.gaokao.Bubble": 1, + "92f1b743-e26b-433b-a1ec-912d1f0ad1fa.Bubble": 1, + "96defd79-4015-4a32-bd09-794ff72183ef.0bdde3c3-7be8-49f1-971b-e6e2cfd62643.AutoOpen": 1, + "96defd79-4015-4a32-bd09-794ff72183ef.128c39c6-6f70-4ce5-9d01-78978e60d666.AutoOpen": 1, + "96defd79-4015-4a32-bd09-794ff72183ef.5ac63306-e962-42e6-8313-7e5a5b707d65.AutoOpen": 1, + "96defd79-4015-4a32-bd09-794ff72183ef.AutoOpen": 1, + "96defd79-4015-4a32-bd09-794ff72183ef.Bubble": 1, + "96defd79-4015-4a32-bd09-794ff72183ef.Is1PGameDomain.Bubble": 1, + "96defd79-4015-4a32-bd09-794ff72183ef.Is3PGameDomain.Bubble": 1, + "9ce3c9c2-462f-4cc9-bbd7-57d656445be0.Bubble": 1, + "AUTOFILL_PASSWORD_NON_FUNCTIONAL_FLYOUTS": 1, + "DefaultExperience": 1, + "EdgeDownloadChromeInterceptDialog": 2, + "PerformanceDetectorFeatureNotification": 1, + "RewardsPromotionNotifications": 1, + "RewardsReminderNotifications": 1, + "SAN.Personalization.ConsentPrompt": 1, + "SHOPPING_AA_CONSENT": 1, + "SHOPPING_AUTO_PRODUCT_TRACKING_EXP_PRICE_DROP": 1, + "SHOPPING_AUTO_PRODUCT_TRACKING_IMP_PRICE_DROP": 1, + "SHOPPING_AUTO_PRODUCT_TRACKING_OUT_OF_STOCK": 1, + "SHOPPING_AUTO_SHOW_ABANDONED_CART": 1, + "SHOPPING_AUTO_SHOW_ADD_SPB_TO_CART_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_AMAZON_SEARCH_PC": 1, + "SHOPPING_AUTO_SHOW_ATTAINABLE_COUPONS": 1, + "SHOPPING_AUTO_SHOW_AUTOS_MARKETPLACE": 1, + "SHOPPING_AUTO_SHOW_AWARENESSEXP": 1, + "SHOPPING_AUTO_SHOW_AWARENESS_EXPANSION": 1, + "SHOPPING_AUTO_SHOW_CAMPAIGN_AWARENESS_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_CAMPAIGN_PDP_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_CASHBACK_PDP_PLUS_COUPONS": 1, + "SHOPPING_AUTO_SHOW_CJK_COUPON_FOUND": 1, + "SHOPPING_AUTO_SHOW_CJK_PRICE_DROP": 1, + "SHOPPING_AUTO_SHOW_CODEX_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_CONFIRMATION_SCRIPT": 1, + "SHOPPING_AUTO_SHOW_CONTROLLER": 1, + "SHOPPING_AUTO_SHOW_COUPONS_BACKGROUND_AUTO_APPLY": 1, + "SHOPPING_AUTO_SHOW_COUPONS_CHECKOUT": 1, + "SHOPPING_AUTO_SHOW_COUPONS_CHECKOUT_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_COUPONS_CLIPPING": 1, + "SHOPPING_AUTO_SHOW_DISCOVER_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_DISCOVER_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_EXPRESS_CHECKOUT": 1, + "SHOPPING_AUTO_SHOW_GIFT_CARD": 1, + "SHOPPING_AUTO_SHOW_GOODRX": 1, + "SHOPPING_AUTO_SHOW_GROCERY_ITEMIZED_CASHBACK": 1, + "SHOPPING_AUTO_SHOW_GROCERY_ITEMIZED_CASHBACK_LANDING": 1, + "SHOPPING_AUTO_SHOW_GUEST_DOMAIN_COUPONS": 1, + "SHOPPING_AUTO_SHOW_IBC_UPSELL": 1, + "SHOPPING_AUTO_SHOW_LOWER_PRICE_FOUND": 1, + "SHOPPING_AUTO_SHOW_LOWER_PRICE_PLUS_CASHBACK_PLUS_COUPONS": 1, + "SHOPPING_AUTO_SHOW_MOMENT_IN_TIME": 1, + "SHOPPING_AUTO_SHOW_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_ORGANIC_CASHBACK_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_OTHER_SELLER": 1, + "SHOPPING_AUTO_SHOW_OUT_OF_STOCK": 1, + "SHOPPING_AUTO_SHOW_PACKAGE_TRACKING": 1, + "SHOPPING_AUTO_SHOW_PACKAGE_TRACKING_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_PERSONALIZED_CASHBACK_ADDRESSBAR": 1, + "SHOPPING_AUTO_SHOW_PERSONALIZED_CASHBACK_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_POST_PURCHASE_TRACKING": 1, + "SHOPPING_AUTO_SHOW_PRICE_DROP_PLUS_CASHBACK": 1, + "SHOPPING_AUTO_SHOW_PRICE_DROP_PLUS_COUPONS": 1, + "SHOPPING_AUTO_SHOW_PRICE_HISTORY": 1, + "SHOPPING_AUTO_SHOW_PRICE_HISTORY_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_PRINT_GROCERY": 1, + "SHOPPING_AUTO_SHOW_PRODUCT_BEST_COUPON_CONSENT": 1, + "SHOPPING_AUTO_SHOW_PRODUCT_TRACKING_BACK_IN_STOCK": 1, + "SHOPPING_AUTO_SHOW_PRODUCT_TRACKING_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_PROFESSIONAL_REVIEWS": 1, + "SHOPPING_AUTO_SHOW_REBATES": 1, + "SHOPPING_AUTO_SHOW_REBATES_CHECKOUT": 1, + "SHOPPING_AUTO_SHOW_REBATES_ORGANIC": 1, + "SHOPPING_AUTO_SHOW_REBATES_ORGANIC_NEW": 1, + "SHOPPING_AUTO_SHOW_REBATES_PDP": 1, + "SHOPPING_AUTO_SHOW_RECOMMENDATIONS_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_SAN_CONSENT_CONFIRMATION": 1, + "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_ALL_PAGES": 1, + "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_CHECKOUT": 1, + "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_CONFIRMATION_PAGE": 1, + "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_HOME_PAGE": 1, + "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_REWARDS": 1, + "SHOPPING_AUTO_SHOW_SHOPRUNNER": 1, + "SHOPPING_AUTO_SHOW_SIDEPANE_CASHBACK_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_SPB_CASHBACK_LANDING": 1, + "SHOPPING_AUTO_SHOW_SPB_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_SPB_NUDGE_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_SURFACE_UPSELL": 1, + "SHOPPING_AUTO_SHOW_SUSTAINABILITY_LANDING": 1, + "SHOPPING_AUTO_SHOW_TRAVEL_NOTIFICATION_CHEAPER_FLIGHTS": 1, + "SHOPPING_AUTO_SHOW_TRAVEL_NOTIFICATION_CHEAPER_HOTEL_ROOM": 1, + "SHOPPING_AUTO_SHOW_TRENDING_COUPONS": 1, + "ShorelinePrivilegedExperienceID": 1, + "TabActionsMenuVerticalTabsPromotion": 1, + "VPNFeatureNotification": 1, + "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.75a774c2-6075-ae4f-09f9-e5f5d9bef6e1.AutoOpen": 1, + "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.AutoOpen": 1, + "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.a5e9f5e1-fcee-c07b-2c44-b707ded020a3.AutoOpen": 1, + "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.c8ebbf64-e3b8-41d9-925f-4e3754151ff7.AutoOpen": 1, + "bc25fcef-8964-4e72-8287-23e2b496c128.68b8a884-6e08-46e6-8a3b-7e06ffe48ecf.AutoOpen": 1, + "bc25fcef-8964-4e72-8287-23e2b496c128.Bubble": 1, + "c8ebd871-9f47-4a0d-abd3-c1c02b4f8f53.2cfab14c-ebd6-4548-9401-30ab5afe5061.AutoOpen": 1, + "c8ebd871-9f47-4a0d-abd3-c1c02b4f8f53.AutoOpen": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.5b853177-a0be-4237-bda0-4fce5cd165c2.AutoOpen": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.8d3a928d-e911-40f0-9852-f63f6434dc7e.AutoOpen": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.AutoOpen": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.AutoOpen.PDF": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.AutoOpen.PersistentChat": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsCompeteAISite.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsCopilotJitEduAcademicAI.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsCopilotJitEduArticleAI.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsCopilotJitEduStudyAI.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsKnowledgeCardQuery.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsMsnArticleUrlFromNtpP1P2.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsShoppingNotificationNudge.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsTextPage.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsTopNewsDomain.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsTwitchNonStreamPage.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsTwitchSubPage.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsVideoPage.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.e06e75c1-a59a-4ab6-8361-e8b038e00a8c.AutoOpen": 1, + "e6723537-66ff-4f4e-ab56-a4cbaddf4e0f.MM2UpSellPopup.Bubble": 1 + } + }, + "FunctionalCohort": [ "EdgeDownloadChromeInterceptFunctionalDialog", "8682d0fa-50b3-4ece-aa5b-e0b33f9919e2.AutoOpen.Functional", "8682d0fa-50b3-4ece-aa5b-e0b33f9919e2.f5b8c725-cb2e-4c12-accd-73e500d88d47.AutoOpen.Functional", "bc25fcef-8964-4e72-8287-23e2b496c128.AutoOpen.Functional", "bc25fcef-8964-4e72-8287-23e2b496c128.68b8a884-6e08-46e6-8a3b-7e06ffe48ecf.AutoOpen.Functional", "WPOFunctionalEvent.AutofillAccountChooser.Bubble", "WPOFunctionalEvent.AutofillAutoSignin.Bubble", "WPOFunctionalEvent.AutofillPassword.Bubble", "SHOPPING_AUTO_SHOW_BING_SEARCH", "SHOPPING_AUTO_SHOW_REBATES_CONFIRMATION", "SHOPPING_AUTO_SHOW_REBATES_DEACTIVATED", "SHOPPING_AUTO_SHOW_REBATES_BING", "SHOPPING_AUTO_SHOW_PERSONALIZED_CASHBACK", "SHOPPING_AUTO_SHOW_PERSONALIZED_CASHBACK_CONFIRMATION", "SHOPPING_AUTO_SHOW_URL_PARAM_REBATES", "SHOPPING_AUTO_SHOW_URL_PARAM_PRICE_COMPARISON", "SHOPPING_AUTO_SHOW_URL_PARAM_PRICE_HISTORY", "SHOPPING_AUTO_SHOW_REBATES_ACTIVATION_FAILED", "SHOPPING_AUTO_SHOW_REBATES_SWITCHED_TO_MSA", "SHOPPING_AUTO_SHOW_ITEM_ADDED_TO_CART_FROM_OTHER_SELLER", "SHOPPING_AUTO_SHOW_VIRTUAL_CARD", "SHOPPING_AUTO_SHOW_BING_CAMPAIGN", "SHOPPING_OPEN_FLYOUT_FROM_EDGE_DRIVER", "SHOPPING_AUTO_SHOW_SUSTAINABILITY_PURCHASE", "SHOPPING_AUTO_SHOW_REWARDS_ACTIVATION_FAILED", "SHOPPING_AUTO_SHOW_REWARDS_SWITCHED_TO_MSA", "SHOPPING_AUTO_SHOW_SHOPRUNNER_CONFIRMATION", "SHOPPING_AUTO_SHOW_ENROLL_TO_CASHBACK_CONFIRMATION_NOTIFICATION", "SHOPPING_AUTO_SHOW_POST_PURCHASE_REWARDS_NOTIFICATION", "694efa4f-a304-4214-aaf7-90444bc887f5.c1c025d9-a620-4f6b-bebb-eff0cf19a671.AutoOpen.Functional" ], + "GlobalSuppressedExperiences": [ "Teams.Bubble", "Nurturing.Global.EdgeVpn_VpnFre", "Nurturing.Global.Rewards_RedemptionCoachmark_2", "Nurturing.Global.Rewards_RedemptionCoachmark_25", "Nurturing.Global.EdgeCBUD_SanPersonalizationConsentWave1Variant0", "Nurturing.Global.Bing_NewBingChatFlyout", "Copilot.AutoOpen.PDF.v2", "Nurturing.Global.PWA_SidebarSearchPromotion", "Nurturing.Global.FC_NetworkWarningFlyout", "Nurturing.Global.EdgeMobile_MobileUpsell_ChatGpt_Flyout", "E-tree.Bubble", "Nurturing.Global.EdgeEDU_BrowserFocusedTranslateNudge", "Games.Bubble", "Nurturing.Global.OnRamp_RetriggerFRECodexCoPilotAutoAprd", "Nurturing.Global.OnRamp_NurturingViaProng_Experiment", "Nurturing.Global.OnRamp_ReTriggerOnWinUpgrade", "Nurturing.Global.EdgeGrowth_CIShoppingUpsell", "Nurturing.Global.Shopping_EnableShoppingAssistance_Optin_Generic", "Nurturing.Global.Shopping_EnableShoppingAssistance", "Nurturing.Global.BrowserExperiences_TryVerticalTabs" ], + "IgnoredFunctionalNotifications": [ "Nurturing.Functional.NTP_CourtesyEngineCampaign", "Nurturing.Functional.NTP_FunctionalCampaign", "Nurturing.Functional.NTP_SettingsCampaign", "Nurturing.Functional.NTP_UpsellCampaign", "Nurturing.Functional.FN_SmartSwitchFeatureInfoView" ], + "ModelInfo": { + "segment_id": 515, + "signals": [ "notification_triggered_count", "notification_click_rate", "notification_click_rate_lower_ci", "notification_click_rate_upper_ci", "notification_dismiss_rate", "notification_dismiss_rate_lower_ci", "notification_dismiss_rate_upper_ci", "notification_ignored_rate", "notification_ignored_rate_lower_ci", "notification_ignored_rate_upper_ci", "notification_quick_dismiss_rate", "notification_quick_dismiss_rate_lower_ci", "notification_quick_dismiss_rate_upper_ci", "notification_disable_rate", "notification_disable_rate_lower_ci", "notification_disable_rate_upper_ci", "notification_snooze_rate", "notification_snooze_rate_lower_ci", "notification_snooze_rate_upper_ci" ], + "threshold_value": 0.5 + }, + "ModelSuppressionBypass": [ "Nurturing.Local.SHOPPING_AUTO_SHOW_LOWER_PRICE_FOUND", "Nurturing.Local.SHOPPING_AUTO_SHOW_REBATES_ORGANIC", "Nurturing.Local.SHOPPING_AUTO_SHOW_REBATES_CHECKOUT", "Nurturing.Local.SHOPPING_AUTO_SHOW_SPB_CASHBACK_LANDING" ], + "NotificationsAllowLists": { + }, + "PrivilegedExperiences": [ "ShorelinePrivilegedExperienceID", "SHOPPING_AUTO_SHOW_COUPONS_CHECKOUT", "SHOPPING_AUTO_SHOW_LOWER_PRICE_FOUND", "SHOPPING_AUTO_SHOW_REBATES", "SHOPPING_AUTO_SHOW_REBATES_ORGANIC", "SHOPPING_AUTO_SHOW_PRICE_HISTORY", "SHOPPING_AUTO_SHOW_REBATES_ORGANIC_NEW", "SHOPPING_AUTO_SHOW_REBATES_CHECKOUT", "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_CHECKOUT", "SHOPPING_AUTO_SHOW_EXPRESS_CHECKOUT", "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_ALL_PAGES", "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_CONFIRMATION_PAGE", "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_HOME_PAGE", "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_REWARDS", "SHOPPING_AUTO_SHOW_COUPONS_CLIPPING", "SHOPPING_AUTO_SHOW_NOTIFICATION", "SHOPPING_AUTO_SHOW_OTHER_SELLER", "SHOPPING_AUTO_SHOW_PROFESSIONAL_REVIEWS", "SHOPPING_AUTO_SHOW_PACKAGE_TRACKING", "SHOPPING_AUTO_SHOW_GUEST_DOMAIN_COUPONS", "SHOPPING_AUTO_SHOW_SUSTAINABILITY_LANDING", "SHOPPING_AUTO_SHOW_ATTAINABLE_COUPONS", "SHOPPING_AUTO_SHOW_GIFT_CARD", "SHOPPING_AUTO_SHOW_PRINT_GROCERY", "SHOPPING_AUTO_SHOW_GROCERY_ITEMIZED_CASHBACK", "SHOPPING_AUTO_SHOW_CONTROLLER", "SHOPPING_AUTO_SHOW_AUTOS_MARKETPLACE", "SHOPPING_AUTO_SHOW_SHOPRUNNER", "SHOPPING_AUTO_SHOW_ABANDONED_CART", "SHOPPING_AUTO_SHOW_OUT_OF_STOCK", "SHOPPING_AUTO_SHOW_GROCERY_ITEMIZED_CASHBACK_LANDING", "SHOPPING_AUTO_SHOW_SPB_CASHBACK_LANDING", "SHOPPING_AUTO_SHOW_AWARENESSEXP", "SHOPPING_AA_CONSENT", "SHOPPING_AUTO_SHOW_SAN_CONSENT_CONFIRMATION", "SHOPPING_AUTO_SHOW_CONFIRMATION_SCRIPT", "SHOPPING_AUTO_SHOW_MOMENT_IN_TIME", "SHOPPING_AUTO_SHOW_COUPONS_CHECKOUT_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_TRENDING_COUPONS", "SHOPPING_AUTO_SHOW_RECOMMENDATIONS_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_PRODUCT_TRACKING_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_SURFACE_UPSELL", "SHOPPING_AUTO_SHOW_PRODUCT_TRACKING_BACK_IN_STOCK", "SHOPPING_AUTO_PRODUCT_TRACKING_EXP_PRICE_DROP", "SHOPPING_AUTO_PRODUCT_TRACKING_IMP_PRICE_DROP", "SHOPPING_AUTO_PRODUCT_TRACKING_OUT_OF_STOCK", "SHOPPING_AUTO_SHOW_CODEX_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_PERSONALIZED_CASHBACK_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_PRICE_HISTORY_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_ORGANIC_CASHBACK_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_GOODRX", "SHOPPING_AUTO_SHOW_SIDEPANE_CASHBACK_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_DISCOVER_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_REBATES_PDP", "SHOPPING_AUTO_SHOW_PRODUCT_BEST_COUPON_CONSENT", "SHOPPING_AUTO_SHOW_CAMPAIGN_PDP_NOTIFICATION", "SHOPPING_AUTO_SHOW_CAMPAIGN_AWARENESS_NOTIFICATION", "SHOPPING_AUTO_SHOW_SPB_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_PRICE_DROP_PLUS_COUPONS", "SHOPPING_AUTO_SHOW_SPB_NUDGE_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_ADD_SPB_TO_CART_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_CASHBACK_PDP_PLUS_COUPONS", "SHOPPING_AUTO_SHOW_PRICE_DROP_PLUS_CASHBACK", "SHOPPING_AUTO_SHOW_DISCOVER_NOTIFICATION", "SHOPPING_AUTO_SHOW_AMAZON_SEARCH_PC", "SHOPPING_AUTO_SHOW_COUPONS_BACKGROUND_AUTO_APPLY", "SHOPPING_AUTO_SHOW_PERSONALIZED_CASHBACK_ADDRESSBAR", "SHOPPING_AUTO_SHOW_TRAVEL_NOTIFICATION_CHEAPER_FLIGHTS", "SHOPPING_AUTO_SHOW_TRAVEL_NOTIFICATION_CHEAPER_HOTEL_ROOM", "SHOPPING_AUTO_SHOW_CJK_PRICE_DROP", "SHOPPING_AUTO_SHOW_CJK_COUPON_FOUND", "AUTOFILL_PASSWORD_NON_FUNCTIONAL_FLYOUTS", "76b926d6-3738-46bf-82d7-2ab896ddf70b.MM2UpSellPopup.Bubble", "e6723537-66ff-4f4e-ab56-a4cbaddf4e0f.MM2UpSellPopup.Bubble", "8ac719c5-140b-4bf2-a0b7-c71617f1f377.3662f1e2-66ae-464f-b690-e7e3dc4fc662.AutoOpen", "8ac719c5-140b-4bf2-a0b7-c71617f1f377.gaokao.Bubble", "c8ebd871-9f47-4a0d-abd3-c1c02b4f8f53.AutoOpen", "c8ebd871-9f47-4a0d-abd3-c1c02b4f8f53.2cfab14c-ebd6-4548-9401-30ab5afe5061.AutoOpen", "cd4688a9-e888-48ea-ad81-76193d56b1be.AutoOpen.PersistentChat", "cd4688a9-e888-48ea-ad81-76193d56b1be.AutoOpen.PDF", "cd4688a9-e888-48ea-ad81-76193d56b1be.8d3a928d-e911-40f0-9852-f63f6434dc7e.AutoOpen", "cd4688a9-e888-48ea-ad81-76193d56b1be.e06e75c1-a59a-4ab6-8361-e8b038e00a8c.AutoOpen", "cd4688a9-e888-48ea-ad81-76193d56b1be.5b853177-a0be-4237-bda0-4fce5cd165c2.AutoOpen", "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.AutoOpen", "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.c8ebbf64-e3b8-41d9-925f-4e3754151ff7.AutoOpen", "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.75a774c2-6075-ae4f-09f9-e5f5d9bef6e1.AutoOpen", "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.a5e9f5e1-fcee-c07b-2c44-b707ded020a3.AutoOpen", "8682d0fa-50b3-4ece-aa5b-e0b33f9919e2.f5b8c725-cb2e-4c12-accd-73e500d88d47.AutoOpen", "bc25fcef-8964-4e72-8287-23e2b496c128.68b8a884-6e08-46e6-8a3b-7e06ffe48ecf.AutoOpen", "EdgeDownloadChromeInterceptDialog", "439642fc-998d-4a64-8bb6-940ecaf6b60b.AutoOpen", "694efa4f-a304-4214-aaf7-90444bc887f5.c1c025d9-a620-4f6b-bebb-eff0cf19a671.AutoOpen" ], + "ReserveApproved": { + "ExperienceIDs": [ "Nurturing.Global.Edge_SpawnNtpOptIn", "Nurturing.Global.Edge_SpawnNtpOptOut" ], + "SourceIDs": [ 3 ], + "TeamIDs": [ "Edge Consumer Content and Verticals" ] + }, + "ScenarioSuppressLists": { + }, + "SuppressedExperiences": [ ], + "TimeDelta": 5000000, + "baseConfigVersion": "40.0.1", + "configVersion": "40.0.1" +} diff --git a/.edge-profile-render-1774474922711/Default/commerce_subscription_db/LOCK b/.edge-profile-render-1774474922711/Default/commerce_subscription_db/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Default/commerce_subscription_db/LOG b/.edge-profile-render-1774474922711/Default/commerce_subscription_db/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Default/discount_infos_db/LOCK b/.edge-profile-render-1774474922711/Default/discount_infos_db/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Default/discount_infos_db/LOG b/.edge-profile-render-1774474922711/Default/discount_infos_db/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Default/discounts_db/LOCK b/.edge-profile-render-1774474922711/Default/discounts_db/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Default/discounts_db/LOG b/.edge-profile-render-1774474922711/Default/discounts_db/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Default/heavy_ad_intervention_opt_out.db b/.edge-profile-render-1774474922711/Default/heavy_ad_intervention_opt_out.db new file mode 100644 index 0000000..ac64349 Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/heavy_ad_intervention_opt_out.db differ diff --git a/.edge-profile-render-1774474922711/Default/heavy_ad_intervention_opt_out.db-journal b/.edge-profile-render-1774474922711/Default/heavy_ad_intervention_opt_out.db-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Default/load_statistics.db b/.edge-profile-render-1774474922711/Default/load_statistics.db new file mode 100644 index 0000000..4410bda Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/load_statistics.db differ diff --git a/.edge-profile-render-1774474922711/Default/load_statistics.db-shm b/.edge-profile-render-1774474922711/Default/load_statistics.db-shm new file mode 100644 index 0000000..b92fc51 Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/load_statistics.db-shm differ diff --git a/.edge-profile-render-1774474922711/Default/load_statistics.db-wal b/.edge-profile-render-1774474922711/Default/load_statistics.db-wal new file mode 100644 index 0000000..d7ae9c7 Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/load_statistics.db-wal differ diff --git a/.edge-profile-render-1774474922711/Default/optimization_guide_hint_cache_store/LOCK b/.edge-profile-render-1774474922711/Default/optimization_guide_hint_cache_store/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Default/optimization_guide_hint_cache_store/LOG b/.edge-profile-render-1774474922711/Default/optimization_guide_hint_cache_store/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Default/parcel_tracking_db/LOCK b/.edge-profile-render-1774474922711/Default/parcel_tracking_db/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Default/parcel_tracking_db/LOG b/.edge-profile-render-1774474922711/Default/parcel_tracking_db/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Default/shared_proto_db/CURRENT b/.edge-profile-render-1774474922711/Default/shared_proto_db/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile-render-1774474922711/Default/shared_proto_db/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile-render-1774474922711/Default/shared_proto_db/LOCK b/.edge-profile-render-1774474922711/Default/shared_proto_db/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Default/shared_proto_db/LOG b/.edge-profile-render-1774474922711/Default/shared_proto_db/LOG new file mode 100644 index 0000000..bdff907 --- /dev/null +++ b/.edge-profile-render-1774474922711/Default/shared_proto_db/LOG @@ -0,0 +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 diff --git a/.edge-profile-render-1774474922711/Default/shared_proto_db/MANIFEST-000001 b/.edge-profile-render-1774474922711/Default/shared_proto_db/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/shared_proto_db/MANIFEST-000001 differ diff --git a/.edge-profile-render-1774474922711/Default/shared_proto_db/metadata/CURRENT b/.edge-profile-render-1774474922711/Default/shared_proto_db/metadata/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile-render-1774474922711/Default/shared_proto_db/metadata/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile-render-1774474922711/Default/shared_proto_db/metadata/LOCK b/.edge-profile-render-1774474922711/Default/shared_proto_db/metadata/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Default/shared_proto_db/metadata/LOG b/.edge-profile-render-1774474922711/Default/shared_proto_db/metadata/LOG new file mode 100644 index 0000000..5b45c4a --- /dev/null +++ b/.edge-profile-render-1774474922711/Default/shared_proto_db/metadata/LOG @@ -0,0 +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 diff --git a/.edge-profile-render-1774474922711/Default/shared_proto_db/metadata/MANIFEST-000001 b/.edge-profile-render-1774474922711/Default/shared_proto_db/metadata/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile-render-1774474922711/Default/shared_proto_db/metadata/MANIFEST-000001 differ diff --git a/.edge-profile-render-1774474922711/FirstLaunchAfterInstallation b/.edge-profile-render-1774474922711/FirstLaunchAfterInstallation new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/Last Browser b/.edge-profile-render-1774474922711/Last Browser new file mode 100644 index 0000000..28a4fac Binary files /dev/null and b/.edge-profile-render-1774474922711/Last Browser differ diff --git a/.edge-profile-render-1774474922711/Last Version b/.edge-profile-render-1774474922711/Last Version new file mode 100644 index 0000000..a887bff --- /dev/null +++ b/.edge-profile-render-1774474922711/Last Version @@ -0,0 +1 @@ +146.0.3856.72 \ No newline at end of file diff --git a/.edge-profile-render-1774474922711/Local State b/.edge-profile-render-1774474922711/Local State new file mode 100644 index 0000000..c441c36 --- /dev/null +++ b/.edge-profile-render-1774474922711/Local State @@ -0,0 +1 @@ +{"accessibility":{"captions":{"common_models_path":"","soda_translation_binary_path":""}},"autofill":{"ablation_seed":"VTNBngh0xws="},"breadcrumbs":{"enabled":true,"enabled_time":"13418948523938940"},"default_browser":{"browser_name_enum":0},"edge":{"app_user_model_id":"MSEdge","perf_center":{"efficiency_mode_v2_is_active":false,"perf_game_mode":true,"performance_mode":3,"performance_mode_is_on":false},"retrigger_features":[],"tab_stabs":{"closed_without_unfreeze_never_unfrozen":0,"closed_without_unfreeze_previously_unfrozen":0,"discard_without_unfreeze_never_unfrozen":0,"discard_without_unfreeze_previously_unfrozen":0},"tab_stats":{"frozen_daily":0,"unfrozen_daily":0}},"edge_copilot_mode_enabled_state":{"Default":{"enabled":false,"last_set":"13418948524230553"}},"fre":{"has_first_visible_browser_session_completed":true,"oem_bookmarks_set":true},"hardware_acceleration_mode_previous":true,"host_package_checked_on_browser_version":"146.0.7680.154","ie_react":{"has_done_one_time_ie_import":true},"legacy":{"profile":{"name":{"migrated":true}}},"local":{"password_hash_data_list":[]},"metrics":{"client_id_hash_key_created":true},"optimization_guide":{"model_execution":{"last_usage_by_feature":{}},"model_store_metadata":{},"on_device":{"last_version":"146.0.3856.72","model_crash_count":0}},"os_crypt":{"audit_enabled":true,"encrypted_key":"RFBBUEkBAAAA0Iyd3wEV0RGMegDAT8KX6wEAAAAn89AMc7fOSbvGLGpOq+9IEAAAAB4AAABNAGkAYwByAG8AcwBvAGYAdAAgAEUAZABnAGUAAAAQZgAAAAEAACAAAACaI478RTdIiB8uluvOREriiYvLGZ4TqxQ3tTArjIJ1ogAAAAAOgAAAAAIAACAAAAA+N0WXdSSfkTIAb+B9UG3s/G4XlBVm009+AOmZdWL73DAAAABTKNYzvRpil1zdxt6Cq09q4JhJ7PpIONPpcAnLRP+FTMpAIMnPrWLKtO8p2VPKlaFAAAAALvePsl/unZGXgUD1FdYoC9hXLlYZfPB3d03VLrMOGZknaRNWP3pANaMVb2am3n+cIHau9lmT7EldMj/WvZ/ykQ=="},"performance_intervention":{"last_daily_sample":"13418948525804001"},"phoenix":{"user_laf_toggle_state_static":2},"policy":{"last_statistics_update":"13418948523932974"},"profile":{"info_cache":{"Default":{"active_time":1774474925.701722,"avatar_icon":"chrome://theme/IDR_PROFILE_AVATAR_20","background_apps":false,"edge_account_cid":"","edge_account_environment":0,"edge_account_environment_string":"","edge_account_first_name":"","edge_account_last_name":"","edge_account_oid":"","edge_account_sovereignty":0,"edge_account_tenant_id":"","edge_account_type":0,"edge_create_profile_shortcut":false,"edge_profile_can_be_deleted":true,"edge_profile_can_be_edited":true,"edge_test_on_premises":false,"edge_wam_aad_for_app_account_type":0,"force_signin_profile_locked":false,"gaia_id":"","is_consented_primary_account":false,"is_ephemeral":false,"is_using_default_avatar":true,"is_using_default_name":true,"managed_user_id":"","metrics_bucket_index":1,"name":"Profile 1","signin.with_credential_provider":false,"user_name":""}},"last_active_profiles":["Default"],"metrics":{"next_bucket_index":2},"profile_counts_reported":"13418948523722207","profiles_order":["Default"]},"profile_network_context_service":{"http_cache_finch_experiment_groups":"None None None None"},"profiles":{"collect_potential_implicit_signin_data_started":true,"edge":{"guided_switch_pref":[],"implicit_signin":{"platform_error":1001,"primary_error":15,"secondary_error":22,"telemetry_result":0},"multiple_profiles_with_same_account":false},"edge_sso_info":{"aad_sso_algo_state":1,"first_profile_key":"Default","msa_first_profile_key":"Default","msa_sso_algo_state":1},"signin_last_seen_version":"146.0.3856.72","signin_last_updated_time":1774474924.455275},"sentinel_creation_time":"0","session_id_generator_last_value":"1327656988","signin":{"active_accounts_last_emitted":"13418948523714605"},"startup_boost":{"last_browser_open_time":"13418948525159773"},"subresource_filter":{"ruleset_version":{"checksum":0,"content":"","format":0}},"tab_stats":{"discards_expired":0,"discards_external":0,"discards_proactive":0,"discards_urgent":0,"last_daily_sample":"13418948523899686","max_tabs_per_window":2,"reloads_expired":0,"reloads_external":0,"reloads_urgent":0,"total_tab_count_max":2,"window_count_max":1},"telemetry_client":{"cloned_install":{"user_data_dir_id":2939244},"governance":{"last_dma_change_date":"13418948523888284","last_known_cps":2048},"host_telclient_path":"QzpcUHJvZ3JhbSBGaWxlcyAoeDg2KVxNaWNyb3NvZnRcRWRnZVxBcHBsaWNhdGlvblwxNDYuMC4zODU2LjcyXHRlbGNsaWVudC5kbGw=","install_source_name":"windows","os_integration_level":5,"sample_id":1272656,"updater_version":"1.3.225.7","windows_update_applied":false},"ukm":{"persisted_logs":[]},"uninstall_metrics":{"installation_date2":"1774474923"},"user_experience_metrics":{"client_id2":"138355b8-d18c-4ea5-9c04-56d9bfa666f2","diagnostics":{"last_data_collection_level_on_launch":1},"last_seen":{"CrashpadMetrics":"0"},"limited_entropy_randomization_source":"A603C4BC1F3CA87784325A68811BC594","log_record_id":1,"low_entropy_source3":4342,"machine_id":5216996,"payload_counter":1,"pseudo_low_entropy_source":2961,"reporting_enabled":false,"session_id":0,"stability":{"browser_last_live_timestamp":"13418948523045524","saved_system_profile":"CJ2l8s0GEhAxNDYuMC4zODU2LjcyLTY0GAAiBWVuLVVTKhgKCldpbmRvd3MgTlQSCjEwLjAuMjYyMDAybQoGeDg2XzY0EIdfGICAjNGN/x8iE0hQIExhcHRvcCAxNy1ieTB4eHgoATCgBjjYBEIKCAAQABoAMgA6AGUAAIA/ahgKDEdlbnVpbmVJbnRlbBDqjSAYCCABKACCAQCKAQCqAQZ4ODZfNjSwAQFKCg3ZeE7NFV5v0thKCg1sO7s6FV5v0thKCg1Ak3CxFV5v0thKCg0T5AAxFV5v0thKCg1ZIj2uFV5v0thKCg0XBxSpFV5v0thKCg0T2ptcFV5v0thKCg2Q6as/FV5v0thKCg1DO2FuFV5v0thQBGIESU5CWGoICAAQADgAQACAAdCZkc4GmAEA+AH2IYAC////////////AYgCAagCkReyAjDRJfNWC4+9L/K351oQADyTN0RE6rqF3y+rE8bwOQvdoidEg0lfDgvA6BJXNkzzDV3xAqlLUh+DN8Wbyj7nAgoECAAQABIIIgQIAhACKAEiAggCMgYIACIAKgA6Cwjz///v9/////8BQigSCTEuMy4yMjUuNxgFIAAqDlJlZ0tleU5vdEZvdW5kMgd3aW5kb3dzUgIIAFr8AQlKDAIrh65YQBGmm8QgsKpXQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAADwPxkAAAAAAADwPxkAAAAAAAAAABkAAAAAAADwPxkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAAAAABkAAAAAAABZQBkAAAAAAADwPxkAAAAAAABZQBkAAAAAAADwPxkAAAAAAADwPxkAAAAAAAA0QBkAAAAAAADwPxkAAAAAAABZQBkAAAAAAABZQHoCCAGCAQIYAKoBAgoAsAEA","saved_system_profile_hash":"C2D2EF886042720353F1FE1F9119BEDC6B891135","stats_buildtime":"1773965981","stats_version":"146.0.3856.72-64","system_crash_count":0}},"variations_google_groups":{"Default":[]},"was":{"restarted":false}} \ No newline at end of file diff --git a/.edge-profile-render-1774474922711/Nurturing/campaign_history b/.edge-profile-render-1774474922711/Nurturing/campaign_history new file mode 100644 index 0000000..e8086ce Binary files /dev/null and b/.edge-profile-render-1774474922711/Nurturing/campaign_history differ diff --git a/.edge-profile-render-1774474922711/Nurturing/campaign_history-journal b/.edge-profile-render-1774474922711/Nurturing/campaign_history-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774474922711/ShaderCache/data_0 b/.edge-profile-render-1774474922711/ShaderCache/data_0 new file mode 100644 index 0000000..d76fb77 Binary files /dev/null and b/.edge-profile-render-1774474922711/ShaderCache/data_0 differ diff --git a/.edge-profile-render-1774474922711/ShaderCache/data_1 b/.edge-profile-render-1774474922711/ShaderCache/data_1 new file mode 100644 index 0000000..035d06d Binary files /dev/null and b/.edge-profile-render-1774474922711/ShaderCache/data_1 differ diff --git a/.edge-profile-render-1774474922711/ShaderCache/data_2 b/.edge-profile-render-1774474922711/ShaderCache/data_2 new file mode 100644 index 0000000..c7e2eb9 Binary files /dev/null and b/.edge-profile-render-1774474922711/ShaderCache/data_2 differ diff --git a/.edge-profile-render-1774474922711/ShaderCache/data_3 b/.edge-profile-render-1774474922711/ShaderCache/data_3 new file mode 100644 index 0000000..5eec973 Binary files /dev/null and b/.edge-profile-render-1774474922711/ShaderCache/data_3 differ diff --git a/.edge-profile-render-1774474922711/ShaderCache/index b/.edge-profile-render-1774474922711/ShaderCache/index new file mode 100644 index 0000000..aeb0f73 Binary files /dev/null and b/.edge-profile-render-1774474922711/ShaderCache/index differ diff --git a/.edge-profile-render-1774474922711/SmartScreen/RemoteData/customSettings b/.edge-profile-render-1774474922711/SmartScreen/RemoteData/customSettings new file mode 100644 index 0000000..997f02d --- /dev/null +++ b/.edge-profile-render-1774474922711/SmartScreen/RemoteData/customSettings @@ -0,0 +1 @@ +customSettings_F95BA787499AB4FA9EFFF472CE383A14 \ No newline at end of file diff --git a/.edge-profile-render-1774474922711/SmartScreen/RemoteData/customSettings_F95BA787499AB4FA9EFFF472CE383A14 b/.edge-profile-render-1774474922711/SmartScreen/RemoteData/customSettings_F95BA787499AB4FA9EFFF472CE383A14 new file mode 100644 index 0000000..ae2fefa --- /dev/null +++ b/.edge-profile-render-1774474922711/SmartScreen/RemoteData/customSettings_F95BA787499AB4FA9EFFF472CE383A14 @@ -0,0 +1 @@ +{"forceServiceDetermination":false} \ No newline at end of file diff --git a/.edge-profile-render-1774474922711/SmartScreen/RemoteData/edgeSettings b/.edge-profile-render-1774474922711/SmartScreen/RemoteData/edgeSettings new file mode 100644 index 0000000..a89ca1f --- /dev/null +++ b/.edge-profile-render-1774474922711/SmartScreen/RemoteData/edgeSettings @@ -0,0 +1 @@ +edgeSettings_2.0-0 \ No newline at end of file diff --git a/.edge-profile-render-1774474922711/SmartScreen/RemoteData/edgeSettings_2.0-0 b/.edge-profile-render-1774474922711/SmartScreen/RemoteData/edgeSettings_2.0-0 new file mode 100644 index 0000000..3db8ccb --- /dev/null +++ b/.edge-profile-render-1774474922711/SmartScreen/RemoteData/edgeSettings_2.0-0 @@ -0,0 +1 @@ +{"models":[],"geoidMaps":{"gw_my":"https://malaysia.smartscreen.microsoft.com/","gw_tw":"https://taiwan.smartscreen.microsoft.com/","gw_at":"https://austria.smartscreen.microsoft.com/","gw_es":"https://spain.smartscreen.microsoft.com/","gw_pl":"https://poland.smartscreen.microsoft.com/","gw_se":"https://sweden.smartscreen.microsoft.com/","gw_kr":"https://southkorea.smartscreen.microsoft.com/","gw_br":"https://brazil.smartscreen.microsoft.com/","au":"https://australia.smartscreen.microsoft.com/","dk":"https://denmark.smartscreen.microsoft.com/","gw_sg":"https://singapore.smartscreen.microsoft.com/","gw_fr":"https://france.smartscreen.microsoft.com/","gw_ca":"https://canada.smartscreen.microsoft.com/","gw_il":"https://israel.smartscreen.microsoft.com/","gw_au":"https://australia.smartscreen.microsoft.com/","gw_ffl4mod":"https://unitedstates4.ss.wd.microsoft.us/","gw_ffl4":"https://unitedstates1.ss.wd.microsoft.us/","gw_eu":"https://europe.smartscreen.microsoft.com/","gw_gr":"https://greece.smartscreen.microsoft.com/","gw_de":"https://germany.smartscreen.microsoft.com/","br":"https://brazil.smartscreen.microsoft.com/","gw_uk":"https://unitedkingdom.smartscreen.microsoft.com/","gw_it":"https://italy.smartscreen.microsoft.com/","gw_us":"https://unitedstates.smartscreen.microsoft.com/","il":"https://israel.smartscreen.microsoft.com/","es":"https://spain.smartscreen.microsoft.com/","ch":"https://switzerland.smartscreen.microsoft.com/","at":"https://austria.smartscreen.microsoft.com/","jp":"https://japan.smartscreen.microsoft.com/","kr":"https://southkorea.smartscreen.microsoft.com/","nz":"https://newzealand.smartscreen.microsoft.com/","gw_cl":"https://chile.smartscreen.microsoft.com/","pl":"https://poland.smartscreen.microsoft.com/","eu":"https://europe.smartscreen.microsoft.com/","de":"https://germany.smartscreen.microsoft.com/","gw_no":"https://norway.smartscreen.microsoft.com/","ffl4mod":"https://unitedstates4.ss.wd.microsoft.us/","gw_jp":"https://japan.smartscreen.microsoft.com/","mx":"https://mexico.smartscreen.microsoft.com/","gw_ffl5":"https://unitedstates2.ss.wd.microsoft.us/","se":"https://sweden.smartscreen.microsoft.com/","gw_ch":"https://switzerland.smartscreen.microsoft.com/","gw_ae":"https://uae.smartscreen.microsoft.com/","my":"https://malaysia.smartscreen.microsoft.com/","gw_nz":"https://newzealand.smartscreen.microsoft.com/","ca":"https://canada.smartscreen.microsoft.com/","fr":"https://france.smartscreen.microsoft.com/","gw_mx":"https://mexico.smartscreen.microsoft.com/","no":"https://norway.smartscreen.microsoft.com/","gr":"https://greece.smartscreen.microsoft.com/","gw_qa":"https://qatar.smartscreen.microsoft.com/","gw_in":"https://india.smartscreen.microsoft.com/","in":"https://india.smartscreen.microsoft.com/","tw":"https://taiwan.smartscreen.microsoft.com/","sg":"https://singapore.smartscreen.microsoft.com/","ffl5":"https://unitedstates2.ss.wd.microsoft.us/","ae":"https://uae.smartscreen.microsoft.com/","gw_dk":"https://denmark.smartscreen.microsoft.com/","gw_za":"https://southafrica.smartscreen.microsoft.com/","uk":"https://unitedkingdom.smartscreen.microsoft.com/","cl":"https://chile.smartscreen.microsoft.com/","us":"https://unitedstates.smartscreen.microsoft.com/","qa":"https://qatar.smartscreen.microsoft.com/","za":"https://southafrica.smartscreen.microsoft.com/","ffl4":"https://unitedstates1.ss.wd.microsoft.us/","it":"https://italy.smartscreen.microsoft.com/"},"sampleBuckets":{"evaluateModel":1.0,"error":1.0,"uriLookup":0.01,"userAction":1.0,"topTrafficHit":0.00007}} \ No newline at end of file diff --git a/.edge-profile-render-1774474922711/Variations b/.edge-profile-render-1774474922711/Variations new file mode 100644 index 0000000..a157215 --- /dev/null +++ b/.edge-profile-render-1774474922711/Variations @@ -0,0 +1 @@ +{"user_experience_metrics.stability.exited_cleanly":false,"variations_crash_streak":0} \ No newline at end of file diff --git a/.edge-profile-render-1774474922711/component_crx_cache/metadata.json b/.edge-profile-render-1774474922711/component_crx_cache/metadata.json new file mode 100644 index 0000000..4d15610 --- /dev/null +++ b/.edge-profile-render-1774474922711/component_crx_cache/metadata.json @@ -0,0 +1 @@ +{"hashes":{}} \ No newline at end of file diff --git a/.edge-profile-render-1774474922711/extensions_crx_cache/metadata.json b/.edge-profile-render-1774474922711/extensions_crx_cache/metadata.json new file mode 100644 index 0000000..4d15610 --- /dev/null +++ b/.edge-profile-render-1774474922711/extensions_crx_cache/metadata.json @@ -0,0 +1 @@ +{"hashes":{}} \ No newline at end of file diff --git a/.edge-profile-render-1774474922711/first_party_sets.db b/.edge-profile-render-1774474922711/first_party_sets.db new file mode 100644 index 0000000..2e4b19b Binary files /dev/null and b/.edge-profile-render-1774474922711/first_party_sets.db differ diff --git a/.edge-profile-render-1774474922711/first_party_sets.db-journal b/.edge-profile-render-1774474922711/first_party_sets.db-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475451193/Crashpad/metadata b/.edge-profile-render-1774475451193/Crashpad/metadata new file mode 100644 index 0000000..bd6be50 Binary files /dev/null and b/.edge-profile-render-1774475451193/Crashpad/metadata differ diff --git a/.edge-profile-render-1774475451193/Crashpad/reports/324b0527-4054-4c39-8ebe-0d1172ccaf87.dmp b/.edge-profile-render-1774475451193/Crashpad/reports/324b0527-4054-4c39-8ebe-0d1172ccaf87.dmp new file mode 100644 index 0000000..ad22d7c Binary files /dev/null and b/.edge-profile-render-1774475451193/Crashpad/reports/324b0527-4054-4c39-8ebe-0d1172ccaf87.dmp differ diff --git a/.edge-profile-render-1774475451193/Crashpad/settings.dat b/.edge-profile-render-1774475451193/Crashpad/settings.dat new file mode 100644 index 0000000..37ed434 Binary files /dev/null and b/.edge-profile-render-1774475451193/Crashpad/settings.dat differ diff --git a/.edge-profile-render-1774475451193/Crashpad/throttle_store.dat b/.edge-profile-render-1774475451193/Crashpad/throttle_store.dat new file mode 100644 index 0000000..9639e1b --- /dev/null +++ b/.edge-profile-render-1774475451193/Crashpad/throttle_store.dat @@ -0,0 +1 @@ +level=none expiry=0 diff --git a/.edge-profile-render-1774475451193/Default/ClientCertificates/LOCK b/.edge-profile-render-1774475451193/Default/ClientCertificates/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475451193/Default/ClientCertificates/LOG b/.edge-profile-render-1774475451193/Default/ClientCertificates/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475451193/Default/Code Cache/js/index b/.edge-profile-render-1774475451193/Default/Code Cache/js/index new file mode 100644 index 0000000..79bd403 Binary files /dev/null and b/.edge-profile-render-1774475451193/Default/Code Cache/js/index differ diff --git a/.edge-profile-render-1774475451193/Default/Code Cache/js/index-dir/the-real-index b/.edge-profile-render-1774475451193/Default/Code Cache/js/index-dir/the-real-index new file mode 100644 index 0000000..76e0dea Binary files /dev/null and b/.edge-profile-render-1774475451193/Default/Code Cache/js/index-dir/the-real-index differ diff --git a/.edge-profile-render-1774475451193/Default/Code Cache/wasm/index b/.edge-profile-render-1774475451193/Default/Code Cache/wasm/index new file mode 100644 index 0000000..79bd403 Binary files /dev/null and b/.edge-profile-render-1774475451193/Default/Code Cache/wasm/index differ diff --git a/.edge-profile-render-1774475451193/Default/Code Cache/wasm/index-dir/the-real-index b/.edge-profile-render-1774475451193/Default/Code Cache/wasm/index-dir/the-real-index new file mode 100644 index 0000000..e72e7c3 Binary files /dev/null and b/.edge-profile-render-1774475451193/Default/Code Cache/wasm/index-dir/the-real-index differ diff --git a/.edge-profile-render-1774475451193/Default/DawnGraphiteCache/data_0 b/.edge-profile-render-1774475451193/Default/DawnGraphiteCache/data_0 new file mode 100644 index 0000000..d76fb77 Binary files /dev/null and b/.edge-profile-render-1774475451193/Default/DawnGraphiteCache/data_0 differ diff --git a/.edge-profile-render-1774475451193/Default/DawnGraphiteCache/data_1 b/.edge-profile-render-1774475451193/Default/DawnGraphiteCache/data_1 new file mode 100644 index 0000000..035d06d Binary files /dev/null and b/.edge-profile-render-1774475451193/Default/DawnGraphiteCache/data_1 differ diff --git a/.edge-profile-render-1774475451193/Default/DawnGraphiteCache/data_2 b/.edge-profile-render-1774475451193/Default/DawnGraphiteCache/data_2 new file mode 100644 index 0000000..c7e2eb9 Binary files /dev/null and b/.edge-profile-render-1774475451193/Default/DawnGraphiteCache/data_2 differ diff --git a/.edge-profile-render-1774475451193/Default/DawnGraphiteCache/data_3 b/.edge-profile-render-1774475451193/Default/DawnGraphiteCache/data_3 new file mode 100644 index 0000000..5eec973 Binary files /dev/null and b/.edge-profile-render-1774475451193/Default/DawnGraphiteCache/data_3 differ diff --git a/.edge-profile-render-1774475451193/Default/DawnGraphiteCache/index b/.edge-profile-render-1774475451193/Default/DawnGraphiteCache/index new file mode 100644 index 0000000..e8e10e5 Binary files /dev/null and b/.edge-profile-render-1774475451193/Default/DawnGraphiteCache/index differ diff --git a/.edge-profile-render-1774475451193/Default/DawnWebGPUCache/data_0 b/.edge-profile-render-1774475451193/Default/DawnWebGPUCache/data_0 new file mode 100644 index 0000000..d76fb77 Binary files /dev/null and b/.edge-profile-render-1774475451193/Default/DawnWebGPUCache/data_0 differ diff --git a/.edge-profile-render-1774475451193/Default/DawnWebGPUCache/data_1 b/.edge-profile-render-1774475451193/Default/DawnWebGPUCache/data_1 new file mode 100644 index 0000000..035d06d Binary files /dev/null and b/.edge-profile-render-1774475451193/Default/DawnWebGPUCache/data_1 differ diff --git a/.edge-profile-render-1774475451193/Default/DawnWebGPUCache/data_2 b/.edge-profile-render-1774475451193/Default/DawnWebGPUCache/data_2 new file mode 100644 index 0000000..c7e2eb9 Binary files /dev/null and b/.edge-profile-render-1774475451193/Default/DawnWebGPUCache/data_2 differ diff --git a/.edge-profile-render-1774475451193/Default/DawnWebGPUCache/data_3 b/.edge-profile-render-1774475451193/Default/DawnWebGPUCache/data_3 new file mode 100644 index 0000000..5eec973 Binary files /dev/null and b/.edge-profile-render-1774475451193/Default/DawnWebGPUCache/data_3 differ diff --git a/.edge-profile-render-1774475451193/Default/DawnWebGPUCache/index b/.edge-profile-render-1774475451193/Default/DawnWebGPUCache/index new file mode 100644 index 0000000..ff112c3 Binary files /dev/null and b/.edge-profile-render-1774475451193/Default/DawnWebGPUCache/index differ diff --git a/.edge-profile-render-1774475451193/Default/EdgePushStorageWithConnectTokenAndKey/LOCK b/.edge-profile-render-1774475451193/Default/EdgePushStorageWithConnectTokenAndKey/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475451193/Default/EdgePushStorageWithConnectTokenAndKey/LOG b/.edge-profile-render-1774475451193/Default/EdgePushStorageWithConnectTokenAndKey/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475451193/Default/EdgePushStorageWithConnectTokenAndKey/LOG.old b/.edge-profile-render-1774475451193/Default/EdgePushStorageWithConnectTokenAndKey/LOG.old new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475451193/Default/Extension Rules/CURRENT b/.edge-profile-render-1774475451193/Default/Extension Rules/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile-render-1774475451193/Default/Extension Rules/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile-render-1774475451193/Default/Extension Rules/LOCK b/.edge-profile-render-1774475451193/Default/Extension Rules/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475451193/Default/Extension Rules/LOG b/.edge-profile-render-1774475451193/Default/Extension Rules/LOG new file mode 100644 index 0000000..4e48b9f --- /dev/null +++ b/.edge-profile-render-1774475451193/Default/Extension Rules/LOG @@ -0,0 +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 diff --git a/.edge-profile-render-1774475451193/Default/Extension Rules/MANIFEST-000001 b/.edge-profile-render-1774475451193/Default/Extension Rules/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile-render-1774475451193/Default/Extension Rules/MANIFEST-000001 differ diff --git a/.edge-profile-render-1774475451193/Default/Extension Scripts/CURRENT b/.edge-profile-render-1774475451193/Default/Extension Scripts/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile-render-1774475451193/Default/Extension Scripts/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile-render-1774475451193/Default/Extension Scripts/LOCK b/.edge-profile-render-1774475451193/Default/Extension Scripts/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475451193/Default/Extension Scripts/LOG b/.edge-profile-render-1774475451193/Default/Extension Scripts/LOG new file mode 100644 index 0000000..a840c37 --- /dev/null +++ b/.edge-profile-render-1774475451193/Default/Extension Scripts/LOG @@ -0,0 +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 diff --git a/.edge-profile-render-1774475451193/Default/Extension Scripts/MANIFEST-000001 b/.edge-profile-render-1774475451193/Default/Extension Scripts/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile-render-1774475451193/Default/Extension Scripts/MANIFEST-000001 differ diff --git a/.edge-profile-render-1774475451193/Default/Extension State/CURRENT b/.edge-profile-render-1774475451193/Default/Extension State/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile-render-1774475451193/Default/Extension State/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile-render-1774475451193/Default/Extension State/LOCK b/.edge-profile-render-1774475451193/Default/Extension State/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475451193/Default/Extension State/LOG b/.edge-profile-render-1774475451193/Default/Extension State/LOG new file mode 100644 index 0000000..742feaa --- /dev/null +++ b/.edge-profile-render-1774475451193/Default/Extension State/LOG @@ -0,0 +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 diff --git a/.edge-profile-render-1774475451193/Default/Extension State/MANIFEST-000001 b/.edge-profile-render-1774475451193/Default/Extension State/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile-render-1774475451193/Default/Extension State/MANIFEST-000001 differ diff --git a/.edge-profile-render-1774475451193/Default/Favicons b/.edge-profile-render-1774475451193/Default/Favicons new file mode 100644 index 0000000..e589db8 Binary files /dev/null and b/.edge-profile-render-1774475451193/Default/Favicons differ diff --git a/.edge-profile-render-1774475451193/Default/Favicons-journal b/.edge-profile-render-1774475451193/Default/Favicons-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475451193/Default/GPUCache/data_0 b/.edge-profile-render-1774475451193/Default/GPUCache/data_0 new file mode 100644 index 0000000..d76fb77 Binary files /dev/null and b/.edge-profile-render-1774475451193/Default/GPUCache/data_0 differ diff --git a/.edge-profile-render-1774475451193/Default/GPUCache/data_1 b/.edge-profile-render-1774475451193/Default/GPUCache/data_1 new file mode 100644 index 0000000..035d06d Binary files /dev/null and b/.edge-profile-render-1774475451193/Default/GPUCache/data_1 differ diff --git a/.edge-profile-render-1774475451193/Default/GPUCache/data_2 b/.edge-profile-render-1774475451193/Default/GPUCache/data_2 new file mode 100644 index 0000000..c7e2eb9 Binary files /dev/null and b/.edge-profile-render-1774475451193/Default/GPUCache/data_2 differ diff --git a/.edge-profile-render-1774475451193/Default/GPUCache/data_3 b/.edge-profile-render-1774475451193/Default/GPUCache/data_3 new file mode 100644 index 0000000..5eec973 Binary files /dev/null and b/.edge-profile-render-1774475451193/Default/GPUCache/data_3 differ diff --git a/.edge-profile-render-1774475451193/Default/GPUCache/index b/.edge-profile-render-1774475451193/Default/GPUCache/index new file mode 100644 index 0000000..9a8e731 Binary files /dev/null and b/.edge-profile-render-1774475451193/Default/GPUCache/index differ diff --git a/.edge-profile-render-1774475451193/Default/History b/.edge-profile-render-1774475451193/Default/History new file mode 100644 index 0000000..c02d277 Binary files /dev/null and b/.edge-profile-render-1774475451193/Default/History differ diff --git a/.edge-profile-render-1774475451193/Default/History-journal b/.edge-profile-render-1774475451193/Default/History-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475451193/Default/HubApps Icons b/.edge-profile-render-1774475451193/Default/HubApps Icons new file mode 100644 index 0000000..a838bbc Binary files /dev/null and b/.edge-profile-render-1774475451193/Default/HubApps Icons differ diff --git a/.edge-profile-render-1774475451193/Default/HubApps Icons-journal b/.edge-profile-render-1774475451193/Default/HubApps Icons-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475451193/Default/LOCK b/.edge-profile-render-1774475451193/Default/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475451193/Default/LOG b/.edge-profile-render-1774475451193/Default/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475451193/Default/Login Data b/.edge-profile-render-1774475451193/Default/Login Data new file mode 100644 index 0000000..0af13bc Binary files /dev/null and b/.edge-profile-render-1774475451193/Default/Login Data differ diff --git a/.edge-profile-render-1774475451193/Default/Login Data For Account b/.edge-profile-render-1774475451193/Default/Login Data For Account new file mode 100644 index 0000000..0af13bc Binary files /dev/null and b/.edge-profile-render-1774475451193/Default/Login Data For Account differ diff --git a/.edge-profile-render-1774475451193/Default/Login Data For Account-journal b/.edge-profile-render-1774475451193/Default/Login Data For Account-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475451193/Default/Login Data-journal b/.edge-profile-render-1774475451193/Default/Login Data-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475451193/Default/Nurturing/campaign_history b/.edge-profile-render-1774475451193/Default/Nurturing/campaign_history new file mode 100644 index 0000000..eab8517 Binary files /dev/null and b/.edge-profile-render-1774475451193/Default/Nurturing/campaign_history differ diff --git a/.edge-profile-render-1774475451193/Default/Nurturing/campaign_history-journal b/.edge-profile-render-1774475451193/Default/Nurturing/campaign_history-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475451193/Default/PersistentOriginTrials/LOCK b/.edge-profile-render-1774475451193/Default/PersistentOriginTrials/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475451193/Default/PersistentOriginTrials/LOG b/.edge-profile-render-1774475451193/Default/PersistentOriginTrials/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475451193/Default/README b/.edge-profile-render-1774475451193/Default/README new file mode 100644 index 0000000..4a34402 --- /dev/null +++ b/.edge-profile-render-1774475451193/Default/README @@ -0,0 +1 @@ +Microsoft Edge settings and storage represent user-selected preferences and information and MUST not be extracted, overwritten or modified except through Microsoft Edge defined APIs. \ No newline at end of file diff --git a/.edge-profile-render-1774475451193/Default/ServerCertificate b/.edge-profile-render-1774475451193/Default/ServerCertificate new file mode 100644 index 0000000..9587f64 Binary files /dev/null and b/.edge-profile-render-1774475451193/Default/ServerCertificate differ diff --git a/.edge-profile-render-1774475451193/Default/ServerCertificate-journal b/.edge-profile-render-1774475451193/Default/ServerCertificate-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475451193/Default/Sessions/Session_13418949058237424 b/.edge-profile-render-1774475451193/Default/Sessions/Session_13418949058237424 new file mode 100644 index 0000000..cf870d6 Binary files /dev/null and b/.edge-profile-render-1774475451193/Default/Sessions/Session_13418949058237424 differ diff --git a/.edge-profile-render-1774475451193/Default/SharedStorage b/.edge-profile-render-1774475451193/Default/SharedStorage new file mode 100644 index 0000000..4410bda Binary files /dev/null and b/.edge-profile-render-1774475451193/Default/SharedStorage differ diff --git a/.edge-profile-render-1774475451193/Default/SharedStorage-wal b/.edge-profile-render-1774475451193/Default/SharedStorage-wal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475451193/Default/Site Characteristics Database/CURRENT b/.edge-profile-render-1774475451193/Default/Site Characteristics Database/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile-render-1774475451193/Default/Site Characteristics Database/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile-render-1774475451193/Default/Site Characteristics Database/LOCK b/.edge-profile-render-1774475451193/Default/Site Characteristics Database/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475451193/Default/Site Characteristics Database/LOG b/.edge-profile-render-1774475451193/Default/Site Characteristics Database/LOG new file mode 100644 index 0000000..aba0235 --- /dev/null +++ b/.edge-profile-render-1774475451193/Default/Site Characteristics Database/LOG @@ -0,0 +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 diff --git a/.edge-profile-render-1774475451193/Default/Site Characteristics Database/MANIFEST-000001 b/.edge-profile-render-1774475451193/Default/Site Characteristics Database/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile-render-1774475451193/Default/Site Characteristics Database/MANIFEST-000001 differ diff --git a/.edge-profile-render-1774475451193/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/js/index b/.edge-profile-render-1774475451193/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/js/index new file mode 100644 index 0000000..79bd403 Binary files /dev/null and b/.edge-profile-render-1774475451193/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/js/index differ diff --git a/.edge-profile-render-1774475451193/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/js/index-dir/the-real-index b/.edge-profile-render-1774475451193/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/js/index-dir/the-real-index new file mode 100644 index 0000000..79780ef Binary files /dev/null and b/.edge-profile-render-1774475451193/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/js/index-dir/the-real-index differ diff --git a/.edge-profile-render-1774475451193/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/wasm/index b/.edge-profile-render-1774475451193/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/wasm/index new file mode 100644 index 0000000..79bd403 Binary files /dev/null and b/.edge-profile-render-1774475451193/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/wasm/index differ diff --git a/.edge-profile-render-1774475451193/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/wasm/index-dir/the-real-index b/.edge-profile-render-1774475451193/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/wasm/index-dir/the-real-index new file mode 100644 index 0000000..79780ef Binary files /dev/null and b/.edge-profile-render-1774475451193/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/wasm/index-dir/the-real-index differ diff --git a/.edge-profile-render-1774475451193/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_0 b/.edge-profile-render-1774475451193/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_0 new file mode 100644 index 0000000..d76fb77 Binary files /dev/null and b/.edge-profile-render-1774475451193/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_0 differ diff --git a/.edge-profile-render-1774475451193/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_1 b/.edge-profile-render-1774475451193/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_1 new file mode 100644 index 0000000..035d06d Binary files /dev/null and b/.edge-profile-render-1774475451193/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_1 differ diff --git a/.edge-profile-render-1774475451193/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_2 b/.edge-profile-render-1774475451193/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_2 new file mode 100644 index 0000000..c7e2eb9 Binary files /dev/null and b/.edge-profile-render-1774475451193/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_2 differ diff --git a/.edge-profile-render-1774475451193/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_3 b/.edge-profile-render-1774475451193/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_3 new file mode 100644 index 0000000..5eec973 Binary files /dev/null and b/.edge-profile-render-1774475451193/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_3 differ diff --git a/.edge-profile-render-1774475451193/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/index b/.edge-profile-render-1774475451193/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/index new file mode 100644 index 0000000..6f18098 Binary files /dev/null and b/.edge-profile-render-1774475451193/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/index differ diff --git a/.edge-profile-render-1774475451193/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_0 b/.edge-profile-render-1774475451193/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_0 new file mode 100644 index 0000000..d76fb77 Binary files /dev/null and b/.edge-profile-render-1774475451193/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_0 differ diff --git a/.edge-profile-render-1774475451193/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_1 b/.edge-profile-render-1774475451193/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_1 new file mode 100644 index 0000000..035d06d Binary files /dev/null and b/.edge-profile-render-1774475451193/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_1 differ diff --git a/.edge-profile-render-1774475451193/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_2 b/.edge-profile-render-1774475451193/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_2 new file mode 100644 index 0000000..c7e2eb9 Binary files /dev/null and b/.edge-profile-render-1774475451193/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_2 differ diff --git a/.edge-profile-render-1774475451193/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_3 b/.edge-profile-render-1774475451193/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_3 new file mode 100644 index 0000000..5eec973 Binary files /dev/null and b/.edge-profile-render-1774475451193/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_3 differ diff --git a/.edge-profile-render-1774475451193/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/index b/.edge-profile-render-1774475451193/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/index new file mode 100644 index 0000000..3066f3f Binary files /dev/null and b/.edge-profile-render-1774475451193/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/index differ diff --git a/.edge-profile-render-1774475451193/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_0 b/.edge-profile-render-1774475451193/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_0 new file mode 100644 index 0000000..d76fb77 Binary files /dev/null and b/.edge-profile-render-1774475451193/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_0 differ diff --git a/.edge-profile-render-1774475451193/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_1 b/.edge-profile-render-1774475451193/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_1 new file mode 100644 index 0000000..035d06d Binary files /dev/null and b/.edge-profile-render-1774475451193/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_1 differ diff --git a/.edge-profile-render-1774475451193/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_2 b/.edge-profile-render-1774475451193/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_2 new file mode 100644 index 0000000..c7e2eb9 Binary files /dev/null and b/.edge-profile-render-1774475451193/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_2 differ diff --git a/.edge-profile-render-1774475451193/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_3 b/.edge-profile-render-1774475451193/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_3 new file mode 100644 index 0000000..5eec973 Binary files /dev/null and b/.edge-profile-render-1774475451193/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_3 differ diff --git a/.edge-profile-render-1774475451193/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/index b/.edge-profile-render-1774475451193/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/index new file mode 100644 index 0000000..546f50f Binary files /dev/null and b/.edge-profile-render-1774475451193/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/index differ diff --git a/.edge-profile-render-1774475451193/Default/Sync Data/LevelDB/CURRENT b/.edge-profile-render-1774475451193/Default/Sync Data/LevelDB/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile-render-1774475451193/Default/Sync Data/LevelDB/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile-render-1774475451193/Default/Sync Data/LevelDB/LOCK b/.edge-profile-render-1774475451193/Default/Sync Data/LevelDB/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475451193/Default/Sync Data/LevelDB/LOG b/.edge-profile-render-1774475451193/Default/Sync Data/LevelDB/LOG new file mode 100644 index 0000000..4e3d6fc --- /dev/null +++ b/.edge-profile-render-1774475451193/Default/Sync Data/LevelDB/LOG @@ -0,0 +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 diff --git a/.edge-profile-render-1774475451193/Default/Sync Data/LevelDB/MANIFEST-000001 b/.edge-profile-render-1774475451193/Default/Sync Data/LevelDB/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile-render-1774475451193/Default/Sync Data/LevelDB/MANIFEST-000001 differ diff --git a/.edge-profile-render-1774475451193/Default/Top Sites b/.edge-profile-render-1774475451193/Default/Top Sites new file mode 100644 index 0000000..e700bd4 Binary files /dev/null and b/.edge-profile-render-1774475451193/Default/Top Sites differ diff --git a/.edge-profile-render-1774475451193/Default/Top Sites-journal b/.edge-profile-render-1774475451193/Default/Top Sites-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475451193/Default/Vpn Tokens b/.edge-profile-render-1774475451193/Default/Vpn Tokens new file mode 100644 index 0000000..2ba3b69 Binary files /dev/null and b/.edge-profile-render-1774475451193/Default/Vpn Tokens differ diff --git a/.edge-profile-render-1774475451193/Default/Vpn Tokens-journal b/.edge-profile-render-1774475451193/Default/Vpn Tokens-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475451193/Default/Web Data b/.edge-profile-render-1774475451193/Default/Web Data new file mode 100644 index 0000000..6097c32 Binary files /dev/null and b/.edge-profile-render-1774475451193/Default/Web Data differ diff --git a/.edge-profile-render-1774475451193/Default/Web Data-journal b/.edge-profile-render-1774475451193/Default/Web Data-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475451193/Default/arbitration_service_config.json b/.edge-profile-render-1774475451193/Default/arbitration_service_config.json new file mode 100644 index 0000000..fd7d0be --- /dev/null +++ b/.edge-profile-render-1774475451193/Default/arbitration_service_config.json @@ -0,0 +1,197 @@ +{ + "ArbitrationSignal": "notification_nsat_upper_ci-0.7", + "CopilotModeBypass": [ "cd4688a9-e888-48ea-ad81-76193d56b1be.IsVideoPage.Bubble", "cd4688a9-e888-48ea-ad81-76193d56b1be.IsKnowledgeCardQuery.Bubble", "PerformanceDetectorFeatureNotification", "AUTOFILL_PASSWORD_NON_FUNCTIONAL_FLYOUTS", "SHOPPING_AUTO_SHOW_LOWER_PRICE_FOUND", "SHOPPING_AUTO_SHOW_REBATES", "SHOPPING_AUTO_SHOW_REBATES_CONFIRMATION", "SHOPPING_AUTO_SHOW_REBATES_ORGANIC", "SHOPPING_AUTO_SHOW_REBATES_ORGANIC_NEW" ], + "CustomSuppressionPolicies": { + "8682d0fa-50b3-4ece-aa5b-e0b33f9919e2.f5b8c725-cb2e-4c12-accd-73e500d88d47.AutoOpen": { + "notification_max_quick_dismiss_count": 3 + }, + "bc25fcef-8964-4e72-8287-23e2b496c128.68b8a884-6e08-46e6-8a3b-7e06ffe48ecf.AutoOpen": { + "notification_max_quick_dismiss_count": 3 + }, + "cd4688a9-e888-48ea-ad81-76193d56b1be.e06e75c1-a59a-4ab6-8361-e8b038e00a8c.AutoOpen": { + "notification_max_quick_dismiss_count": 1 + } + }, + "DynamicSuppressionBypass": { + "ExperienceIDs": [ "Nurturing.Global.OnRamp_RetriggerFREOnEdgeVersionUpgradeViaExplicitLaunch", "Nurturing.Global.OnRamp_RetriggerFREOnExplicitProtocolPDFLaunchForEdgePostDMA", "Nurturing.Global.Bing_DefaultBrowserBannerCloseBtn", "Nurturing.Global.Bing_DefaultBrowserBannerCloseBtnUpdate", "Nurturing.Global.Bing_MSStartYJCompete", "Nurturing.Global.Bing_NtpHomeStartpageUpsellFlyout", "Nurturing.Global.Fundamentals_DefaultBrowserMonitor", "Nurturing.Global.Fundamentals_DefaultBrowserMonitorOnStart", "Nurturing.Global.Fundamentals_DefaultBrowserMonitorVariant2", "Nurturing.Global.RecommendedSettingsChina", "Nurturing.Global.ContinuousImport_PasswordZeroStateV2", "Nurturing.Global.OnRamp_CIExplicitLaunchBannerUpsell", "Nurturing.Global.OnRamp_CIUpsell_ProtocolLaunch_Banner", "Nurturing.Global.EdgeGrowth_SitePinningCITopSites", "Nurturing.Global.EdgeGrowth_SitePinningWithWindowsConsent", "Nurturing.Global.EdgeGrowth_GlobalSitePinningOnCloseModal" ], + "TeamIDs": [ "NTP" ] + }, + "ExperienceCohorts": { + "DefaultCohort": { + "21f3388b-c2a5-4791-8f6e-a4cad6d17f4f.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.BingHomePage.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Covid.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Finance.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Jobs.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.KnowledgeCard.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Local.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.NTP3PCLICK.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.NotifySearchPage.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Recipe.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.SearchPage.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Sports.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Travel.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Weather.Bubble": 1, + "2cb2db96-3bd0-403e-abe2-9269b3761041.AutoOpen": 1, + "2cb2db96-3bd0-403e-abe2-9269b3761041.Bubble": 1, + "439642fc-998d-4a64-8bb6-940ecaf6b60b.AutoOpen": 1, + "439642fc-998d-4a64-8bb6-940ecaf6b60b.Bubble": 1, + "523b5ef3-0b10-4154-8b62-10b2ebd00921.Bubble": 1, + "64be4f9b-3b81-4b6e-b354-0ba00d6ba485.AutoOpen": 1, + "64be4f9b-3b81-4b6e-b354-0ba00d6ba485.Bubble": 1, + "76b926d6-3738-46bf-82d7-2ab896ddf70b.MM2UpSellPopup.Bubble": 1, + "8682d0fa-50b3-4ece-aa5b-e0b33f9919e2.Bubble": 1, + "8682d0fa-50b3-4ece-aa5b-e0b33f9919e2.f5b8c725-cb2e-4c12-accd-73e500d88d47.AutoOpen": 1, + "8ac719c5-140b-4bf2-a0b7-c71617f1f377.3662f1e2-66ae-464f-b690-e7e3dc4fc662.AutoOpen": 1, + "8ac719c5-140b-4bf2-a0b7-c71617f1f377.93e5b5cd-15fc-4253-9728-d80685da304e.AutoOpen": 1, + "8ac719c5-140b-4bf2-a0b7-c71617f1f377.AutoOpen": 1, + "8ac719c5-140b-4bf2-a0b7-c71617f1f377.gaokao.Bubble": 1, + "92f1b743-e26b-433b-a1ec-912d1f0ad1fa.Bubble": 1, + "96defd79-4015-4a32-bd09-794ff72183ef.0bdde3c3-7be8-49f1-971b-e6e2cfd62643.AutoOpen": 1, + "96defd79-4015-4a32-bd09-794ff72183ef.128c39c6-6f70-4ce5-9d01-78978e60d666.AutoOpen": 1, + "96defd79-4015-4a32-bd09-794ff72183ef.5ac63306-e962-42e6-8313-7e5a5b707d65.AutoOpen": 1, + "96defd79-4015-4a32-bd09-794ff72183ef.AutoOpen": 1, + "96defd79-4015-4a32-bd09-794ff72183ef.Bubble": 1, + "96defd79-4015-4a32-bd09-794ff72183ef.Is1PGameDomain.Bubble": 1, + "96defd79-4015-4a32-bd09-794ff72183ef.Is3PGameDomain.Bubble": 1, + "9ce3c9c2-462f-4cc9-bbd7-57d656445be0.Bubble": 1, + "AUTOFILL_PASSWORD_NON_FUNCTIONAL_FLYOUTS": 1, + "DefaultExperience": 1, + "EdgeDownloadChromeInterceptDialog": 2, + "PerformanceDetectorFeatureNotification": 1, + "RewardsPromotionNotifications": 1, + "RewardsReminderNotifications": 1, + "SAN.Personalization.ConsentPrompt": 1, + "SHOPPING_AA_CONSENT": 1, + "SHOPPING_AUTO_PRODUCT_TRACKING_EXP_PRICE_DROP": 1, + "SHOPPING_AUTO_PRODUCT_TRACKING_IMP_PRICE_DROP": 1, + "SHOPPING_AUTO_PRODUCT_TRACKING_OUT_OF_STOCK": 1, + "SHOPPING_AUTO_SHOW_ABANDONED_CART": 1, + "SHOPPING_AUTO_SHOW_ADD_SPB_TO_CART_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_AMAZON_SEARCH_PC": 1, + "SHOPPING_AUTO_SHOW_ATTAINABLE_COUPONS": 1, + "SHOPPING_AUTO_SHOW_AUTOS_MARKETPLACE": 1, + "SHOPPING_AUTO_SHOW_AWARENESSEXP": 1, + "SHOPPING_AUTO_SHOW_AWARENESS_EXPANSION": 1, + "SHOPPING_AUTO_SHOW_CAMPAIGN_AWARENESS_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_CAMPAIGN_PDP_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_CASHBACK_PDP_PLUS_COUPONS": 1, + "SHOPPING_AUTO_SHOW_CJK_COUPON_FOUND": 1, + "SHOPPING_AUTO_SHOW_CJK_PRICE_DROP": 1, + "SHOPPING_AUTO_SHOW_CODEX_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_CONFIRMATION_SCRIPT": 1, + "SHOPPING_AUTO_SHOW_CONTROLLER": 1, + "SHOPPING_AUTO_SHOW_COUPONS_BACKGROUND_AUTO_APPLY": 1, + "SHOPPING_AUTO_SHOW_COUPONS_CHECKOUT": 1, + "SHOPPING_AUTO_SHOW_COUPONS_CHECKOUT_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_COUPONS_CLIPPING": 1, + "SHOPPING_AUTO_SHOW_DISCOVER_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_DISCOVER_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_EXPRESS_CHECKOUT": 1, + "SHOPPING_AUTO_SHOW_GIFT_CARD": 1, + "SHOPPING_AUTO_SHOW_GOODRX": 1, + "SHOPPING_AUTO_SHOW_GROCERY_ITEMIZED_CASHBACK": 1, + "SHOPPING_AUTO_SHOW_GROCERY_ITEMIZED_CASHBACK_LANDING": 1, + "SHOPPING_AUTO_SHOW_GUEST_DOMAIN_COUPONS": 1, + "SHOPPING_AUTO_SHOW_IBC_UPSELL": 1, + "SHOPPING_AUTO_SHOW_LOWER_PRICE_FOUND": 1, + "SHOPPING_AUTO_SHOW_LOWER_PRICE_PLUS_CASHBACK_PLUS_COUPONS": 1, + "SHOPPING_AUTO_SHOW_MOMENT_IN_TIME": 1, + "SHOPPING_AUTO_SHOW_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_ORGANIC_CASHBACK_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_OTHER_SELLER": 1, + "SHOPPING_AUTO_SHOW_OUT_OF_STOCK": 1, + "SHOPPING_AUTO_SHOW_PACKAGE_TRACKING": 1, + "SHOPPING_AUTO_SHOW_PACKAGE_TRACKING_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_PERSONALIZED_CASHBACK_ADDRESSBAR": 1, + "SHOPPING_AUTO_SHOW_PERSONALIZED_CASHBACK_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_POST_PURCHASE_TRACKING": 1, + "SHOPPING_AUTO_SHOW_PRICE_DROP_PLUS_CASHBACK": 1, + "SHOPPING_AUTO_SHOW_PRICE_DROP_PLUS_COUPONS": 1, + "SHOPPING_AUTO_SHOW_PRICE_HISTORY": 1, + "SHOPPING_AUTO_SHOW_PRICE_HISTORY_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_PRINT_GROCERY": 1, + "SHOPPING_AUTO_SHOW_PRODUCT_BEST_COUPON_CONSENT": 1, + "SHOPPING_AUTO_SHOW_PRODUCT_TRACKING_BACK_IN_STOCK": 1, + "SHOPPING_AUTO_SHOW_PRODUCT_TRACKING_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_PROFESSIONAL_REVIEWS": 1, + "SHOPPING_AUTO_SHOW_REBATES": 1, + "SHOPPING_AUTO_SHOW_REBATES_CHECKOUT": 1, + "SHOPPING_AUTO_SHOW_REBATES_ORGANIC": 1, + "SHOPPING_AUTO_SHOW_REBATES_ORGANIC_NEW": 1, + "SHOPPING_AUTO_SHOW_REBATES_PDP": 1, + "SHOPPING_AUTO_SHOW_RECOMMENDATIONS_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_SAN_CONSENT_CONFIRMATION": 1, + "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_ALL_PAGES": 1, + "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_CHECKOUT": 1, + "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_CONFIRMATION_PAGE": 1, + "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_HOME_PAGE": 1, + "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_REWARDS": 1, + "SHOPPING_AUTO_SHOW_SHOPRUNNER": 1, + "SHOPPING_AUTO_SHOW_SIDEPANE_CASHBACK_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_SPB_CASHBACK_LANDING": 1, + "SHOPPING_AUTO_SHOW_SPB_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_SPB_NUDGE_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_SURFACE_UPSELL": 1, + "SHOPPING_AUTO_SHOW_SUSTAINABILITY_LANDING": 1, + "SHOPPING_AUTO_SHOW_TRAVEL_NOTIFICATION_CHEAPER_FLIGHTS": 1, + "SHOPPING_AUTO_SHOW_TRAVEL_NOTIFICATION_CHEAPER_HOTEL_ROOM": 1, + "SHOPPING_AUTO_SHOW_TRENDING_COUPONS": 1, + "ShorelinePrivilegedExperienceID": 1, + "TabActionsMenuVerticalTabsPromotion": 1, + "VPNFeatureNotification": 1, + "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.75a774c2-6075-ae4f-09f9-e5f5d9bef6e1.AutoOpen": 1, + "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.AutoOpen": 1, + "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.a5e9f5e1-fcee-c07b-2c44-b707ded020a3.AutoOpen": 1, + "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.c8ebbf64-e3b8-41d9-925f-4e3754151ff7.AutoOpen": 1, + "bc25fcef-8964-4e72-8287-23e2b496c128.68b8a884-6e08-46e6-8a3b-7e06ffe48ecf.AutoOpen": 1, + "bc25fcef-8964-4e72-8287-23e2b496c128.Bubble": 1, + "c8ebd871-9f47-4a0d-abd3-c1c02b4f8f53.2cfab14c-ebd6-4548-9401-30ab5afe5061.AutoOpen": 1, + "c8ebd871-9f47-4a0d-abd3-c1c02b4f8f53.AutoOpen": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.5b853177-a0be-4237-bda0-4fce5cd165c2.AutoOpen": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.8d3a928d-e911-40f0-9852-f63f6434dc7e.AutoOpen": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.AutoOpen": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.AutoOpen.PDF": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.AutoOpen.PersistentChat": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsCompeteAISite.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsCopilotJitEduAcademicAI.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsCopilotJitEduArticleAI.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsCopilotJitEduStudyAI.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsKnowledgeCardQuery.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsMsnArticleUrlFromNtpP1P2.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsShoppingNotificationNudge.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsTextPage.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsTopNewsDomain.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsTwitchNonStreamPage.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsTwitchSubPage.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsVideoPage.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.e06e75c1-a59a-4ab6-8361-e8b038e00a8c.AutoOpen": 1, + "e6723537-66ff-4f4e-ab56-a4cbaddf4e0f.MM2UpSellPopup.Bubble": 1 + } + }, + "FunctionalCohort": [ "EdgeDownloadChromeInterceptFunctionalDialog", "8682d0fa-50b3-4ece-aa5b-e0b33f9919e2.AutoOpen.Functional", "8682d0fa-50b3-4ece-aa5b-e0b33f9919e2.f5b8c725-cb2e-4c12-accd-73e500d88d47.AutoOpen.Functional", "bc25fcef-8964-4e72-8287-23e2b496c128.AutoOpen.Functional", "bc25fcef-8964-4e72-8287-23e2b496c128.68b8a884-6e08-46e6-8a3b-7e06ffe48ecf.AutoOpen.Functional", "WPOFunctionalEvent.AutofillAccountChooser.Bubble", "WPOFunctionalEvent.AutofillAutoSignin.Bubble", "WPOFunctionalEvent.AutofillPassword.Bubble", "SHOPPING_AUTO_SHOW_BING_SEARCH", "SHOPPING_AUTO_SHOW_REBATES_CONFIRMATION", "SHOPPING_AUTO_SHOW_REBATES_DEACTIVATED", "SHOPPING_AUTO_SHOW_REBATES_BING", "SHOPPING_AUTO_SHOW_PERSONALIZED_CASHBACK", "SHOPPING_AUTO_SHOW_PERSONALIZED_CASHBACK_CONFIRMATION", "SHOPPING_AUTO_SHOW_URL_PARAM_REBATES", "SHOPPING_AUTO_SHOW_URL_PARAM_PRICE_COMPARISON", "SHOPPING_AUTO_SHOW_URL_PARAM_PRICE_HISTORY", "SHOPPING_AUTO_SHOW_REBATES_ACTIVATION_FAILED", "SHOPPING_AUTO_SHOW_REBATES_SWITCHED_TO_MSA", "SHOPPING_AUTO_SHOW_ITEM_ADDED_TO_CART_FROM_OTHER_SELLER", "SHOPPING_AUTO_SHOW_VIRTUAL_CARD", "SHOPPING_AUTO_SHOW_BING_CAMPAIGN", "SHOPPING_OPEN_FLYOUT_FROM_EDGE_DRIVER", "SHOPPING_AUTO_SHOW_SUSTAINABILITY_PURCHASE", "SHOPPING_AUTO_SHOW_REWARDS_ACTIVATION_FAILED", "SHOPPING_AUTO_SHOW_REWARDS_SWITCHED_TO_MSA", "SHOPPING_AUTO_SHOW_SHOPRUNNER_CONFIRMATION", "SHOPPING_AUTO_SHOW_ENROLL_TO_CASHBACK_CONFIRMATION_NOTIFICATION", "SHOPPING_AUTO_SHOW_POST_PURCHASE_REWARDS_NOTIFICATION", "694efa4f-a304-4214-aaf7-90444bc887f5.c1c025d9-a620-4f6b-bebb-eff0cf19a671.AutoOpen.Functional" ], + "GlobalSuppressedExperiences": [ "Teams.Bubble", "Nurturing.Global.EdgeVpn_VpnFre", "Nurturing.Global.Rewards_RedemptionCoachmark_2", "Nurturing.Global.Rewards_RedemptionCoachmark_25", "Nurturing.Global.EdgeCBUD_SanPersonalizationConsentWave1Variant0", "Nurturing.Global.Bing_NewBingChatFlyout", "Copilot.AutoOpen.PDF.v2", "Nurturing.Global.PWA_SidebarSearchPromotion", "Nurturing.Global.FC_NetworkWarningFlyout", "Nurturing.Global.EdgeMobile_MobileUpsell_ChatGpt_Flyout", "E-tree.Bubble", "Nurturing.Global.EdgeEDU_BrowserFocusedTranslateNudge", "Games.Bubble", "Nurturing.Global.OnRamp_RetriggerFRECodexCoPilotAutoAprd", "Nurturing.Global.OnRamp_NurturingViaProng_Experiment", "Nurturing.Global.OnRamp_ReTriggerOnWinUpgrade", "Nurturing.Global.EdgeGrowth_CIShoppingUpsell", "Nurturing.Global.Shopping_EnableShoppingAssistance_Optin_Generic", "Nurturing.Global.Shopping_EnableShoppingAssistance", "Nurturing.Global.BrowserExperiences_TryVerticalTabs" ], + "IgnoredFunctionalNotifications": [ "Nurturing.Functional.NTP_CourtesyEngineCampaign", "Nurturing.Functional.NTP_FunctionalCampaign", "Nurturing.Functional.NTP_SettingsCampaign", "Nurturing.Functional.NTP_UpsellCampaign", "Nurturing.Functional.FN_SmartSwitchFeatureInfoView" ], + "ModelInfo": { + "segment_id": 515, + "signals": [ "notification_triggered_count", "notification_click_rate", "notification_click_rate_lower_ci", "notification_click_rate_upper_ci", "notification_dismiss_rate", "notification_dismiss_rate_lower_ci", "notification_dismiss_rate_upper_ci", "notification_ignored_rate", "notification_ignored_rate_lower_ci", "notification_ignored_rate_upper_ci", "notification_quick_dismiss_rate", "notification_quick_dismiss_rate_lower_ci", "notification_quick_dismiss_rate_upper_ci", "notification_disable_rate", "notification_disable_rate_lower_ci", "notification_disable_rate_upper_ci", "notification_snooze_rate", "notification_snooze_rate_lower_ci", "notification_snooze_rate_upper_ci" ], + "threshold_value": 0.5 + }, + "ModelSuppressionBypass": [ "Nurturing.Local.SHOPPING_AUTO_SHOW_LOWER_PRICE_FOUND", "Nurturing.Local.SHOPPING_AUTO_SHOW_REBATES_ORGANIC", "Nurturing.Local.SHOPPING_AUTO_SHOW_REBATES_CHECKOUT", "Nurturing.Local.SHOPPING_AUTO_SHOW_SPB_CASHBACK_LANDING" ], + "NotificationsAllowLists": { + }, + "PrivilegedExperiences": [ "ShorelinePrivilegedExperienceID", "SHOPPING_AUTO_SHOW_COUPONS_CHECKOUT", "SHOPPING_AUTO_SHOW_LOWER_PRICE_FOUND", "SHOPPING_AUTO_SHOW_REBATES", "SHOPPING_AUTO_SHOW_REBATES_ORGANIC", "SHOPPING_AUTO_SHOW_PRICE_HISTORY", "SHOPPING_AUTO_SHOW_REBATES_ORGANIC_NEW", "SHOPPING_AUTO_SHOW_REBATES_CHECKOUT", "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_CHECKOUT", "SHOPPING_AUTO_SHOW_EXPRESS_CHECKOUT", "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_ALL_PAGES", "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_CONFIRMATION_PAGE", "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_HOME_PAGE", "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_REWARDS", "SHOPPING_AUTO_SHOW_COUPONS_CLIPPING", "SHOPPING_AUTO_SHOW_NOTIFICATION", "SHOPPING_AUTO_SHOW_OTHER_SELLER", "SHOPPING_AUTO_SHOW_PROFESSIONAL_REVIEWS", "SHOPPING_AUTO_SHOW_PACKAGE_TRACKING", "SHOPPING_AUTO_SHOW_GUEST_DOMAIN_COUPONS", "SHOPPING_AUTO_SHOW_SUSTAINABILITY_LANDING", "SHOPPING_AUTO_SHOW_ATTAINABLE_COUPONS", "SHOPPING_AUTO_SHOW_GIFT_CARD", "SHOPPING_AUTO_SHOW_PRINT_GROCERY", "SHOPPING_AUTO_SHOW_GROCERY_ITEMIZED_CASHBACK", "SHOPPING_AUTO_SHOW_CONTROLLER", "SHOPPING_AUTO_SHOW_AUTOS_MARKETPLACE", "SHOPPING_AUTO_SHOW_SHOPRUNNER", "SHOPPING_AUTO_SHOW_ABANDONED_CART", "SHOPPING_AUTO_SHOW_OUT_OF_STOCK", "SHOPPING_AUTO_SHOW_GROCERY_ITEMIZED_CASHBACK_LANDING", "SHOPPING_AUTO_SHOW_SPB_CASHBACK_LANDING", "SHOPPING_AUTO_SHOW_AWARENESSEXP", "SHOPPING_AA_CONSENT", "SHOPPING_AUTO_SHOW_SAN_CONSENT_CONFIRMATION", "SHOPPING_AUTO_SHOW_CONFIRMATION_SCRIPT", "SHOPPING_AUTO_SHOW_MOMENT_IN_TIME", "SHOPPING_AUTO_SHOW_COUPONS_CHECKOUT_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_TRENDING_COUPONS", "SHOPPING_AUTO_SHOW_RECOMMENDATIONS_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_PRODUCT_TRACKING_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_SURFACE_UPSELL", "SHOPPING_AUTO_SHOW_PRODUCT_TRACKING_BACK_IN_STOCK", "SHOPPING_AUTO_PRODUCT_TRACKING_EXP_PRICE_DROP", "SHOPPING_AUTO_PRODUCT_TRACKING_IMP_PRICE_DROP", "SHOPPING_AUTO_PRODUCT_TRACKING_OUT_OF_STOCK", "SHOPPING_AUTO_SHOW_CODEX_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_PERSONALIZED_CASHBACK_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_PRICE_HISTORY_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_ORGANIC_CASHBACK_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_GOODRX", "SHOPPING_AUTO_SHOW_SIDEPANE_CASHBACK_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_DISCOVER_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_REBATES_PDP", "SHOPPING_AUTO_SHOW_PRODUCT_BEST_COUPON_CONSENT", "SHOPPING_AUTO_SHOW_CAMPAIGN_PDP_NOTIFICATION", "SHOPPING_AUTO_SHOW_CAMPAIGN_AWARENESS_NOTIFICATION", "SHOPPING_AUTO_SHOW_SPB_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_PRICE_DROP_PLUS_COUPONS", "SHOPPING_AUTO_SHOW_SPB_NUDGE_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_ADD_SPB_TO_CART_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_CASHBACK_PDP_PLUS_COUPONS", "SHOPPING_AUTO_SHOW_PRICE_DROP_PLUS_CASHBACK", "SHOPPING_AUTO_SHOW_DISCOVER_NOTIFICATION", "SHOPPING_AUTO_SHOW_AMAZON_SEARCH_PC", "SHOPPING_AUTO_SHOW_COUPONS_BACKGROUND_AUTO_APPLY", "SHOPPING_AUTO_SHOW_PERSONALIZED_CASHBACK_ADDRESSBAR", "SHOPPING_AUTO_SHOW_TRAVEL_NOTIFICATION_CHEAPER_FLIGHTS", "SHOPPING_AUTO_SHOW_TRAVEL_NOTIFICATION_CHEAPER_HOTEL_ROOM", "SHOPPING_AUTO_SHOW_CJK_PRICE_DROP", "SHOPPING_AUTO_SHOW_CJK_COUPON_FOUND", "AUTOFILL_PASSWORD_NON_FUNCTIONAL_FLYOUTS", "76b926d6-3738-46bf-82d7-2ab896ddf70b.MM2UpSellPopup.Bubble", "e6723537-66ff-4f4e-ab56-a4cbaddf4e0f.MM2UpSellPopup.Bubble", "8ac719c5-140b-4bf2-a0b7-c71617f1f377.3662f1e2-66ae-464f-b690-e7e3dc4fc662.AutoOpen", "8ac719c5-140b-4bf2-a0b7-c71617f1f377.gaokao.Bubble", "c8ebd871-9f47-4a0d-abd3-c1c02b4f8f53.AutoOpen", "c8ebd871-9f47-4a0d-abd3-c1c02b4f8f53.2cfab14c-ebd6-4548-9401-30ab5afe5061.AutoOpen", "cd4688a9-e888-48ea-ad81-76193d56b1be.AutoOpen.PersistentChat", "cd4688a9-e888-48ea-ad81-76193d56b1be.AutoOpen.PDF", "cd4688a9-e888-48ea-ad81-76193d56b1be.8d3a928d-e911-40f0-9852-f63f6434dc7e.AutoOpen", "cd4688a9-e888-48ea-ad81-76193d56b1be.e06e75c1-a59a-4ab6-8361-e8b038e00a8c.AutoOpen", "cd4688a9-e888-48ea-ad81-76193d56b1be.5b853177-a0be-4237-bda0-4fce5cd165c2.AutoOpen", "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.AutoOpen", "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.c8ebbf64-e3b8-41d9-925f-4e3754151ff7.AutoOpen", "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.75a774c2-6075-ae4f-09f9-e5f5d9bef6e1.AutoOpen", "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.a5e9f5e1-fcee-c07b-2c44-b707ded020a3.AutoOpen", "8682d0fa-50b3-4ece-aa5b-e0b33f9919e2.f5b8c725-cb2e-4c12-accd-73e500d88d47.AutoOpen", "bc25fcef-8964-4e72-8287-23e2b496c128.68b8a884-6e08-46e6-8a3b-7e06ffe48ecf.AutoOpen", "EdgeDownloadChromeInterceptDialog", "439642fc-998d-4a64-8bb6-940ecaf6b60b.AutoOpen", "694efa4f-a304-4214-aaf7-90444bc887f5.c1c025d9-a620-4f6b-bebb-eff0cf19a671.AutoOpen" ], + "ReserveApproved": { + "ExperienceIDs": [ "Nurturing.Global.Edge_SpawnNtpOptIn", "Nurturing.Global.Edge_SpawnNtpOptOut" ], + "SourceIDs": [ 3 ], + "TeamIDs": [ "Edge Consumer Content and Verticals" ] + }, + "ScenarioSuppressLists": { + }, + "SuppressedExperiences": [ ], + "TimeDelta": 5000000, + "baseConfigVersion": "40.0.1", + "configVersion": "40.0.1" +} diff --git a/.edge-profile-render-1774475451193/Default/commerce_subscription_db/LOCK b/.edge-profile-render-1774475451193/Default/commerce_subscription_db/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475451193/Default/commerce_subscription_db/LOG b/.edge-profile-render-1774475451193/Default/commerce_subscription_db/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475451193/Default/discount_infos_db/LOCK b/.edge-profile-render-1774475451193/Default/discount_infos_db/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475451193/Default/discount_infos_db/LOG b/.edge-profile-render-1774475451193/Default/discount_infos_db/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475451193/Default/discounts_db/LOCK b/.edge-profile-render-1774475451193/Default/discounts_db/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475451193/Default/discounts_db/LOG b/.edge-profile-render-1774475451193/Default/discounts_db/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475451193/Default/load_statistics.db b/.edge-profile-render-1774475451193/Default/load_statistics.db new file mode 100644 index 0000000..4410bda Binary files /dev/null and b/.edge-profile-render-1774475451193/Default/load_statistics.db differ diff --git a/.edge-profile-render-1774475451193/Default/load_statistics.db-shm b/.edge-profile-render-1774475451193/Default/load_statistics.db-shm new file mode 100644 index 0000000..ee9ee86 Binary files /dev/null and b/.edge-profile-render-1774475451193/Default/load_statistics.db-shm differ diff --git a/.edge-profile-render-1774475451193/Default/load_statistics.db-wal b/.edge-profile-render-1774475451193/Default/load_statistics.db-wal new file mode 100644 index 0000000..48c4e82 Binary files /dev/null and b/.edge-profile-render-1774475451193/Default/load_statistics.db-wal differ diff --git a/.edge-profile-render-1774475451193/Default/parcel_tracking_db/LOCK b/.edge-profile-render-1774475451193/Default/parcel_tracking_db/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475451193/Default/parcel_tracking_db/LOG b/.edge-profile-render-1774475451193/Default/parcel_tracking_db/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475451193/Default/shared_proto_db/CURRENT b/.edge-profile-render-1774475451193/Default/shared_proto_db/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile-render-1774475451193/Default/shared_proto_db/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile-render-1774475451193/Default/shared_proto_db/LOCK b/.edge-profile-render-1774475451193/Default/shared_proto_db/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475451193/Default/shared_proto_db/LOG b/.edge-profile-render-1774475451193/Default/shared_proto_db/LOG new file mode 100644 index 0000000..4009c1b --- /dev/null +++ b/.edge-profile-render-1774475451193/Default/shared_proto_db/LOG @@ -0,0 +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 diff --git a/.edge-profile-render-1774475451193/Default/shared_proto_db/MANIFEST-000001 b/.edge-profile-render-1774475451193/Default/shared_proto_db/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile-render-1774475451193/Default/shared_proto_db/MANIFEST-000001 differ diff --git a/.edge-profile-render-1774475451193/Default/shared_proto_db/metadata/CURRENT b/.edge-profile-render-1774475451193/Default/shared_proto_db/metadata/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile-render-1774475451193/Default/shared_proto_db/metadata/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile-render-1774475451193/Default/shared_proto_db/metadata/LOCK b/.edge-profile-render-1774475451193/Default/shared_proto_db/metadata/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475451193/Default/shared_proto_db/metadata/LOG b/.edge-profile-render-1774475451193/Default/shared_proto_db/metadata/LOG new file mode 100644 index 0000000..de207eb --- /dev/null +++ b/.edge-profile-render-1774475451193/Default/shared_proto_db/metadata/LOG @@ -0,0 +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 diff --git a/.edge-profile-render-1774475451193/Default/shared_proto_db/metadata/MANIFEST-000001 b/.edge-profile-render-1774475451193/Default/shared_proto_db/metadata/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile-render-1774475451193/Default/shared_proto_db/metadata/MANIFEST-000001 differ diff --git a/.edge-profile-render-1774475451193/FirstLaunchAfterInstallation b/.edge-profile-render-1774475451193/FirstLaunchAfterInstallation new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475451193/Last Version b/.edge-profile-render-1774475451193/Last Version new file mode 100644 index 0000000..a887bff --- /dev/null +++ b/.edge-profile-render-1774475451193/Last Version @@ -0,0 +1 @@ +146.0.3856.72 \ No newline at end of file diff --git a/.edge-profile-render-1774475451193/Local State b/.edge-profile-render-1774475451193/Local State new file mode 100644 index 0000000..bb2c89d --- /dev/null +++ b/.edge-profile-render-1774475451193/Local State @@ -0,0 +1 @@ +{"breadcrumbs":{"enabled":true,"enabled_time":"13418949055213904"},"edge":{"app_user_model_id":"MSEdge","perf_center":{"efficiency_mode_v2_is_active":false,"performance_mode":3,"performance_mode_is_on":false},"retrigger_features":[],"tab_stabs":{"closed_without_unfreeze_never_unfrozen":0,"closed_without_unfreeze_previously_unfrozen":0,"discard_without_unfreeze_never_unfrozen":0,"discard_without_unfreeze_previously_unfrozen":0},"tab_stats":{"frozen_daily":0,"unfrozen_daily":0}},"edge_copilot_mode_enabled_state":{"Default":{"enabled":false,"last_set":"13418949055700145"}},"hardware_acceleration_mode_previous":true,"legacy":{"profile":{"name":{"migrated":true}}},"local":{"password_hash_data_list":[]},"metrics":{"client_id_hash_key_created":true},"optimization_guide":{"model_execution":{"last_usage_by_feature":{}},"model_store_metadata":{},"on_device":{"last_version":"146.0.3856.72","model_crash_count":0}},"os_crypt":{"audit_enabled":true,"encrypted_key":"RFBBUEkBAAAA0Iyd3wEV0RGMegDAT8KX6wEAAAAn89AMc7fOSbvGLGpOq+9IEAAAAB4AAABNAGkAYwByAG8AcwBvAGYAdAAgAEUAZABnAGUAAAAQZgAAAAEAACAAAABrZsaIqCRxdV/n9Sn4btaz05FoykgjVrKoi8A0pI6QEAAAAAAOgAAAAAIAACAAAABT0OYu2AEKyOwJs1W2m5EfodwUXbmontiXl0C1bdiN/TAAAABm2W4tIUB7lhkJTf+lnGz9IScdtSEo92dmjmB8dFFzQz9Zzj0UXizTk+irzJJkFjJAAAAAO8B70JK0P3iD4Y4RcHyLuSAf7E2OyBoTjELrqfFw4Y8S1eJd09FHLmYekvpQKetHtgtG7xdlgeIjmoOMyaNEkQ=="},"policy":{"last_statistics_update":"13418949055207623"},"profile":{"info_cache":{"Default":{"avatar_icon":"chrome://theme/IDR_PROFILE_AVATAR_20","background_apps":false,"edge_account_cid":"","edge_account_environment":0,"edge_account_environment_string":"","edge_account_first_name":"","edge_account_last_name":"","edge_account_oid":"","edge_account_sovereignty":0,"edge_account_tenant_id":"","edge_account_type":0,"edge_create_profile_shortcut":false,"edge_profile_can_be_deleted":true,"edge_profile_can_be_edited":true,"edge_test_on_premises":false,"edge_wam_aad_for_app_account_type":0,"force_signin_profile_locked":false,"gaia_id":"","is_consented_primary_account":false,"is_ephemeral":false,"is_using_default_avatar":true,"is_using_default_name":true,"managed_user_id":"","name":"Profile 1","signin.with_credential_provider":false,"user_name":""}},"profile_counts_reported":"13418949054780481","profiles_order":["Default"]},"profile_network_context_service":{"http_cache_finch_experiment_groups":"None None None None"},"profiles":{"edge":{"multiple_profiles_with_same_account":false},"edge_sso_info":{"aad_sso_algo_state":1,"first_profile_key":"Default","msa_first_profile_key":"Default","msa_sso_algo_state":1},"signin_last_seen_version":"146.0.3856.72","signin_last_updated_time":1774475455.933847},"sentinel_creation_time":"0","session_id_generator_last_value":"1310587392","signin":{"active_accounts_last_emitted":"13418949054767362"},"startup_boost":{"last_browser_open_time":"13418949055103067"},"subresource_filter":{"ruleset_version":{"checksum":0,"content":"","format":0}},"tab_stats":{"discards_expired":0,"discards_external":0,"discards_proactive":0,"discards_urgent":0,"last_daily_sample":"13418949055167996","reloads_expired":0,"reloads_external":0,"reloads_urgent":0},"telemetry_client":{"governance":{"last_dma_change_date":"13418949055147878","last_known_cps":2048},"install_source_name":"windows","os_integration_level":5,"sample_id":75608384,"updater_version":"1.3.225.7","windows_update_applied":false},"ukm":{"persisted_logs":[]},"uninstall_metrics":{"installation_date2":"1774475452"},"user_experience_metrics":{"client_id2":"cb503ddf-ee86-4b2a-94a9-70b5e5e3341a","diagnostics":{"last_data_collection_level_on_launch":1},"last_seen":{"CrashpadMetrics":"0"},"limited_entropy_randomization_source":"D16804CA28E89950DA1D4B844BAC4F44","log_record_id":1,"low_entropy_source3":255,"payload_counter":1,"pseudo_low_entropy_source":6707,"session_id":0,"stability":{"browser_last_live_timestamp":"13418949052701258","saved_system_profile":"CJ2l8s0GEhAxNDYuMC4zODU2LjcyLTY0GAAiBWVuLVVTKhgKCldpbmRvd3MgTlQSCjEwLjAuMjYyMDAybQoGeDg2XzY0EIdfGICAjNGN/x8iE0hQIExhcHRvcCAxNy1ieTB4eHgoATCgBjjYBEIKCAAQABoAMgA6AGUAAIA/ahgKDEdlbnVpbmVJbnRlbBDqjSAYCCABKACCAQCKAQCqAQZ4ODZfNjSwAQFKCg3ZeE7NFV5v0thKCg1sO7s6FV5v0thKCg1Ak3CxFV5v0thKCg0T5AAxFV5v0thKCg1ZIj2uFV5v0thKCg0XBxSpFV5v0thKCg0T2ptcFV5v0thKCg2Q6as/FV5v0thKCg1DO2FuFV5v0thQBGIESU5CWGoICAAQADgAQACAAdCZkc4GmAEA+AH/AYAC////////////AYgCAagCszSyAjDRJfNWC4+9L/K351oQADyTN0RE6rqF3y+rE8bwOQvdoidEg0lfDgvA6BJXNkzzDV3xAuAzMwH7HKwdyj7nAgoECAAQABIIIgQIAhACKAEiAggCMgYIACIAKgA6Cwjz///v9/////8BQigSCTEuMy4yMjUuNxgFIAAqDlJlZ0tleU5vdEZvdW5kMgd3aW5kb3dzUgIIAFr8AQkxCKwcWmQ4QBGmm8QgsKpXQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAADwPxkAAAAAAADwPxkAAAAAAAAAABkAAAAAAADwPxkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAAAAABkAAAAAAABZQBkAAAAAAADwPxkAAAAAAABZQBkAAAAAAADwPxkAAAAAAADwPxkAAAAAAAA0QBkAAAAAAADwPxkAAAAAAABZQBkAAAAAAABZQHoCCAGCAQIYAKoBAgoAsAEA","saved_system_profile_hash":"1BEE69AF458D0BD679EC4BD4497B86FA0D4C1203","stats_buildtime":"1773965981","stats_version":"146.0.3856.72-64","system_crash_count":0}},"variations_google_groups":{"Default":[]},"was":{"restarted":false}} \ No newline at end of file diff --git a/.edge-profile-render-1774475451193/Nurturing/campaign_history b/.edge-profile-render-1774475451193/Nurturing/campaign_history new file mode 100644 index 0000000..eab8517 Binary files /dev/null and b/.edge-profile-render-1774475451193/Nurturing/campaign_history differ diff --git a/.edge-profile-render-1774475451193/Nurturing/campaign_history-journal b/.edge-profile-render-1774475451193/Nurturing/campaign_history-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475451193/ShaderCache/data_0 b/.edge-profile-render-1774475451193/ShaderCache/data_0 new file mode 100644 index 0000000..d76fb77 Binary files /dev/null and b/.edge-profile-render-1774475451193/ShaderCache/data_0 differ diff --git a/.edge-profile-render-1774475451193/ShaderCache/data_1 b/.edge-profile-render-1774475451193/ShaderCache/data_1 new file mode 100644 index 0000000..035d06d Binary files /dev/null and b/.edge-profile-render-1774475451193/ShaderCache/data_1 differ diff --git a/.edge-profile-render-1774475451193/ShaderCache/data_2 b/.edge-profile-render-1774475451193/ShaderCache/data_2 new file mode 100644 index 0000000..c7e2eb9 Binary files /dev/null and b/.edge-profile-render-1774475451193/ShaderCache/data_2 differ diff --git a/.edge-profile-render-1774475451193/ShaderCache/data_3 b/.edge-profile-render-1774475451193/ShaderCache/data_3 new file mode 100644 index 0000000..5eec973 Binary files /dev/null and b/.edge-profile-render-1774475451193/ShaderCache/data_3 differ diff --git a/.edge-profile-render-1774475451193/ShaderCache/index b/.edge-profile-render-1774475451193/ShaderCache/index new file mode 100644 index 0000000..ee7db14 Binary files /dev/null and b/.edge-profile-render-1774475451193/ShaderCache/index differ diff --git a/.edge-profile-render-1774475451193/SmartScreen/RemoteData/customSettings b/.edge-profile-render-1774475451193/SmartScreen/RemoteData/customSettings new file mode 100644 index 0000000..997f02d --- /dev/null +++ b/.edge-profile-render-1774475451193/SmartScreen/RemoteData/customSettings @@ -0,0 +1 @@ +customSettings_F95BA787499AB4FA9EFFF472CE383A14 \ No newline at end of file diff --git a/.edge-profile-render-1774475451193/SmartScreen/RemoteData/customSettings_F95BA787499AB4FA9EFFF472CE383A14 b/.edge-profile-render-1774475451193/SmartScreen/RemoteData/customSettings_F95BA787499AB4FA9EFFF472CE383A14 new file mode 100644 index 0000000..ae2fefa --- /dev/null +++ b/.edge-profile-render-1774475451193/SmartScreen/RemoteData/customSettings_F95BA787499AB4FA9EFFF472CE383A14 @@ -0,0 +1 @@ +{"forceServiceDetermination":false} \ No newline at end of file diff --git a/.edge-profile-render-1774475451193/Variations b/.edge-profile-render-1774475451193/Variations new file mode 100644 index 0000000..a157215 --- /dev/null +++ b/.edge-profile-render-1774475451193/Variations @@ -0,0 +1 @@ +{"user_experience_metrics.stability.exited_cleanly":false,"variations_crash_streak":0} \ No newline at end of file diff --git a/.edge-profile-render-1774475972382/Crashpad/metadata b/.edge-profile-render-1774475972382/Crashpad/metadata new file mode 100644 index 0000000..283030f Binary files /dev/null and b/.edge-profile-render-1774475972382/Crashpad/metadata differ diff --git a/.edge-profile-render-1774475972382/Crashpad/reports/40c7bb75-eeb4-4792-ba53-0c05a3c03c56.dmp b/.edge-profile-render-1774475972382/Crashpad/reports/40c7bb75-eeb4-4792-ba53-0c05a3c03c56.dmp new file mode 100644 index 0000000..0284cac Binary files /dev/null and b/.edge-profile-render-1774475972382/Crashpad/reports/40c7bb75-eeb4-4792-ba53-0c05a3c03c56.dmp differ diff --git a/.edge-profile-render-1774475972382/Crashpad/settings.dat b/.edge-profile-render-1774475972382/Crashpad/settings.dat new file mode 100644 index 0000000..99db9b0 Binary files /dev/null and b/.edge-profile-render-1774475972382/Crashpad/settings.dat differ diff --git a/.edge-profile-render-1774475972382/Crashpad/throttle_store.dat b/.edge-profile-render-1774475972382/Crashpad/throttle_store.dat new file mode 100644 index 0000000..9639e1b --- /dev/null +++ b/.edge-profile-render-1774475972382/Crashpad/throttle_store.dat @@ -0,0 +1 @@ +level=none expiry=0 diff --git a/.edge-profile-render-1774475972382/Default/ClientCertificates/LOCK b/.edge-profile-render-1774475972382/Default/ClientCertificates/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475972382/Default/ClientCertificates/LOG b/.edge-profile-render-1774475972382/Default/ClientCertificates/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475972382/Default/Code Cache/js/index b/.edge-profile-render-1774475972382/Default/Code Cache/js/index new file mode 100644 index 0000000..79bd403 Binary files /dev/null and b/.edge-profile-render-1774475972382/Default/Code Cache/js/index differ diff --git a/.edge-profile-render-1774475972382/Default/Code Cache/js/index-dir/the-real-index b/.edge-profile-render-1774475972382/Default/Code Cache/js/index-dir/the-real-index new file mode 100644 index 0000000..f916bc8 Binary files /dev/null and b/.edge-profile-render-1774475972382/Default/Code Cache/js/index-dir/the-real-index differ diff --git a/.edge-profile-render-1774475972382/Default/Code Cache/wasm/index b/.edge-profile-render-1774475972382/Default/Code Cache/wasm/index new file mode 100644 index 0000000..79bd403 Binary files /dev/null and b/.edge-profile-render-1774475972382/Default/Code Cache/wasm/index differ diff --git a/.edge-profile-render-1774475972382/Default/Code Cache/wasm/index-dir/the-real-index b/.edge-profile-render-1774475972382/Default/Code Cache/wasm/index-dir/the-real-index new file mode 100644 index 0000000..dca3333 Binary files /dev/null and b/.edge-profile-render-1774475972382/Default/Code Cache/wasm/index-dir/the-real-index differ diff --git a/.edge-profile-render-1774475972382/Default/DawnGraphiteCache/data_0 b/.edge-profile-render-1774475972382/Default/DawnGraphiteCache/data_0 new file mode 100644 index 0000000..d76fb77 Binary files /dev/null and b/.edge-profile-render-1774475972382/Default/DawnGraphiteCache/data_0 differ diff --git a/.edge-profile-render-1774475972382/Default/DawnGraphiteCache/data_1 b/.edge-profile-render-1774475972382/Default/DawnGraphiteCache/data_1 new file mode 100644 index 0000000..035d06d Binary files /dev/null and b/.edge-profile-render-1774475972382/Default/DawnGraphiteCache/data_1 differ diff --git a/.edge-profile-render-1774475972382/Default/DawnGraphiteCache/data_2 b/.edge-profile-render-1774475972382/Default/DawnGraphiteCache/data_2 new file mode 100644 index 0000000..c7e2eb9 Binary files /dev/null and b/.edge-profile-render-1774475972382/Default/DawnGraphiteCache/data_2 differ diff --git a/.edge-profile-render-1774475972382/Default/DawnGraphiteCache/data_3 b/.edge-profile-render-1774475972382/Default/DawnGraphiteCache/data_3 new file mode 100644 index 0000000..5eec973 Binary files /dev/null and b/.edge-profile-render-1774475972382/Default/DawnGraphiteCache/data_3 differ diff --git a/.edge-profile-render-1774475972382/Default/DawnGraphiteCache/index b/.edge-profile-render-1774475972382/Default/DawnGraphiteCache/index new file mode 100644 index 0000000..61452fc Binary files /dev/null and b/.edge-profile-render-1774475972382/Default/DawnGraphiteCache/index differ diff --git a/.edge-profile-render-1774475972382/Default/DawnWebGPUCache/data_0 b/.edge-profile-render-1774475972382/Default/DawnWebGPUCache/data_0 new file mode 100644 index 0000000..d76fb77 Binary files /dev/null and b/.edge-profile-render-1774475972382/Default/DawnWebGPUCache/data_0 differ diff --git a/.edge-profile-render-1774475972382/Default/DawnWebGPUCache/data_1 b/.edge-profile-render-1774475972382/Default/DawnWebGPUCache/data_1 new file mode 100644 index 0000000..035d06d Binary files /dev/null and b/.edge-profile-render-1774475972382/Default/DawnWebGPUCache/data_1 differ diff --git a/.edge-profile-render-1774475972382/Default/DawnWebGPUCache/data_2 b/.edge-profile-render-1774475972382/Default/DawnWebGPUCache/data_2 new file mode 100644 index 0000000..c7e2eb9 Binary files /dev/null and b/.edge-profile-render-1774475972382/Default/DawnWebGPUCache/data_2 differ diff --git a/.edge-profile-render-1774475972382/Default/DawnWebGPUCache/data_3 b/.edge-profile-render-1774475972382/Default/DawnWebGPUCache/data_3 new file mode 100644 index 0000000..5eec973 Binary files /dev/null and b/.edge-profile-render-1774475972382/Default/DawnWebGPUCache/data_3 differ diff --git a/.edge-profile-render-1774475972382/Default/DawnWebGPUCache/index b/.edge-profile-render-1774475972382/Default/DawnWebGPUCache/index new file mode 100644 index 0000000..c783d1a Binary files /dev/null and b/.edge-profile-render-1774475972382/Default/DawnWebGPUCache/index differ diff --git a/.edge-profile-render-1774475972382/Default/EdgePushStorageWithConnectTokenAndKey/LOCK b/.edge-profile-render-1774475972382/Default/EdgePushStorageWithConnectTokenAndKey/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475972382/Default/EdgePushStorageWithConnectTokenAndKey/LOG b/.edge-profile-render-1774475972382/Default/EdgePushStorageWithConnectTokenAndKey/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475972382/Default/EdgePushStorageWithConnectTokenAndKey/LOG.old b/.edge-profile-render-1774475972382/Default/EdgePushStorageWithConnectTokenAndKey/LOG.old new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475972382/Default/Extension Rules/CURRENT b/.edge-profile-render-1774475972382/Default/Extension Rules/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile-render-1774475972382/Default/Extension Rules/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile-render-1774475972382/Default/Extension Rules/LOCK b/.edge-profile-render-1774475972382/Default/Extension Rules/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475972382/Default/Extension Rules/LOG b/.edge-profile-render-1774475972382/Default/Extension Rules/LOG new file mode 100644 index 0000000..0d65558 --- /dev/null +++ b/.edge-profile-render-1774475972382/Default/Extension Rules/LOG @@ -0,0 +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 diff --git a/.edge-profile-render-1774475972382/Default/Extension Rules/MANIFEST-000001 b/.edge-profile-render-1774475972382/Default/Extension Rules/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile-render-1774475972382/Default/Extension Rules/MANIFEST-000001 differ diff --git a/.edge-profile-render-1774475972382/Default/Extension Scripts/CURRENT b/.edge-profile-render-1774475972382/Default/Extension Scripts/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile-render-1774475972382/Default/Extension Scripts/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile-render-1774475972382/Default/Extension Scripts/LOCK b/.edge-profile-render-1774475972382/Default/Extension Scripts/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475972382/Default/Extension Scripts/LOG b/.edge-profile-render-1774475972382/Default/Extension Scripts/LOG new file mode 100644 index 0000000..8026672 --- /dev/null +++ b/.edge-profile-render-1774475972382/Default/Extension Scripts/LOG @@ -0,0 +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 diff --git a/.edge-profile-render-1774475972382/Default/Extension Scripts/MANIFEST-000001 b/.edge-profile-render-1774475972382/Default/Extension Scripts/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile-render-1774475972382/Default/Extension Scripts/MANIFEST-000001 differ diff --git a/.edge-profile-render-1774475972382/Default/Extension State/CURRENT b/.edge-profile-render-1774475972382/Default/Extension State/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile-render-1774475972382/Default/Extension State/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile-render-1774475972382/Default/Extension State/LOCK b/.edge-profile-render-1774475972382/Default/Extension State/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475972382/Default/Extension State/LOG b/.edge-profile-render-1774475972382/Default/Extension State/LOG new file mode 100644 index 0000000..d24a890 --- /dev/null +++ b/.edge-profile-render-1774475972382/Default/Extension State/LOG @@ -0,0 +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 diff --git a/.edge-profile-render-1774475972382/Default/Extension State/MANIFEST-000001 b/.edge-profile-render-1774475972382/Default/Extension State/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile-render-1774475972382/Default/Extension State/MANIFEST-000001 differ diff --git a/.edge-profile-render-1774475972382/Default/Favicons b/.edge-profile-render-1774475972382/Default/Favicons new file mode 100644 index 0000000..e589db8 Binary files /dev/null and b/.edge-profile-render-1774475972382/Default/Favicons differ diff --git a/.edge-profile-render-1774475972382/Default/Favicons-journal b/.edge-profile-render-1774475972382/Default/Favicons-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475972382/Default/GPUCache/data_0 b/.edge-profile-render-1774475972382/Default/GPUCache/data_0 new file mode 100644 index 0000000..d76fb77 Binary files /dev/null and b/.edge-profile-render-1774475972382/Default/GPUCache/data_0 differ diff --git a/.edge-profile-render-1774475972382/Default/GPUCache/data_1 b/.edge-profile-render-1774475972382/Default/GPUCache/data_1 new file mode 100644 index 0000000..035d06d Binary files /dev/null and b/.edge-profile-render-1774475972382/Default/GPUCache/data_1 differ diff --git a/.edge-profile-render-1774475972382/Default/GPUCache/data_2 b/.edge-profile-render-1774475972382/Default/GPUCache/data_2 new file mode 100644 index 0000000..c7e2eb9 Binary files /dev/null and b/.edge-profile-render-1774475972382/Default/GPUCache/data_2 differ diff --git a/.edge-profile-render-1774475972382/Default/GPUCache/data_3 b/.edge-profile-render-1774475972382/Default/GPUCache/data_3 new file mode 100644 index 0000000..5eec973 Binary files /dev/null and b/.edge-profile-render-1774475972382/Default/GPUCache/data_3 differ diff --git a/.edge-profile-render-1774475972382/Default/GPUCache/index b/.edge-profile-render-1774475972382/Default/GPUCache/index new file mode 100644 index 0000000..ed23878 Binary files /dev/null and b/.edge-profile-render-1774475972382/Default/GPUCache/index differ diff --git a/.edge-profile-render-1774475972382/Default/History b/.edge-profile-render-1774475972382/Default/History new file mode 100644 index 0000000..c02d277 Binary files /dev/null and b/.edge-profile-render-1774475972382/Default/History differ diff --git a/.edge-profile-render-1774475972382/Default/History-journal b/.edge-profile-render-1774475972382/Default/History-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475972382/Default/HubApps Icons b/.edge-profile-render-1774475972382/Default/HubApps Icons new file mode 100644 index 0000000..a838bbc Binary files /dev/null and b/.edge-profile-render-1774475972382/Default/HubApps Icons differ diff --git a/.edge-profile-render-1774475972382/Default/HubApps Icons-journal b/.edge-profile-render-1774475972382/Default/HubApps Icons-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475972382/Default/LOCK b/.edge-profile-render-1774475972382/Default/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475972382/Default/LOG b/.edge-profile-render-1774475972382/Default/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475972382/Default/Login Data b/.edge-profile-render-1774475972382/Default/Login Data new file mode 100644 index 0000000..0af13bc Binary files /dev/null and b/.edge-profile-render-1774475972382/Default/Login Data differ diff --git a/.edge-profile-render-1774475972382/Default/Login Data For Account b/.edge-profile-render-1774475972382/Default/Login Data For Account new file mode 100644 index 0000000..0af13bc Binary files /dev/null and b/.edge-profile-render-1774475972382/Default/Login Data For Account differ diff --git a/.edge-profile-render-1774475972382/Default/Login Data For Account-journal b/.edge-profile-render-1774475972382/Default/Login Data For Account-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475972382/Default/Login Data-journal b/.edge-profile-render-1774475972382/Default/Login Data-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475972382/Default/Nurturing/campaign_history b/.edge-profile-render-1774475972382/Default/Nurturing/campaign_history new file mode 100644 index 0000000..eab8517 Binary files /dev/null and b/.edge-profile-render-1774475972382/Default/Nurturing/campaign_history differ diff --git a/.edge-profile-render-1774475972382/Default/Nurturing/campaign_history-journal b/.edge-profile-render-1774475972382/Default/Nurturing/campaign_history-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475972382/Default/PersistentOriginTrials/LOCK b/.edge-profile-render-1774475972382/Default/PersistentOriginTrials/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475972382/Default/PersistentOriginTrials/LOG b/.edge-profile-render-1774475972382/Default/PersistentOriginTrials/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475972382/Default/README b/.edge-profile-render-1774475972382/Default/README new file mode 100644 index 0000000..4a34402 --- /dev/null +++ b/.edge-profile-render-1774475972382/Default/README @@ -0,0 +1 @@ +Microsoft Edge settings and storage represent user-selected preferences and information and MUST not be extracted, overwritten or modified except through Microsoft Edge defined APIs. \ No newline at end of file diff --git a/.edge-profile-render-1774475972382/Default/ServerCertificate b/.edge-profile-render-1774475972382/Default/ServerCertificate new file mode 100644 index 0000000..9587f64 Binary files /dev/null and b/.edge-profile-render-1774475972382/Default/ServerCertificate differ diff --git a/.edge-profile-render-1774475972382/Default/ServerCertificate-journal b/.edge-profile-render-1774475972382/Default/ServerCertificate-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475972382/Default/Sessions/Session_13418949580489387 b/.edge-profile-render-1774475972382/Default/Sessions/Session_13418949580489387 new file mode 100644 index 0000000..df75a73 Binary files /dev/null and b/.edge-profile-render-1774475972382/Default/Sessions/Session_13418949580489387 differ diff --git a/.edge-profile-render-1774475972382/Default/SharedStorage b/.edge-profile-render-1774475972382/Default/SharedStorage new file mode 100644 index 0000000..4410bda Binary files /dev/null and b/.edge-profile-render-1774475972382/Default/SharedStorage differ diff --git a/.edge-profile-render-1774475972382/Default/SharedStorage-wal b/.edge-profile-render-1774475972382/Default/SharedStorage-wal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475972382/Default/Site Characteristics Database/CURRENT b/.edge-profile-render-1774475972382/Default/Site Characteristics Database/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile-render-1774475972382/Default/Site Characteristics Database/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile-render-1774475972382/Default/Site Characteristics Database/LOCK b/.edge-profile-render-1774475972382/Default/Site Characteristics Database/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475972382/Default/Site Characteristics Database/LOG b/.edge-profile-render-1774475972382/Default/Site Characteristics Database/LOG new file mode 100644 index 0000000..763334a --- /dev/null +++ b/.edge-profile-render-1774475972382/Default/Site Characteristics Database/LOG @@ -0,0 +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 diff --git a/.edge-profile-render-1774475972382/Default/Site Characteristics Database/MANIFEST-000001 b/.edge-profile-render-1774475972382/Default/Site Characteristics Database/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile-render-1774475972382/Default/Site Characteristics Database/MANIFEST-000001 differ diff --git a/.edge-profile-render-1774475972382/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/js/index b/.edge-profile-render-1774475972382/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/js/index new file mode 100644 index 0000000..79bd403 Binary files /dev/null and b/.edge-profile-render-1774475972382/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/js/index differ diff --git a/.edge-profile-render-1774475972382/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/js/index-dir/the-real-index b/.edge-profile-render-1774475972382/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/js/index-dir/the-real-index new file mode 100644 index 0000000..13cae87 Binary files /dev/null and b/.edge-profile-render-1774475972382/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/js/index-dir/the-real-index differ diff --git a/.edge-profile-render-1774475972382/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/wasm/index b/.edge-profile-render-1774475972382/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/wasm/index new file mode 100644 index 0000000..79bd403 Binary files /dev/null and b/.edge-profile-render-1774475972382/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/wasm/index differ diff --git a/.edge-profile-render-1774475972382/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/wasm/index-dir/the-real-index b/.edge-profile-render-1774475972382/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/wasm/index-dir/the-real-index new file mode 100644 index 0000000..ccda6a0 Binary files /dev/null and b/.edge-profile-render-1774475972382/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/wasm/index-dir/the-real-index differ diff --git a/.edge-profile-render-1774475972382/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_0 b/.edge-profile-render-1774475972382/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_0 new file mode 100644 index 0000000..d76fb77 Binary files /dev/null and b/.edge-profile-render-1774475972382/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_0 differ diff --git a/.edge-profile-render-1774475972382/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_1 b/.edge-profile-render-1774475972382/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_1 new file mode 100644 index 0000000..035d06d Binary files /dev/null and b/.edge-profile-render-1774475972382/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_1 differ diff --git a/.edge-profile-render-1774475972382/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_2 b/.edge-profile-render-1774475972382/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_2 new file mode 100644 index 0000000..c7e2eb9 Binary files /dev/null and b/.edge-profile-render-1774475972382/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_2 differ diff --git a/.edge-profile-render-1774475972382/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_3 b/.edge-profile-render-1774475972382/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_3 new file mode 100644 index 0000000..5eec973 Binary files /dev/null and b/.edge-profile-render-1774475972382/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_3 differ diff --git a/.edge-profile-render-1774475972382/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/index b/.edge-profile-render-1774475972382/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/index new file mode 100644 index 0000000..ea325f8 Binary files /dev/null and b/.edge-profile-render-1774475972382/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/index differ diff --git a/.edge-profile-render-1774475972382/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_0 b/.edge-profile-render-1774475972382/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_0 new file mode 100644 index 0000000..d76fb77 Binary files /dev/null and b/.edge-profile-render-1774475972382/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_0 differ diff --git a/.edge-profile-render-1774475972382/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_1 b/.edge-profile-render-1774475972382/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_1 new file mode 100644 index 0000000..035d06d Binary files /dev/null and b/.edge-profile-render-1774475972382/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_1 differ diff --git a/.edge-profile-render-1774475972382/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_2 b/.edge-profile-render-1774475972382/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_2 new file mode 100644 index 0000000..c7e2eb9 Binary files /dev/null and b/.edge-profile-render-1774475972382/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_2 differ diff --git a/.edge-profile-render-1774475972382/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_3 b/.edge-profile-render-1774475972382/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_3 new file mode 100644 index 0000000..5eec973 Binary files /dev/null and b/.edge-profile-render-1774475972382/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_3 differ diff --git a/.edge-profile-render-1774475972382/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/index b/.edge-profile-render-1774475972382/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/index new file mode 100644 index 0000000..ba5b5bf Binary files /dev/null and b/.edge-profile-render-1774475972382/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/index differ diff --git a/.edge-profile-render-1774475972382/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_0 b/.edge-profile-render-1774475972382/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_0 new file mode 100644 index 0000000..d76fb77 Binary files /dev/null and b/.edge-profile-render-1774475972382/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_0 differ diff --git a/.edge-profile-render-1774475972382/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_1 b/.edge-profile-render-1774475972382/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_1 new file mode 100644 index 0000000..035d06d Binary files /dev/null and b/.edge-profile-render-1774475972382/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_1 differ diff --git a/.edge-profile-render-1774475972382/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_2 b/.edge-profile-render-1774475972382/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_2 new file mode 100644 index 0000000..c7e2eb9 Binary files /dev/null and b/.edge-profile-render-1774475972382/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_2 differ diff --git a/.edge-profile-render-1774475972382/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_3 b/.edge-profile-render-1774475972382/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_3 new file mode 100644 index 0000000..5eec973 Binary files /dev/null and b/.edge-profile-render-1774475972382/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_3 differ diff --git a/.edge-profile-render-1774475972382/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/index b/.edge-profile-render-1774475972382/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/index new file mode 100644 index 0000000..514ec70 Binary files /dev/null and b/.edge-profile-render-1774475972382/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/index differ diff --git a/.edge-profile-render-1774475972382/Default/Sync Data/LevelDB/CURRENT b/.edge-profile-render-1774475972382/Default/Sync Data/LevelDB/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile-render-1774475972382/Default/Sync Data/LevelDB/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile-render-1774475972382/Default/Sync Data/LevelDB/LOCK b/.edge-profile-render-1774475972382/Default/Sync Data/LevelDB/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475972382/Default/Sync Data/LevelDB/LOG b/.edge-profile-render-1774475972382/Default/Sync Data/LevelDB/LOG new file mode 100644 index 0000000..8590d39 --- /dev/null +++ b/.edge-profile-render-1774475972382/Default/Sync Data/LevelDB/LOG @@ -0,0 +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 diff --git a/.edge-profile-render-1774475972382/Default/Sync Data/LevelDB/MANIFEST-000001 b/.edge-profile-render-1774475972382/Default/Sync Data/LevelDB/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile-render-1774475972382/Default/Sync Data/LevelDB/MANIFEST-000001 differ diff --git a/.edge-profile-render-1774475972382/Default/Top Sites b/.edge-profile-render-1774475972382/Default/Top Sites new file mode 100644 index 0000000..e700bd4 Binary files /dev/null and b/.edge-profile-render-1774475972382/Default/Top Sites differ diff --git a/.edge-profile-render-1774475972382/Default/Top Sites-journal b/.edge-profile-render-1774475972382/Default/Top Sites-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475972382/Default/Vpn Tokens b/.edge-profile-render-1774475972382/Default/Vpn Tokens new file mode 100644 index 0000000..2ba3b69 Binary files /dev/null and b/.edge-profile-render-1774475972382/Default/Vpn Tokens differ diff --git a/.edge-profile-render-1774475972382/Default/Vpn Tokens-journal b/.edge-profile-render-1774475972382/Default/Vpn Tokens-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475972382/Default/Web Data b/.edge-profile-render-1774475972382/Default/Web Data new file mode 100644 index 0000000..6097c32 Binary files /dev/null and b/.edge-profile-render-1774475972382/Default/Web Data differ diff --git a/.edge-profile-render-1774475972382/Default/Web Data-journal b/.edge-profile-render-1774475972382/Default/Web Data-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475972382/Default/arbitration_service_config.json b/.edge-profile-render-1774475972382/Default/arbitration_service_config.json new file mode 100644 index 0000000..fd7d0be --- /dev/null +++ b/.edge-profile-render-1774475972382/Default/arbitration_service_config.json @@ -0,0 +1,197 @@ +{ + "ArbitrationSignal": "notification_nsat_upper_ci-0.7", + "CopilotModeBypass": [ "cd4688a9-e888-48ea-ad81-76193d56b1be.IsVideoPage.Bubble", "cd4688a9-e888-48ea-ad81-76193d56b1be.IsKnowledgeCardQuery.Bubble", "PerformanceDetectorFeatureNotification", "AUTOFILL_PASSWORD_NON_FUNCTIONAL_FLYOUTS", "SHOPPING_AUTO_SHOW_LOWER_PRICE_FOUND", "SHOPPING_AUTO_SHOW_REBATES", "SHOPPING_AUTO_SHOW_REBATES_CONFIRMATION", "SHOPPING_AUTO_SHOW_REBATES_ORGANIC", "SHOPPING_AUTO_SHOW_REBATES_ORGANIC_NEW" ], + "CustomSuppressionPolicies": { + "8682d0fa-50b3-4ece-aa5b-e0b33f9919e2.f5b8c725-cb2e-4c12-accd-73e500d88d47.AutoOpen": { + "notification_max_quick_dismiss_count": 3 + }, + "bc25fcef-8964-4e72-8287-23e2b496c128.68b8a884-6e08-46e6-8a3b-7e06ffe48ecf.AutoOpen": { + "notification_max_quick_dismiss_count": 3 + }, + "cd4688a9-e888-48ea-ad81-76193d56b1be.e06e75c1-a59a-4ab6-8361-e8b038e00a8c.AutoOpen": { + "notification_max_quick_dismiss_count": 1 + } + }, + "DynamicSuppressionBypass": { + "ExperienceIDs": [ "Nurturing.Global.OnRamp_RetriggerFREOnEdgeVersionUpgradeViaExplicitLaunch", "Nurturing.Global.OnRamp_RetriggerFREOnExplicitProtocolPDFLaunchForEdgePostDMA", "Nurturing.Global.Bing_DefaultBrowserBannerCloseBtn", "Nurturing.Global.Bing_DefaultBrowserBannerCloseBtnUpdate", "Nurturing.Global.Bing_MSStartYJCompete", "Nurturing.Global.Bing_NtpHomeStartpageUpsellFlyout", "Nurturing.Global.Fundamentals_DefaultBrowserMonitor", "Nurturing.Global.Fundamentals_DefaultBrowserMonitorOnStart", "Nurturing.Global.Fundamentals_DefaultBrowserMonitorVariant2", "Nurturing.Global.RecommendedSettingsChina", "Nurturing.Global.ContinuousImport_PasswordZeroStateV2", "Nurturing.Global.OnRamp_CIExplicitLaunchBannerUpsell", "Nurturing.Global.OnRamp_CIUpsell_ProtocolLaunch_Banner", "Nurturing.Global.EdgeGrowth_SitePinningCITopSites", "Nurturing.Global.EdgeGrowth_SitePinningWithWindowsConsent", "Nurturing.Global.EdgeGrowth_GlobalSitePinningOnCloseModal" ], + "TeamIDs": [ "NTP" ] + }, + "ExperienceCohorts": { + "DefaultCohort": { + "21f3388b-c2a5-4791-8f6e-a4cad6d17f4f.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.BingHomePage.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Covid.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Finance.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Jobs.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.KnowledgeCard.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Local.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.NTP3PCLICK.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.NotifySearchPage.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Recipe.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.SearchPage.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Sports.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Travel.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Weather.Bubble": 1, + "2cb2db96-3bd0-403e-abe2-9269b3761041.AutoOpen": 1, + "2cb2db96-3bd0-403e-abe2-9269b3761041.Bubble": 1, + "439642fc-998d-4a64-8bb6-940ecaf6b60b.AutoOpen": 1, + "439642fc-998d-4a64-8bb6-940ecaf6b60b.Bubble": 1, + "523b5ef3-0b10-4154-8b62-10b2ebd00921.Bubble": 1, + "64be4f9b-3b81-4b6e-b354-0ba00d6ba485.AutoOpen": 1, + "64be4f9b-3b81-4b6e-b354-0ba00d6ba485.Bubble": 1, + "76b926d6-3738-46bf-82d7-2ab896ddf70b.MM2UpSellPopup.Bubble": 1, + "8682d0fa-50b3-4ece-aa5b-e0b33f9919e2.Bubble": 1, + "8682d0fa-50b3-4ece-aa5b-e0b33f9919e2.f5b8c725-cb2e-4c12-accd-73e500d88d47.AutoOpen": 1, + "8ac719c5-140b-4bf2-a0b7-c71617f1f377.3662f1e2-66ae-464f-b690-e7e3dc4fc662.AutoOpen": 1, + "8ac719c5-140b-4bf2-a0b7-c71617f1f377.93e5b5cd-15fc-4253-9728-d80685da304e.AutoOpen": 1, + "8ac719c5-140b-4bf2-a0b7-c71617f1f377.AutoOpen": 1, + "8ac719c5-140b-4bf2-a0b7-c71617f1f377.gaokao.Bubble": 1, + "92f1b743-e26b-433b-a1ec-912d1f0ad1fa.Bubble": 1, + "96defd79-4015-4a32-bd09-794ff72183ef.0bdde3c3-7be8-49f1-971b-e6e2cfd62643.AutoOpen": 1, + "96defd79-4015-4a32-bd09-794ff72183ef.128c39c6-6f70-4ce5-9d01-78978e60d666.AutoOpen": 1, + "96defd79-4015-4a32-bd09-794ff72183ef.5ac63306-e962-42e6-8313-7e5a5b707d65.AutoOpen": 1, + "96defd79-4015-4a32-bd09-794ff72183ef.AutoOpen": 1, + "96defd79-4015-4a32-bd09-794ff72183ef.Bubble": 1, + "96defd79-4015-4a32-bd09-794ff72183ef.Is1PGameDomain.Bubble": 1, + "96defd79-4015-4a32-bd09-794ff72183ef.Is3PGameDomain.Bubble": 1, + "9ce3c9c2-462f-4cc9-bbd7-57d656445be0.Bubble": 1, + "AUTOFILL_PASSWORD_NON_FUNCTIONAL_FLYOUTS": 1, + "DefaultExperience": 1, + "EdgeDownloadChromeInterceptDialog": 2, + "PerformanceDetectorFeatureNotification": 1, + "RewardsPromotionNotifications": 1, + "RewardsReminderNotifications": 1, + "SAN.Personalization.ConsentPrompt": 1, + "SHOPPING_AA_CONSENT": 1, + "SHOPPING_AUTO_PRODUCT_TRACKING_EXP_PRICE_DROP": 1, + "SHOPPING_AUTO_PRODUCT_TRACKING_IMP_PRICE_DROP": 1, + "SHOPPING_AUTO_PRODUCT_TRACKING_OUT_OF_STOCK": 1, + "SHOPPING_AUTO_SHOW_ABANDONED_CART": 1, + "SHOPPING_AUTO_SHOW_ADD_SPB_TO_CART_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_AMAZON_SEARCH_PC": 1, + "SHOPPING_AUTO_SHOW_ATTAINABLE_COUPONS": 1, + "SHOPPING_AUTO_SHOW_AUTOS_MARKETPLACE": 1, + "SHOPPING_AUTO_SHOW_AWARENESSEXP": 1, + "SHOPPING_AUTO_SHOW_AWARENESS_EXPANSION": 1, + "SHOPPING_AUTO_SHOW_CAMPAIGN_AWARENESS_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_CAMPAIGN_PDP_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_CASHBACK_PDP_PLUS_COUPONS": 1, + "SHOPPING_AUTO_SHOW_CJK_COUPON_FOUND": 1, + "SHOPPING_AUTO_SHOW_CJK_PRICE_DROP": 1, + "SHOPPING_AUTO_SHOW_CODEX_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_CONFIRMATION_SCRIPT": 1, + "SHOPPING_AUTO_SHOW_CONTROLLER": 1, + "SHOPPING_AUTO_SHOW_COUPONS_BACKGROUND_AUTO_APPLY": 1, + "SHOPPING_AUTO_SHOW_COUPONS_CHECKOUT": 1, + "SHOPPING_AUTO_SHOW_COUPONS_CHECKOUT_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_COUPONS_CLIPPING": 1, + "SHOPPING_AUTO_SHOW_DISCOVER_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_DISCOVER_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_EXPRESS_CHECKOUT": 1, + "SHOPPING_AUTO_SHOW_GIFT_CARD": 1, + "SHOPPING_AUTO_SHOW_GOODRX": 1, + "SHOPPING_AUTO_SHOW_GROCERY_ITEMIZED_CASHBACK": 1, + "SHOPPING_AUTO_SHOW_GROCERY_ITEMIZED_CASHBACK_LANDING": 1, + "SHOPPING_AUTO_SHOW_GUEST_DOMAIN_COUPONS": 1, + "SHOPPING_AUTO_SHOW_IBC_UPSELL": 1, + "SHOPPING_AUTO_SHOW_LOWER_PRICE_FOUND": 1, + "SHOPPING_AUTO_SHOW_LOWER_PRICE_PLUS_CASHBACK_PLUS_COUPONS": 1, + "SHOPPING_AUTO_SHOW_MOMENT_IN_TIME": 1, + "SHOPPING_AUTO_SHOW_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_ORGANIC_CASHBACK_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_OTHER_SELLER": 1, + "SHOPPING_AUTO_SHOW_OUT_OF_STOCK": 1, + "SHOPPING_AUTO_SHOW_PACKAGE_TRACKING": 1, + "SHOPPING_AUTO_SHOW_PACKAGE_TRACKING_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_PERSONALIZED_CASHBACK_ADDRESSBAR": 1, + "SHOPPING_AUTO_SHOW_PERSONALIZED_CASHBACK_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_POST_PURCHASE_TRACKING": 1, + "SHOPPING_AUTO_SHOW_PRICE_DROP_PLUS_CASHBACK": 1, + "SHOPPING_AUTO_SHOW_PRICE_DROP_PLUS_COUPONS": 1, + "SHOPPING_AUTO_SHOW_PRICE_HISTORY": 1, + "SHOPPING_AUTO_SHOW_PRICE_HISTORY_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_PRINT_GROCERY": 1, + "SHOPPING_AUTO_SHOW_PRODUCT_BEST_COUPON_CONSENT": 1, + "SHOPPING_AUTO_SHOW_PRODUCT_TRACKING_BACK_IN_STOCK": 1, + "SHOPPING_AUTO_SHOW_PRODUCT_TRACKING_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_PROFESSIONAL_REVIEWS": 1, + "SHOPPING_AUTO_SHOW_REBATES": 1, + "SHOPPING_AUTO_SHOW_REBATES_CHECKOUT": 1, + "SHOPPING_AUTO_SHOW_REBATES_ORGANIC": 1, + "SHOPPING_AUTO_SHOW_REBATES_ORGANIC_NEW": 1, + "SHOPPING_AUTO_SHOW_REBATES_PDP": 1, + "SHOPPING_AUTO_SHOW_RECOMMENDATIONS_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_SAN_CONSENT_CONFIRMATION": 1, + "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_ALL_PAGES": 1, + "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_CHECKOUT": 1, + "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_CONFIRMATION_PAGE": 1, + "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_HOME_PAGE": 1, + "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_REWARDS": 1, + "SHOPPING_AUTO_SHOW_SHOPRUNNER": 1, + "SHOPPING_AUTO_SHOW_SIDEPANE_CASHBACK_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_SPB_CASHBACK_LANDING": 1, + "SHOPPING_AUTO_SHOW_SPB_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_SPB_NUDGE_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_SURFACE_UPSELL": 1, + "SHOPPING_AUTO_SHOW_SUSTAINABILITY_LANDING": 1, + "SHOPPING_AUTO_SHOW_TRAVEL_NOTIFICATION_CHEAPER_FLIGHTS": 1, + "SHOPPING_AUTO_SHOW_TRAVEL_NOTIFICATION_CHEAPER_HOTEL_ROOM": 1, + "SHOPPING_AUTO_SHOW_TRENDING_COUPONS": 1, + "ShorelinePrivilegedExperienceID": 1, + "TabActionsMenuVerticalTabsPromotion": 1, + "VPNFeatureNotification": 1, + "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.75a774c2-6075-ae4f-09f9-e5f5d9bef6e1.AutoOpen": 1, + "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.AutoOpen": 1, + "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.a5e9f5e1-fcee-c07b-2c44-b707ded020a3.AutoOpen": 1, + "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.c8ebbf64-e3b8-41d9-925f-4e3754151ff7.AutoOpen": 1, + "bc25fcef-8964-4e72-8287-23e2b496c128.68b8a884-6e08-46e6-8a3b-7e06ffe48ecf.AutoOpen": 1, + "bc25fcef-8964-4e72-8287-23e2b496c128.Bubble": 1, + "c8ebd871-9f47-4a0d-abd3-c1c02b4f8f53.2cfab14c-ebd6-4548-9401-30ab5afe5061.AutoOpen": 1, + "c8ebd871-9f47-4a0d-abd3-c1c02b4f8f53.AutoOpen": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.5b853177-a0be-4237-bda0-4fce5cd165c2.AutoOpen": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.8d3a928d-e911-40f0-9852-f63f6434dc7e.AutoOpen": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.AutoOpen": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.AutoOpen.PDF": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.AutoOpen.PersistentChat": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsCompeteAISite.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsCopilotJitEduAcademicAI.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsCopilotJitEduArticleAI.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsCopilotJitEduStudyAI.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsKnowledgeCardQuery.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsMsnArticleUrlFromNtpP1P2.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsShoppingNotificationNudge.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsTextPage.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsTopNewsDomain.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsTwitchNonStreamPage.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsTwitchSubPage.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsVideoPage.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.e06e75c1-a59a-4ab6-8361-e8b038e00a8c.AutoOpen": 1, + "e6723537-66ff-4f4e-ab56-a4cbaddf4e0f.MM2UpSellPopup.Bubble": 1 + } + }, + "FunctionalCohort": [ "EdgeDownloadChromeInterceptFunctionalDialog", "8682d0fa-50b3-4ece-aa5b-e0b33f9919e2.AutoOpen.Functional", "8682d0fa-50b3-4ece-aa5b-e0b33f9919e2.f5b8c725-cb2e-4c12-accd-73e500d88d47.AutoOpen.Functional", "bc25fcef-8964-4e72-8287-23e2b496c128.AutoOpen.Functional", "bc25fcef-8964-4e72-8287-23e2b496c128.68b8a884-6e08-46e6-8a3b-7e06ffe48ecf.AutoOpen.Functional", "WPOFunctionalEvent.AutofillAccountChooser.Bubble", "WPOFunctionalEvent.AutofillAutoSignin.Bubble", "WPOFunctionalEvent.AutofillPassword.Bubble", "SHOPPING_AUTO_SHOW_BING_SEARCH", "SHOPPING_AUTO_SHOW_REBATES_CONFIRMATION", "SHOPPING_AUTO_SHOW_REBATES_DEACTIVATED", "SHOPPING_AUTO_SHOW_REBATES_BING", "SHOPPING_AUTO_SHOW_PERSONALIZED_CASHBACK", "SHOPPING_AUTO_SHOW_PERSONALIZED_CASHBACK_CONFIRMATION", "SHOPPING_AUTO_SHOW_URL_PARAM_REBATES", "SHOPPING_AUTO_SHOW_URL_PARAM_PRICE_COMPARISON", "SHOPPING_AUTO_SHOW_URL_PARAM_PRICE_HISTORY", "SHOPPING_AUTO_SHOW_REBATES_ACTIVATION_FAILED", "SHOPPING_AUTO_SHOW_REBATES_SWITCHED_TO_MSA", "SHOPPING_AUTO_SHOW_ITEM_ADDED_TO_CART_FROM_OTHER_SELLER", "SHOPPING_AUTO_SHOW_VIRTUAL_CARD", "SHOPPING_AUTO_SHOW_BING_CAMPAIGN", "SHOPPING_OPEN_FLYOUT_FROM_EDGE_DRIVER", "SHOPPING_AUTO_SHOW_SUSTAINABILITY_PURCHASE", "SHOPPING_AUTO_SHOW_REWARDS_ACTIVATION_FAILED", "SHOPPING_AUTO_SHOW_REWARDS_SWITCHED_TO_MSA", "SHOPPING_AUTO_SHOW_SHOPRUNNER_CONFIRMATION", "SHOPPING_AUTO_SHOW_ENROLL_TO_CASHBACK_CONFIRMATION_NOTIFICATION", "SHOPPING_AUTO_SHOW_POST_PURCHASE_REWARDS_NOTIFICATION", "694efa4f-a304-4214-aaf7-90444bc887f5.c1c025d9-a620-4f6b-bebb-eff0cf19a671.AutoOpen.Functional" ], + "GlobalSuppressedExperiences": [ "Teams.Bubble", "Nurturing.Global.EdgeVpn_VpnFre", "Nurturing.Global.Rewards_RedemptionCoachmark_2", "Nurturing.Global.Rewards_RedemptionCoachmark_25", "Nurturing.Global.EdgeCBUD_SanPersonalizationConsentWave1Variant0", "Nurturing.Global.Bing_NewBingChatFlyout", "Copilot.AutoOpen.PDF.v2", "Nurturing.Global.PWA_SidebarSearchPromotion", "Nurturing.Global.FC_NetworkWarningFlyout", "Nurturing.Global.EdgeMobile_MobileUpsell_ChatGpt_Flyout", "E-tree.Bubble", "Nurturing.Global.EdgeEDU_BrowserFocusedTranslateNudge", "Games.Bubble", "Nurturing.Global.OnRamp_RetriggerFRECodexCoPilotAutoAprd", "Nurturing.Global.OnRamp_NurturingViaProng_Experiment", "Nurturing.Global.OnRamp_ReTriggerOnWinUpgrade", "Nurturing.Global.EdgeGrowth_CIShoppingUpsell", "Nurturing.Global.Shopping_EnableShoppingAssistance_Optin_Generic", "Nurturing.Global.Shopping_EnableShoppingAssistance", "Nurturing.Global.BrowserExperiences_TryVerticalTabs" ], + "IgnoredFunctionalNotifications": [ "Nurturing.Functional.NTP_CourtesyEngineCampaign", "Nurturing.Functional.NTP_FunctionalCampaign", "Nurturing.Functional.NTP_SettingsCampaign", "Nurturing.Functional.NTP_UpsellCampaign", "Nurturing.Functional.FN_SmartSwitchFeatureInfoView" ], + "ModelInfo": { + "segment_id": 515, + "signals": [ "notification_triggered_count", "notification_click_rate", "notification_click_rate_lower_ci", "notification_click_rate_upper_ci", "notification_dismiss_rate", "notification_dismiss_rate_lower_ci", "notification_dismiss_rate_upper_ci", "notification_ignored_rate", "notification_ignored_rate_lower_ci", "notification_ignored_rate_upper_ci", "notification_quick_dismiss_rate", "notification_quick_dismiss_rate_lower_ci", "notification_quick_dismiss_rate_upper_ci", "notification_disable_rate", "notification_disable_rate_lower_ci", "notification_disable_rate_upper_ci", "notification_snooze_rate", "notification_snooze_rate_lower_ci", "notification_snooze_rate_upper_ci" ], + "threshold_value": 0.5 + }, + "ModelSuppressionBypass": [ "Nurturing.Local.SHOPPING_AUTO_SHOW_LOWER_PRICE_FOUND", "Nurturing.Local.SHOPPING_AUTO_SHOW_REBATES_ORGANIC", "Nurturing.Local.SHOPPING_AUTO_SHOW_REBATES_CHECKOUT", "Nurturing.Local.SHOPPING_AUTO_SHOW_SPB_CASHBACK_LANDING" ], + "NotificationsAllowLists": { + }, + "PrivilegedExperiences": [ "ShorelinePrivilegedExperienceID", "SHOPPING_AUTO_SHOW_COUPONS_CHECKOUT", "SHOPPING_AUTO_SHOW_LOWER_PRICE_FOUND", "SHOPPING_AUTO_SHOW_REBATES", "SHOPPING_AUTO_SHOW_REBATES_ORGANIC", "SHOPPING_AUTO_SHOW_PRICE_HISTORY", "SHOPPING_AUTO_SHOW_REBATES_ORGANIC_NEW", "SHOPPING_AUTO_SHOW_REBATES_CHECKOUT", "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_CHECKOUT", "SHOPPING_AUTO_SHOW_EXPRESS_CHECKOUT", "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_ALL_PAGES", "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_CONFIRMATION_PAGE", "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_HOME_PAGE", "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_REWARDS", "SHOPPING_AUTO_SHOW_COUPONS_CLIPPING", "SHOPPING_AUTO_SHOW_NOTIFICATION", "SHOPPING_AUTO_SHOW_OTHER_SELLER", "SHOPPING_AUTO_SHOW_PROFESSIONAL_REVIEWS", "SHOPPING_AUTO_SHOW_PACKAGE_TRACKING", "SHOPPING_AUTO_SHOW_GUEST_DOMAIN_COUPONS", "SHOPPING_AUTO_SHOW_SUSTAINABILITY_LANDING", "SHOPPING_AUTO_SHOW_ATTAINABLE_COUPONS", "SHOPPING_AUTO_SHOW_GIFT_CARD", "SHOPPING_AUTO_SHOW_PRINT_GROCERY", "SHOPPING_AUTO_SHOW_GROCERY_ITEMIZED_CASHBACK", "SHOPPING_AUTO_SHOW_CONTROLLER", "SHOPPING_AUTO_SHOW_AUTOS_MARKETPLACE", "SHOPPING_AUTO_SHOW_SHOPRUNNER", "SHOPPING_AUTO_SHOW_ABANDONED_CART", "SHOPPING_AUTO_SHOW_OUT_OF_STOCK", "SHOPPING_AUTO_SHOW_GROCERY_ITEMIZED_CASHBACK_LANDING", "SHOPPING_AUTO_SHOW_SPB_CASHBACK_LANDING", "SHOPPING_AUTO_SHOW_AWARENESSEXP", "SHOPPING_AA_CONSENT", "SHOPPING_AUTO_SHOW_SAN_CONSENT_CONFIRMATION", "SHOPPING_AUTO_SHOW_CONFIRMATION_SCRIPT", "SHOPPING_AUTO_SHOW_MOMENT_IN_TIME", "SHOPPING_AUTO_SHOW_COUPONS_CHECKOUT_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_TRENDING_COUPONS", "SHOPPING_AUTO_SHOW_RECOMMENDATIONS_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_PRODUCT_TRACKING_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_SURFACE_UPSELL", "SHOPPING_AUTO_SHOW_PRODUCT_TRACKING_BACK_IN_STOCK", "SHOPPING_AUTO_PRODUCT_TRACKING_EXP_PRICE_DROP", "SHOPPING_AUTO_PRODUCT_TRACKING_IMP_PRICE_DROP", "SHOPPING_AUTO_PRODUCT_TRACKING_OUT_OF_STOCK", "SHOPPING_AUTO_SHOW_CODEX_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_PERSONALIZED_CASHBACK_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_PRICE_HISTORY_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_ORGANIC_CASHBACK_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_GOODRX", "SHOPPING_AUTO_SHOW_SIDEPANE_CASHBACK_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_DISCOVER_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_REBATES_PDP", "SHOPPING_AUTO_SHOW_PRODUCT_BEST_COUPON_CONSENT", "SHOPPING_AUTO_SHOW_CAMPAIGN_PDP_NOTIFICATION", "SHOPPING_AUTO_SHOW_CAMPAIGN_AWARENESS_NOTIFICATION", "SHOPPING_AUTO_SHOW_SPB_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_PRICE_DROP_PLUS_COUPONS", "SHOPPING_AUTO_SHOW_SPB_NUDGE_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_ADD_SPB_TO_CART_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_CASHBACK_PDP_PLUS_COUPONS", "SHOPPING_AUTO_SHOW_PRICE_DROP_PLUS_CASHBACK", "SHOPPING_AUTO_SHOW_DISCOVER_NOTIFICATION", "SHOPPING_AUTO_SHOW_AMAZON_SEARCH_PC", "SHOPPING_AUTO_SHOW_COUPONS_BACKGROUND_AUTO_APPLY", "SHOPPING_AUTO_SHOW_PERSONALIZED_CASHBACK_ADDRESSBAR", "SHOPPING_AUTO_SHOW_TRAVEL_NOTIFICATION_CHEAPER_FLIGHTS", "SHOPPING_AUTO_SHOW_TRAVEL_NOTIFICATION_CHEAPER_HOTEL_ROOM", "SHOPPING_AUTO_SHOW_CJK_PRICE_DROP", "SHOPPING_AUTO_SHOW_CJK_COUPON_FOUND", "AUTOFILL_PASSWORD_NON_FUNCTIONAL_FLYOUTS", "76b926d6-3738-46bf-82d7-2ab896ddf70b.MM2UpSellPopup.Bubble", "e6723537-66ff-4f4e-ab56-a4cbaddf4e0f.MM2UpSellPopup.Bubble", "8ac719c5-140b-4bf2-a0b7-c71617f1f377.3662f1e2-66ae-464f-b690-e7e3dc4fc662.AutoOpen", "8ac719c5-140b-4bf2-a0b7-c71617f1f377.gaokao.Bubble", "c8ebd871-9f47-4a0d-abd3-c1c02b4f8f53.AutoOpen", "c8ebd871-9f47-4a0d-abd3-c1c02b4f8f53.2cfab14c-ebd6-4548-9401-30ab5afe5061.AutoOpen", "cd4688a9-e888-48ea-ad81-76193d56b1be.AutoOpen.PersistentChat", "cd4688a9-e888-48ea-ad81-76193d56b1be.AutoOpen.PDF", "cd4688a9-e888-48ea-ad81-76193d56b1be.8d3a928d-e911-40f0-9852-f63f6434dc7e.AutoOpen", "cd4688a9-e888-48ea-ad81-76193d56b1be.e06e75c1-a59a-4ab6-8361-e8b038e00a8c.AutoOpen", "cd4688a9-e888-48ea-ad81-76193d56b1be.5b853177-a0be-4237-bda0-4fce5cd165c2.AutoOpen", "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.AutoOpen", "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.c8ebbf64-e3b8-41d9-925f-4e3754151ff7.AutoOpen", "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.75a774c2-6075-ae4f-09f9-e5f5d9bef6e1.AutoOpen", "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.a5e9f5e1-fcee-c07b-2c44-b707ded020a3.AutoOpen", "8682d0fa-50b3-4ece-aa5b-e0b33f9919e2.f5b8c725-cb2e-4c12-accd-73e500d88d47.AutoOpen", "bc25fcef-8964-4e72-8287-23e2b496c128.68b8a884-6e08-46e6-8a3b-7e06ffe48ecf.AutoOpen", "EdgeDownloadChromeInterceptDialog", "439642fc-998d-4a64-8bb6-940ecaf6b60b.AutoOpen", "694efa4f-a304-4214-aaf7-90444bc887f5.c1c025d9-a620-4f6b-bebb-eff0cf19a671.AutoOpen" ], + "ReserveApproved": { + "ExperienceIDs": [ "Nurturing.Global.Edge_SpawnNtpOptIn", "Nurturing.Global.Edge_SpawnNtpOptOut" ], + "SourceIDs": [ 3 ], + "TeamIDs": [ "Edge Consumer Content and Verticals" ] + }, + "ScenarioSuppressLists": { + }, + "SuppressedExperiences": [ ], + "TimeDelta": 5000000, + "baseConfigVersion": "40.0.1", + "configVersion": "40.0.1" +} diff --git a/.edge-profile-render-1774475972382/Default/commerce_subscription_db/LOCK b/.edge-profile-render-1774475972382/Default/commerce_subscription_db/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475972382/Default/commerce_subscription_db/LOG b/.edge-profile-render-1774475972382/Default/commerce_subscription_db/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475972382/Default/discount_infos_db/LOCK b/.edge-profile-render-1774475972382/Default/discount_infos_db/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475972382/Default/discount_infos_db/LOG b/.edge-profile-render-1774475972382/Default/discount_infos_db/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475972382/Default/discounts_db/LOCK b/.edge-profile-render-1774475972382/Default/discounts_db/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475972382/Default/discounts_db/LOG b/.edge-profile-render-1774475972382/Default/discounts_db/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475972382/Default/load_statistics.db b/.edge-profile-render-1774475972382/Default/load_statistics.db new file mode 100644 index 0000000..4410bda Binary files /dev/null and b/.edge-profile-render-1774475972382/Default/load_statistics.db differ diff --git a/.edge-profile-render-1774475972382/Default/load_statistics.db-shm b/.edge-profile-render-1774475972382/Default/load_statistics.db-shm new file mode 100644 index 0000000..60757ed Binary files /dev/null and b/.edge-profile-render-1774475972382/Default/load_statistics.db-shm differ diff --git a/.edge-profile-render-1774475972382/Default/load_statistics.db-wal b/.edge-profile-render-1774475972382/Default/load_statistics.db-wal new file mode 100644 index 0000000..e7d90c9 Binary files /dev/null and b/.edge-profile-render-1774475972382/Default/load_statistics.db-wal differ diff --git a/.edge-profile-render-1774475972382/Default/parcel_tracking_db/LOCK b/.edge-profile-render-1774475972382/Default/parcel_tracking_db/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475972382/Default/parcel_tracking_db/LOG b/.edge-profile-render-1774475972382/Default/parcel_tracking_db/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475972382/Default/shared_proto_db/CURRENT b/.edge-profile-render-1774475972382/Default/shared_proto_db/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile-render-1774475972382/Default/shared_proto_db/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile-render-1774475972382/Default/shared_proto_db/LOCK b/.edge-profile-render-1774475972382/Default/shared_proto_db/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475972382/Default/shared_proto_db/LOG b/.edge-profile-render-1774475972382/Default/shared_proto_db/LOG new file mode 100644 index 0000000..c6e3c0e --- /dev/null +++ b/.edge-profile-render-1774475972382/Default/shared_proto_db/LOG @@ -0,0 +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 diff --git a/.edge-profile-render-1774475972382/Default/shared_proto_db/MANIFEST-000001 b/.edge-profile-render-1774475972382/Default/shared_proto_db/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile-render-1774475972382/Default/shared_proto_db/MANIFEST-000001 differ diff --git a/.edge-profile-render-1774475972382/Default/shared_proto_db/metadata/CURRENT b/.edge-profile-render-1774475972382/Default/shared_proto_db/metadata/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile-render-1774475972382/Default/shared_proto_db/metadata/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile-render-1774475972382/Default/shared_proto_db/metadata/LOCK b/.edge-profile-render-1774475972382/Default/shared_proto_db/metadata/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475972382/Default/shared_proto_db/metadata/LOG b/.edge-profile-render-1774475972382/Default/shared_proto_db/metadata/LOG new file mode 100644 index 0000000..3a6368a --- /dev/null +++ b/.edge-profile-render-1774475972382/Default/shared_proto_db/metadata/LOG @@ -0,0 +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 diff --git a/.edge-profile-render-1774475972382/Default/shared_proto_db/metadata/MANIFEST-000001 b/.edge-profile-render-1774475972382/Default/shared_proto_db/metadata/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile-render-1774475972382/Default/shared_proto_db/metadata/MANIFEST-000001 differ diff --git a/.edge-profile-render-1774475972382/FirstLaunchAfterInstallation b/.edge-profile-render-1774475972382/FirstLaunchAfterInstallation new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475972382/Last Version b/.edge-profile-render-1774475972382/Last Version new file mode 100644 index 0000000..a887bff --- /dev/null +++ b/.edge-profile-render-1774475972382/Last Version @@ -0,0 +1 @@ +146.0.3856.72 \ No newline at end of file diff --git a/.edge-profile-render-1774475972382/Local State b/.edge-profile-render-1774475972382/Local State new file mode 100644 index 0000000..5cadc5c --- /dev/null +++ b/.edge-profile-render-1774475972382/Local State @@ -0,0 +1 @@ +{"breadcrumbs":{"enabled":true,"enabled_time":"13418949577384834"},"edge":{"app_user_model_id":"MSEdge","perf_center":{"efficiency_mode_v2_is_active":false,"performance_mode":3,"performance_mode_is_on":false},"retrigger_features":[],"tab_stabs":{"closed_without_unfreeze_never_unfrozen":0,"closed_without_unfreeze_previously_unfrozen":0,"discard_without_unfreeze_never_unfrozen":0,"discard_without_unfreeze_previously_unfrozen":0},"tab_stats":{"frozen_daily":0,"unfrozen_daily":0}},"edge_copilot_mode_enabled_state":{"Default":{"enabled":false,"last_set":"13418949577865420"}},"hardware_acceleration_mode_previous":true,"legacy":{"profile":{"name":{"migrated":true}}},"local":{"password_hash_data_list":[]},"metrics":{"client_id_hash_key_created":true},"optimization_guide":{"model_execution":{"last_usage_by_feature":{}},"model_store_metadata":{},"on_device":{"last_version":"146.0.3856.72","model_crash_count":0}},"os_crypt":{"audit_enabled":true,"encrypted_key":"RFBBUEkBAAAA0Iyd3wEV0RGMegDAT8KX6wEAAAAn89AMc7fOSbvGLGpOq+9IEAAAAB4AAABNAGkAYwByAG8AcwBvAGYAdAAgAEUAZABnAGUAAAAQZgAAAAEAACAAAADGmO3IEm1n4ZwZluHLoDJGHTgjK71reK9RmSL1f+40RwAAAAAOgAAAAAIAACAAAACtE0BY5aiHObUdy8r6UHeCfiCo40cQYLILhmw8CMUjuDAAAACrUSFcKNe9JJl3rXAj0OABfd0uuGIoab8HN+A6vTB1mvmgLX+aOJeSAWqqGIK+77tAAAAANAfAdVDVyqmn+rfcF8TP6h6h83oUFAno6vVrmsh9lUBY01sO+dB9j4EYHahi+mXQ1R0zZgGezwc5F30JkR+QYg=="},"policy":{"last_statistics_update":"13418949577377528"},"profile":{"info_cache":{"Default":{"avatar_icon":"chrome://theme/IDR_PROFILE_AVATAR_20","background_apps":false,"edge_account_cid":"","edge_account_environment":0,"edge_account_environment_string":"","edge_account_first_name":"","edge_account_last_name":"","edge_account_oid":"","edge_account_sovereignty":0,"edge_account_tenant_id":"","edge_account_type":0,"edge_create_profile_shortcut":false,"edge_profile_can_be_deleted":true,"edge_profile_can_be_edited":true,"edge_test_on_premises":false,"edge_wam_aad_for_app_account_type":0,"force_signin_profile_locked":false,"gaia_id":"","is_consented_primary_account":false,"is_ephemeral":false,"is_using_default_avatar":true,"is_using_default_name":true,"managed_user_id":"","name":"Profile 1","signin.with_credential_provider":false,"user_name":""}},"profile_counts_reported":"13418949576880907","profiles_order":["Default"]},"profile_network_context_service":{"http_cache_finch_experiment_groups":"None None None None"},"profiles":{"edge":{"multiple_profiles_with_same_account":false},"edge_sso_info":{"aad_sso_algo_state":1,"first_profile_key":"Default","msa_first_profile_key":"Default","msa_sso_algo_state":1},"signin_last_seen_version":"146.0.3856.72","signin_last_updated_time":1774475978.163856},"sentinel_creation_time":"0","session_id_generator_last_value":"1508269484","signin":{"active_accounts_last_emitted":"13418949576868430"},"startup_boost":{"last_browser_open_time":"13418949577198073"},"subresource_filter":{"ruleset_version":{"checksum":0,"content":"","format":0}},"tab_stats":{"discards_expired":0,"discards_external":0,"discards_proactive":0,"discards_urgent":0,"last_daily_sample":"13418949577317808","reloads_expired":0,"reloads_external":0,"reloads_urgent":0},"telemetry_client":{"governance":{"last_dma_change_date":"13418949577285366","last_known_cps":2048},"install_source_name":"windows","os_integration_level":5,"sample_id":12917278,"updater_version":"1.3.225.7","windows_update_applied":false},"ukm":{"persisted_logs":[]},"uninstall_metrics":{"installation_date2":"1774475973"},"user_experience_metrics":{"client_id2":"a87550d1-ea97-42b7-9d99-3960ae1ff707","diagnostics":{"last_data_collection_level_on_launch":1},"last_seen":{"CrashpadMetrics":"0"},"limited_entropy_randomization_source":"3CFA46546151EC3E512C9A229249DB2F","log_record_id":1,"low_entropy_source3":5898,"payload_counter":1,"pseudo_low_entropy_source":4347,"session_id":0,"stability":{"browser_last_live_timestamp":"13418949573987547","saved_system_profile":"CJ2l8s0GEhAxNDYuMC4zODU2LjcyLTY0GAAiBWVuLVVTKhgKCldpbmRvd3MgTlQSCjEwLjAuMjYyMDAybQoGeDg2XzY0EIdfGICAjNGN/x8iE0hQIExhcHRvcCAxNy1ieTB4eHgoATCgBjjYBEIKCAAQABoAMgA6AGUAAIA/ahgKDEdlbnVpbmVJbnRlbBDqjSAYCCABKACCAQCKAQCqAQZ4ODZfNjSwAQFKCg3ZeE7NFV5v0thKCg1sO7s6FV5v0thKCg1Ak3CxFV5v0thKCg0T5AAxFV5v0thKCg1ZIj2uFV5v0thKCg0XBxSpFV5v0thKCg0T2ptcFV5v0thKCg2Q6as/FV5v0thKCg1DO2FuFV5v0thQBGIESU5CWGoICAAQADgAQACAAdCZkc4GmAEA+AGKLoAC////////////AYgCAagC+yGyAjDRJfNWC4+9L/K351oQADyTN0RE6rqF3y+rE8bwOQvdoidEg0lfDgvA6BJXNkzzDV3xAtUV2UrsAZBDyj7nAgoECAAQABIIIgQIAhACKAEiAggCMgYIACIAKgA6Cwjz///v9/////8BQigSCTEuMy4yMjUuNxgFIAAqDlJlZ0tleU5vdEZvdW5kMgd3aW5kb3dzUgIIAFr8AQlaZDvfT8VVQBGmm8QgsKpXQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAADwPxkAAAAAAADwPxkAAAAAAAAAABkAAAAAAADwPxkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAAAAABkAAAAAAABZQBkAAAAAAADwPxkAAAAAAABZQBkAAAAAAADwPxkAAAAAAADwPxkAAAAAAAA0QBkAAAAAAADwPxkAAAAAAABZQBkAAAAAAABZQHoCCAGCAQIYAKoBAgoAsAEA","saved_system_profile_hash":"8EBF5470671DAEDF5BA3B344A501CD15CA144368","stats_buildtime":"1773965981","stats_version":"146.0.3856.72-64","system_crash_count":0}},"variations_google_groups":{"Default":[]},"was":{"restarted":false}} \ No newline at end of file diff --git a/.edge-profile-render-1774475972382/Nurturing/campaign_history b/.edge-profile-render-1774475972382/Nurturing/campaign_history new file mode 100644 index 0000000..eab8517 Binary files /dev/null and b/.edge-profile-render-1774475972382/Nurturing/campaign_history differ diff --git a/.edge-profile-render-1774475972382/Nurturing/campaign_history-journal b/.edge-profile-render-1774475972382/Nurturing/campaign_history-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774475972382/ShaderCache/data_0 b/.edge-profile-render-1774475972382/ShaderCache/data_0 new file mode 100644 index 0000000..d76fb77 Binary files /dev/null and b/.edge-profile-render-1774475972382/ShaderCache/data_0 differ diff --git a/.edge-profile-render-1774475972382/ShaderCache/data_1 b/.edge-profile-render-1774475972382/ShaderCache/data_1 new file mode 100644 index 0000000..035d06d Binary files /dev/null and b/.edge-profile-render-1774475972382/ShaderCache/data_1 differ diff --git a/.edge-profile-render-1774475972382/ShaderCache/data_2 b/.edge-profile-render-1774475972382/ShaderCache/data_2 new file mode 100644 index 0000000..c7e2eb9 Binary files /dev/null and b/.edge-profile-render-1774475972382/ShaderCache/data_2 differ diff --git a/.edge-profile-render-1774475972382/ShaderCache/data_3 b/.edge-profile-render-1774475972382/ShaderCache/data_3 new file mode 100644 index 0000000..5eec973 Binary files /dev/null and b/.edge-profile-render-1774475972382/ShaderCache/data_3 differ diff --git a/.edge-profile-render-1774475972382/ShaderCache/index b/.edge-profile-render-1774475972382/ShaderCache/index new file mode 100644 index 0000000..a01e4cb Binary files /dev/null and b/.edge-profile-render-1774475972382/ShaderCache/index differ diff --git a/.edge-profile-render-1774475972382/SmartScreen/RemoteData/customSettings b/.edge-profile-render-1774475972382/SmartScreen/RemoteData/customSettings new file mode 100644 index 0000000..997f02d --- /dev/null +++ b/.edge-profile-render-1774475972382/SmartScreen/RemoteData/customSettings @@ -0,0 +1 @@ +customSettings_F95BA787499AB4FA9EFFF472CE383A14 \ No newline at end of file diff --git a/.edge-profile-render-1774475972382/SmartScreen/RemoteData/customSettings_F95BA787499AB4FA9EFFF472CE383A14 b/.edge-profile-render-1774475972382/SmartScreen/RemoteData/customSettings_F95BA787499AB4FA9EFFF472CE383A14 new file mode 100644 index 0000000..ae2fefa --- /dev/null +++ b/.edge-profile-render-1774475972382/SmartScreen/RemoteData/customSettings_F95BA787499AB4FA9EFFF472CE383A14 @@ -0,0 +1 @@ +{"forceServiceDetermination":false} \ No newline at end of file diff --git a/.edge-profile-render-1774475972382/Variations b/.edge-profile-render-1774475972382/Variations new file mode 100644 index 0000000..a157215 --- /dev/null +++ b/.edge-profile-render-1774475972382/Variations @@ -0,0 +1 @@ +{"user_experience_metrics.stability.exited_cleanly":false,"variations_crash_streak":0} \ No newline at end of file diff --git a/.edge-profile-render-1774476044634/Crashpad/metadata b/.edge-profile-render-1774476044634/Crashpad/metadata new file mode 100644 index 0000000..aa43342 Binary files /dev/null and b/.edge-profile-render-1774476044634/Crashpad/metadata differ diff --git a/.edge-profile-render-1774476044634/Crashpad/reports/ac2304d0-f985-4dc8-b76e-e343a7fc3fcf.dmp b/.edge-profile-render-1774476044634/Crashpad/reports/ac2304d0-f985-4dc8-b76e-e343a7fc3fcf.dmp new file mode 100644 index 0000000..1138a51 Binary files /dev/null and b/.edge-profile-render-1774476044634/Crashpad/reports/ac2304d0-f985-4dc8-b76e-e343a7fc3fcf.dmp differ diff --git a/.edge-profile-render-1774476044634/Crashpad/settings.dat b/.edge-profile-render-1774476044634/Crashpad/settings.dat new file mode 100644 index 0000000..9b0d00a Binary files /dev/null and b/.edge-profile-render-1774476044634/Crashpad/settings.dat differ diff --git a/.edge-profile-render-1774476044634/Crashpad/throttle_store.dat b/.edge-profile-render-1774476044634/Crashpad/throttle_store.dat new file mode 100644 index 0000000..9639e1b --- /dev/null +++ b/.edge-profile-render-1774476044634/Crashpad/throttle_store.dat @@ -0,0 +1 @@ +level=none expiry=0 diff --git a/.edge-profile-render-1774476044634/Local State b/.edge-profile-render-1774476044634/Local State new file mode 100644 index 0000000..a0294d0 --- /dev/null +++ b/.edge-profile-render-1774476044634/Local State @@ -0,0 +1 @@ +{"edge":{"perf_center":{"efficiency_mode_v2_is_active":false,"performance_mode":3,"performance_mode_is_on":false},"retrigger_features":[]},"legacy":{"profile":{"name":{"migrated":true}}},"metrics":{"client_id_hash_key_created":true},"os_crypt":{"audit_enabled":true,"encrypted_key":"RFBBUEkBAAAA0Iyd3wEV0RGMegDAT8KX6wEAAAAn89AMc7fOSbvGLGpOq+9IEAAAAB4AAABNAGkAYwByAG8AcwBvAGYAdAAgAEUAZABnAGUAAAAQZgAAAAEAACAAAAA79GjMEUxL4qR7SyZwSkkqIJjb4dpttXTk93xTIiPp/AAAAAAOgAAAAAIAACAAAABasK6KVX+aQwysL9KbGAMSurpBe6USMC6uIioidunaADAAAAD8r6UvJbQUcooqMsJShjVXD/MwbsJA0ixeVV3nvBaSUjjMgtsflV2AeIH50sigI9hAAAAAVp/FBBHgV3FdGfnw4QHq50o59JwaCzGxHraZpwgc6vnm3IReON7AlGVvwSaMhdY14Z4geYm5IrPqPf1xVwz7tA=="},"profile":{"info_cache":{},"profile_counts_reported":"13418949647394446","profiles_order":[]},"signin":{"active_accounts_last_emitted":"13418949647385666"},"startup_boost":{"last_browser_open_time":"13418949647548137"},"telemetry_client":{"governance":{"last_dma_change_date":"13418949647577138","last_known_cps":2048},"install_source_name":"windows","os_integration_level":5,"updater_version":"1.3.225.7","windows_update_applied":false},"uninstall_metrics":{"installation_date2":"1774476046"},"user_experience_metrics":{"client_id2":"d8d61a60-1645-4b4e-aea4-66d271dc1de3","diagnostics":{"last_data_collection_level_on_launch":1},"last_seen":{"CrashpadMetrics":"0"},"limited_entropy_randomization_source":"6DA7E45F05EAD9342F1F9A939621D1D9","low_entropy_source3":2639,"pseudo_low_entropy_source":3284,"stability":{"browser_last_live_timestamp":"13418949646215760","stats_buildtime":"1773965981","stats_version":"146.0.3856.72-64","system_crash_count":0}}} \ No newline at end of file diff --git a/.edge-profile-render-1774476044634/Variations b/.edge-profile-render-1774476044634/Variations new file mode 100644 index 0000000..a157215 --- /dev/null +++ b/.edge-profile-render-1774476044634/Variations @@ -0,0 +1 @@ +{"user_experience_metrics.stability.exited_cleanly":false,"variations_crash_streak":0} \ No newline at end of file diff --git a/.edge-profile-render-1774484525680/Ad Blocking/blocklist b/.edge-profile-render-1774484525680/Ad Blocking/blocklist new file mode 100644 index 0000000..4dfeac7 --- /dev/null +++ b/.edge-profile-render-1774484525680/Ad Blocking/blocklist @@ -0,0 +1 @@ +{"sites":[{"url":"24video.be"},{"url":"7dnifutbol.bg"},{"url":"6tv.dk"},{"url":"9kefa.com"},{"url":"aculpaedoslb.blogspot.pt"},{"url":"aek-live.gr"},{"url":"arcadepunk.co.uk"},{"url":"acidimg.cc"},{"url":"aazah.com"},{"url":"allehensbeverwijk.nl"},{"url":"amateurgonewild.org"},{"url":"aindasoudotempo.blogspot.com"},{"url":"anorthosis365.com"},{"url":"autoreview.bg"},{"url":"alivefoot.us"},{"url":"arbitro10.com"},{"url":"allhard.org"},{"url":"babesnude.info"},{"url":"aysel.today"},{"url":"animepornx.com"},{"url":"bahisideal20.com"},{"url":"analyseindustrie.nl"},{"url":"bahis10line.org"},{"url":"apoel365.net"},{"url":"bahissitelerisikayetleri.com"},{"url":"bambusratte.com"},{"url":"banzaj.pl"},{"url":"barlevegas.com"},{"url":"baston.info"},{"url":"atomcurve.com"},{"url":"atascadocherba.com"},{"url":"astrologer.gr"},{"url":"adultpicz.com"},{"url":"alleporno.com"},{"url":"beaver-tube.com"},{"url":"beachbabes.info"},{"url":"bearworldmagazine.com"},{"url":"bebegimdensonra.com"},{"url":"autoykools.ga"},{"url":"aadmag.am"},{"url":"atdhe.ru"},{"url":"biblemaster.com"},{"url":"bigass-booty.com"},{"url":"birfullhdfilmizle.com"},{"url":"bitchyourfamous.com"},{"url":"bitigee.com"},{"url":"blackorwhitedergi.com"},{"url":"bozporn.com"},{"url":"bqnn.cc"},{"url":"brazzers720p.com"},{"url":"btvsports.co"},{"url":"btvsports.life"},{"url":"burdanhdfilmizle.com"},{"url":"burdanhdfilmizle.org"},{"url":"burdanizle.com"},{"url":"caetius.com"},{"url":"canlicasinobahis.info"},{"url":"camsrated.com"},{"url":"canlimacizle3.co"},{"url":"canlimacizle4.co"},{"url":"canlimacizle6.co"},{"url":"canliyayinci.net"},{"url":"capoupascap.tv"},{"url":"celebinfoz.club"},{"url":"celebritysexcentral.com"},{"url":"ceritaseru.net"},{"url":"chat2000.de"},{"url":"chinesefoodsrecipe.com"},{"url":"ciralihotels.info"},{"url":"citycake.fr"},{"url":"claimbit.win"},{"url":"clictune.com"},{"url":"cogismith.com"},{"url":"com-update.today"},{"url":"consensus-online.org"},{"url":"coomeet.live"},{"url":"cricfree.sx"},{"url":"csajoknak.com"},{"url":"cuckoldwife.net"},{"url":"crunchingbaseteam.com"},{"url":"cukurovaexpres.com"},{"url":"dailydeportes.pw"},{"url":"davenporttheatre.com"},{"url":"deadlinenews.co.uk"},{"url":"depremler.info"},{"url":"derbeder.info"},{"url":"deutsch-pornos.net"},{"url":"deutsche-porno-german.com"},{"url":"diariocoimbra.pt"},{"url":"didhelikeit.com"},{"url":"dinozap.info"},{"url":"dinuovuo.gq"},{"url":"dizilab6.com"},{"url":"dizilab.net"},{"url":"dizilara.com"},{"url":"dizira.com"},{"url":"diziyo1.net"},{"url":"diziyo2.net"},{"url":"dokumenty.tv"},{"url":"domaci-porno-filmovi.blogspot.com"},{"url":"domacipornici.org"},{"url":"dubrovackidnevnik.hr"},{"url":"duvporno.com"},{"url":"dudaelectronica.org"},{"url":"dvse.hu"},{"url":"earhustle411.com"},{"url":"e-grevena.com"},{"url":"elder-scrolls-online.de"},{"url":"eleml.com"},{"url":"elfiz.com"},{"url":"elfnd.com"},{"url":"elfru.com"},{"url":"ellbd.com"},{"url":"emailgo.de"},{"url":"elnhq.com"},{"url":"epithesi.gr"},{"url":"e-pyrzyce.pl"},{"url":"erojkit.com"},{"url":"esports.lv"},{"url":"escosdupliceerservice.nl"},{"url":"esportsplus.me"},{"url":"estrenosdvx.com"},{"url":"e-tribina.com"},{"url":"expansion.es"},{"url":"experienceproject.com"},{"url":"eviavima.blogspot.com"},{"url":"f1-serbia.com"},{"url":"fantastictvsite.blogspot.com"},{"url":"fantastictvsite.blogspot.pt"},{"url":"fbsprueche.de"},{"url":"fcportoeosamigos1893-v2.blogspot.pt"},{"url":"feyadoma.ru"},{"url":"fexburti.ge"},{"url":"f--f.xyz"},{"url":"f--f.top"},{"url":"fifonews.gr"},{"url":"filmhizmeti.org"},{"url":"filmhizmeti.net"},{"url":"ffporns.com"},{"url":"fightbook.gr"},{"url":"football-manager.it"},{"url":"freepornvideos.com.es"},{"url":"fullhdfilmizleyicisi.com"},{"url":"futbolasturiano.es"},{"url":"futbolcafetv1.org"},{"url":"futebolapoiado.blogspot.pt"},{"url":"g6-team.net"},{"url":"galiciaenrallys.com"},{"url":"gamesense.pt"},{"url":"gandhool.id"},{"url":"gay720.com"},{"url":"gazeta.gr"},{"url":"gaypornmarket.com"},{"url":"gazetta.gr"},{"url":"gesichtskirmes.net"},{"url":"getcomics.gq"},{"url":"ghetto-porn-tube.com"},{"url":"giochi999.it"},{"url":"giornaledimontesilvano.com"},{"url":"giochieflash.it"},{"url":"girl.bg"},{"url":"glumicap.cf"},{"url":"goll.ge"},{"url":"grappigezinnen.nl"},{"url":"greenockmorton.org"},{"url":"freelive365.com"},{"url":"footdirect24.net"},{"url":"freeporntrade.xyz"},{"url":"fullhdizleten.org"},{"url":"freexvideotube.net"},{"url":"hashtagsroom.com"},{"url":"hdfilmekrani.com"},{"url":"haysiyet.info"},{"url":"hdfilmevreni.co"},{"url":"hdizletekpart.com"},{"url":"hdrupornotv.info"},{"url":"hdxtube.pw"},{"url":"heetporno.com"},{"url":"hentaimoviez.com"},{"url":"hitportal.com.mk"},{"url":"hommes-en-slip.fr"},{"url":"hot4k.org"},{"url":"hotmomteenxxx.net"},{"url":"hottestgirlsmouth.blogspot.com"},{"url":"hotstories.info"},{"url":"hotmomteenxxx.org"},{"url":"hotpornvideos.xyz"},{"url":"hotx69.us"},{"url":"freexvideotube.org"},{"url":"huddingehockey.com"},{"url":"hypefeast.com"},{"url":"icahporn69.gq"},{"url":"fsplay.org"},{"url":"iddaamakami.net"},{"url":"imgs.to"},{"url":"imajbet250.com"},{"url":"imgup.cz"},{"url":"igexplorer.net"},{"url":"indicadoresforex.com"},{"url":"indycenterbrasil.com.br"},{"url":"informer24.net"},{"url":"insexmovies.net"},{"url":"inspiringnhkids.com"},{"url":"institutionalinvestorsalpha.com"},{"url":"iptvlivestream.org"},{"url":"iptvlivestream.com"},{"url":"interaktive-fundgrube.de"},{"url":"italiaitinerari.it"},{"url":"itemci.com"},{"url":"iv.pl"},{"url":"jablonka.info"},{"url":"javsubtitle.ml"},{"url":"jazzlives.nl"},{"url":"jcocdess.ga"},{"url":"jessicalagergren.se"},{"url":"j-nora.com"},{"url":"jonkopingsposten.se"},{"url":"jornaldamarinha.pt"},{"url":"jornalnacional.pt"},{"url":"jornaltijucas.com.br"},{"url":"jtvizle.com"},{"url":"juicyblackporn.com"},{"url":"jukunude.com"},{"url":"justababy.io"},{"url":"justintv-izle.tv"},{"url":"kactaaciliyor.com"},{"url":"kadincamekan.com"},{"url":"kalamunyenk.co"},{"url":"kat.money"},{"url":"katalysthealthblog.com"},{"url":"kax1.com"},{"url":"kayinpeder.info"},{"url":"kesin.info"},{"url":"kettlebell-vergleich.de"},{"url":"k--i.top"},{"url":"kinogol.org"},{"url":"kinoportals.lv"},{"url":"k--k.club"},{"url":"klipxxx.com"},{"url":"komikhentai.net"},{"url":"konuluporn.xyz"},{"url":"koseyazari.xyz"},{"url":"kouvas.eu"},{"url":"lazerepilasyonmerkezim.com"},{"url":"lbast.ru"},{"url":"lesbiansexvideos.pro"},{"url":"lfporn.com"},{"url":"ligtv.com"},{"url":"ligtvizlesene.fr"},{"url":"ligtvizlesene.me"},{"url":"ligtvizlesene24.com"},{"url":"lindaspendejas.com"},{"url":"linkiest.com"},{"url":"live2all.com"},{"url":"live9.co"},{"url":"livinstream.org"},{"url":"ljepotazdravlje.com"},{"url":"luckyland1.tv"},{"url":"lucrecomfutebol.com.br"},{"url":"lugojeanul.ro"},{"url":"lusofonia.news"},{"url":"luscioustube.com"},{"url":"ltv.lv"},{"url":"macburada.tv"},{"url":"macburda.biz"},{"url":"macizlee1.com"},{"url":"mackolik.com.tr"},{"url":"macyayinlar.org"},{"url":"mamahd.com"},{"url":"mangatopnew.com"},{"url":"manmagazin1.sk"},{"url":"mapo.al"},{"url":"mariejedig.com"},{"url":"maschioles.tk"},{"url":"maturepornhub.net"},{"url":"maturepornland.com"},{"url":"maxx-hameln.de"},{"url":"mchaine.com"},{"url":"media-kljuc.ba"},{"url":"meditazioneyogaroma.it"},{"url":"melty.it"},{"url":"memekmanja.com"},{"url":"micromerchant.xyz"},{"url":"mi-side.nl"},{"url":"misterdocafe.blogspot.com"},{"url":"misterdocafe.blogspot.pt"},{"url":"mistermanager.it"},{"url":"miwnigames.cf"},{"url":"mkd-news.com"},{"url":"mms4soft.com"},{"url":"mobilbahis365.org"},{"url":"moeedelss.ga"},{"url":"moms-and-son.com"},{"url":"morganakamerkoor.nl"},{"url":"moviefree.cc"},{"url":"muscle-insider.com"},{"url":"myeasytv.com"},{"url":"mymusclevideo.com"},{"url":"myptcorner.com"},{"url":"myskreen.com"},{"url":"naijahotmag.com"},{"url":"nakedbeach.info"},{"url":"nakedfreeteens.com"},{"url":"netspor10.club"},{"url":"nettsoiders.ga"},{"url":"neutralen.com"},{"url":"newposts.ge"},{"url":"newpress.ge"},{"url":"news24.mk"},{"url":"news247.fr"},{"url":"northernstar.info"},{"url":"nsubs.com"},{"url":"nutrilover.com"},{"url":"o4evidno.com"},{"url":"odir.us"},{"url":"ofseks.ru"},{"url":"olmaz.tk"},{"url":"on.pt"},{"url":"onderwijsprojectenplein.nl"},{"url":"opera17.rs"},{"url":"opornik.info"},{"url":"ozar.com"},{"url":"patv.eu"},{"url":"pausenspiele.net"},{"url":"peq2.com"},{"url":"oradio.az"},{"url":"oxfordunitedwfc.co.uk"},{"url":"painolympics.info"},{"url":"pesrajam.blogspot.com"},{"url":"picfox.org"},{"url":"pireaspress.gr"},{"url":"piteahockey.se"},{"url":"playboyshow.com"},{"url":"playhentai.com"},{"url":"pojcky.cz"},{"url":"polet.si"},{"url":"popnewsmagazine.com"},{"url":"porn-galore.com"},{"url":"pornbrothers.com"},{"url":"pornin.net"},{"url":"pornkate.com"},{"url":"pornkingtube.com"},{"url":"porno.sexy"},{"url":"porno247hd.info"},{"url":"pornodeblack.com"},{"url":"pornogeildeutsche.com"},{"url":"pornoizle45.com"},{"url":"pornolarbizden.com"},{"url":"pornooizlee.info"},{"url":"pornotur.club"},{"url":"pornovidio.com"},{"url":"pornporn.co"},{"url":"pornpose.info"},{"url":"pornrosa.com"},{"url":"pornslurp.com"},{"url":"pornsnapper.com"},{"url":"portakal.info"},{"url":"powvideo.net"},{"url":"preveza-info.gr"},{"url":"pro474.com"},{"url":"pronstash.com"},{"url":"qrrro.com"},{"url":"puw7.com"},{"url":"quicktoptens.com"},{"url":"raccontieroticireali.it"},{"url":"quiz-loesungen.com"},{"url":"radiosempreamigosrede.blogspot.com"},{"url":"rahibe.in"},{"url":"raidcall.com"},{"url":"rangers-mad.co.uk"},{"url":"rapeasian.com"},{"url":"rcadvisor.com"},{"url":"realitysluts.com"},{"url":"redcountry.us"},{"url":"redipgers.ga"},{"url":"remate.pt"},{"url":"renktir.info"},{"url":"replay.lv"},{"url":"reviewpreneur.de"},{"url":"rn-town.com"},{"url":"rodopi24.blogspot.com"},{"url":"rojadirectaenhd.com"},{"url":"rtmotoracing.com"},{"url":"rumorsfeed.com"},{"url":"russiaporns.info"},{"url":"safetyandsecuritycameras.com"},{"url":"sadeceniyihdfilmizle.com"},{"url":"scatsite.com"},{"url":"satumareonline.ro"},{"url":"schote.biz"},{"url":"scooter-station.com"},{"url":"screamingrape.com"},{"url":"sdbzedu.gov.cn"},{"url":"se-skepseis.gr"},{"url":"serpme.info"},{"url":"sexe-beurette.com"},{"url":"sexe-is-porno.com"},{"url":"sexihikayelerioku.com"},{"url":"sex-sex-sex.co"},{"url":"sextubesvideo.co"},{"url":"sextest.me"},{"url":"sextubesvideo.info"},{"url":"sexvid.info"},{"url":"sexytwinkcock.com"},{"url":"sfwbyf.com"},{"url":"shad2music1.ir"},{"url":"showitoff.org"},{"url":"showyourdick.org"},{"url":"shqip-tv.com"},{"url":"shwidget.com"},{"url":"sigurnokladjenje.com"},{"url":"sikistir.pro"},{"url":"sikistirin.net"},{"url":"simplysinova.com"},{"url":"sims-3.net"},{"url":"sinemaizlefullhd.com"},{"url":"sinemaizlefullhd.net"},{"url":"sisishoes.com"},{"url":"sluttyhd.com"},{"url":"sluttyteensex.org"},{"url":"smartbet.co.ke"},{"url":"smawiness.tk"},{"url":"smesno.bplaced.net"},{"url":"soccerjumbotv.me"},{"url":"sociedaduniversal.website"},{"url":"socialmediafeed.me"},{"url":"sosyalkazan.net"},{"url":"spl-bg.eu"},{"url":"sportbosstv.net"},{"url":"sport-club-partner.nl"},{"url":"sportflash24.it"},{"url":"sportin.biz"},{"url":"sportlineng.com"},{"url":"sports4u.info"},{"url":"sport014.rs"},{"url":"sportsonair.gr"},{"url":"sporttvshdonline.com"},{"url":"sportulsalajean.ro"},{"url":"sportvsonlineshds.com"},{"url":"sportvshdonline.com"},{"url":"srbfm.square7.ch"},{"url":"srpski-porno.blogspot.com"},{"url":"stanwell-tabak-pfeife.de"},{"url":"streamhd.eu"},{"url":"streamingporno.cc"},{"url":"streamonsports.com"},{"url":"strikerless.com"},{"url":"superfoodnews.gr"},{"url":"susannajungblom.se"},{"url":"superstadyum3.com"},{"url":"sxchinesegirlz.blogspot.co.id"},{"url":"sxchinesegirlz.blogspot.com"},{"url":"tagthesponsor.com"},{"url":"taboo-family-thumbs.com"},{"url":"tapantaola.eu"},{"url":"taraftarium24hd.org"},{"url":"taraftarium24.win"},{"url":"tattoopornpics.com"},{"url":"tekrar.info"},{"url":"tellymasti.com"},{"url":"teq1.com"},{"url":"teq9.com"},{"url":"testecdl.com"},{"url":"tetova1.mk"},{"url":"texte-voeux.com"},{"url":"thecherryshare.com"},{"url":"thecherrylife.com"},{"url":"thefirstteeorangecounty.org"},{"url":"themirrorpost.com"},{"url":"theporndex.com"},{"url":"thepicta.com"},{"url":"thepretendbaker.com"},{"url":"thesextube.net"},{"url":"thetomatotart.com"},{"url":"thexxx.pro"},{"url":"thunderoverlouisville.org"},{"url":"time4tv.me"},{"url":"tinyium.com"},{"url":"toltsd-fel.xyz"},{"url":"topcongoinfo.com"},{"url":"topzinas.lv"},{"url":"toutporno.net"},{"url":"tranny.org.es"},{"url":"trgool1.com"},{"url":"trgool2.com"},{"url":"tugacs.com"},{"url":"tvsdezsportv.com"},{"url":"tweakingtricks.com"},{"url":"txxx.biz"},{"url":"tvsdezsportvs.com"},{"url":"ultrafullfilmizle.net"},{"url":"ultraporn.biz"},{"url":"unenagudeseletaja.blogspot.com.ee"},{"url":"unikalnisnimki.com"},{"url":"upsmetegelo.com"},{"url":"usnewsinsider.com"},{"url":"utan.tk"},{"url":"vadesswas.tk"},{"url":"uyar.tk"},{"url":"varporn.com"},{"url":"viahold.com"},{"url":"videoscarica.top"},{"url":"vidup.me"},{"url":"vipnews168.com"},{"url":"v--v.top"},{"url":"warforum.cz"},{"url":"watch5s.rs"},{"url":"watchboruto.tv"},{"url":"watch5s.is"},{"url":"watchhentaistream.com"},{"url":"webmacizle.com"},{"url":"webmacizle.tv"},{"url":"wetttipps-heute.com"},{"url":"williamhill1x2.com"},{"url":"w--w.top"},{"url":"x18.space"},{"url":"xnxx.ink"},{"url":"xoxotasgulosas.blogspot.com"},{"url":"wijzespreuken.com"},{"url":"xpety.com"},{"url":"whatav.org"},{"url":"xtcforum.de"},{"url":"xtube.to"},{"url":"x--x.top"},{"url":"x--x.xyz"},{"url":"xvideospanish.com"},{"url":"xxnx.in"},{"url":"xxpornoindir.mobi"},{"url":"xxxadultphoto.com"},{"url":"xxxboss.net"},{"url":"xxxgourmet.com"},{"url":"xxxrar.com"},{"url":"yebabyvip.com"},{"url":"yenisuperbahis1.com"},{"url":"yoalizer.com"},{"url":"youpornbook.com"},{"url":"yourbrexit.co.uk"},{"url":"youtube-filmek.eu"},{"url":"youwife.com"},{"url":"yuh3.com"},{"url":"yumurte.info"},{"url":"zagraj.pl"},{"url":"zbrojovaci.cz"},{"url":"zonatecnicafutsal.com"},{"url":"zulubet-tips.com"},{"url":"zvoleje.cz"},{"url":"z--z.xyz"},{"url":"wickedforum.com"},{"url":"wickedspot.org"},{"url":"livinstream5.com"},{"url":"jockantv.com"},{"url":"archivsmopaj.info"},{"url":"ninamalmstrom.com"},{"url":"interiorbysusan.se"},{"url":"evenresorthoteluden.nl"},{"url":"pornovideosms.com"},{"url":"9taraftarium24.com"},{"url":"komfort-uborka.ru"},{"url":"afn.az"},{"url":"futbolcafe10.xyz"},{"url":"futbolcafe.xyz"},{"url":"claudiagalliconcha.se"},{"url":"andreanorrman.se"},{"url":"maryjane.live"},{"url":"hgdjm.net"},{"url":"bundegatit.eu"},{"url":"trgool3.com"},{"url":"movies4free.online"},{"url":"24mastimaza.tk"},{"url":"streamcloud.eu"},{"url":"saloora.com"},{"url":"pusula.info"},{"url":"springhillhomepage.com"},{"url":"tvsdezsportstv.com"},{"url":"chilluj.com"},{"url":"voedselbankkrimpenerwaard.nl"},{"url":"felvi.hu"},{"url":"2girls1cup.ws"},{"url":"cdnvideos.club"},{"url":"almavitorianavsc.blogspot.pt"},{"url":"haberhodrimeydan.com"},{"url":"futbolcafetv.org"},{"url":"bet1128scommesse25.it"},{"url":"aimeebrons.blogspot.com"},{"url":"amateurpornzone.com"},{"url":"americannudegirlshot.blogspot.com"},{"url":"aikibudovn.com"},{"url":"annaarris.com"},{"url":"anuhot.xyz"},{"url":"9gagtrend.blogspot.com"},{"url":"thestarsky.com"},{"url":"only1erodouga.com"},{"url":"bangla-choto-sex.blogspot.com"},{"url":"talkjamz.com.ng"},{"url":"probashirjibon.com"},{"url":"tnamcot.com"},{"url":"hdarea.tv"},{"url":"penal1x2.com"},{"url":"togelsingapura.life"},{"url":"gmusictrends.com"},{"url":"togelprediksi.top"},{"url":"gambarbugil.mobi"},{"url":"hentaihunt.com"},{"url":"kenyalivenews.com"},{"url":"nedayenodoushan.ir"},{"url":"webedewe.com"},{"url":"makhfigah.com"},{"url":"ikuchan19.xyz"},{"url":"ns21.us"},{"url":"habar.uz"},{"url":"kalambau.com.br"},{"url":"gay1080.com"},{"url":"bestone-inc.com"},{"url":"erogazo-happening.com"},{"url":"prediksipools.com"},{"url":"nobartv.com"},{"url":"gai-dam.com"},{"url":"voleibol.pe"},{"url":"rorinonaha.com"},{"url":"cerisexs.com"},{"url":"fishingmonthly.com.au"},{"url":"kikibobo.com"},{"url":"knnews.co.kr"},{"url":"kelascpns.online"},{"url":"erovideonavi.info"},{"url":"cactusdl.ir"},{"url":"planetdroidbr.com.br"},{"url":"wolinskyweb.net"},{"url":"imgspace.ru"},{"url":"avtube.se"},{"url":"whichav.net"},{"url":"alfabeta.net"},{"url":"wapdale.com"},{"url":"pornotrixxx.com"},{"url":"baixavideos.com.br"},{"url":"coserfans.com"},{"url":"dahek.net"},{"url":"kodesyair.zone"},{"url":"kumpul.xyz"},{"url":"ero-fc2-xvideos.com"},{"url":"jussex18xm.blogspot.com"},{"url":"gaimup.com"},{"url":"songspk.today"},{"url":"vermelhinhoba.com.br"},{"url":"javynow-d.com"},{"url":"hparadise.space"},{"url":"madresecopy.ir"},{"url":"oaudiovideo.com"},{"url":"diver-hp.com"},{"url":"hsvn.pro"},{"url":"videomega.space"},{"url":"sunnyleone.us"},{"url":"pornvideo.blog"},{"url":"solo-predict.com"},{"url":"javrom.com"},{"url":"treugolniki.ru"},{"url":"tousatu-news.com"},{"url":"abstrapensa.com.br"},{"url":"jav321.com"},{"url":"akhbarino.com"},{"url":"jyukujyo-doga.com"},{"url":"oktemtp.ru"},{"url":"theedgeproperty.com"},{"url":"bdnow24.com"},{"url":"guialacalera.com.ar"},{"url":"feti19.com"},{"url":"tamil-sex-stores.blogspot.com"},{"url":"prediksikitadot.com"},{"url":"meconstructionnews.com"},{"url":"silsilabadalterishtonka.com"},{"url":"ceriwis.id"},{"url":"hero-in.com"},{"url":"veja.com"},{"url":"tulibrogratis.com"},{"url":"javmuseum.club"},{"url":"xn--rm3a64j.co"},{"url":"kfun98.ir"},{"url":"captainmusic.org"},{"url":"best-adult-webhosting.com"},{"url":"ero-boom.site"},{"url":"lk21tv.com"},{"url":"streamingbokeps.net"},{"url":"avsee.xyz"},{"url":"javno1.club"},{"url":"softcore21.co"},{"url":"thaymanhinh.net.vn"},{"url":"fastmobilporno.org"},{"url":"xnxx4arab.com"},{"url":"kormov.xyz"},{"url":"xn--p3tsptxv81n.xyz"},{"url":"talkjamz.com"},{"url":"raicha.net"},{"url":"storyschool.kr"},{"url":"cirebonberintan.com"},{"url":"diariodechiapas.com"},{"url":"oppaimomitai.com"},{"url":"n133.ir"},{"url":"eydnowruz97.ir"},{"url":"spanishpop.net"},{"url":"playno1.club"},{"url":"hastidl1.com"},{"url":"nineentertain.tv"},{"url":"solidance.com"},{"url":"palaiyot.com"},{"url":"keprinews.co.id"},{"url":"pornotrixxx.net"},{"url":"orgs.team"},{"url":"kumpulancontoh.co.id"},{"url":"movieslop.com"},{"url":"hkgoldenav.club"},{"url":"which01.win"},{"url":"baranpatogh.com"},{"url":"scorestime.com"},{"url":"omonoia365.com"},{"url":"djmaza.info"},{"url":"gameniko.ir"},{"url":"club-france.ir"},{"url":"telugustories99.com"},{"url":"centralazs.blogspot.com"},{"url":"rbreezy.net"},{"url":"syairsgphk.info"},{"url":"s-ca.jp"},{"url":"dudaelectronica.com"},{"url":"xerovideos.com"},{"url":"drawhongkong.com"},{"url":"sdhot.xyz"},{"url":"hotstartabloid.com"},{"url":"bepanaah.net"},{"url":"takeadeals.com"},{"url":"hot-jav.xyz"},{"url":"smotrisports.com"},{"url":"filmsbyshaun.com"},{"url":"sukajudi77.com"},{"url":"par30movie1.ir"},{"url":"yugi.ir"},{"url":"truyentranhtam.com"},{"url":"3arabicsex.com"},{"url":"mp4gist.com"},{"url":"xn--a-907a162h5dw.xyz"},{"url":"dlbooks.to"},{"url":"nurse-station.ir"},{"url":"whatav.com"},{"url":"razibet.com"},{"url":"webtoaster.ir"},{"url":"annaoreilly.blogspot.com"},{"url":"gaynerdbrasil.com"},{"url":"chicchimovie.com"},{"url":"uk250.co.uk"},{"url":"revistadonjuan.com"},{"url":"memexmem3.blogspot.com"},{"url":"javcity.space"},{"url":"pic-b.com"},{"url":"araihd.com"},{"url":"opciontv.com"},{"url":"learnelement.ir"},{"url":"xxxgratis.com.ar"},{"url":"flying-animals.ru"},{"url":"gohappytify.com"},{"url":"hypegh.com"},{"url":"ikemen-gaydouga.com"},{"url":"hoghogh.net"},{"url":"cartolaevolution.com"},{"url":"69newth.com"},{"url":"bokeplagi.top"},{"url":"avhohoj.club"},{"url":"iasexamgk.blogspot.com"},{"url":"dontmissthesesexygirls.blogspot.com"},{"url":"sinhalabirthdaysms.blogspot.com"},{"url":"vaisex.com"},{"url":"canal13.cl"},{"url":"mahsho.com"},{"url":"94in.xyz"},{"url":"hottestseductive.com"},{"url":"zhaibus.com"},{"url":"english-for-students.com"},{"url":"kodesyair.top"},{"url":"konkurha.ir"},{"url":"ednchina.com"},{"url":"indoxx1tv.com"},{"url":"naijahots.com"},{"url":"redtubepornvid.com"},{"url":"lk21.cc"},{"url":"wrestlingenvivo.com"},{"url":"sinfoniadegol.cl"},{"url":"freejav.club"},{"url":"desixtube.us"},{"url":"drmagyi.blogspot.com"},{"url":"ael24.net"},{"url":"nontonfilmdrama.com"},{"url":"igomesum.com"},{"url":"avhd.space"},{"url":"apollon1954.com"},{"url":"yaponika.com"},{"url":"tinsoikeo.com"},{"url":"rooja.org"},{"url":"erogazo-sekurosu.com"},{"url":"xcinema21.com"},{"url":"xn--a-ko6aq37itxj.com"},{"url":"upmlm.ir"},{"url":"androidapkobb.com"},{"url":"naijaloaded.com"},{"url":"cinemaindo.pro"},{"url":"togelhongkong.life"},{"url":"javzz.com"},{"url":"thaiporn.cc"},{"url":"bokeps.zone"},{"url":"noticiasgogo.com"},{"url":"cinemapornox.com"},{"url":"rhcamacari.com.br"},{"url":"javpornstreaming.com"},{"url":"vaosex.com"},{"url":"14khorshid.ir"},{"url":"prensadelsur.cl"},{"url":"foto2bokephot.win"},{"url":"connectwarri.com.ng"},{"url":"nungvai.com"},{"url":"onlyindiansex.com"},{"url":"92jav.com"},{"url":"dramabus.com"},{"url":"easyhentai.com"},{"url":"mangashiro.net"},{"url":"indoxxi.to"},{"url":"temditudo.net"},{"url":"pirlotvonline.net"},{"url":"tengokudouga.com"},{"url":"xxxindian.us"},{"url":"ganjdl.ir"},{"url":"myahangha.com"},{"url":"drama321.com"},{"url":"zoomreview.ir"},{"url":"deropalace.net"},{"url":"sextv.space"},{"url":"dlero.net"},{"url":"syairhksgp.com"},{"url":"puntodemarketing.com"},{"url":"kazefuri.com"},{"url":"chinpiku.pink"},{"url":"pa-etu.com"},{"url":"cerita17.club"},{"url":"openloadjav.club"},{"url":"martiniquehebdo.fr"},{"url":"19all08.net"},{"url":"petardasgratis.net"},{"url":"pencarisyair.com"},{"url":"nagoyameshi.co.jp"},{"url":"thisismp3machine.com"},{"url":"sexonpista.com"},{"url":"pioneerwe.com"},{"url":"eltagnid.blogspot.com"},{"url":"520cc.club"},{"url":"soja.ir"},{"url":"janda2super.win"},{"url":"syairsgphk.net"},{"url":"philosophyfilmlisbon.net"},{"url":"sportspirit.com.br"},{"url":"barusd.xyz"},{"url":"robococks.ooo"},{"url":"nomorkeluaran.com"},{"url":"jolloftips.com"},{"url":"fcpredict.com"},{"url":"rezasource.com"},{"url":"khndevaneh.ir"},{"url":"gohappyfoo.com"},{"url":"avtube.today"},{"url":"sieunung.com"},{"url":"mupvkl.com"},{"url":"shironime.web.id"},{"url":"beans.pw"},{"url":"storycheer.com"},{"url":"pajaslocas.com"},{"url":"vavo.ir"},{"url":"panchira-gazou.com"},{"url":"tabeladeirrf.com.br"},{"url":"solitariomahjongg.com"},{"url":"newstimeer.blogspot.com"},{"url":"winninggoals.com.ng"},{"url":"av24h.com"},{"url":"detikhot.com"},{"url":"bsbcapital.com.br"},{"url":"roscheaters.cf"},{"url":"jornaldeolho.com.br"},{"url":"geekmedia.com.br"},{"url":"hastidl1.xyz"},{"url":"togelmania.org"},{"url":"hooris.ir"},{"url":"xn--5yqv06bba1792a.com"},{"url":"sexarabic.tv"},{"url":"educannonce.ci"},{"url":"projejakarta.com"},{"url":"fuckcomix.com"},{"url":"lifewelleaten.com"},{"url":"farsiapk.ir"},{"url":"xingzuovip.com"},{"url":"myporn.pw"},{"url":"militarynews.ir"},{"url":"mxsub.in"},{"url":"toket2montoksmp.club"},{"url":"adultcity.tv"},{"url":"stensilhitamputih.blogspot.com"},{"url":"sooxno.ir"},{"url":"xxxindo.net"},{"url":"sinka.ir"},{"url":"animeisme.com"},{"url":"mnewdownload2018.ir"},{"url":"wildice.ru"},{"url":"xvideospornvid.com"},{"url":"wowmaza.net"},{"url":"mathscope.xyz"},{"url":"xn--a-e56bt34abib.com"},{"url":"520av.space"},{"url":"phonerotica.com"},{"url":"kansaienkou.com"},{"url":"cewebookingan.com"},{"url":"bucetagostosaxxx.com"},{"url":"danlud.com"},{"url":"javvideo.co"},{"url":"bioskop90.org"},{"url":"goionews.com.br"},{"url":"iranfaraze.ir"},{"url":"cape-townairport.co.za"},{"url":"rubka.ir"},{"url":"twsex123.com"},{"url":"songspk.shop"},{"url":"nung3x.com"},{"url":"softcore21.site"},{"url":"ofwpinoytambayans.su"},{"url":"avpapa.space"},{"url":"baklinksal.ir"},{"url":"xn--w8t2ui74ikvg.xyz"},{"url":"korefilm.ir"},{"url":"anysex.top"},{"url":"kansetsu-life.com"},{"url":"hirugossip.lk"},{"url":"ns21.site"},{"url":"amateurscentral.com"},{"url":"world4ufree.ml"},{"url":"mokhs.com"},{"url":"erorefle.com"},{"url":"salearnership.com"},{"url":"arabsex.pw"},{"url":"foto2panas.com"},{"url":"clipe.ir"},{"url":"avmars.com"},{"url":"layarcinema.com"},{"url":"batarakala.co"},{"url":"khuphim.com"},{"url":"openloadav.club"},{"url":"daneshonline.com"},{"url":"hana-gaku.net"},{"url":"formatagendaguru.blogspot.com"},{"url":"galaxygamer.org"},{"url":"toments.com"},{"url":"bokepthailand.com"},{"url":"toolslover.club"},{"url":"mahbaran.com"},{"url":"tsumaran.jp"},{"url":"cai1991.tw"},{"url":"daniellescandles.com"},{"url":"joypoy.com"},{"url":"sanjeshfa.ir"},{"url":"dawenkzmovies.blogspot.ca"},{"url":"momogaki.com"},{"url":"weathercollingwood.com"},{"url":"javfree.club"},{"url":"softcore21.club"},{"url":"hkav101.club"},{"url":"hdtennis.ru"},{"url":"indoxx1.co"},{"url":"andeh.ir"},{"url":"pornocomicsi.mobi"},{"url":"livesgphariini.com"},{"url":"aconteceuemjaragua.com.br"},{"url":"dropbooks.tv"},{"url":"klubesocial.com"},{"url":"istifadabest.blogspot.com"},{"url":"actress-now.blogspot.com"},{"url":"ylallstar.com"},{"url":"ngamvn.net"},{"url":"sexnhe.net"},{"url":"indianxxx.us"},{"url":"nijigen-daiaru.com"},{"url":"toukoucity.to"},{"url":"75news.xyz"},{"url":"khabardown.ir"},{"url":"iranamlaak.com"},{"url":"enculadas.net"},{"url":"inicarannya.blogspot.com"},{"url":"shop1.tokyo"},{"url":"avempire.space"},{"url":"ehtiros.ru"},{"url":"vadiandonanet.com"},{"url":"myhastidl.site"},{"url":"oratoriofuji.com.br"},{"url":"anime17.net"},{"url":"ccine10.com.br"},{"url":"ritu-beri.com"},{"url":"downloadkaraokemusics.com"},{"url":"borz.ir"},{"url":"movieon21.id"},{"url":"bozqush.ir"},{"url":"drakorindo.cc"},{"url":"culture-of-japan.info"},{"url":"parsimods.ir"},{"url":"amritabazar.com"},{"url":"cpnews.ir"},{"url":"invitrofilm.com"},{"url":"audiowala.net"},{"url":"filmymeet.club"},{"url":"8v.ro"},{"url":"elvacanudo.cl"},{"url":"disidentes.net"},{"url":"hartapnet.com"},{"url":"tv-thaionline.com"},{"url":"rdl-italia.com"},{"url":"tahamix-portal.ir"},{"url":"doooman.ir"},{"url":"getpredictions.com.ng"},{"url":"matka.com"},{"url":"witbox.net"},{"url":"javcome.com"},{"url":"sex2arab.com"},{"url":"jobguru.in"},{"url":"bokepdvd.com"},{"url":"sonara.net"},{"url":"bolsamexicanadevalores.com.mx"},{"url":"tosatsu-gazou.com"},{"url":"dunia21.me"},{"url":"film-bioskop21.com"},{"url":"btalah.com"},{"url":"nethnews.lk"},{"url":"myahangha.ir"},{"url":"ghizlar.ir"},{"url":"indoxx1.pw"},{"url":"ges2015.org"},{"url":"xn--bckav7mb6pm11tuf3aoy9al7fz3g.xyz"},{"url":"qombiology.ir"},{"url":"layarcinema.org"},{"url":"funfoods.club"},{"url":"adultgeek.net"},{"url":"jav4k.net"},{"url":"hugogloss.com"},{"url":"smartcore.me"},{"url":"xxxvideospornos.org"},{"url":"movie-wiki.net"},{"url":"cutbackthemovie.com"},{"url":"rambhakt.org"},{"url":"kormov1.xyz"},{"url":"xxxhotstar.com"},{"url":"alamtollywood.com"},{"url":"rcmko.org"},{"url":"sinhala-babynames.blogspot.com"},{"url":"100bestsex.ru"},{"url":"dvideo.ir"},{"url":"javgirl.club"},{"url":"bundasmania.com"},{"url":"duniahentai.com"},{"url":"clanscs.com.br"},{"url":"dagelan.co"},{"url":"changyenew.com"},{"url":"arabxxx.us"},{"url":"tut2learn.com"},{"url":"cikeneh.top"},{"url":"openloadjav.com"},{"url":"xn--gmq602bq2bw20g.com"},{"url":"18iamhot.blogspot.com"},{"url":"tantepamertoge.com"},{"url":"javportal.net"},{"url":"vipchoti.com"},{"url":"javarchive.space"},{"url":"fvoto.net"},{"url":"htube.space"},{"url":"hentaimanga.info"},{"url":"bxcollective.com"},{"url":"xbooks.to"},{"url":"jkminiskirt.com"},{"url":"dwexxuty.blogspot.com"},{"url":"xn--a-u44bq2vmpi.com"},{"url":"yoogi.ir"},{"url":"extramovies.trade"},{"url":"sxmpolicenews.com"},{"url":"crazypornstar.com"},{"url":"gheymaterooz.com"},{"url":"ogcs.ir"},{"url":"healthalover.com"},{"url":"viuvidio.com"},{"url":"leaksarena.com"},{"url":"888173.net"},{"url":"womanaaa.com"},{"url":"bokepsatu.com"},{"url":"gamesib.ir"},{"url":"fcpredicts.com"},{"url":"gay-rush.com"},{"url":"nontonsub.com"},{"url":"lennzor.ir"},{"url":"grandnews.kr"},{"url":"bding.net"},{"url":"forbesthailand.com"},{"url":"nooransisters.in"},{"url":"garanger.net"},{"url":"arabgirlimages.blogspot.com"},{"url":"bugilmontok.club"},{"url":"dominopokerterpercaya.com"},{"url":"cafedl.com"},{"url":"pornoxxxputas.net"},{"url":"namoroserio.com"},{"url":"legendafilmes.com.br"},{"url":"getrelax.club"},{"url":"dailydemocracytoday.com"},{"url":"warp18x.com"},{"url":"v00.link"},{"url":"groupnetzh.com"},{"url":"greatclips.click"},{"url":"gamescenter.com.br"},{"url":"javhot.space"},{"url":"therichfighter.com"},{"url":"big-y.blogspot.com"},{"url":"airav.space"},{"url":"bdmusiccafe.com"},{"url":"paitohk.org"},{"url":"ham0.com"},{"url":"mizbanblog.com"},{"url":"wejapango.com"},{"url":"laar121097.blogspot.com"},{"url":"teropongmalam.com"},{"url":"hentaibobo.com"},{"url":"indoxxi.in"},{"url":"genesisprediksi.com"},{"url":"stubbornlights.org"},{"url":"6-ar.com"},{"url":"reiporn.com"},{"url":"cinemaepipoca.com.br"},{"url":"estaminas.com.br"},{"url":"hits2babi.com"},{"url":"baianolandia.com.br"},{"url":"gigatuga.org"},{"url":"bia2tafrih.ir"},{"url":"tottenhambrasil.com.br"},{"url":"worldi.ir"},{"url":"chamfer.ir"},{"url":"hdxvideos.us"},{"url":"85jav.com"},{"url":"cipokan.top"},{"url":"9mymovies.blogspot.com"},{"url":"iraniax.ir"},{"url":"avtube.space"},{"url":"nb21.biz"},{"url":"megahentaicomics.com"},{"url":"xvideos-sambaporno.com"},{"url":"shabhayetanhayi.com"},{"url":"eropron.com"},{"url":"taigavoice.blogspot.com"},{"url":"loudestgist.com"},{"url":"webanuncio.com.br"},{"url":"cyberidesign.ir"},{"url":"noamazonaseassim.com.br"},{"url":"ngebokep.site"},{"url":"gudangmakalahpendidikan.blogspot.com"},{"url":"spiceaffairs.in"},{"url":"javsubtitle.co"},{"url":"sexstorylist.com"},{"url":"banooonline.ir"},{"url":"ashenandgold.blogspot.com"},{"url":"asianbokep.net"},{"url":"asianporno.biz"},{"url":"19all10.net"},{"url":"aplikasikerja.com"},{"url":"anyav.me"},{"url":"assamesenewsexstory.blogspot.com"},{"url":"aghaghy.ir"},{"url":"bzazi.com"},{"url":"21hehe.xyz"},{"url":"elciudadanoweb.com"},{"url":"thepiratefilmesoficial.com"},{"url":"avhub.club"},{"url":"av-sexbaby.club"},{"url":"avsuggest.com"},{"url":"ayakkabimarkalari.co"},{"url":"banglanewsexstory1.blogspot.com"},{"url":"banglamobilechoti.blogspot.com"},{"url":"banglachotiposts.blogspot.com"},{"url":"dunia21.cc"},{"url":"bdmodel2017.blogspot.com"},{"url":"betciyim3.com"},{"url":"bigtits-girls.com"},{"url":"bigohot.top"},{"url":"billfristblows.blogspot.com"},{"url":"birdpark.ir"},{"url":"ofilmywap.tv"},{"url":"blogcikinadodocheng.blogspot.com"},{"url":"bokep33.top"},{"url":"bokepindoxxx.info"},{"url":"boobsnudegirls.blogspot.com"},{"url":"anunturigayromania.com"},{"url":"trueteenclips.com"},{"url":"business-online.ru"},{"url":"camfreeporn.com"},{"url":"cangcaya.top"},{"url":"carteltv.net"},{"url":"123movies.design"},{"url":"cayu8x.com"},{"url":"chessgambiter.blogspot.com"},{"url":"clikado.com.br"},{"url":"dongamovies.info"},{"url":"jackoffcity.com"},{"url":"narashika.cc"},{"url":"hentaienlinea.com"},{"url":"cosplay-wu.com"},{"url":"creudance.com"},{"url":"creativitybites.blogspot.com"},{"url":"casilinda.blogspot.com"},{"url":"davidtrinidad2.blogspot.com"},{"url":"david-diariodeviajes.blogspot.com"},{"url":"watchserieshd.cc"},{"url":"avcao.info"},{"url":"deshikahaniya.blogspot.com"},{"url":"diariodeladespechada.blogspot.com"},{"url":"dffood.nl"},{"url":"digirap.blogspot.com"},{"url":"desigirlz4u.blogspot.com"},{"url":"diiivass.blogspot.com"},{"url":"devporn.xyz"},{"url":"domacisex.blogspot.com"},{"url":"truyentranh869.com"},{"url":"avimobilemovies.co"},{"url":"videosdocaralho.com"},{"url":"dramma-gothic.blogspot.com"},{"url":"downloadlinkprovider.com"},{"url":"droowa.site"},{"url":"hocvientruyentranh.net"},{"url":"enormousjugs.net"},{"url":"enculiacansin.blogspot.com"},{"url":"amulyam.in"},{"url":"elamaule.cl"},{"url":"hamtruyentranh.net"},{"url":"uznev.com"},{"url":"elparadiario14.cl"},{"url":"espornoespanol.com"},{"url":"eversweet.ir"},{"url":"execporn.xyz"},{"url":"eureca2008.net"},{"url":"fantasiadas.com"},{"url":"fascinante.com.br"},{"url":"fastfuckgames.com"},{"url":"financaspessoais.pt"},{"url":"filmovi-porno.blogspot.com"},{"url":"filmesonlineterror.com"},{"url":"followxxx.xyz"},{"url":"flashsaleprice.com"},{"url":"mostplays.com"},{"url":"freeadultwebchat.blogspot.com"},{"url":"foxpornopriv.info"},{"url":"freeadultonlinechat.blogspot.com"},{"url":"frumpygibbon.blogspot.com"},{"url":"freepornsearchx.com"},{"url":"freeporn-videox.com"},{"url":"freeporncomics.me"},{"url":"freeporntrade.eu"},{"url":"freeporn.com.es"},{"url":"poisontube.com"},{"url":"tructiepbonghd.com"},{"url":"fuckboi.club"},{"url":"freepornsexvideos.net"},{"url":"freepornx.com.es"},{"url":"ftasetaastra.blogspot.com"},{"url":"freepornmoviesxvids.com"},{"url":"fuckretroporn.com"},{"url":"gameniko.com"},{"url":"gaide.xyz"},{"url":"gadis.pink"},{"url":"exstreams.net"},{"url":"fullxnxxpornvideo.com"},{"url":"futeboltv.xyz"},{"url":"fullfilmhdizle2.net"},{"url":"bends365.com"},{"url":"barubokep.club"},{"url":"gay4paytube.com"},{"url":"genfel.blogspot.com"},{"url":"spoilertv.pl"},{"url":"gmovies.online"},{"url":"goivy.net"},{"url":"canlimackeyfi.net"},{"url":"truyentranhtuan.com"},{"url":"gubuksex.site"},{"url":"hardsex.cc"},{"url":"beautifulladiesphoto.blogspot.com"},{"url":"hd-xxx.me"},{"url":"hdbangbros.us"},{"url":"hellolifecalling.blogspot.com"},{"url":"hdbrazzers.us"},{"url":"hellstreaming.com"},{"url":"hentaitubexxxx.com"},{"url":"hentaivr.net"},{"url":"eliamauceri.blogspot.com"},{"url":"filmfree.tv"},{"url":"gmasterfun.com"},{"url":"hizmetkapida.com.tr"},{"url":"pirlotv.blog"},{"url":"09all.net"},{"url":"filmsaru.top"},{"url":"hotbokep.top"},{"url":"hamtruyen.com"},{"url":"hotbf.top"},{"url":"popcornnowrs.blogspot.com"},{"url":"bongdatube.com"},{"url":"hotonenews.blogspot.com"},{"url":"hotsd.xyz"},{"url":"wiisgoon.ir"},{"url":"hugetits.com.es"},{"url":"tuttotoro.com"},{"url":"hunts.xyz"},{"url":"illitpress.com"},{"url":"ibaru.top"},{"url":"idsd.xyz"},{"url":"ibokep.top"},{"url":"img4fap.com"},{"url":"iavpop.com"},{"url":"ilovejav.com"},{"url":"idroption.com"},{"url":"incestgolpo.blogspot.com"},{"url":"affikiso.com"},{"url":"appbzz.blogspot.com"},{"url":"incestbest.blogspot.com"},{"url":"888173.co"},{"url":"indobugil.site"},{"url":"futbolcafe30.xyz"},{"url":"indiansex.us"},{"url":"indolive.top"},{"url":"indiansexconfessions.com"},{"url":"indocool.top"},{"url":"indianstoriesss.blogspot.com"},{"url":"indoasia.club"},{"url":"indovid.top"},{"url":"indoxxisemi.co"},{"url":"ingyu.xyz"},{"url":"indoporn.top"},{"url":"institutopolitologiareligion.blogspot.com"},{"url":"iolablog.blogspot.com"},{"url":"japansexporn.net"},{"url":"javactive.com"},{"url":"insurancekare.com"},{"url":"all-02.net"},{"url":"jilhubzz.blogspot.com"},{"url":"jpvideo.xyz"},{"url":"juraganmovie.org"},{"url":"jukujomuramura.net"},{"url":"kahootsmash.org"},{"url":"kamarana.top"},{"url":"kathasexstory.blogspot.com"},{"url":"kenyanstar.co.ke"},{"url":"kenzonomic.blogspot.com"},{"url":"all-03.net"},{"url":"desipornstories.blogspot.com"},{"url":"kimotyii.com"},{"url":"canlimac2.com"},{"url":"kingcrot.party"},{"url":"jassys.blogspot.com"},{"url":"indoxxi.pictures"},{"url":"gamesadults.com"},{"url":"komikuindo.net"},{"url":"komputery.malopolska.pl"},{"url":"ksrthi.blogspot.com"},{"url":"lakelandconnect.net"},{"url":"lacokako.com"},{"url":"lcgop.info"},{"url":"lavidapasalavida.blogspot.com"},{"url":"daissue.kr"},{"url":"lavirgenparalitica.blogspot.com"},{"url":"lets-start-over.blogspot.com"},{"url":"librosdeartista-documentacion.blogspot.com"},{"url":"lfsyamalaribunlar.blogspot.com"},{"url":"lesbianpornfree.org"},{"url":"layarcinema21.me"},{"url":"lfsosmanligarage.blogspot.com"},{"url":"layarkaca21.my.id"},{"url":"linkimyandex.blogspot.com"},{"url":"linkciabe.blogspot.com"},{"url":"indoxxi.nl"},{"url":"lokalindo.xyz"},{"url":"extremeporn.tube"},{"url":"lk21xi.com"},{"url":"loadporno.top"},{"url":"livehot.xyz"},{"url":"love-freebooks.blogspot.com"},{"url":"jorkyballcanada.ca"},{"url":"lovelymomsex.com"},{"url":"manutdnewsfeed.com"},{"url":"marias2s2.blogspot.com"},{"url":"malaytop.com"},{"url":"mastrani.blogspot.com"},{"url":"mangaku.xyz"},{"url":"mangadrop.me"},{"url":"lalsarosomoygupto.blogspot.com"},{"url":"all-05.net"},{"url":"maxpornblog.com"},{"url":"insight-report.com"},{"url":"melayubolehlucah.blogspot.com"},{"url":"hakansekers.blogspot.com"},{"url":"lucasprensa.blogspot.com"},{"url":"men720p.com"},{"url":"ienac.lv"},{"url":"futbolcafe34.xyz"},{"url":"mackeyfi5.com"},{"url":"canlimac6.com"},{"url":"all-06.net"},{"url":"hosszupuskasub.com"},{"url":"mindimink.com"},{"url":"mientrassigasaliendoelsol.blogspot.com"},{"url":"mitfeminineliv.dk"},{"url":"faithonajourney.blogspot.com"},{"url":"hehe01.com"},{"url":"motirandi.com"},{"url":"ligtvizlesene.se"},{"url":"indianimagegirls.blogspot.com"},{"url":"mongolheleer11.blogspot.com"},{"url":"azaritarh.com"},{"url":"mp3indirelim.info"},{"url":"all-07.net"},{"url":"mundodosdocumentarios.com.br"},{"url":"mt2swordsmax.com"},{"url":"mulhereslindaesensuais.blogspot.com"},{"url":"muelanews.com"},{"url":"gotaporn.info"},{"url":"mackeyfi7.com"},{"url":"indcomix.blogspot.com"},{"url":"infoboxdaily.com"},{"url":"ggxvideos.com"},{"url":"myworld9988.com"},{"url":"myxvideo.net"},{"url":"all-08.net"},{"url":"freemovieswatchonline.me"},{"url":"jnaba.com"},{"url":"natilosland.ir"},{"url":"newbokep.icu"},{"url":"networkofprince.blogspot.com"},{"url":"firehurney.com"},{"url":"mackeyfi8.com"},{"url":"myanmarsexymodels.com"},{"url":"nonton21.top"},{"url":"layar21.cc"},{"url":"nudentitas.blogspot.com"},{"url":"all-09.net"},{"url":"officeindir.blogspot.com"},{"url":"obasantoissyo.net"},{"url":"offroadproracing.it"},{"url":"onlinemarketing-trends.com"},{"url":"onbokep.top"},{"url":"onefun.xyz"},{"url":"all-10.net"},{"url":"palarun.com"},{"url":"pdfsitesi.blogspot.com"},{"url":"pdfavm.com"},{"url":"paupraqualquerobra.com.br"},{"url":"pedidosimultaneo.blogspot.com"},{"url":"ligtvizlesene4.se"},{"url":"angorarosa.blogspot.com"},{"url":"likeamodel.ru"},{"url":"canlimac8.com"},{"url":"144chan.ovh"},{"url":"pexfantasy.com"},{"url":"peterreybautista.blogspot.com"},{"url":"phmovielife.com"},{"url":"all-11.net"},{"url":"pinoynetworktambayan.net"},{"url":"porndighd.com"},{"url":"porn720p.net"},{"url":"porn-videos.cc"},{"url":"pornmodeon.com"},{"url":"pornktube.info"},{"url":"pornoindo.top"},{"url":"pornoifsaizle.blogspot.com"},{"url":"pornosexifsa.blogspot.com"},{"url":"pornoifsaturk2019.blogspot.com"},{"url":"pornoturkifsa.blogspot.com"},{"url":"pornoturkcealtyazili2019.blogspot.com"},{"url":"91ganpap.me"},{"url":"pornpank.com"},{"url":"episodtv.blogspot.com"},{"url":"pornvideos.fm"},{"url":"portalguandu.com.br"},{"url":"meporntube.com"},{"url":"newsauto.co"},{"url":"professorwilliampereira.blogspot.com"},{"url":"prettywomen.pw"},{"url":"hitjjal.com"},{"url":"sexvcc.com"},{"url":"centralxfilmes.blogspot.com"},{"url":"limesheet.co.uk"},{"url":"purzycki.blogspot.com"},{"url":"puffypussygirls.com"},{"url":"mackeyfi9.com"},{"url":"watchmovies.com.pk"},{"url":"lns.lt"},{"url":"quitodiano.blogspot.com"},{"url":"rapxrnb.com"},{"url":"rapeporn.com.es"},{"url":"coutureislamicart.com"},{"url":"redexvideos.com"},{"url":"realhindisexstoris.blogspot.com"},{"url":"regal88movies.com"},{"url":"mackeyfi10.com"},{"url":"canlimac10.com"},{"url":"reviewbrokers.net"},{"url":"richinvest.biz"},{"url":"lk21.nl"},{"url":"bioskopkerenin.org"},{"url":"keralasrtists.blogspot.com"},{"url":"canlimac11.com"},{"url":"mackeyfi11.com"},{"url":"moduboa.net"},{"url":"rizkipurnomo.blogspot.com"},{"url":"dunia21.download"},{"url":"roshikbibi.blogspot.com"},{"url":"rpghentai.com"},{"url":"bangla-choti-sex-stories.blogspot.com"},{"url":"dodosay.com"},{"url":"mangak.info"},{"url":"saltoalexterior.blogspot.com"},{"url":"juraganfilm.mobi"},{"url":"alfaguaraerrante.blogspot.com"},{"url":"likepornsboobs.blogspot.com"},{"url":"savebokepme.blogspot.com"},{"url":"xtasis.org"},{"url":"allall01.net"},{"url":"mackeyfi12.com"},{"url":"bokepigo.me"},{"url":"milkyboobpics.blogspot.com"},{"url":"canlimac12.com"},{"url":"allall02.net"},{"url":"sexnow247.blogspot.com"},{"url":"playzik.org"},{"url":"newxnxxstories.blogspot.com"},{"url":"sextoescuela7.blogspot.com"},{"url":"terbit21.cool"},{"url":"rokettube.ovh"},{"url":"9xmoviesop.blogspot.com"},{"url":"bruto.lt"},{"url":"carikunci.com"},{"url":"afiliadogenial.com"},{"url":"bampaynews.com.ng"},{"url":"cs-downloadstation.blogspot.com"},{"url":"dmhc.online"},{"url":"filmyflixx.blogspot.com"},{"url":"gamingdistrict007.blogspot.com"},{"url":"jetztsparen.eu"},{"url":"janizu.blogspot.com"},{"url":"kakawithnews.blogspot.com"},{"url":"carizmatech10.site"},{"url":"leinghmag.blogspot.com"},{"url":"kpoppomusic.blogspot.com"},{"url":"biphimz.com"},{"url":"mahapc.com"},{"url":"canlimacizle13.co"},{"url":"mobileappadvice.com"},{"url":"mh00083.blogspot.com"},{"url":"mangafd92.blogspot.com"},{"url":"mh00070.blogspot.com"},{"url":"mariasayanora.blogspot.com"},{"url":"myemailexplorer.com"},{"url":"myrotravel.blogspot.com"},{"url":"noticiasdeldeportemundialxd.ml"},{"url":"mycathymakeup.blogspot.com"},{"url":"obaramakeup.blogspot.com"},{"url":"dtjytyk.blogspot.com"},{"url":"oblog.xyz"},{"url":"ps3pgamez.blogspot.com"},{"url":"portaldosgame5.blogspot.com"},{"url":"phokatkagyan.blogspot.com"},{"url":"rairaravensis.blogspot.com"},{"url":"raravensis.blogspot.com"},{"url":"exfosib.blogspot.com"},{"url":"mh00084.blogspot.com"},{"url":"myalemore.blogspot.com"},{"url":"sandrannews.blogspot.com"},{"url":"share4freegame.blogspot.com"},{"url":"myalara.blogspot.com"},{"url":"sharof7alj7.blogspot.com"},{"url":"showmyfilm.blogspot.com"},{"url":"singlesm4a.blogspot.com"},{"url":"singlem4ablog.blogspot.com"},{"url":"singlem4a.blogspot.com"},{"url":"sijunjung-xcoder.blogspot.com"},{"url":"sinemaster.net"},{"url":"sm-go.blogspot.com"},{"url":"ra3eta.blogspot.com"},{"url":"smoothapk.blogspot.com"},{"url":"softwareyalgomas.blogspot.com"},{"url":"softwaremasalah.blogspot.com"},{"url":"slaintepobal.org"},{"url":"songs2139.blogspot.com"},{"url":"fyvieinc.com"},{"url":"fyvieinc.com"},{"url":"starbiofy.com"},{"url":"starbiofy.com"},{"url":"cinemaentucasa.com"},{"url":"cinemaentucasa.com"},{"url":"filmaks.me"},{"url":"svirpara.blogspot.com"},{"url":"superb1kestuff.blogspot.com"},{"url":"styjun.blogspot.com"},{"url":"sztjytr.blogspot.com"},{"url":"teachcomputertips.blogspot.com"},{"url":"tamilrockers787.blogspot.com"},{"url":"tchnical.blogspot.com"},{"url":"teluguayurvedahomeremedies.blogspot.com"},{"url":"tech2gyn.blogspot.com"},{"url":"teknowledge1.blogspot.com"},{"url":"tebadvisor.ir"},{"url":"telugudubbedmoviesfreedownload.blogspot.com"},{"url":"tftcum.blogspot.com"},{"url":"th3xprofessional.blogspot.com"},{"url":"thegamestoreyt.blogspot.com"},{"url":"thechristmas25.blogspot.com"},{"url":"thesuchintricks.blogspot.com"},{"url":"thiatv.com"},{"url":"tjyylli.blogspot.com"},{"url":"ticdroid.blogspot.com"},{"url":"times-of-india-yourmansfieldisd.blogspot.com"},{"url":"tikaitev.eu"},{"url":"topfilm21.com"},{"url":"topmusicmz.blogspot.com"},{"url":"toonzuniverse.blogspot.com"},{"url":"tohomold.com"},{"url":"toofanihdhinditoonmovies.blogspot.com"},{"url":"topprioritys.appspot.com"},{"url":"totalrust.blogspot.com"},{"url":"trastitius.blogspot.com"},{"url":"trends.com.cy"},{"url":"trjtdtk.blogspot.com"},{"url":"treexnet.com"},{"url":"ttdfjt.blogspot.com"},{"url":"ttyjukl.blogspot.com"},{"url":"tukukkk.blogspot.com"},{"url":"tumusicp3.blogspot.com"},{"url":"tvseriestalkddl.blogspot.com"},{"url":"tutorialzonepdf.blogspot.com"},{"url":"uae-bayt.com"},{"url":"ufdjrw.blogspot.com"},{"url":"ungkapankuu.blogspot.com"},{"url":"uas5.ir"},{"url":"learntermux.tech"},{"url":"tuwang.org"},{"url":"vtghjyuf.blogspot.com"},{"url":"vtykumyu.blogspot.com"},{"url":"vsdgtrju.blogspot.com"},{"url":"wakibmovies.blogspot.com"},{"url":"ryfujk.blogspot.com"},{"url":"watchesonlinemovies.blogspot.com"},{"url":"website.info.tr"},{"url":"hbgxdf.com"},{"url":"welikedoraemon.blogspot.com"},{"url":"websitespage.appspot.com"},{"url":"x-od.blogspot.com"},{"url":"wordpressforus.com"},{"url":"winload0.blogspot.com"},{"url":"x-dp.blogspot.com"},{"url":"x-emploi.blogspot.com"},{"url":"wsrtjtyk.blogspot.com"},{"url":"x-bk.blogspot.com"},{"url":"xfukyl.blogspot.com"},{"url":"xdabloger.blogspot.com"},{"url":"xtduliu.blogspot.com"},{"url":"xyjyk.blogspot.com"},{"url":"xrfgtjtk.blogspot.com"},{"url":"y-bac.blogspot.com"},{"url":"justinizle.net"},{"url":"romsdownload.club"},{"url":"ydtyjku.blogspot.com"},{"url":"ygtjki.blogspot.com"},{"url":"100premium.blogspot.com"},{"url":"108homeidea.com"},{"url":"7babamovie.blogspot.com"},{"url":"acadsplace.blogspot.com"},{"url":"aflamnews1.blogspot.com"},{"url":"akmdnlsite.blogspot.com"},{"url":"aisljdm.blogspot.com"},{"url":"alchemistar.blogspot.com"},{"url":"alfafilmestorrent.blogspot.com"},{"url":"amadarnet.blogspot.com"},{"url":"android-foruum.blogspot.com"},{"url":"android4stores.blogspot.com"},{"url":"animeflv-flv.blogspot.com"},{"url":"animeworldhindi.blogspot.com"},{"url":"anycracksoft.blogspot.com"},{"url":"apsc0.blogspot.com"},{"url":"apoelgroup.com"},{"url":"argthtjtr.blogspot.com"},{"url":"arielcreation.blogspot.com"},{"url":"arieshp3.blogspot.com"},{"url":"atozmovieslinksofficial.blogspot.com"},{"url":"auksarankes.lt"},{"url":"azcuriosidades.blogspot.com"},{"url":"babmusic.ir"},{"url":"bahasbanksoalonline.blogspot.com"},{"url":"bacaansatu.blogspot.com"},{"url":"balkhash.kz"},{"url":"barzacommunity.blogspot.com"},{"url":"bdtryt.blogspot.com"},{"url":"bdtyk.blogspot.com"},{"url":"bdtykty.blogspot.com"},{"url":"bestsoftwar.com"},{"url":"bramiguz.blogspot.com"},{"url":"bu-guru-yola.blogspot.com"},{"url":"bsrgvty.blogspot.com"},{"url":"btukfyl.blogspot.com"},{"url":"btuxenlinea.blogspot.com"},{"url":"c-vi.blogspot.com"},{"url":"cantinflasenhd.blogspot.com"},{"url":"bfvtmrc.blogspot.com"},{"url":"censhare.de"},{"url":"cdtjyku.blogspot.com"},{"url":"conquerwithknowledge.blogspot.com"},{"url":"cimaclub-1.blogspot.com"},{"url":"crhirt.blogspot.com"},{"url":"crackitandroid.blogspot.com"},{"url":"cwoste43.info"},{"url":"customdroidrom.blogspot.com"},{"url":"cukyuju.blogspot.com"},{"url":"cybertrickk.blogspot.com"},{"url":"ctnmjyu.blogspot.com"},{"url":"darkoficialeducacionbi.blogspot.com"},{"url":"davestewart.io"},{"url":"ddjhty.blogspot.com"},{"url":"dayahbabul-tanyajawab.blogspot.com"},{"url":"descargarunderthedome.blogspot.com"},{"url":"derecholatinoamerica.com"},{"url":"descargaxmg.blogspot.com"},{"url":"deportestvc.com"},{"url":"depedk12manuals.blogspot.com"},{"url":"dfm2u.net"},{"url":"dftrjy.blogspot.com"},{"url":"dilansupdate.blogspot.com"},{"url":"dfconectado.com.br"},{"url":"dragonballzhindiplanet.blogspot.com"},{"url":"crtgre.blogspot.com"},{"url":"downloadfirmware-zr.blogspot.com"},{"url":"downloadedmodapk.blogspot.com"},{"url":"apk97android.blogspot.com"},{"url":"dramarare.blogspot.com"},{"url":"dtgjllo.blogspot.com"},{"url":"dtyjlui.blogspot.com"},{"url":"dwmods123.blogspot.com"},{"url":"drakorindofilms.us"},{"url":"dzfootballlive007gool.blogspot.com"},{"url":"ebookgratuit1.blogspot.com"},{"url":"ebookforbd.blogspot.com"},{"url":"saucehotties.com"},{"url":"edtykyu.blogspot.com"},{"url":"elchavodel8enhd.blogspot.com"},{"url":"elmaktb.blogspot.com"},{"url":"estrictamenterap.blogspot.com"},{"url":"errorpedia.ir"},{"url":"codeskco.work"},{"url":"etjynty.blogspot.com"},{"url":"faadufiles.blogspot.com"},{"url":"fadmasakina.blogspot.com"},{"url":"facesehairs.blogspot.com"},{"url":"fdzfgy.blogspot.com"},{"url":"fanofgk.blogspot.com"},{"url":"family-hotels.at"},{"url":"filmesonlineemhd01.blogspot.com"},{"url":"drakorindofilms.fun"},{"url":"foabs.com"},{"url":"forumclan.com"},{"url":"fracsfd.blogspot.com"},{"url":"fortilocandia.com.ph"},{"url":"forumandco.com"},{"url":"freeworldfor4ll.blogspot.com"},{"url":"freeonlinemovies-4u.blogspot.com"},{"url":"freeonlinemovies-4u.blogspot.com"},{"url":"freeworldfor4ll.blogspot.com"},{"url":"frsyjtdy.blogspot.com"},{"url":"fullmp3songalbum.blogspot.com"},{"url":"fulfile.ir"},{"url":"fulldownloadpg.blogspot.com"},{"url":"ftdxyku.blogspot.com"},{"url":"fwdyphi.blogspot.com"},{"url":"funicular.mx"},{"url":"fungkynotes.blogspot.com"},{"url":"galaxyygamingarena.blogspot.com"},{"url":"gameloftrepairgames.blogspot.com"},{"url":"ggtykul.blogspot.com"},{"url":"gfrktyl.blogspot.com"},{"url":"ggtcf.blogspot.com"},{"url":"accbychouette.com"},{"url":"gkspicc.blogspot.com"},{"url":"bongdafast.net"},{"url":"fxqoazh.blogspot.com"},{"url":"1dammam.blogspot.com"},{"url":"google-maps-claudiadtt.blogspot.com"},{"url":"1freepcgames.blogspot.com"},{"url":"gopup.com"},{"url":"governmentlaptop.blogspot.com"},{"url":"1stkissmanga.net"},{"url":"gots6.blogspot.com"},{"url":"21stcentury30something.blogspot.com"},{"url":"21movienew.blogspot.com"},{"url":"javtube.cc"},{"url":"grsxth.blogspot.com"},{"url":"gtdthb.blogspot.com"},{"url":"2resultatbac15algerie.blogspot.com"},{"url":"ha200.blogspot.com"},{"url":"hape-media.blogspot.com"},{"url":"haxsharing.blogspot.com"},{"url":"harriettbaldwin.com"},{"url":"hdmovieonlinee.blogspot.com"},{"url":"hcfyk.blogspot.com"},{"url":"hdvideoss4u.blogspot.com"},{"url":"filmblurayku.icu"},{"url":"hochzeit-und-sprueche.de"},{"url":"homem-aranha-longe-de-casa.blogspot.com"},{"url":"4sharedda.blogspot.com"},{"url":"5yyyuhu.blogspot.com"},{"url":"betiforex.com"},{"url":"24hourporno.com"},{"url":"filmblurayku.info"},{"url":"mybia4music.com"},{"url":"aharmusic.ir"},{"url":"husnulmirza96.blogspot.com"},{"url":"kataloh.com"},{"url":"7hitmovies.cam"},{"url":"okestream.cam"},{"url":"iamsimonpolak.blogspot.com"},{"url":"ihknews.blogspot.com"},{"url":"aflameep.blogspot.com"},{"url":"inidramaku.club"},{"url":"indmovz.blogspot.com"},{"url":"abcya100.xyz"},{"url":"drakorindo.bid"},{"url":"indiscography.blogspot.com"},{"url":"iptvlinks8.blogspot.com"},{"url":"islamidesk.blogspot.com"},{"url":"islamicvectorss.blogspot.com"},{"url":"cakhia2.tv"},{"url":"jawahirulazkar.blogspot.com"},{"url":"jiophonegov.blogspot.com"},{"url":"martinpest.com"},{"url":"kadik.com.ua"},{"url":"juegos-nds-3ds-y-mas.blogspot.com"},{"url":"kalamhob.com"},{"url":"kazutamusic.blogspot.com"},{"url":"keralapsclogin.blogspot.com"},{"url":"a--fr.blogspot.com"},{"url":"asiaotaku.com"},{"url":"klicktohack.blogspot.com"},{"url":"koreancinemaonline.blogspot.com"},{"url":"kramarecap.blogspot.com"},{"url":"cialisuuqa.com"},{"url":"tnmusic.in"},{"url":"hhuabag.com"},{"url":"hackyboymods.blogspot.com"},{"url":"azearr.com"},{"url":"drakorindo.life"},{"url":"1thiruttumovies.site"},{"url":"youwatch.casa"},{"url":"lfsmodding.blogspot.com"},{"url":"lioneletus.blogspot.com"},{"url":"load8apk.blogspot.com"},{"url":"luischuello.blogspot.com"},{"url":"lovingthetunes.blogspot.com"},{"url":"m4telromsydesarrollo.blogspot.com"},{"url":"faucetflix.xyz"},{"url":"malomattebi.blogspot.com"},{"url":"efectalia.com"},{"url":"mastermusic.ir"},{"url":"mediatekcustomrom.blogspot.com"},{"url":"medibd.blogspot.com"},{"url":"meaning-in-marathi.blogspot.com"},{"url":"mh00092.blogspot.com"},{"url":"mh00085.blogspot.com"},{"url":"metin2pvp-serverler.org"},{"url":"mirajtech1.blogspot.com"},{"url":"migueltemazos.com"},{"url":"modsfirmware.blogspot.com"},{"url":"modfirmware.blogspot.com"},{"url":"mobiletechsoftware.blogspot.com"},{"url":"modfullandroid.blogspot.com"},{"url":"mp3musiklagu.blogspot.com"},{"url":"moviesandlink.blogspot.com"},{"url":"movierulzone.blogspot.com"},{"url":"youwatch.online"},{"url":"drakorindo.fit"},{"url":"mtk-devs.blogspot.com"},{"url":"nanatsu-no-taizai-manga.blogspot.com"},{"url":"myteq009.blogspot.com"},{"url":"nanasubs17.blogspot.com"},{"url":"ieensdc.blogspot.com"},{"url":"naturalesenlinea.blogspot.com"},{"url":"nazarallepisodes.blogspot.com"},{"url":"ngurahobelixs.blogspot.com"},{"url":"northfacetransitjacket.org"},{"url":"nikwire.blogspot.com"},{"url":"odiageetlyrics.blogspot.com"},{"url":"offresemploi-maroc.blogspot.com"},{"url":"oldtamilmp3.blogspot.com"},{"url":"onlinesfullmoviez.blogspot.com"},{"url":"pcgamesfullcrack.blogspot.com"},{"url":"pelicula-completa-latino.blogspot.com"},{"url":"peliculearte.blogspot.com"},{"url":"peliculascalidadhdlatino.blogspot.com"},{"url":"pencarian-alamat.blogspot.com"},{"url":"9xmovies.run"},{"url":"gayvideo.me"},{"url":"gaypornlove.net"},{"url":"gaybestsex.com"},{"url":"inidramaku.shop"},{"url":"freegayporn.me"},{"url":"plusmusicitunes.blogspot.com"},{"url":"drakorindofilms.vip"},{"url":"pochetegospel.blogspot.com"},{"url":"princemp3song.blogspot.com"},{"url":"privateserver-game.blogspot.com"},{"url":"pronouncemath.blogspot.com"},{"url":"prohackingtuts.blogspot.com"},{"url":"cakhia5.tv"},{"url":"programasparapcconfiables.blogspot.com"},{"url":"qvgaspot.blogspot.com"},{"url":"telknyhu.com.ua"},{"url":"recipesbysandhya.com"},{"url":"realfifa16crack.blogspot.com"},{"url":"livesport24.net"},{"url":"18pornpros.com"},{"url":"rohitrdx.blogspot.com"},{"url":"18teenhd.top"},{"url":"18teenxx.com"},{"url":"rockykkc.blogspot.com"},{"url":"rocket10apk.blogspot.com"},{"url":"18teenhd.co"},{"url":"rudhramadevifullmovie.blogspot.com"},{"url":"samarv-121.blogspot.com"},{"url":"saraikidownload.blogspot.com"},{"url":"dashen91.xyz"},{"url":"samehadaku.care"},{"url":"senengilmu.blogspot.com"},{"url":"security10001.blogspot.com"},{"url":"mobiloid.ru"},{"url":"andespedeilya.blogspot.com"},{"url":"crackitosmac.blogspot.com"},{"url":"3danimexxx.top"},{"url":"3sphim.com"},{"url":"terusinsafelink.blogspot.com"},{"url":"telugudub535.blogspot.com"},{"url":"rupaulsdragracehd2.blogspot.com"},{"url":"18yosex.top"},{"url":"getviagrax.com"},{"url":"mylinks.my.id"},{"url":"sheelat.com"},{"url":"umamusumegatya.com"},{"url":"imdh.xyz"},{"url":"sjxnmc.com"},{"url":"weareanonymousfans.blogspot.com"},{"url":"volcano14.blogspot.com"},{"url":"ynbs.blogspot.com"},{"url":"xsportv23.com"},{"url":"bestallfreemockup.blogspot.com"},{"url":"vuasanco1.com"},{"url":"ysldiscount.org"},{"url":"3sphim.net"},{"url":"lapakfilm.net"},{"url":"oploverz.biz"},{"url":"inidramaku.cc"},{"url":"zdravi-recepti.si"},{"url":"66cc6.com"},{"url":"livinstream96.com"},{"url":"cakhia6.tv"},{"url":"869bet.com"},{"url":"897bet.com"},{"url":"888173.live"},{"url":"1ws.co"},{"url":"ogario.ovh"},{"url":"91fuliseba.com"},{"url":"terkenalmurah.com"},{"url":"a-nosek.blogspot.com"},{"url":"9hkmovies.blogspot.com"},{"url":"abpganga.com"},{"url":"aboutfordycespot.blogspot.com"},{"url":"adabocoransoal.blogspot.com"},{"url":"abusexxxhd.com"},{"url":"acasetaeliastormo.blogspot.com"},{"url":"livinstream98.com"},{"url":"activenorcal.com"},{"url":"actionngamees.blogspot.com"},{"url":"desixnxx2.net"},{"url":"adult-xxx-clips.com"},{"url":"adultgames18.com"},{"url":"d666.xyz"},{"url":"leyendas.xyz"},{"url":"ag24h.com"},{"url":"aficionadosdelwrestling.blogspot.com"},{"url":"agenjav.com"},{"url":"agenpromo303.com"},{"url":"ahmadfikri98.blogspot.com"},{"url":"j6q.net"},{"url":"nbalives.xyz"},{"url":"akihiro15.blogspot.com"},{"url":"4porngo.com"},{"url":"alexa.ws"},{"url":"85iwin0.com"},{"url":"allfororgasm.com"},{"url":"allmovies.tube"},{"url":"allnet5.net"},{"url":"allxhentai.com"},{"url":"almaimoun.com"},{"url":"oploverz.eu"},{"url":"aluthkatha.xyz"},{"url":"argdroidmods.blogspot.com"},{"url":"amateurxxxhd.com"},{"url":"cbtarab.com"},{"url":"amatuervid.com"},{"url":"anaksd.xyz"},{"url":"192238.com"},{"url":"allnet7.net"},{"url":"animate-onlineshop.com.tw"},{"url":"animecartoontube.com"},{"url":"animeporno.biz"},{"url":"animexxxhd.com"},{"url":"animekartun52.blogspot.com"},{"url":"animexxxtube.icu"},{"url":"animeworldnetwork.blogspot.com"},{"url":"animexxxtube.biz"},{"url":"annitamilkamakathaikal.blogspot.com"},{"url":"allnet8.net"},{"url":"anythingdload.blogspot.com"},{"url":"apkzones.blogspot.com"},{"url":"apple-2014.blogspot.com"},{"url":"arabpornhd.com"},{"url":"arab-porn.co"},{"url":"arabianporn.top"},{"url":"apotekica.info"},{"url":"arabxxxhd.com"},{"url":"arabsexhd.com"},{"url":"arcjav.com"},{"url":"aristidessantana.blogspot.com"},{"url":"allnet9.net"},{"url":"armadainternational.com"},{"url":"manhua-scan.cloud"},{"url":"asia-porn.top"},{"url":"asian-sex.co"},{"url":"asian-sex.top"},{"url":"asianbondagexxx.com"},{"url":"asianmoviesxxx.com"},{"url":"asiansex4k.top"},{"url":"asiansex18.top"},{"url":"asianmotherxxx.com"},{"url":"assamesesexstories.online"},{"url":"asurascans.cloud"},{"url":"asmr20.blogspot.com"},{"url":"manganato.party"},{"url":"assamesesexstories.xyz"},{"url":"athallwelakatha.blogspot.com"},{"url":"mangaku.quest"},{"url":"atm93.blogspot.com"},{"url":"allnet10.net"},{"url":"atozmovieslinksnew.blogspot.com"},{"url":"aweksd.xyz"},{"url":"aventurasmaternas.com.br"},{"url":"blackoutcv.com"},{"url":"awop-environment.blogspot.com"},{"url":"azernews.az"},{"url":"awkarmyar.blogspot.com"},{"url":"babesxxxhd.com"},{"url":"augmentin365.com"},{"url":"babe-galleries.com"},{"url":"bacaceritagay.blogspot.com"},{"url":"babes18videos.com"},{"url":"bacolsd.xyz"},{"url":"mangaowls.stream"},{"url":"nftmoviez.xyz"},{"url":"zinmanga.fit"},{"url":"banglahotchotibd24.blogspot.com"},{"url":"banglachotibd24.blogspot.com"},{"url":"banglaralonews.com"},{"url":"banglachoti-golpo.in"},{"url":"batoto.org"},{"url":"barman.news"},{"url":"gotspot.tistory.com"},{"url":"arick.dev"},{"url":"alterpinay.blogspot.com"},{"url":"ambefashion.blogspot.com"},{"url":"bysivatravel.blogspot.com"},{"url":"allnet12.net"},{"url":"beautybrunette.com"},{"url":"bdmodel66.blogspot.com"},{"url":"beautymilf.com"},{"url":"befreemockup.blogspot.com"},{"url":"belajardanhiburan.blogspot.com"},{"url":"ayuwl.cn"},{"url":"best-porn-tube.com"},{"url":"best-gay-short-film.blogspot.com"},{"url":"bestporntube.top"},{"url":"bestpornever.top"},{"url":"manhwatop.cyou"},{"url":"bestxhub.com"},{"url":"allnet13.net"},{"url":"itsmadypad.com"},{"url":"bfindo.xyz"},{"url":"betosgame.com.br"},{"url":"bfsd.xyz"},{"url":"big7porn.com"},{"url":"biganimetube.biz"},{"url":"biallaylbiallayl.blogspot.com"},{"url":"bigohot.xyz"},{"url":"mangaclash.cloud"},{"url":"adiksmk.xyz"},{"url":"allnet14.net"},{"url":"blacktgirltube.com"},{"url":"isekaiscan.fans"},{"url":"adiksd.xyz"},{"url":"adiksma.xyz"},{"url":"bocoranpragmatic.com"},{"url":"bocilsd.xyz"},{"url":"manhwatop.fit"},{"url":"bokep4sd.xyz"},{"url":"adiksmp.xyz"},{"url":"bokep1sd.xyz"},{"url":"bokepsd3.xyz"},{"url":"bokep2sd.xyz"},{"url":"bgibola1.live"},{"url":"bolichesfree.blogspot.com"},{"url":"bokepsdindo.xyz"},{"url":"bokepsd1.xyz"},{"url":"bokepsd2.xyz"},{"url":"newyorkoliveoilcompany.com"},{"url":"kissmanga.surf"},{"url":"allnet15.net"},{"url":"gfycatporn.com"},{"url":"filmy4wap.bar"},{"url":"boosaky.blogspot.com"},{"url":"boosregly.blogspot.com"},{"url":"toonily.work"},{"url":"boxnovel.org"},{"url":"tomy21.com"},{"url":"brzina.info"},{"url":"mangaraw.cloud"},{"url":"antumabikhayr.blogspot.com"},{"url":"lectormanga.stream"},{"url":"pussyspot.net"},{"url":"bvcdsg.blogspot.com"},{"url":"allnet17.net"},{"url":"blomming25.tistory.com"},{"url":"casinoclubdeutschland.de"},{"url":"carnequehabla.blogspot.com"},{"url":"cartoonmangafree.blogspot.com"},{"url":"bestbigcocks.com"},{"url":"catalaoonline.com"},{"url":"cakbuncakcibo.blogspot.com"},{"url":"ceritaluncah.blogspot.com"},{"url":"ceritamesumhot69.blogspot.com"},{"url":"charityjohnson.blogspot.com"},{"url":"allnet18.net"},{"url":"chinexxx.top"},{"url":"chinesehdvideos.top"},{"url":"chinesesex.top"},{"url":"chinesepornsex.top"},{"url":"chotistory24.blogspot.com"},{"url":"chodachudinews.blogspot.com"},{"url":"cikliesaweblog-material.blogspot.com"},{"url":"allnet19.net"},{"url":"unicialis.com"},{"url":"cixporntube.com"},{"url":"bigboobs-blog.com"},{"url":"clubpornostars.com"},{"url":"bokepngentot.xyz"},{"url":"collegeleaks.biz"},{"url":"tellist.website"},{"url":"comiccondom.com"},{"url":"comicanimal.me"},{"url":"complextimelines.blogspot.com"},{"url":"conectandopensamientos.blogspot.com"},{"url":"www-formula.ru"},{"url":"cooowlme.blogspot.com"},{"url":"makeapp.club"},{"url":"thaidns.co.th"},{"url":"inidramaku.us"},{"url":"cocreality.com"},{"url":"daily-post.shop"},{"url":"cym2h.blogspot.com"},{"url":"av69q.com"},{"url":"egbest1.me"},{"url":"02004.cc"},{"url":"danskcvr.dk"},{"url":"danillambrich.blogspot.com"},{"url":"datcalilar.com"},{"url":"ybnsfw.us"},{"url":"cluebird.com"},{"url":"crazyrace.com.br"},{"url":"desikahani.club"},{"url":"desiimagesgirls.blogspot.com"},{"url":"desisexmasala.com"},{"url":"8sdm.ir"},{"url":"dewi.link"},{"url":"diariosenred.com"},{"url":"90phutttttttt.xyz"},{"url":"digitopstore.com"},{"url":"dis4ever.blogspot.com"},{"url":"diosasbrasilenas.com"},{"url":"luzhu360.com"},{"url":"discover-magazine-downloadpcgames123.blogspot.com"},{"url":"dkhanfragrances.com"},{"url":"88online.me"},{"url":"dphimsex.cc"},{"url":"tbbviagra.com"},{"url":"dranimegame.blogspot.com"},{"url":"viagrasi.com"},{"url":"deltamaringa.com.br"},{"url":"desipornmms.com"},{"url":"avthisav.com"},{"url":"informationautomotive.com"},{"url":"pelisplus.sh"},{"url":"ltepharmacy.com"},{"url":"doxycyclinemeds.com"},{"url":"viagraotab.com"},{"url":"elconcecuente.cl"},{"url":"elive668.com"},{"url":"em199.com"},{"url":"elsoldelasamericas.blogspot.com"},{"url":"eloccidente.news"},{"url":"dgfantasy.com"},{"url":"chinapornx.com.es"},{"url":"thenetnaija.com"},{"url":"extramovies.tel"},{"url":"betgratis1.guru"},{"url":"drakorindo.quest"},{"url":"eroticvideos4k.com"},{"url":"filmy4wap.run"},{"url":"eroticarab.blogspot.com"},{"url":"eroticxxxtube.com"},{"url":"bananamovies.net"},{"url":"cuevana3.pe"},{"url":"erotskepricebalkana.blogspot.com"},{"url":"6neek.com"},{"url":"erotskeprice0.blogspot.com"},{"url":"erotskepricexx.blogspot.com"},{"url":"erotskepricesrbija.blogspot.com"},{"url":"movierulzhd.co"},{"url":"espacodicas.com.br"},{"url":"rukoeb-x.com"},{"url":"europeanporn.co"},{"url":"nvrl8.com"},{"url":"eworldmagz.com"},{"url":"crph.xyz"},{"url":"excentrifugalforz.blogspot.com"},{"url":"exgfxxxvideos.com"},{"url":"mkvmad.casa"},{"url":"sporttvonlinetvs.com"},{"url":"extremexxxhd.com"},{"url":"extremepornclips.com"},{"url":"dualeotruyenpro.com"},{"url":"aleidfarhah4.blogspot.com"},{"url":"eldora-kw.com"},{"url":"eracitymm.com"},{"url":"birahijab.com"},{"url":"famosasfolladas.com"},{"url":"fanebi.com"},{"url":"fapfapgames.com"},{"url":"tvsporttvtvdez.com"},{"url":"fapxvideos.com"},{"url":"betgratis1.xyz"},{"url":"feelporntime.com"},{"url":"5shbet.com"},{"url":"xeserve.com"},{"url":"em977.com"},{"url":"filmaski.com"},{"url":"movierulzhd.pro"},{"url":"jadipintar.online"},{"url":"qqzb88.com"},{"url":"applakorn.blogspot.com"},{"url":"diperkosa.xyz"},{"url":"90phut2.live"},{"url":"filmyzilla1.bar"},{"url":"betgratis1.top"},{"url":"afilmywap.mba"},{"url":"018789.com"},{"url":"antisalah.lol"},{"url":"fn88.com"},{"url":"daisuki-na-fansub.com"},{"url":"rukoebx.com"},{"url":"fortworthlumber.com"},{"url":"vnphimmoi.net"},{"url":"foxxmovie.com"},{"url":"fotovideodanceritahot.blogspot.com"},{"url":"freeadultmovs.com"},{"url":"freeadulthotgirl.blogspot.com"},{"url":"free-download-torrent-movie-songs.blogspot.com"},{"url":"andlearn.live"},{"url":"pinoymovieshub.ph"},{"url":"freeadultxmovies.com"},{"url":"freebetindonesia.org"},{"url":"freedaysegypt.com"},{"url":"drakorindo.world"},{"url":"tubexxxone.com"},{"url":"em177.com"},{"url":"freehdsex.top"},{"url":"hentaivn.moe"},{"url":"freemoviesjapan.com"},{"url":"freeporncomic.net"},{"url":"tubeqd.tv"},{"url":"freeporncomics.info"},{"url":"motargm.com"},{"url":"eroero-anime.pink"},{"url":"freesoccertip.net"},{"url":"freepornsgirlspictures.blogspot.com"},{"url":"repelis24.co"},{"url":"kingdrakor.pro"},{"url":"rukoeb-xx.com"},{"url":"pelisplus.ac"},{"url":"pintarbaca.online"},{"url":"belajarkelompok.my.id"},{"url":"mp4moviez.dev"},{"url":"fromto74.blogspot.com"},{"url":"moviezwap.mx"},{"url":"jiorockers.sbs"},{"url":"daily-real.site"},{"url":"tamilblasters.lol"},{"url":"sawstoryent.com"},{"url":"dualeotruyenpro.net"},{"url":"terpelajar.online"},{"url":"caraku.live"},{"url":"freepornovideosite.net"},{"url":"akujawab.my.id"},{"url":"fuckmehard.top"},{"url":"fullphimzz.com"},{"url":"futanarinosekai.blogspot.com"},{"url":"hdmovie2.to"},{"url":"gamefever.co"},{"url":"gamekeygenn.blogspot.com"},{"url":"gamebaiclub.club"},{"url":"gamebytop.blogspot.com"},{"url":"feda.com"},{"url":"ganerjhuri.co.in"},{"url":"gamingwithxee.blogspot.com"},{"url":"akhirsaa.com"},{"url":"emas7.com"},{"url":"filmsstreaming-vf.blogspot.com"},{"url":"financebuzzs.com"},{"url":"findfun101.blogspot.com"},{"url":"gayfollados.com"},{"url":"gaymaletube.me"},{"url":"gayofficexxx.com"},{"url":"gayjovencitos.com"},{"url":"gaysextube.top"},{"url":"gaypornlatino.net"},{"url":"nharbhuu.com"},{"url":"gaypornvideo.top"},{"url":"gcnewstoday.blogspot.com"},{"url":"inidramaku.art"},{"url":"bokepfbx.xyz"},{"url":"cutemodelia.blogspot.com"},{"url":"ge-ma.com"},{"url":"tanyajawab.github.io"},{"url":"sugohaesseo.tistory.com"},{"url":"generostextuais-ifnmg.blogspot.com"},{"url":"jiorockers.cfd"},{"url":"germanxxxhd.com"},{"url":"enginedtc.com"},{"url":"getpcgameset.blogspot.com"},{"url":"geralnoticia.com.br"},{"url":"aphimhot3.com"},{"url":"ggkdpsls.blogspot.com"},{"url":"ghbuuj.blogspot.com"},{"url":"ghadim-music.ir"},{"url":"fullphimzz.net"},{"url":"khabarvarzeshi.com"},{"url":"giftpornvideos.com"},{"url":"girlsclubdesi.blogspot.com"},{"url":"dsxfd.com"},{"url":"giornaledilipari.it"},{"url":"givanoandkeri.blogspot.com"},{"url":"givinglistsantabarbara.com"},{"url":"gkeseva.blogspot.com"},{"url":"7starhd.skin"},{"url":"gnoccagirls.com"},{"url":"glitzybits.blogspot.com"},{"url":"gmblsites.com"},{"url":"hero909090.blogspot.com"},{"url":"90phut3.live"},{"url":"agakaneh.cf"},{"url":"ban88a.com"},{"url":"cuevana3.fm"},{"url":"168168.vn"},{"url":"okneek.com"},{"url":"grannyxxxhd.com"},{"url":"grandmaxxxhd.com"},{"url":"grannyxxxvideos.com"},{"url":"yomovies.skin"},{"url":"gd666sg.com"},{"url":"masalaseen.com"},{"url":"groupslinks.info"},{"url":"tamilblasters.cloud"},{"url":"cq9158.com"},{"url":"apkolxe.com"},{"url":"h-mourad.blogspot.com"},{"url":"ganeshtravels.co.in"},{"url":"haifaalkhal.blogspot.com"},{"url":"h-anim.blogspot.com"},{"url":"chackeo.com"},{"url":"hairymaturexxx.com"},{"url":"fakern1.blogspot.com"},{"url":"handsgame.me"},{"url":"harderdeeper.com"},{"url":"hardoralsex.com"},{"url":"hayatana7.blogspot.com"},{"url":"hariharifareena.blogspot.com"},{"url":"hdfreeteen.com"},{"url":"hdbokep.xyz"},{"url":"hdporn4k.top"},{"url":"gosexgames.com"},{"url":"hdrealitykings.us"},{"url":"cakhia19.tv"},{"url":"flufcore.xyz"},{"url":"healthcaretips519.blogspot.com"},{"url":"hdxclip.com"},{"url":"jiorockers.pics"},{"url":"globalcomsol.blogspot.com"},{"url":"hei-market.com"},{"url":"heinshare.blogspot.com"},{"url":"tut4k.net"},{"url":"hentai-porn-tube.com"},{"url":"hentaipornvideo.top"},{"url":"hentaiclips.biz"},{"url":"hentai-sex-tube.com"},{"url":"heo69.cc"},{"url":"hentaisexmovie.top"},{"url":"hentaisexhd.com"},{"url":"hentaixxxhd.com"},{"url":"edukasionline.my.id"},{"url":"viagraiix.com"},{"url":"foodforbrain.xyz"},{"url":"hindi4us.blogspot.com"},{"url":"hindisexstory.net"},{"url":"granfondosanbenedettodeltronto.it"},{"url":"hklocalfeed.com"},{"url":"balideveloper.my.id"},{"url":"hljbys.org.cn"},{"url":"historicalpublicationsllc.com"},{"url":"hmgame168.com"},{"url":"hdmovies23.ink"},{"url":"inspirational-share.com"},{"url":"prmovies.team"},{"url":"tamilblasters.casa"},{"url":"hotgirlsw.xyz"},{"url":"memayazoun.blogspot.com"},{"url":"xxxmoviestream.xyz"},{"url":"asiancrot18.blogspot.com"},{"url":"hotpussyvid.com"},{"url":"hotxtvt.blogspot.com"},{"url":"hqsexxx.com"},{"url":"hotxxxhd.com"},{"url":"hqsexvid.com"},{"url":"hp24h.net"},{"url":"hdmovies23.lol"},{"url":"exmilfdating.com"},{"url":"dailydaily-up.com"},{"url":"kstarsmedia.com"},{"url":"itechmedia.xyz"},{"url":"0044789.com"},{"url":"idnmovie.net"},{"url":"ijam121.blogspot.com"},{"url":"gadssl.blogspot.com"},{"url":"lilapharm.com"},{"url":"pintar.buzz"},{"url":"indiancdgirls.blogspot.com"},{"url":"hentaipornvalley.com"},{"url":"inbakadhikalstory.blogspot.com"},{"url":"indianhotincest.blogspot.com"},{"url":"indianleaks.in"},{"url":"donmodder.blogspot.com"},{"url":"indobokep.sbs"},{"url":"infoadminsekolahmu.blogspot.com"},{"url":"influencergto.com"},{"url":"informacional100.blogspot.com"},{"url":"jiorockers.skin"},{"url":"tamilblasters.trade"},{"url":"indotopunikaneh.blogspot.com"},{"url":"inf0mag.blogspot.com"},{"url":"indosubjav.com"},{"url":"cerdas.buzz"},{"url":"mahabrata.my.id"},{"url":"inha.ru"},{"url":"bdhmxs.com"},{"url":"chinesexxx.top"},{"url":"bokeponlineterbaru.link"},{"url":"gaylife.work"},{"url":"javsun.cc"},{"url":"akantetapi.my.id"},{"url":"cumshotparty.com"},{"url":"agenfreebet.club"},{"url":"bokepcuy.net"},{"url":"ininder.tv"},{"url":"insidemotocross.ch"},{"url":"camshowstream.com"},{"url":"camshowmodel.com"},{"url":"belajar.buzz"},{"url":"ilmucerdas.buzz"},{"url":"cartoonvideos.icu"},{"url":"hotestcams.com"},{"url":"camshow247.com"},{"url":"rukoeb-ru.com"},{"url":"tamilblasters.city"},{"url":"cewekgenit.one"},{"url":"bocil.pw"},{"url":"esport.vin"},{"url":"islamic-history0.blogspot.com"},{"url":"24income.co"},{"url":"itechlogic.in"},{"url":"italian-architects.com"},{"url":"isthatjessiej.com"},{"url":"themoviezflix.co"},{"url":"tructiepdabong10.live"},{"url":"iwantteenporn.com"},{"url":"cakhia22.tv"},{"url":"caheo2.com"},{"url":"apkig.com"},{"url":"jadicerdas.online"},{"url":"jambulmemek.world"},{"url":"japanfamilyxxx.com"},{"url":"japantube.co"},{"url":"prmovies.fyi"},{"url":"japantube.top"},{"url":"moviezwap.wiki"},{"url":"japanesexxxhd.com"},{"url":"jav-tube.co"},{"url":"jav-porn.co"},{"url":"jav-tube.top"},{"url":"babenki.top"},{"url":"javteen.icu"},{"url":"javnava.com"},{"url":"javomg.cc"},{"url":"kampungdrakor.my.id"},{"url":"mmceleworld.club"},{"url":"javporn18.com"},{"url":"javsex18.top"},{"url":"javuncensored.icu"},{"url":"javsexvideo.top"},{"url":"javslutmom.net"},{"url":"javporn.pw"},{"url":"umar-danny.my.id"},{"url":"javxxxtube.icu"},{"url":"7starhd.town"},{"url":"javxxxvideo.top"},{"url":"gayvidsclub.ga"},{"url":"nubepornogratis.net"},{"url":"jchann.net"},{"url":"mp4moviez.yt"},{"url":"jili178.com"},{"url":"jawabsoal.asia"},{"url":"apabisa.my.id"},{"url":"vebo5.com"},{"url":"711gameing.com"},{"url":"1madrasrockers.pics"},{"url":"yomovies.fyi"},{"url":"ashofund.com"},{"url":"onlinemac.cc"},{"url":"39399.one"},{"url":"faktapilihanraya.blogspot.com"},{"url":"hindustancricket.com"},{"url":"jlgamesz.xyz"},{"url":"matbetmacizle.cc"},{"url":"jianpu.info"},{"url":"189979.com"},{"url":"9966789.com"},{"url":"dey-1400.ir"},{"url":"caheo6.com"},{"url":"jomjav.com"},{"url":"bedava24.cc"},{"url":"bokepviralterbaru.com"},{"url":"jogadorcaro.online"},{"url":"tamilblasters.life"},{"url":"indirdur.ist"},{"url":"joybet88.com"},{"url":"cakhia30.tv"},{"url":"prmovies.tel"},{"url":"jeanpharmacy.com"},{"url":"ivermectincov.com"},{"url":"fbc-abc.com"},{"url":"jpboy.me"},{"url":"jporntube.top"},{"url":"fakazavibes.com"},{"url":"moviezwap.skin"},{"url":"juraganslots77.com"},{"url":"kampaiimoveis.com.br"},{"url":"i58bet.vip"},{"url":"jizzcause.weebly.com"},{"url":"tamilblasters.hair"},{"url":"eyetube.pro"},{"url":"justmilfpussy.com"},{"url":"justdo.co.il"},{"url":"i58bet8.com"},{"url":"karikaturalani.com"},{"url":"ampcanlimacizle.cc"},{"url":"thayarwaddy.com"},{"url":"justtooentertain.blogspot.com"},{"url":"rakhoi3.com"},{"url":"kariyerharitasi.com"},{"url":"kagenoame.blogspot.com"},{"url":"kadinmasallari.com"},{"url":"kadinsayfasi.com"},{"url":"kamdev.xyz"},{"url":"kardelengazetesi.com"},{"url":"kawancolly.blogspot.com"},{"url":"hot-indian-girlz.blogspot.com"},{"url":"kayseridijitalhaber.com"},{"url":"garaptugas.com"},{"url":"cemerlang.blog"},{"url":"keoxien88.com"},{"url":"keobongda123.com"},{"url":"keobong1.com"},{"url":"investing24.io"},{"url":"keralatva.blogspot.com"},{"url":"0gomovies.mn"},{"url":"vsc247.top"},{"url":"kerisdigital.com"},{"url":"kevblack-win7.blogspot.com"},{"url":"cerdascermat.blog"},{"url":"shrlinks.fun"},{"url":"khomuc2.tv"},{"url":"korgtr.net"},{"url":"khmerhotnovels.blogspot.com"},{"url":"moviezwap.run"},{"url":"krov68.ru"},{"url":"kingdicksize.com"},{"url":"abgcrot.life"},{"url":"terpelajar.club"},{"url":"siswa.club"},{"url":"terdidik.club"},{"url":"rukoeb-russia.com"},{"url":"kissiskiss.com"},{"url":"kissdick.com"},{"url":"yomovies.tel"},{"url":"kversemm.xyz"},{"url":"cialisoraltabs.com"},{"url":"tut4k.sex"},{"url":"hindianimes.in"},{"url":"phimgif.tv"},{"url":"tamilyogi.kim"},{"url":"moviespapa.autos"},{"url":"kokochitchit.xyz"},{"url":"roman-one.xyz"},{"url":"doujindesu.lol"},{"url":"koreanporn.pw"},{"url":"kowaingo.net"},{"url":"krishantube.blogspot.com"},{"url":"kutabkhana.blogspot.com"},{"url":"kurdsubtitle.blogspot.com"},{"url":"socdo.tv"},{"url":"bangladeshigirlsonfacebook.blogspot.com"},{"url":"listenvid.net"},{"url":"bnbrasil.com.br"},{"url":"blemperor.xyz"},{"url":"lantaibursa.id"},{"url":"hdmovie2.fit"},{"url":"jiorockers.page"},{"url":"laopinon.cl"},{"url":"laradioredonda.ec"},{"url":"lasthandjob.com"},{"url":"animetvn.pro"},{"url":"lvhteam32.blogspot.com"},{"url":"leernovelasligeras.blogspot.com"},{"url":"khomuc5.tv"},{"url":"cakhiatv.us"},{"url":"legalmanagement.org"},{"url":"bikini-video.com"},{"url":"aviationjobs.co.in"},{"url":"isexpic.com"},{"url":"leech-premium-file.blogspot.com"},{"url":"leopoldinense.com.br"},{"url":"lesbiansanalxxx.com"},{"url":"caheo2.live"},{"url":"library-of-the-intellectual.blogspot.com"},{"url":"cakhia6.live"},{"url":"coiphimhay247.com"},{"url":"arabicporntube.co"},{"url":"jambulmemek.me"},{"url":"lighthifi.blogspot.com"},{"url":"typonews.my.id"},{"url":"lifesex.xyz"},{"url":"cakhiatv1.live"},{"url":"martynapiechowska.pl"},{"url":"linkbwing.com"},{"url":"sexhay69.link"},{"url":"linkdomino168.com"},{"url":"livegirlcam.net"},{"url":"liveetvshow.blogspot.com"},{"url":"livedcartographies.blogspot.com"},{"url":"cambaby.ink"},{"url":"burmagirl.xyz"},{"url":"menuzabreh.cz"},{"url":"loscantajuego.blogspot.com"},{"url":"lookthisporn.com"},{"url":"longhairpicandvideo.blogspot.com"},{"url":"yourtube.xxx"},{"url":"tvdewa1.xyz"},{"url":"lovefamilyporn.com"},{"url":"hentaistream.me"},{"url":"metodepenelitianyonasmuanley.blogspot.com"},{"url":"lovelysis.com"},{"url":"lovepornmovs.com"},{"url":"loveteenpussy.com"},{"url":"dicasmoneyn.xyz"},{"url":"asiktv1.cam"},{"url":"jiorockers.help"},{"url":"animetvn.info"},{"url":"minimalisthomedesign0.blogspot.com"},{"url":"lv177.com"},{"url":"lunachicago.blogspot.com"},{"url":"magicbitch.com"},{"url":"maharanyo.blogspot.com"},{"url":"magicbrunette.com"},{"url":"yomovies.gay"},{"url":"mainnewslink.com"},{"url":"lv177.net"},{"url":"mh00052.blogspot.com"},{"url":"mh00055.blogspot.com"},{"url":"cewekgenit.info"},{"url":"mh00057.blogspot.com"},{"url":"bokepviralterbaru.link"},{"url":"minecraftaltslist.blogspot.com"},{"url":"cakhia26.tv"},{"url":"phim18hdx.com"},{"url":"checki.co.ke"},{"url":"moviezwap.help"},{"url":"fuqit.org"},{"url":"7ibommamovie.online"},{"url":"bolasiar2.online"},{"url":"mamah-muda-cantik.blogspot.com"},{"url":"blackcoffeekalisz.pl"},{"url":"mamicrot.fun"},{"url":"eplsportnews.com"},{"url":"mamicrot.rest"},{"url":"arabicsex.co"},{"url":"mangago.mobi"},{"url":"manhwa3s.com"},{"url":"prmovies.gay"},{"url":"charliegirl.live"},{"url":"mangatx.online"},{"url":"manisatcinehot.blogspot.com"},{"url":"mangaestrellass.blogspot.com"},{"url":"albumporns.com"},{"url":"manisat.blogspot.com"},{"url":"mangafreak.cyou"},{"url":"mangatx.today"},{"url":"manxxxgay.com"},{"url":"tut4k.xxx"},{"url":"asianstream.pro"},{"url":"lk21.day"},{"url":"cakhiatv2.live"},{"url":"mustafizmovies.blogspot.com"},{"url":"jiorockers.cool"},{"url":"maseda08.blogspot.com"},{"url":"issue-tree1.tistory.com"},{"url":"mp3juices.lat"},{"url":"masturbatezone.com"},{"url":"eduforkids.xyz"},{"url":"kinkysex.dk"},{"url":"filmyhit.cfd"},{"url":"movierulzhd.skin"},{"url":"jambulmemek.pro"},{"url":"masturbatesite.com"},{"url":"cakhiatv5.live"},{"url":"cumception.com"},{"url":"afilmywap.haus"},{"url":"maturexxxhd.com"},{"url":"themoviezflix.co.com"},{"url":"mceletimes.xyz"},{"url":"mechaplamodel.blogspot.com"},{"url":"mediconepal.com"},{"url":"memangbau.com"},{"url":"melekduniait.blogspot.com"},{"url":"hindilinks4u.pm"},{"url":"freepornpicss.com"},{"url":"meilleurcheval.blogspot.com"},{"url":"cherrynews.xyz"},{"url":"tamilblasters.pm"},{"url":"mensex.net"},{"url":"memeksiana.life"},{"url":"mersininsesiburada.com"},{"url":"yomovies.kim"},{"url":"mh00051.blogspot.com"},{"url":"djitu.live"},{"url":"arteri.my.id"},{"url":"angkasakti.live"},{"url":"colok.live"},{"url":"colokjitu.live"},{"url":"asah.my.id"},{"url":"grignols24.fr"},{"url":"milfvsteen.com"},{"url":"milfwetpussy.com"},{"url":"justswallows.com"},{"url":"agua.my.id"},{"url":"sextop18.plus"},{"url":"mirei-world.com"},{"url":"amable.my.id"},{"url":"loefuck.com"},{"url":"basmi.my.id"},{"url":"samehadaku.win"},{"url":"singemp3.app"},{"url":"cerrado.my.id"},{"url":"miscelaneasmias.blogspot.com"},{"url":"bersih.biz.id"},{"url":"hoy.my.id"},{"url":"disculpe.my.id"},{"url":"mirror-content.blogspot.com"},{"url":"cuenta.my.id"},{"url":"hermoso.my.id"},{"url":"chau.my.id"},{"url":"barter.my.id"},{"url":"gusta.my.id"},{"url":"nguonphimhay.com"},{"url":"dewapaito.live"},{"url":"derecha.my.id"},{"url":"jungkir.my.id"},{"url":"cajero.my.id"},{"url":"jahanam.my.id"},{"url":"misaminesydoramas.blogspot.com"},{"url":"cuesta.my.id"},{"url":"eromanganote.com"},{"url":"feliz.my.id"},{"url":"kundun1069.com"},{"url":"mixpornsite.com"},{"url":"streeteatdeluxe.pl"},{"url":"mitaoshe.cyou"},{"url":"nguontvhay.com"},{"url":"9kmovies.tube"},{"url":"pornrewind.com"},{"url":"vlxx.day"},{"url":"mnmnmnlmnm.blogspot.com"},{"url":"hermavvan.blogspot.com"},{"url":"mmfootballfans.xyz"},{"url":"mmmega.com"},{"url":"oracleport.com"},{"url":"cambaby.store"},{"url":"bunkr.ru"},{"url":"moviezwap.cool"},{"url":"mombitch.com"},{"url":"mom-son.pro"},{"url":"momwifecockold.blogspot.com"},{"url":"momisbitch.com"},{"url":"jiorockers.team"},{"url":"themoviezflix.us.com"},{"url":"morarnaeuropa.com.br"},{"url":"educandoenlaexcelencia.blogspot.com"},{"url":"morsodifameblog.blogspot.com"},{"url":"yomovies.rest"},{"url":"mothersontube.com"},{"url":"prmovies.rest"},{"url":"meliaoh5.me"},{"url":"70mleague.net"},{"url":"moviesaddafree.blogspot.com"},{"url":"mrnoegyi.com"},{"url":"cecs.in"},{"url":"mamicrot.life"},{"url":"tamilyogi.gay"},{"url":"ido.org.in"},{"url":"mtav.art"},{"url":"mtamania.blogspot.com"},{"url":"floristerialamore.es"},{"url":"lovediary.icu"},{"url":"pragaracing.es"},{"url":"persianwallet.com"},{"url":"dood.yt"},{"url":"jiorockers.plus"},{"url":"peperosaintavola.it"},{"url":"slaskieranczo.pl"},{"url":"breakgameplays.xyz"},{"url":"onlinecourses4u.top"},{"url":"mydesiboobs.com"},{"url":"mydatingmaster.com"},{"url":"fsdtm.com"},{"url":"mygamerzspot.blogspot.com"},{"url":"mylifestyle-aa.blogspot.com"},{"url":"mynakalx.blogspot.com"},{"url":"mypremiumst0re.blogspot.com"},{"url":"9kmovies.garden"},{"url":"yomovies.bio"},{"url":"k3phim.com"},{"url":"sexto.mobi"},{"url":"jda.net.in"},{"url":"binbin8.org"},{"url":"prmovies.bio"},{"url":"namikaze-cyber.blogspot.com"},{"url":"nan-net.net"},{"url":"themoviezflix.ac"},{"url":"nekopoci.my.id"},{"url":"nendidau.com"},{"url":"9kmovies.dance"},{"url":"gundem.live"},{"url":"phim18vnx.com"},{"url":"ngefilm21.store"},{"url":"bitchyx.it"},{"url":"newfreehdmovedownlod.blogspot.com"},{"url":"hdmovie2.team"},{"url":"news24bring.com"},{"url":"cakhia28.tv"},{"url":"dragongryfice.pl"},{"url":"moviezwap.city"},{"url":"nhacai247.com"},{"url":"leomed.es"},{"url":"africanpornhd.co"},{"url":"headlinesnews.net"},{"url":"lk21.social"},{"url":"samehadaku.run"},{"url":"pyaykyi.one"},{"url":"nisiratechotigolpo.blogspot.com"},{"url":"ngwelamin.xyz"},{"url":"agungdev.id"},{"url":"mkvcinemas.uno"},{"url":"hindilinks4u.kim"},{"url":"ramu.ru"},{"url":"yomovies.vin"},{"url":"bgibola5.xyz"},{"url":"streamonsport4.click"},{"url":"nyaungoo.xyz"},{"url":"themoviezflix.cx"},{"url":"oploverz.tv"},{"url":"9kmovies.tools"},{"url":"reggaetoncd.blogspot.com"},{"url":"18pornvideos.co"},{"url":"demonews.xyz"},{"url":"animetvn.xyz"},{"url":"anhsexgaidephd.blogspot.com"},{"url":"dunia21.live"},{"url":"oatual.com.br"},{"url":"cambaby.fun"},{"url":"yomovies.lat"},{"url":"dee99.com"},{"url":"prmovies.lat"},{"url":"chillphim.tv"},{"url":"movierulzhd.media"},{"url":"eu88.bet"},{"url":"judicasino.net"},{"url":"omegle-points-game.blogspot.com"},{"url":"juraganfilm.space"},{"url":"streamonsport-ldc.top"},{"url":"oniym.holy.jp"},{"url":"onlinebanglachotistory.blogspot.com"},{"url":"jpxnx.info"},{"url":"9kmovies.beauty"},{"url":"only-thaimovie.blogspot.com"},{"url":"onlygujarat.in"},{"url":"hdmovie2.cool"},{"url":"tut4k.app"},{"url":"9xmovies.church"},{"url":"onurlugazeteciler.net"},{"url":"aceph99.net"},{"url":"rppkurtilasrevisi2017.blogspot.com"},{"url":"gamebaiplus.fun"},{"url":"themoviezflix.com.mx"},{"url":"graysonreedmusic.com"},{"url":"vector-tech.edu.jm"},{"url":"entutes.com"},{"url":"otakumovie24.blogspot.com"},{"url":"sabarpratham.in"},{"url":"lk21.cafe"},{"url":"noindexscan.com"},{"url":"ouradvice.info"},{"url":"boutchecoiffure.fr"},{"url":"mtyncp.com"},{"url":"koreakingnews.com"},{"url":"xemphimhay247a.com"},{"url":"jdcollegekorthu.org.in"},{"url":"yomovies.bid"},{"url":"prmovies.cfd"},{"url":"barceloclinic.es"},{"url":"movieplay.sbs"},{"url":"moviespapa.boats"},{"url":"isdc.org.in"},{"url":"sarbelgyi.site"},{"url":"pizzeriawloczykij.pl"},{"url":"partprocurer.com"},{"url":"youtubevanced.com"},{"url":"vivud.com"},{"url":"playbokep.life"},{"url":"repelis24.rs"},{"url":"futemax.nu"},{"url":"finominaleducation.in"},{"url":"secondincomecenter.com"},{"url":"mephimtv1.com"},{"url":"pcgamesandro.blogspot.com"},{"url":"pcgamecrackz.blogspot.com"},{"url":"pcdandf.com"},{"url":"sextop18.org"},{"url":"senpaitambayan.com"},{"url":"samehadaku.cam"},{"url":"pelisplusgo.icu"},{"url":"o2tvseries1.com"},{"url":"periodicontinyent.com"},{"url":"perkosa.space"},{"url":"personalitytipsonline.com"},{"url":"petrusko.blogspot.com"},{"url":"powerfm.es"},{"url":"mushesushi.pl"},{"url":"calgarylatino.ca"},{"url":"sahicollege.in"},{"url":"phim18tv.com"},{"url":"themeatclub.in"},{"url":"xn--72czpbj7gtbe3e0e3d.com"},{"url":"risquesluts.com"},{"url":"agenbokep.club"},{"url":"pharmalive.com"},{"url":"pharmacologycorner.com"},{"url":"phimholic.com"},{"url":"phimbuon.net"},{"url":"phimhot365.tv"},{"url":"phimmoi2024.com"},{"url":"phimnhanh24h.com"},{"url":"igodesu.net"},{"url":"vlxx.ai"},{"url":"phot1.blogspot.com"},{"url":"filtradopanama.com"},{"url":"animetvn.in"},{"url":"daga8.com"},{"url":"cambaby.top"},{"url":"movierulzhd.rest"},{"url":"siddheshmishra.blogspot.com"},{"url":"dooood.com"},{"url":"usasexguide.nl"},{"url":"tut4k.co"},{"url":"pinaypak-sexstory.blogspot.com"},{"url":"simplymoviesfree.blogspot.com"},{"url":"filmyhit.makeup"},{"url":"pinkhentai.co"},{"url":"pisstubeextreme.com"},{"url":"mpo111star.com"},{"url":"cheapsmmking.com"},{"url":"sistemafaetsenar.org.br"},{"url":"playeateasy.com"},{"url":"playschristian.blogspot.com"},{"url":"ujmfs.in"},{"url":"hsrplay.ru"},{"url":"cambaby.live"},{"url":"1tamilblasters.net"},{"url":"futemax.bio"},{"url":"jiorockers.space"},{"url":"themoviezflix.eu.com"},{"url":"doujindesu.win"},{"url":"phevkl.me"},{"url":"016269.com"},{"url":"faktafreebet.net"},{"url":"moviespapa.center"},{"url":"blognohu.net"},{"url":"pornbests.com"},{"url":"software-it-pc.blogspot.com"},{"url":"porngames18.com"},{"url":"cakhiatv4.tv"},{"url":"porngifmate.com"},{"url":"cakhiatv7.tv"},{"url":"tut4k.biz"},{"url":"tvhays.com"},{"url":"sosfrelonsandco.fr"},{"url":"javsubindo.vip"},{"url":"mamagyi.click"},{"url":"igodesu.xyz"},{"url":"dongphyms.net"},{"url":"drhkbali.in"},{"url":"mkvcinemas.lat"},{"url":"phim18vn.biz"},{"url":"9kmovies.makeup"},{"url":"bolasiar6.sbs"},{"url":"iphimchilly.com"},{"url":"vwidhome.pl"},{"url":"fadaparis.fr"},{"url":"reunie-mytylschoolroosendaal.nl"},{"url":"filmyhit.group"},{"url":"phimmoichill.org"},{"url":"fzb120.com"},{"url":"hentaitube.icu"},{"url":"mitom01.me"},{"url":"gudangmovies21.skin"},{"url":"kuy89.com"},{"url":"subnhanh1.cc"},{"url":"alameenmissionhowly.org.in"},{"url":"sextop18.cc"},{"url":"art4glas.de"},{"url":"prmovies.media"},{"url":"pornstory.xyz"},{"url":"samehadaku.day"},{"url":"kaushiktradingsystem.com"},{"url":"mms24.xyz"},{"url":"pornvideos.today"},{"url":"nobartv7.site"},{"url":"pornzok.com"},{"url":"1tamilblasters.pw"},{"url":"playtaku.online"},{"url":"moviezwap.cafe"},{"url":"pornxxx3.com"},{"url":"bgibola7.site"},{"url":"themainmane.com"},{"url":"akkermanverhuizingen.nl"},{"url":"okestream2.guru"},{"url":"tvdewa6.lol"},{"url":"portalabrantes.com.br"},{"url":"naturopathe-lalinde-bergerac.fr"},{"url":"hindilinks4u.cyou"},{"url":"barbershopkoujo.nl"},{"url":"mpo234star.com"},{"url":"kanjav.com"},{"url":"practicallyfunctional.com"},{"url":"paulinabasa.pl"},{"url":"zggangguan.cn"},{"url":"fbmdj.com"},{"url":"darknaija.com"},{"url":"cuevana2espanol.com"},{"url":"grotty-monday.com"},{"url":"premiumscholorships.info"},{"url":"xn--2-ztbcbch.help"},{"url":"sosdigital.com.br"},{"url":"yomovies.team"},{"url":"terbit21.bet"},{"url":"jjvids.com"},{"url":"aagmaal.day"},{"url":"xbokepfb.net"},{"url":"samehadaku.bio"},{"url":"farmingsim2017.com"},{"url":"mpo111b.com"},{"url":"animetvn.live"},{"url":"oshioki24.com"},{"url":"pornxxx69.net"},{"url":"theranikhetcontinental.in"},{"url":"h5yy5.com"},{"url":"939.com"},{"url":"rukoeb-tube.com"},{"url":"1tamilblasters.site"},{"url":"tut4k.vip"},{"url":"haysex.ai"},{"url":"9xflix.win"},{"url":"pronhubxnx.blogspot.com"},{"url":"themoviezflix.gr.com"},{"url":"miriyaonline.in"},{"url":"ngefilm21.club"},{"url":"animutuelle.fr"},{"url":"xemphimhay247c.com"},{"url":"assur-cyber.fr"},{"url":"jiorockers.lat"},{"url":"prmovies.beauty"},{"url":"rajfacilities.in"},{"url":"4hiidude.mom"},{"url":"rtconsult.fr"},{"url":"coffeetouch.fr"},{"url":"xxxvn.io"},{"url":"anchorworld.co.in"},{"url":"pg-cursus.nl"},{"url":"healtharena.in"},{"url":"cinefilux.com"},{"url":"jpxnx.co"},{"url":"dermalife.in"},{"url":"doujindesu.rip"},{"url":"hitut.site"},{"url":"clipviet69.vip"},{"url":"seostudios.xyz"},{"url":"goliedevushki.club"},{"url":"quand-on-veut-on-peut.blogspot.com"},{"url":"nicegospel.com"},{"url":"arasup.pw"},{"url":"quotes-liker.blogspot.com"},{"url":"r18-ero-mv.com"},{"url":"rachaelcavalli.xxx"},{"url":"erotikfilmsitesi3.com"},{"url":"drakorindofilms.life"},{"url":"syafiiiq.blogspot.com"},{"url":"rekhagroup.co.in"},{"url":"inidramaku.co"},{"url":"1madrasrockers.lol"},{"url":"giladrakor.club"},{"url":"oploverz.link"},{"url":"terbit21.green"},{"url":"rajagitarindonesia.blogspot.com"},{"url":"manhwadesu.ink"},{"url":"randids.blogspot.com"},{"url":"tytvideo.mobi"},{"url":"ranchoaleman.cl"},{"url":"doood.co"},{"url":"quadacademy.in"},{"url":"edgemiddleeast.com"},{"url":"drakorindofilms.lol"},{"url":"re-animesch.blogspot.com"},{"url":"lhssblog.in"},{"url":"hawajsolar.cz"},{"url":"duduk123.com"},{"url":"realityking-picss.blogspot.com"},{"url":"met21.fr"},{"url":"leadthegreenchange.in"},{"url":"prmovies.baby"},{"url":"moviezwap.bet"},{"url":"losinfluencerszc.es"},{"url":"dotwatch.ch"},{"url":"nguonphim1.com"},{"url":"tamil1gp.blogspot.com"},{"url":"rpcollegevasai.co.in"},{"url":"sfnano2022.fr"},{"url":"rukoeb-tubex.com"},{"url":"curasidium.de"},{"url":"auntymaza.cc"},{"url":"gmvorai.in"},{"url":"ravaslot.info"},{"url":"ccpro.in"},{"url":"techsoftwareworld.blogspot.com"},{"url":"reiterinfos.de"},{"url":"mmshub.net"},{"url":"huisvangebedheerde.nl"},{"url":"gekkoserviciosmedioambientales.es"},{"url":"schuelerstiftung-saarburg.de"},{"url":"yomovies.baby"},{"url":"requestyourlinksph.blogspot.com"},{"url":"1madrasrockers.bio"},{"url":"bokepcolmek.pro"},{"url":"ten79ryuu.blogspot.com"},{"url":"ssmghospital.co.in"},{"url":"schmelzfarben.de"},{"url":"filmy-hit.solutions"},{"url":"multicanais.li"},{"url":"rezqorten.blogspot.com"},{"url":"samehadaku.skin"},{"url":"9kmovies.bet"},{"url":"asianpinay.cc"},{"url":"egyshare.lol"},{"url":"moviespapa.expert"},{"url":"idlixprime.com"},{"url":"galleryhomes.in"},{"url":"ricettedicasa.blogspot.com"},{"url":"dhunwap.in"},{"url":"oploverz.la"},{"url":"xn--42cf2bubhe9j0bgf1g0fze.com"},{"url":"1filmy4wep.buzz"},{"url":"krutiindia.in"},{"url":"samehadaku.lat"},{"url":"9xflix.lat"},{"url":"editorxformation.fr"},{"url":"filmygod.pro"},{"url":"interactivead.ru"},{"url":"desklive.in"},{"url":"r39th.com"},{"url":"moviezwap.fan"},{"url":"juraganfilm.icu"},{"url":"9xmovies.dog"},{"url":"terbit21.gold"},{"url":"manhwadesu.top"},{"url":"rumporn.com"},{"url":"rumahliterasisumenep.org"},{"url":"ventilatiereinigers.nl"},{"url":"ruqyahpengobatannabi.blogspot.com"},{"url":"tut4k.pro"},{"url":"julianeleveque.fr"},{"url":"yomovies.monster"},{"url":"palabradevasco.es"},{"url":"9kmovies.toys"},{"url":"hindilinks4u.run"},{"url":"chinaporn.com.es"},{"url":"dramaserial.sbs"},{"url":"multiserviciosramirez.es"},{"url":"onco-zorg.nl"},{"url":"hemelsondernemen.nl"},{"url":"9kmovies.center"},{"url":"kuajingd.com"},{"url":"moviespapa.fan"},{"url":"9xmovies.fan"},{"url":"msugcmansa.co.in"},{"url":"bangbros.vip"},{"url":"colmeksmp.space"},{"url":"groupement-garonne.fr"},{"url":"wesafe.es"},{"url":"manwhasonline.com"},{"url":"rijsdijk132.nl"},{"url":"zafma.com"},{"url":"burgersandbowls.nl"},{"url":"forge-utile.fr"},{"url":"towerfantasy.ru"},{"url":"bokepcolmek.co"},{"url":"samachartez.com"},{"url":"neef-driving-experience.ch"},{"url":"saifedia.blogspot.com"},{"url":"samehadaku.bar"},{"url":"suncelebrationsamp.com"},{"url":"januflix.expert"},{"url":"kahoo.cz"},{"url":"9xflix.monster"},{"url":"ako-kamp.com"},{"url":"mobiblog.bio"},{"url":"pgslot8899.com"},{"url":"hindisexystories.blog"},{"url":"nikesh.in"},{"url":"jblpartners.fr"},{"url":"7hitmovies.ltd"},{"url":"sarbelgyi.xyz"},{"url":"sayidahnapisah.com"},{"url":"sayfa5.com"},{"url":"bgibola8.lol"},{"url":"filmyhit.ac"},{"url":"themoviesflix.gr.com"},{"url":"iphimchilla.com"},{"url":"dvdplay.hair"},{"url":"sritcara.in"},{"url":"dailyxxxclips.com"},{"url":"nex8vn.com"},{"url":"phimtho.net"},{"url":"sweatersintl.com"},{"url":"moviezwap.tips"},{"url":"samehadaku.world"},{"url":"mocbai6.com"},{"url":"onmov.me"},{"url":"serveadkitchen.com"},{"url":"glowar.in"},{"url":"bpqil.com"},{"url":"juraganfilm.bio"},{"url":"sdarrot.blogspot.com"},{"url":"secogiounviejoylagrabaron.blogspot.com"},{"url":"xnxx.vip"},{"url":"dandanzan.com"},{"url":"1tamilblasters.lat"},{"url":"oploverz.ltd"},{"url":"segredosdanett.blogspot.com"},{"url":"sehtakahm.blogspot.com"},{"url":"mkvcinemas.rest"},{"url":"wimobile-pam.fr"},{"url":"sejarahkarbala.blogspot.com"},{"url":"pembetv18.net"},{"url":"sicvirals.com"},{"url":"iplin9.com"},{"url":"1madrasrockers.pro"},{"url":"garotosbrasil.net"},{"url":"bichill1.net"},{"url":"youtubecliphot.lol"},{"url":"upemp3.blogspot.com"},{"url":"tut4k.xyz"},{"url":"terbit21.tube"},{"url":"cliphotvn.pro"},{"url":"themoviesflix.de.com"},{"url":"hochzeitsgleis.de"},{"url":"cambaby.lol"},{"url":"009banca.com"},{"url":"notmikw7.xyz"},{"url":"kopedao5.xyz"},{"url":"mocbai8.com"},{"url":"kopedav7.xyz"},{"url":"kopedab4.xyz"},{"url":"https-www-xozilla.com"},{"url":"notmiko8.xyz"},{"url":"ravaslot.store"},{"url":"kopedaf7.xyz"},{"url":"f799999.com"},{"url":"samehadaku.bond"},{"url":"sexdiaryx.us"},{"url":"kopedat5.xyz"},{"url":"moviezwap.tax"},{"url":"upslut-hnv.shop"},{"url":"kopedaf2.xyz"},{"url":"finish-frame.nl"},{"url":"notmike5.xyz"},{"url":"no-drakor.xyz"},{"url":"kopedau1.xyz"},{"url":"kopedah9.xyz"},{"url":"kopedas8.xyz"},{"url":"seriesanimadasemvariaslinguas.blogspot.com"},{"url":"filmyhit.hair"},{"url":"seriesviejasdetvenhd.blogspot.com"},{"url":"urdunvls.blogspot.com"},{"url":"xbokepfb.co"},{"url":"serindigena.cl"},{"url":"set2app.blogspot.com"},{"url":"upslut-nvs.shop"},{"url":"agenbokep.one"},{"url":"asianhd1.com"},{"url":"mocbai1.com"},{"url":"tbliz.com"},{"url":"mpoplay.pro"},{"url":"manatelugukamakathalu.blogspot.com"},{"url":"kopedap8.xyz"},{"url":"sex-com.blogspot.com"},{"url":"kopedaw4.xyz"},{"url":"rsarticles.com"},{"url":"bokepcolmek.cc"},{"url":"auntymaza.sbs"},{"url":"dafitness.xyz"},{"url":"shinigami.sh"},{"url":"kopedae7.xyz"},{"url":"upslut-nrs.shop"},{"url":"seucdia.com"},{"url":"yaoiflix.online"},{"url":"notmikc6.xyz"},{"url":"sexgames.bz"},{"url":"phimchill2.net"},{"url":"notmikg4.xyz"},{"url":"livetv704.me"},{"url":"sexhotbabe.blogspot.com"},{"url":"newsgaziantep.com"},{"url":"notmika9.xyz"},{"url":"kopedaj6.xyz"},{"url":"notmikv6.xyz"},{"url":"kopedae5.xyz"},{"url":"moviezwap.tube"},{"url":"xn--72cmtudp6e8ad1dzef5f7bwc2an.com"},{"url":"cudem69.lol"},{"url":"kopedaa6.xyz"},{"url":"kopedat9.xyz"},{"url":"sexowood.blogspot.com"},{"url":"clk.wiki"},{"url":"upslut-snh.shop"},{"url":"thenextplanet.pro"},{"url":"boothuboothuboothu.blogspot.com"},{"url":"jiorockers.cloud"},{"url":"sexxx-69.blogspot.com"},{"url":"livesydney4d.com"},{"url":"clipviet69.xyz"},{"url":"kopedad6.xyz"},{"url":"crohasit.online"},{"url":"1tamilblasters.art"},{"url":"sexyphotobook.blogspot.com"},{"url":"fmoviesx.net"},{"url":"kopeda2s.xyz"},{"url":"kopeda3h.xyz"},{"url":"arabdx.com"},{"url":"kebokepanku.bond"},{"url":"kopedar8.xyz"},{"url":"kopeda2h.xyz"},{"url":"dutamovie21.co"},{"url":"galaxy38.com"},{"url":"jornalamanhecer.com.br"},{"url":"watchomovies.beauty"},{"url":"bokepsd.cfd"},{"url":"yaoiflix.cc"},{"url":"notmikt7.xyz"},{"url":"parball.com"},{"url":"a-xnxx.com"},{"url":"brattysisporn.com"},{"url":"phim3mien.com"},{"url":"upslut-nbs.shop"},{"url":"kopeda1d.xyz"},{"url":"tut4k.ink"},{"url":"notmik3q.xyz"},{"url":"rebahin.co.in"},{"url":"kuttymovies.com.de"},{"url":"notmik8l.xyz"},{"url":"shsssk.com"},{"url":"siam212thai.com"},{"url":"jiorockers.work"},{"url":"pornosutener.net"},{"url":"taraftarium.marketing"},{"url":"kopedai0.xyz"},{"url":"notmik2t.xyz"},{"url":"kopeda9m.xyz"},{"url":"upslut-mdb.shop"},{"url":"vivo-y15roms.blogspot.com"},{"url":"mmsbee.digital"},{"url":"1tamilblasters.cfd"},{"url":"upslut-mbd.shop"},{"url":"baclieu24h.net"},{"url":"score808.tech"},{"url":"notmik6y.xyz"},{"url":"notmikc5.xyz"},{"url":"kopeda3y.xyz"},{"url":"kopeda6s.xyz"},{"url":"kopeda7a.xyz"},{"url":"movieku.lol"},{"url":"9xflix.men"},{"url":"skytoon117.com"},{"url":"filmywap.gr.com"},{"url":"e19app.com"},{"url":"kopeda1u.xyz"},{"url":"upslut-dnb.shop"},{"url":"cliphot.sh"},{"url":"yaoiflix.pro"},{"url":"websiteedukasi1.blogspot.com"},{"url":"webseriezzz.blogspot.com"},{"url":"notmikh4.xyz"},{"url":"upslut-bnd.shop"},{"url":"samehadaku.rent"},{"url":"sonesansimyanmar.blogspot.com"},{"url":"sonhaberimiz.com"},{"url":"sometapatapisneeded.blogspot.com"},{"url":"javguruji.online"},{"url":"bokepbocil.cfd"},{"url":"mesum.cfd"},{"url":"boothupusthakam.blogspot.com"},{"url":"phim18hd.me"},{"url":"kopeda4i.xyz"},{"url":"filmywap.com.vc"},{"url":"sourcecodeaplikasi.info"},{"url":"kopeda8b.xyz"},{"url":"sokuja.biz"},{"url":"notmikgf.xyz"},{"url":"moviezwap.work"},{"url":"giladrakor.pro"},{"url":"sineadmcdermott.com"},{"url":"kopedar2.xyz"},{"url":"upslut-mbs.shop"},{"url":"sqlinjectiondorks2016.blogspot.com"},{"url":"upslut-dms.shop"},{"url":"sportwedkantoor.nl"},{"url":"rutubex.net"},{"url":"notmikh9.xyz"},{"url":"srungaaravedhanti.blogspot.com"},{"url":"srpski-pornic.blogspot.com"},{"url":"sexhay2023.net"},{"url":"ssphimnet.com"},{"url":"srilankanactress519.blogspot.com"},{"url":"haryananewsalert.com"},{"url":"xn--2-zwfi5czan3iwbf1f5e6cya.com"},{"url":"indobokep.cfd"},{"url":"fashionandcomplements.com"},{"url":"upslut-nbm.shop"},{"url":"kopedav3.xyz"},{"url":"notmik7y.xyz"},{"url":"vn5885.com"},{"url":"kopeda8v.xyz"},{"url":"notmik2x.xyz"},{"url":"kopedac3.xyz"},{"url":"upslut-sdn.shop"},{"url":"upslut-dcv.shop"},{"url":"notmik5p.xyz"},{"url":"studforlife.com"},{"url":"filmyhit.stream"},{"url":"kopedak6.xyz"},{"url":"samehadaku.mom"},{"url":"baladfilm.win"},{"url":"genzsex.com"},{"url":"allall107.com"},{"url":"dutamovie21.club"},{"url":"phimmoi.mom"},{"url":"notmik3t.xyz"},{"url":"notmik1o.xyz"},{"url":"kopedap2.xyz"},{"url":"notmika6.xyz"},{"url":"kopedar0.xyz"},{"url":"kopeda3g.xyz"},{"url":"pascol.fun"},{"url":"upslut-nbc.shop"},{"url":"jiorockers.report"},{"url":"vancedtube.org"},{"url":"upslut-ncb.shop"},{"url":"kopedal1.xyz"},{"url":"upslut-bcn.shop"},{"url":"cliphot.moe"},{"url":"xxxtubedot.com"},{"url":"samehadaku.digital"},{"url":"javhdhayz.me"},{"url":"swzy.club"},{"url":"notmik2j.xyz"},{"url":"kopeda5n.xyz"},{"url":"upslut-ndc.shop"},{"url":"7hitmovies.stream"},{"url":"viet69.bet"},{"url":"manga-ninja.com"},{"url":"sweetywoman.com"},{"url":"okestream4.lol"},{"url":"kopeda7q.xyz"},{"url":"kopedah6.xyz"},{"url":"jav-fun.in"},{"url":"notmik4i.xyz"},{"url":"talkcity.it"},{"url":"upslut-dcn.shop"},{"url":"tamildirtystoriz.blogspot.com"},{"url":"tamilkamalogaam.blogspot.com"},{"url":"upslut-ncs.shop"},{"url":"tamilsexstories.cc"},{"url":"kopeda8c.xyz"},{"url":"kopedaj7.xyz"},{"url":"kopeda5c.xyz"},{"url":"kenhtin88.com"},{"url":"teamcomics.com.br"},{"url":"notmikp6.xyz"},{"url":"nudebeachporn.net"},{"url":"notmik2a.xyz"},{"url":"upslut-vcn.shop"},{"url":"upslut-csn.shop"},{"url":"allall108.com"},{"url":"mp3cielo.app"},{"url":"camcaps.to"},{"url":"kopeda6m.xyz"},{"url":"upslut-vnc.shop"},{"url":"xnxx-vid.com"},{"url":"bacolviral.club"},{"url":"kopeda3u.xyz"},{"url":"tvhaym.org"},{"url":"teluguactresssexstories.blogspot.com"},{"url":"notmik7x.xyz"},{"url":"thamdu.net"},{"url":"1688porn.tv"},{"url":"xxnx.ink"},{"url":"kopeda7j.xyz"},{"url":"kopeda0z.xyz"},{"url":"hotindiansexscandals.com"},{"url":"upslut-cvn.shop"},{"url":"thecap.com.br"},{"url":"baladfilm.lat"},{"url":"xn--o3cfd3av3mqarx7a.com"},{"url":"kopeda9c.xyz"},{"url":"themushokutensei.com"},{"url":"upslut-cnv.shop"},{"url":"stumblingtongue.com"},{"url":"infotrends.co"},{"url":"notmik8b.xyz"},{"url":"kopedau4.xyz"},{"url":"themacaonews.com"},{"url":"upslut-mcv.shop"},{"url":"kopeda0b.xyz"},{"url":"allall109.com"},{"url":"upslut-nvh.shop"},{"url":"filmyzilla.com.sc"},{"url":"tut4k.top"},{"url":"notmik5n.xyz"},{"url":"okestream4.online"},{"url":"androidmuziq.com"},{"url":"notmik3e.xyz"},{"url":"kopeda9f.xyz"},{"url":"jiorockers.cam"},{"url":"moviezwap.uno"},{"url":"filmy-hit.mom"},{"url":"aagmaal.host"},{"url":"telugusexnovels.blogspot.com"},{"url":"guitarstores.net"},{"url":"upslut-hns.shop"},{"url":"nodrakor.store"},{"url":"kopeda6e.xyz"},{"url":"phimmoivl.net"},{"url":"tideswaterfrontkitchen.com"},{"url":"kopeda6q.xyz"},{"url":"jadvalyab.ir"},{"url":"yaoiflix.live"},{"url":"simontok.autos"},{"url":"1mainanserbagoceng.com"},{"url":"tizihay.com"},{"url":"khatrimazaful.art"},{"url":"hentaimoe.me"},{"url":"motchillf.com"},{"url":"notmikq8.xyz"},{"url":"theluckytv.weebly.com"},{"url":"kopedas6.xyz"},{"url":"movierulzhd.host"},{"url":"5ivetv.com"},{"url":"kopedal4.xyz"},{"url":"tobigame.com"},{"url":"notmikp2.xyz"},{"url":"ruangbokep.rest"},{"url":"genzsex.net"},{"url":"kopeda9r.xyz"},{"url":"hafizh.link"},{"url":"fullymaza.cyou"},{"url":"bandarsbo2y.com"},{"url":"upslut-shc.shop"},{"url":"notmik1g.xyz"},{"url":"xn--12cl2bca0a9jsa8a7e1dc3gd.tv"},{"url":"toket.cfd"},{"url":"d0o0d.com"},{"url":"notmik0l.xyz"},{"url":"toperotiek.com"},{"url":"motphimf.com"},{"url":"kopeda5v.xyz"},{"url":"upslut-bcs.shop"},{"url":"toppornsgirlshot.blogspot.com"},{"url":"1tamilblasters.tel"},{"url":"lauxanh69.net"},{"url":"gocphim.org"},{"url":"upslut-scb.shop"},{"url":"kopeda2c.xyz"},{"url":"dutamovie21.tech"},{"url":"trakyaflashaber.com"},{"url":"tuoi69.tv"},{"url":"upslut-bvc.shop"},{"url":"cartoonporn.tv"},{"url":"moviezwap.men"},{"url":"ashapurabus.in"},{"url":"bongngotv.cc"},{"url":"kopeda8p.xyz"},{"url":"kopeda1p.xyz"},{"url":"filmyhit.date"},{"url":"kopeda7u.xyz"},{"url":"notmiku6.xyz"},{"url":"fiagra.net"},{"url":"trueorlienews.com"},{"url":"tructiepgame.tv"},{"url":"upslut-bfs.shop"},{"url":"subnhanh.bio"},{"url":"kopeda6b.xyz"},{"url":"866.su"},{"url":"upslut-bsf.shop"},{"url":"do0od.com"},{"url":"dual-simcard.com"},{"url":"kopedai2.xyz"},{"url":"sexhay2024.tv"},{"url":"upslut-hcb.shop"},{"url":"3d2x.com"},{"url":"upslut-fsb.shop"},{"url":"kopeda1k.xyz"},{"url":"rcnmundo.com"},{"url":"ssphim.us"},{"url":"notmikf1.xyz"},{"url":"autohybrid.it"},{"url":"dongphim3s.com"},{"url":"biphim.biz"},{"url":"autoxpertinsight.com"},{"url":"autourban.md"},{"url":"phimnhanhtv.cc"},{"url":"upslut-ctb.shop"},{"url":"kopedae2.xyz"},{"url":"subnhanh.men"},{"url":"genzsex.tv"},{"url":"masaporn.fun"},{"url":"bichill.pro"},{"url":"filmyhit.bingo"},{"url":"kopedaw3.xyz"},{"url":"1tamilyogi.lat"},{"url":"prostoporno.group"},{"url":"twinksbang.com"},{"url":"1tamilblasters.day"},{"url":"123mkv.boo"},{"url":"upslut-cbt.shop"},{"url":"motchill1.pro"},{"url":"notmik2n.xyz"},{"url":"kopeda5s.xyz"},{"url":"ihubnews.top"},{"url":"kopeda7p.xyz"},{"url":"kopeda4u.xyz"},{"url":"upslut-bkt.shop"},{"url":"ultimatebtcfree.blogspot.com"},{"url":"upslut-tkb.shop"},{"url":"notmik5m.xyz"},{"url":"sexviethay.info"},{"url":"ultrafilmeshdcl.blogspot.com"},{"url":"kopeda3p.xyz"},{"url":"kopeda9w.xyz"},{"url":"xn--72czbawn3i1b1dydua7dub.com"},{"url":"okestream.art"},{"url":"miror.uk.com"},{"url":"upslut-fkb.shop"},{"url":"upslut-kbt.shop"},{"url":"kopeda4p.xyz"},{"url":"terbit21.team"},{"url":"xxx888porn.com"},{"url":"notmiku5.xyz"},{"url":"melongmovie.site"},{"url":"unesco.cl"},{"url":"asilporno.com"},{"url":"thenextplanet.baby"},{"url":"jonynewz.com"},{"url":"kopeda9q.xyz"},{"url":"kopeda8w.xyz"},{"url":"multicanais.cl"},{"url":"biphim.men"},{"url":"hhpanda.vip"},{"url":"subnhanh.moe"},{"url":"kopeda2p.xyz"},{"url":"upslut-knb.shop"},{"url":"notmik9q.xyz"},{"url":"subnhanh.bot"},{"url":"kopeda5t.xyz"},{"url":"bilutv.lol"},{"url":"phe18.net"},{"url":"upslut-kbn.shop"},{"url":"dongphim3s.cc"},{"url":"webptt.com"},{"url":"javflix.top"},{"url":"fullgays.com"},{"url":"phimnhanhtv.men"},{"url":"hotigo.cloud"},{"url":"phimmoichill.lol"},{"url":"upslut-ntb.shop"},{"url":"freeporn.org.es"},{"url":"phimlau.lol"},{"url":"phym18.pro"},{"url":"filmyhit.productions"},{"url":"xomphim.cc"},{"url":"phim18hd.co"},{"url":"uyduca.net"},{"url":"ihubknowledge.com"},{"url":"kopeda4w.xyz"},{"url":"jiorockers.mom"},{"url":"vale24horas.com.br"},{"url":"khatrimazaful.top"},{"url":"v18plus.lol"},{"url":"kopeda2i.xyz"},{"url":"cliphotmoi.com"},{"url":"kopedab3.xyz"},{"url":"kopeda6g.xyz"},{"url":"beptukaff.vn"},{"url":"desivdo.com"},{"url":"kopedac0.xyz"},{"url":"xn--72c9aafes9a9c6azaf3b3m3csb.com"},{"url":"xemphimplus.lol"},{"url":"upslut-ftb.shop"},{"url":"kissasian.hu"},{"url":"motphimchill.us"},{"url":"porncom.com.es"},{"url":"hhpanda.io"},{"url":"upslut-ftk.shop"},{"url":"upslut-kft.shop"},{"url":"sexdiaryx.tv"},{"url":"megaporn.com.es"},{"url":"sougouwiki.com"},{"url":"bestapk.pl"},{"url":"cryptoofaucet.site"},{"url":"xn--72ca2bsl7gxbd4m7c.tv"},{"url":"verificar-human1.blogspot.com"},{"url":"vclxxx.blogspot.com"},{"url":"dongphim3s.tv"},{"url":"biphim.vin"},{"url":"subnhanh.vin"},{"url":"kopeda0c.xyz"},{"url":"kopedak3.xyz"},{"url":"phimmoiz.lol"},{"url":"sinemaxxi.art"},{"url":"rusprofiles.ru"},{"url":"tracy9ja.com.ng"},{"url":"cliphotx.net"},{"url":"claysxfilm.com"},{"url":"upslut-hkd.shop"},{"url":"kopeda4y.xyz"},{"url":"kopedae0.xyz"},{"url":"vicetemple.io"},{"url":"videodownload2.blogspot.com"},{"url":"videojapansex.top"},{"url":"videoanimehd.com"},{"url":"dongphimz.lol"},{"url":"cliphot.cam"},{"url":"kopedai4.xyz"},{"url":"okestream.bio"},{"url":"pelisflix.giving"},{"url":"motchillw.com"},{"url":"dongphymtv.xyz"},{"url":"mobiblog2.com"},{"url":"kopeda3o.xyz"},{"url":"upslut-fhk.shop"},{"url":"kopeda9k.xyz"},{"url":"dog2024free.com"},{"url":"upslut-khf.shop"},{"url":"vipescorts.co.uk"},{"url":"kopeda2n.xyz"},{"url":"kopeda8x.xyz"},{"url":"viralefilmer.no"},{"url":"notmik9y.xyz"},{"url":"motphimf.net"},{"url":"tut4k.me"},{"url":"jav987.xyz"},{"url":"kopedaw9.xyz"},{"url":"moviezwap.bid"},{"url":"upslut-kcb.shop"},{"url":"sinemaxxi.cc"},{"url":"kopedaf9.xyz"},{"url":"uaecarprice.com"},{"url":"genzsex.vip"},{"url":"pandamovies.pw"},{"url":"kissasiantv.la"},{"url":"kopeda6z.xyz"},{"url":"upslut-ckb.shop"},{"url":"filmyhit.archi"},{"url":"banhtv.pro"},{"url":"dongphymtv.info"},{"url":"fsiblog2.blog"},{"url":"yaoiflix.co"},{"url":"vkoolkk.net"},{"url":"cliphotvn.xyz"},{"url":"truyenchus.com"},{"url":"upslut-hfd.shop"},{"url":"upslut-hfc.shop"},{"url":"sinemaxxi.us"},{"url":"kopeday5.xyz"},{"url":"ulluhot.net"},{"url":"upslut-hcd.shop"},{"url":"vrsex4k.com"},{"url":"mobiblog.one"},{"url":"vuighenet.com"},{"url":"mobiblog.pro"},{"url":"vungtv.us"},{"url":"walkathaas.blogspot.com"},{"url":"wankgod.com"},{"url":"fmovieszfree.org"},{"url":"kopeda7s.xyz"},{"url":"upslut-dfh.shop"},{"url":"quatvn.link"},{"url":"phimmoi.cool"},{"url":"hayhayphim.com"},{"url":"phimsubmoi.com"},{"url":"kopedaa8.xyz"},{"url":"kopedah7.xyz"},{"url":"mafree.online"},{"url":"genzsex.pro"},{"url":"motphimchilli.org"},{"url":"tructiepbongdaz.net"},{"url":"sinemaxxi.me"},{"url":"xn--12cl2bu3go0a5d9cud.tv"},{"url":"thaihubx.tv"},{"url":"cliphot.bid"},{"url":"kopeda4f.xyz"},{"url":"webmlovers.xyz"},{"url":"doctruyenchufull.info"},{"url":"wechannel.com.br"},{"url":"bonerstarters.com"},{"url":"kopedap9.xyz"},{"url":"moviezwap.dog"},{"url":"phimmoisz.com"},{"url":"javkche.info"},{"url":"camvat.tv"},{"url":"infotechspot.com"},{"url":"vkoolkkk.net"},{"url":"genzsex.cc"},{"url":"phimmoiplus.lol"},{"url":"upslut-ghd.shop"},{"url":"fillmyhit.stream"},{"url":"upslut-gbh.shop"},{"url":"notmikh0.xyz"},{"url":"ghienphim.me"},{"url":"tiroalpalo.org"},{"url":"motphimhan.biz"},{"url":"kopedac2.xyz"},{"url":"cliphotmoi.biz"},{"url":"hutieutv1.live"},{"url":"lkprd.fun"},{"url":"sinemaxxi.tv"},{"url":"1xanimes.org"},{"url":"kopeda6y.xyz"},{"url":"mobiblog.life"},{"url":"vuabongco.live"},{"url":"bokepratihbugil.com"},{"url":"upslut-bdg.shop"},{"url":"upslut-bdf.shop"},{"url":"upslut-dhb.shop"},{"url":"upslut-kbd.shop"},{"url":"meomeotv.bio"},{"url":"kopeda7e.xyz"},{"url":"abaxsonorisation.com"},{"url":"open-music.ir"},{"url":"kopedaf0.xyz"},{"url":"womanandhomemagazine.co.za"},{"url":"t21.press"},{"url":"vailonxx.vip"},{"url":"centralajuda.com"},{"url":"kopeda4v.xyz"},{"url":"nbaworth.com"},{"url":"phe18.vip"},{"url":"dongphims.info"},{"url":"doctruyenchufull.pro"},{"url":"catalpary.top"},{"url":"nodrakor22.life"},{"url":"kopeda3n.xyz"},{"url":"futemax.lu"},{"url":"kopedah8.xyz"},{"url":"giladrakor.life"},{"url":"multicanais.pm"},{"url":"motchillh.com"},{"url":"kopedax0.xyz"},{"url":"upslut-cbf.shop"},{"url":"viet69.pet"},{"url":"mobiblog.mom"},{"url":"sinemaxxi.vip"},{"url":"genzsex.me"},{"url":"tlcplantsinc.com"},{"url":"webphim5.com"},{"url":"vkoolll.net"},{"url":"xartoonzmm.blogspot.com"},{"url":"xemphimchill.lol"},{"url":"xbizarre.com"},{"url":"xemphimhay247.com"},{"url":"xn--72czpjuy5c8b0b6a0h8d.tv"},{"url":"xembong8.site"},{"url":"xemphimchill.xyz"},{"url":"bilutv.life"},{"url":"nudeshark.net"},{"url":"nadymods.com"},{"url":"kopedaw7.xyz"},{"url":"kopedag6.xyz"},{"url":"kissasiantv.to"},{"url":"phimmoichill.xyz"},{"url":"hdstreamzz.net"},{"url":"desigirlsindia.com"},{"url":"kopedaj5.xyz"},{"url":"notmik5b.xyz"},{"url":"inatbox-izle.com.tr"},{"url":"upslut-hvf.shop"},{"url":"viet69.hair"},{"url":"modder.in"},{"url":"tvhayii.org"},{"url":"kopeda8l.xyz"},{"url":"pornparadox.com"},{"url":"kopeda7t.xyz"},{"url":"ani24vn.com"},{"url":"rojadirectatv.ch"},{"url":"xn--2-twfr5cza1iqa4a3exdyd.com"},{"url":"maturesl.com"},{"url":"upslut-fvb.shop"},{"url":"perverttube.com"},{"url":"komikseru.sbs"},{"url":"multicanais.pl"},{"url":"shinigami.ws"},{"url":"sexnhatban.cam"},{"url":"vietsubtv.lol"},{"url":"scores24.live"},{"url":"xn--3-zwfi5czan3iwbf1f5e6cya.com"},{"url":"twi-fans.com"},{"url":"kopeda1v.xyz"},{"url":"cliphotmoi.pro"},{"url":"vuaphimmoi5.net"},{"url":"vaophim.lol"},{"url":"pornhoarder.org"},{"url":"kopedan9.xyz"},{"url":"jpxnx.moe"},{"url":"168porn2.com"},{"url":"bkh017.com"},{"url":"phimmoii.biz"},{"url":"kopeda8m.xyz"},{"url":"prostoporno.quest"},{"url":"notmik1k.xyz"},{"url":"90phut7.xyz"},{"url":"kopedaq9.xyz"},{"url":"upslut-kgv.shop"},{"url":"ihaveporno.com"},{"url":"diakron.it"}],"created_time":1773984225} \ No newline at end of file diff --git a/.edge-profile-render-1774484525680/Crashpad/metadata b/.edge-profile-render-1774484525680/Crashpad/metadata new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Crashpad/settings.dat b/.edge-profile-render-1774484525680/Crashpad/settings.dat new file mode 100644 index 0000000..f7b5e42 Binary files /dev/null and b/.edge-profile-render-1774484525680/Crashpad/settings.dat differ diff --git a/.edge-profile-render-1774484525680/Crashpad/throttle_store.dat b/.edge-profile-render-1774484525680/Crashpad/throttle_store.dat new file mode 100644 index 0000000..9639e1b --- /dev/null +++ b/.edge-profile-render-1774484525680/Crashpad/throttle_store.dat @@ -0,0 +1 @@ +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 new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Asset Store/assets.db/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile-render-1774484525680/Default/Asset Store/assets.db/LOCK b/.edge-profile-render-1774484525680/Default/Asset Store/assets.db/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/Asset Store/assets.db/LOG b/.edge-profile-render-1774484525680/Default/Asset Store/assets.db/LOG new file mode 100644 index 0000000..a7d35ed --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Asset Store/assets.db/LOG @@ -0,0 +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 diff --git a/.edge-profile-render-1774484525680/Default/Asset Store/assets.db/MANIFEST-000001 b/.edge-profile-render-1774484525680/Default/Asset Store/assets.db/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Asset Store/assets.db/MANIFEST-000001 differ diff --git a/.edge-profile-render-1774484525680/Default/AutofillAiModelCache/LOCK b/.edge-profile-render-1774484525680/Default/AutofillAiModelCache/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/AutofillAiModelCache/LOG b/.edge-profile-render-1774484525680/Default/AutofillAiModelCache/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/AutofillStrikeDatabase/LOCK b/.edge-profile-render-1774484525680/Default/AutofillStrikeDatabase/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/AutofillStrikeDatabase/LOG b/.edge-profile-render-1774484525680/Default/AutofillStrikeDatabase/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/BookmarkMergedSurfaceOrdering b/.edge-profile-render-1774484525680/Default/BookmarkMergedSurfaceOrdering new file mode 100644 index 0000000..f3ee419 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/BookmarkMergedSurfaceOrdering @@ -0,0 +1,2 @@ +{ +} diff --git a/.edge-profile-render-1774484525680/Default/BrowsingTopicsSiteData b/.edge-profile-render-1774484525680/Default/BrowsingTopicsSiteData new file mode 100644 index 0000000..c41f9b3 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/BrowsingTopicsSiteData differ diff --git a/.edge-profile-render-1774484525680/Default/BrowsingTopicsSiteData-journal b/.edge-profile-render-1774484525680/Default/BrowsingTopicsSiteData-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/BrowsingTopicsState b/.edge-profile-render-1774484525680/Default/BrowsingTopicsState new file mode 100644 index 0000000..39f9d4a --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/BrowsingTopicsState @@ -0,0 +1,12 @@ +{ + "epochs": [ { + "calculation_time": "13418958132531185", + "config_version": 0, + "model_version": "0", + "padded_top_topics_start_index": 0, + "taxonomy_version": 0, + "top_topics_and_observing_domains": [ ] + } ], + "hex_encoded_hmac_key": "C1E56B7B011A37A9D7598BAB61BA06CA18362510E651479193ECE5C2F29A1156", + "next_scheduled_calculation_time": "13419562932531424" +} diff --git a/.edge-profile-render-1774484525680/Default/BudgetDatabase/LOCK b/.edge-profile-render-1774484525680/Default/BudgetDatabase/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/BudgetDatabase/LOG b/.edge-profile-render-1774484525680/Default/BudgetDatabase/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/Cache/Cache_Data/data_0 b/.edge-profile-render-1774484525680/Default/Cache/Cache_Data/data_0 new file mode 100644 index 0000000..337db3e Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Cache/Cache_Data/data_0 differ diff --git a/.edge-profile-render-1774484525680/Default/Cache/Cache_Data/data_1 b/.edge-profile-render-1774484525680/Default/Cache/Cache_Data/data_1 new file mode 100644 index 0000000..5e82925 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Cache/Cache_Data/data_1 differ diff --git a/.edge-profile-render-1774484525680/Default/Cache/Cache_Data/data_2 b/.edge-profile-render-1774484525680/Default/Cache/Cache_Data/data_2 new file mode 100644 index 0000000..20d747d Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Cache/Cache_Data/data_2 differ diff --git a/.edge-profile-render-1774484525680/Default/Cache/Cache_Data/data_3 b/.edge-profile-render-1774484525680/Default/Cache/Cache_Data/data_3 new file mode 100644 index 0000000..9b02773 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Cache/Cache_Data/data_3 differ diff --git a/.edge-profile-render-1774484525680/Default/Cache/Cache_Data/f_000001 b/.edge-profile-render-1774484525680/Default/Cache/Cache_Data/f_000001 new file mode 100644 index 0000000..eddbef2 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Cache/Cache_Data/f_000001 differ diff --git a/.edge-profile-render-1774484525680/Default/Cache/Cache_Data/f_000002 b/.edge-profile-render-1774484525680/Default/Cache/Cache_Data/f_000002 new file mode 100644 index 0000000..3950247 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Cache/Cache_Data/f_000002 differ diff --git a/.edge-profile-render-1774484525680/Default/Cache/Cache_Data/f_000003 b/.edge-profile-render-1774484525680/Default/Cache/Cache_Data/f_000003 new file mode 100644 index 0000000..b25ca78 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Cache/Cache_Data/f_000003 differ diff --git a/.edge-profile-render-1774484525680/Default/Cache/Cache_Data/f_000005 b/.edge-profile-render-1774484525680/Default/Cache/Cache_Data/f_000005 new file mode 100644 index 0000000..7abc972 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Cache/Cache_Data/f_000005 differ diff --git a/.edge-profile-render-1774484525680/Default/Cache/Cache_Data/f_000007 b/.edge-profile-render-1774484525680/Default/Cache/Cache_Data/f_000007 new file mode 100644 index 0000000..c4a7204 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Cache/Cache_Data/f_000007 differ diff --git a/.edge-profile-render-1774484525680/Default/Cache/Cache_Data/f_00000a b/.edge-profile-render-1774484525680/Default/Cache/Cache_Data/f_00000a new file mode 100644 index 0000000..59728d1 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Cache/Cache_Data/f_00000a differ diff --git a/.edge-profile-render-1774484525680/Default/Cache/Cache_Data/f_00000b b/.edge-profile-render-1774484525680/Default/Cache/Cache_Data/f_00000b new file mode 100644 index 0000000..416a144 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Cache/Cache_Data/f_00000b differ diff --git a/.edge-profile-render-1774484525680/Default/Cache/Cache_Data/f_00000c b/.edge-profile-render-1774484525680/Default/Cache/Cache_Data/f_00000c new file mode 100644 index 0000000..35f0cc6 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Cache/Cache_Data/f_00000c differ diff --git a/.edge-profile-render-1774484525680/Default/Cache/Cache_Data/f_00000d b/.edge-profile-render-1774484525680/Default/Cache/Cache_Data/f_00000d new file mode 100644 index 0000000..75ccdf5 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Cache/Cache_Data/f_00000d differ diff --git a/.edge-profile-render-1774484525680/Default/Cache/Cache_Data/index b/.edge-profile-render-1774484525680/Default/Cache/Cache_Data/index new file mode 100644 index 0000000..c5cbc7a Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Cache/Cache_Data/index differ diff --git a/.edge-profile-render-1774484525680/Default/Cache/No_Vary_Search/journal.baj b/.edge-profile-render-1774484525680/Default/Cache/No_Vary_Search/journal.baj new file mode 100644 index 0000000..54fe66e --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Cache/No_Vary_Search/journal.baj @@ -0,0 +1 @@ +$F~ \ No newline at end of file diff --git a/.edge-profile-render-1774484525680/Default/Cache/No_Vary_Search/snapshot.baf b/.edge-profile-render-1774484525680/Default/Cache/No_Vary_Search/snapshot.baf new file mode 100644 index 0000000..8912405 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Cache/No_Vary_Search/snapshot.baf differ diff --git a/.edge-profile-render-1774484525680/Default/ClientCertificates/LOCK b/.edge-profile-render-1774484525680/Default/ClientCertificates/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/ClientCertificates/LOG b/.edge-profile-render-1774484525680/Default/ClientCertificates/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/Code Cache/js/2a8a6f695a3ff316_0 b/.edge-profile-render-1774484525680/Default/Code Cache/js/2a8a6f695a3ff316_0 new file mode 100644 index 0000000..4f7abb8 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Code Cache/js/2a8a6f695a3ff316_0 differ diff --git a/.edge-profile-render-1774484525680/Default/Code Cache/js/2cca9bc741a6516d_0 b/.edge-profile-render-1774484525680/Default/Code Cache/js/2cca9bc741a6516d_0 new file mode 100644 index 0000000..38861c7 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Code Cache/js/2cca9bc741a6516d_0 differ diff --git a/.edge-profile-render-1774484525680/Default/Code Cache/js/5cce1706364839f1_0 b/.edge-profile-render-1774484525680/Default/Code Cache/js/5cce1706364839f1_0 new file mode 100644 index 0000000..e1f8ec3 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Code Cache/js/5cce1706364839f1_0 differ diff --git a/.edge-profile-render-1774484525680/Default/Code Cache/js/5fbb54f36261c413_0 b/.edge-profile-render-1774484525680/Default/Code Cache/js/5fbb54f36261c413_0 new file mode 100644 index 0000000..0d0b74c Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Code Cache/js/5fbb54f36261c413_0 differ diff --git a/.edge-profile-render-1774484525680/Default/Code Cache/js/7de0dc67a2b3a69c_0 b/.edge-profile-render-1774484525680/Default/Code Cache/js/7de0dc67a2b3a69c_0 new file mode 100644 index 0000000..501bd16 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Code Cache/js/7de0dc67a2b3a69c_0 differ diff --git a/.edge-profile-render-1774484525680/Default/Code Cache/js/8020acacb3d13763_0 b/.edge-profile-render-1774484525680/Default/Code Cache/js/8020acacb3d13763_0 new file mode 100644 index 0000000..289579f Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Code Cache/js/8020acacb3d13763_0 differ diff --git a/.edge-profile-render-1774484525680/Default/Code Cache/js/8bb1867be67136eb_0 b/.edge-profile-render-1774484525680/Default/Code Cache/js/8bb1867be67136eb_0 new file mode 100644 index 0000000..7bbb80b Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Code Cache/js/8bb1867be67136eb_0 differ diff --git a/.edge-profile-render-1774484525680/Default/Code Cache/js/945cb8fb56d09a8e_0 b/.edge-profile-render-1774484525680/Default/Code Cache/js/945cb8fb56d09a8e_0 new file mode 100644 index 0000000..57b3127 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Code Cache/js/945cb8fb56d09a8e_0 differ diff --git a/.edge-profile-render-1774484525680/Default/Code Cache/js/b21fb45197b9c728_0 b/.edge-profile-render-1774484525680/Default/Code Cache/js/b21fb45197b9c728_0 new file mode 100644 index 0000000..2ce54cb Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Code Cache/js/b21fb45197b9c728_0 differ diff --git a/.edge-profile-render-1774484525680/Default/Code Cache/js/ba678a2fbd8c358c_0 b/.edge-profile-render-1774484525680/Default/Code Cache/js/ba678a2fbd8c358c_0 new file mode 100644 index 0000000..8d0b312 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Code Cache/js/ba678a2fbd8c358c_0 differ diff --git a/.edge-profile-render-1774484525680/Default/Code Cache/js/baded5730168391f_0 b/.edge-profile-render-1774484525680/Default/Code Cache/js/baded5730168391f_0 new file mode 100644 index 0000000..3752dbb Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Code Cache/js/baded5730168391f_0 differ diff --git a/.edge-profile-render-1774484525680/Default/Code Cache/js/e94999eac39dfd99_0 b/.edge-profile-render-1774484525680/Default/Code Cache/js/e94999eac39dfd99_0 new file mode 100644 index 0000000..7841818 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Code Cache/js/e94999eac39dfd99_0 differ diff --git a/.edge-profile-render-1774484525680/Default/Code Cache/js/e9a142a21b9ad9ef_0 b/.edge-profile-render-1774484525680/Default/Code Cache/js/e9a142a21b9ad9ef_0 new file mode 100644 index 0000000..1044cf1 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Code Cache/js/e9a142a21b9ad9ef_0 differ diff --git a/.edge-profile-render-1774484525680/Default/Code Cache/js/ebce9e52a869b921_0 b/.edge-profile-render-1774484525680/Default/Code Cache/js/ebce9e52a869b921_0 new file mode 100644 index 0000000..9ccc765 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Code Cache/js/ebce9e52a869b921_0 differ diff --git a/.edge-profile-render-1774484525680/Default/Code Cache/js/index b/.edge-profile-render-1774484525680/Default/Code Cache/js/index new file mode 100644 index 0000000..79bd403 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Code Cache/js/index differ diff --git a/.edge-profile-render-1774484525680/Default/Code Cache/js/index-dir/the-real-index b/.edge-profile-render-1774484525680/Default/Code Cache/js/index-dir/the-real-index new file mode 100644 index 0000000..c362a25 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Code Cache/js/index-dir/the-real-index differ diff --git a/.edge-profile-render-1774484525680/Default/Code Cache/wasm/index b/.edge-profile-render-1774484525680/Default/Code Cache/wasm/index new file mode 100644 index 0000000..79bd403 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Code Cache/wasm/index differ diff --git a/.edge-profile-render-1774484525680/Default/Code Cache/wasm/index-dir/the-real-index b/.edge-profile-render-1774484525680/Default/Code Cache/wasm/index-dir/the-real-index new file mode 100644 index 0000000..4220ed3 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Code Cache/wasm/index-dir/the-real-index differ diff --git a/.edge-profile-render-1774484525680/Default/DIPS b/.edge-profile-render-1774484525680/Default/DIPS new file mode 100644 index 0000000..4410bda Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/DIPS differ diff --git a/.edge-profile-render-1774484525680/Default/DIPS-wal b/.edge-profile-render-1774484525680/Default/DIPS-wal new file mode 100644 index 0000000..9197f3e Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/DIPS-wal differ diff --git a/.edge-profile-render-1774484525680/Default/DawnGraphiteCache/data_0 b/.edge-profile-render-1774484525680/Default/DawnGraphiteCache/data_0 new file mode 100644 index 0000000..d76fb77 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/DawnGraphiteCache/data_0 differ diff --git a/.edge-profile-render-1774484525680/Default/DawnGraphiteCache/data_1 b/.edge-profile-render-1774484525680/Default/DawnGraphiteCache/data_1 new file mode 100644 index 0000000..035d06d Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/DawnGraphiteCache/data_1 differ diff --git a/.edge-profile-render-1774484525680/Default/DawnGraphiteCache/data_2 b/.edge-profile-render-1774484525680/Default/DawnGraphiteCache/data_2 new file mode 100644 index 0000000..c7e2eb9 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/DawnGraphiteCache/data_2 differ diff --git a/.edge-profile-render-1774484525680/Default/DawnGraphiteCache/data_3 b/.edge-profile-render-1774484525680/Default/DawnGraphiteCache/data_3 new file mode 100644 index 0000000..5eec973 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/DawnGraphiteCache/data_3 differ diff --git a/.edge-profile-render-1774484525680/Default/DawnGraphiteCache/index b/.edge-profile-render-1774484525680/Default/DawnGraphiteCache/index new file mode 100644 index 0000000..bd2bdee Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/DawnGraphiteCache/index differ diff --git a/.edge-profile-render-1774484525680/Default/DawnWebGPUCache/data_0 b/.edge-profile-render-1774484525680/Default/DawnWebGPUCache/data_0 new file mode 100644 index 0000000..d76fb77 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/DawnWebGPUCache/data_0 differ diff --git a/.edge-profile-render-1774484525680/Default/DawnWebGPUCache/data_1 b/.edge-profile-render-1774484525680/Default/DawnWebGPUCache/data_1 new file mode 100644 index 0000000..035d06d Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/DawnWebGPUCache/data_1 differ diff --git a/.edge-profile-render-1774484525680/Default/DawnWebGPUCache/data_2 b/.edge-profile-render-1774484525680/Default/DawnWebGPUCache/data_2 new file mode 100644 index 0000000..c7e2eb9 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/DawnWebGPUCache/data_2 differ diff --git a/.edge-profile-render-1774484525680/Default/DawnWebGPUCache/data_3 b/.edge-profile-render-1774484525680/Default/DawnWebGPUCache/data_3 new file mode 100644 index 0000000..5eec973 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/DawnWebGPUCache/data_3 differ diff --git a/.edge-profile-render-1774484525680/Default/DawnWebGPUCache/index b/.edge-profile-render-1774484525680/Default/DawnWebGPUCache/index new file mode 100644 index 0000000..b55b0b1 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/DawnWebGPUCache/index differ diff --git a/.edge-profile-render-1774484525680/Default/DualEngine/SiteList-Consumer.json b/.edge-profile-render-1774484525680/Default/DualEngine/SiteList-Consumer.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/DualEngine/SiteList-Consumer.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/.edge-profile-render-1774484525680/Default/DualEngine/SiteList-Enterprise.json b/.edge-profile-render-1774484525680/Default/DualEngine/SiteList-Enterprise.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/DualEngine/SiteList-Enterprise.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/.edge-profile-render-1774484525680/Default/EdgeCoupons/coupons_data.db/CURRENT b/.edge-profile-render-1774484525680/Default/EdgeCoupons/coupons_data.db/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/EdgeCoupons/coupons_data.db/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile-render-1774484525680/Default/EdgeCoupons/coupons_data.db/LOCK b/.edge-profile-render-1774484525680/Default/EdgeCoupons/coupons_data.db/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/EdgeCoupons/coupons_data.db/LOG b/.edge-profile-render-1774484525680/Default/EdgeCoupons/coupons_data.db/LOG new file mode 100644 index 0000000..a9be593 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/EdgeCoupons/coupons_data.db/LOG @@ -0,0 +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 diff --git a/.edge-profile-render-1774484525680/Default/EdgeCoupons/coupons_data.db/MANIFEST-000001 b/.edge-profile-render-1774484525680/Default/EdgeCoupons/coupons_data.db/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/EdgeCoupons/coupons_data.db/MANIFEST-000001 differ diff --git a/.edge-profile-render-1774484525680/Default/EdgeEDrop/EdgeEDropSQLite.db b/.edge-profile-render-1774484525680/Default/EdgeEDrop/EdgeEDropSQLite.db new file mode 100644 index 0000000..65a59e0 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/EdgeEDrop/EdgeEDropSQLite.db differ diff --git a/.edge-profile-render-1774484525680/Default/EdgeEDrop/EdgeEDropSQLite.db-journal b/.edge-profile-render-1774484525680/Default/EdgeEDrop/EdgeEDropSQLite.db-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/EdgeHubAppUsage/EdgeHubAppUsageSQLite.db b/.edge-profile-render-1774484525680/Default/EdgeHubAppUsage/EdgeHubAppUsageSQLite.db new file mode 100644 index 0000000..2d0a2bb Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/EdgeHubAppUsage/EdgeHubAppUsageSQLite.db differ diff --git a/.edge-profile-render-1774484525680/Default/EdgeHubAppUsage/EdgeHubAppUsageSQLite.db-journal b/.edge-profile-render-1774484525680/Default/EdgeHubAppUsage/EdgeHubAppUsageSQLite.db-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/EdgeJourneys/EdgeJourneys.db b/.edge-profile-render-1774484525680/Default/EdgeJourneys/EdgeJourneys.db new file mode 100644 index 0000000..8ad0e11 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/EdgeJourneys/EdgeJourneys.db differ diff --git a/.edge-profile-render-1774484525680/Default/EdgeJourneys/EdgeJourneys.db-wal b/.edge-profile-render-1774484525680/Default/EdgeJourneys/EdgeJourneys.db-wal new file mode 100644 index 0000000..100a958 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/EdgeJourneys/EdgeJourneys.db-wal differ diff --git a/.edge-profile-render-1774484525680/Default/EdgePushStorageWithConnectTokenAndKey/LOCK b/.edge-profile-render-1774484525680/Default/EdgePushStorageWithConnectTokenAndKey/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/EdgePushStorageWithConnectTokenAndKey/LOG b/.edge-profile-render-1774484525680/Default/EdgePushStorageWithConnectTokenAndKey/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/EdgePushStorageWithConnectTokenAndKey/LOG.old b/.edge-profile-render-1774484525680/Default/EdgePushStorageWithConnectTokenAndKey/LOG.old new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/EntityExtraction/EntityExtractionAssetStore.db/CURRENT b/.edge-profile-render-1774484525680/Default/EntityExtraction/EntityExtractionAssetStore.db/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/EntityExtraction/EntityExtractionAssetStore.db/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile-render-1774484525680/Default/EntityExtraction/EntityExtractionAssetStore.db/LOCK b/.edge-profile-render-1774484525680/Default/EntityExtraction/EntityExtractionAssetStore.db/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/EntityExtraction/EntityExtractionAssetStore.db/LOG b/.edge-profile-render-1774484525680/Default/EntityExtraction/EntityExtractionAssetStore.db/LOG new file mode 100644 index 0000000..6d7c685 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/EntityExtraction/EntityExtractionAssetStore.db/LOG @@ -0,0 +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 diff --git a/.edge-profile-render-1774484525680/Default/EntityExtraction/EntityExtractionAssetStore.db/MANIFEST-000001 b/.edge-profile-render-1774484525680/Default/EntityExtraction/EntityExtractionAssetStore.db/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/EntityExtraction/EntityExtractionAssetStore.db/MANIFEST-000001 differ diff --git a/.edge-profile-render-1774484525680/Default/EntityExtraction/domains_config.json b/.edge-profile-render-1774484525680/Default/EntityExtraction/domains_config.json new file mode 100644 index 0000000..005e7ec --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/EntityExtraction/domains_config.json @@ -0,0 +1 @@ +{"aee_config":{"ar":{"price_regex":{"ae":"(((ae|aed|\\x{062F}\\x{0660}\\x{0625}\\x{0660}|\\x{062F}\\.\\x{0625}|dhs|dh)\\s*\\d{1,3})|(\\d{1,3}\\s*(ae|aed|\\x{062F}\\x{0660}\\x{0625}\\x{0660}|\\x{062F}\\.\\x{0625}|dhs|dh)))","dz":"(((dzd|da|\\x{062F}\\x{062C})\\s*\\d{1,3})|(\\d{1,3}\\s*(dzd|da|\\x{062F}\\x{062C})))","eg":"(((e\\x{00a3}|egp)\\s*\\d{1,3})|(\\d{1,3}\\s*(e\\x{00a3}|egp)))","ma":"(((mad|dhs|dh)\\s*\\d{1,3})|(\\d{1,3}\\s*(mad|dhs|dh)))","sa":"((\\d{1,3}\\s*(sar\\s*\\x{fdfc}|sar|sr|\\x{fdfc}|\\.\\x{0631}\\.\\x{0633}))|((sar\\s*\\x{fdfc}|sar|sr|\\x{fdfc}|\\.\\x{0631}\\.\\x{0633})\\s*\\d{1,3}))"},"product_terms":"((\\x{0623}\\x{0636}\\x{0641}\\s*\\x{0625}\\x{0644}\\x{0649}\\s*\\x{0627}\\x{0644}\\x{0639}\\x{0631}\\x{0628}\\x{0629})|(\\x{0623}\\x{0636}\\x{0641}\\s*\\x{0625}\\x{0644}\\x{0649}\\s*\\x{0627}\\x{0644}\\x{062D}\\x{0642}\\x{064A}\\x{0628}\\x{0629})|(\\x{0627}\\x{0634}\\x{062A}\\x{0631}\\x{064A}\\s*\\x{0627}\\x{0644}\\x{0622}\\x{0646})|(\\x{062E}\\x{064A}\\x{0627}\\x{0631}\\x{0627}\\x{062A}\\s*\\x{0627}\\x{0644}\\x{062A}\\x{0648}\\x{0635}\\x{064A}\\x{0644})|(\\x{0627}\\x{0644}\\x{062A}\\x{0648}\\x{0635}\\x{064A}\\x{0644}\\s*\\x{0641}\\x{064A}\\s*\\x{0646}\\x{0641}\\x{0633}\\s*\\x{0627}\\x{0644}\\x{064A}\\x{0648}\\x{0645}\\s*\\x{0645}\\x{062A}\\x{0627}\\x{062D}))"},"autofill":{"autofill_onnx_model_config":{"autofill_class_map":{"0":"ACCOUNT_CREATION_PASSWORD","1":"ADDRESS_HOME_CITY","10":"CONFIRMATION_PASSWORD","11":"CREDIT_CARD_EXP_2_DIGIT_YEAR","12":"CREDIT_CARD_EXP_4_DIGIT_YEAR","13":"CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR","14":"CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR","15":"CREDIT_CARD_EXP_MONTH","16":"CREDIT_CARD_NAME_FIRST","17":"CREDIT_CARD_NAME_FULL","18":"CREDIT_CARD_NAME_LAST","19":"CREDIT_CARD_NUMBER","2":"ADDRESS_HOME_COUNTRY","20":"CREDIT_CARD_TYPE","21":"CREDIT_CARD_VERIFICATION_CODE","22":"DATE_OF_BIRTH_DAY","23":"DATE_OF_BIRTH_DD_MM_YYYY_DELIM_SLASH","24":"DATE_OF_BIRTH_DD_MM_YY_DELIM_SLASH","25":"DATE_OF_BIRTH_MM_DD_YYYY_DELIM_SLASH","26":"DATE_OF_BIRTH_MM_DD_YY_DELIM_SLASH","27":"DATE_OF_BIRTH_MONTH","28":"DATE_OF_BIRTH_YEAR","29":"EMAIL_ADDRESS","3":"ADDRESS_HOME_LINE1","30":"MERCHANT_PROMO_CODE","31":"NAME_FIRST","32":"NAME_FULL","33":"NAME_LAST","34":"NAME_MIDDLE","35":"NEW_PASSWORD","36":"PASSWORD","37":"PHONE_FAX_NUMBER","38":"PHONE_HOME_CITY_AND_NUMBER","39":"PHONE_HOME_CITY_CODE","4":"ADDRESS_HOME_LINE2","40":"PHONE_HOME_COUNTRY_CODE","41":"PHONE_HOME_EXTENSION","42":"PHONE_HOME_NUMBER","43":"PHONE_HOME_WHOLE_NUMBER","44":"PRICE","45":"PROBABLY_NEW_PASSWORD","46":"SEARCH_TERM","47":"UNKNOWN_TYPE","48":"USERNAME","5":"ADDRESS_HOME_LINE3","6":"ADDRESS_HOME_STATE","7":"ADDRESS_HOME_STREET_ADDRESS","8":"ADDRESS_HOME_ZIP","9":"COMPANY_NAME"},"autofill_class_num":49,"autofill_field_confidence_bar":{"ACCOUNT_CREATION_PASSWORD":"0.6","ADDRESS_HOME_CITY":"0.9","ADDRESS_HOME_COUNTRY":"0.9","ADDRESS_HOME_LINE1":"0.75","ADDRESS_HOME_LINE2":"0.6","ADDRESS_HOME_LINE3":"0.6","ADDRESS_HOME_STATE":"0.6","ADDRESS_HOME_STREET_ADDRESS":"0.6","ADDRESS_HOME_ZIP":"0.6","COMPANY_NAME":"0.9999","CONFIRMATION_PASSWORD":"0.65","CREDIT_CARD_EXP_2_DIGIT_YEAR":"0.75","CREDIT_CARD_EXP_4_DIGIT_YEAR":"0.75","CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR":"0.75","CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR":"0.75","CREDIT_CARD_EXP_MONTH":"0.75","CREDIT_CARD_NAME_FIRST":"0.75","CREDIT_CARD_NAME_FULL":"0.75","CREDIT_CARD_NAME_LAST":"0.75","CREDIT_CARD_NUMBER":"0.75","CREDIT_CARD_TYPE":"0.75","CREDIT_CARD_VERIFICATION_CODE":"0.7","DATE_OF_BIRTH_DAY":"0.9","DATE_OF_BIRTH_DD_MM_YYYY_DELIM_SLASH":"0.9999","DATE_OF_BIRTH_DD_MM_YY_DELIM_SLASH":"0.9999","DATE_OF_BIRTH_MM_DD_YYYY_DELIM_SLASH":"0.9999","DATE_OF_BIRTH_MM_DD_YY_DELIM_SLASH":"0.9999","DATE_OF_BIRTH_MONTH":"0.9","DATE_OF_BIRTH_YEAR":"0.9","EMAIL_ADDRESS":"0.6","MERCHANT_PROMO_CODE":"0.6","NAME_FIRST":"0.6","NAME_FULL":"0.9","NAME_LAST":"0.6","NAME_MIDDLE":"0.6","NEW_PASSWORD":"0.65","PASSWORD":"0.6","PHONE_FAX_NUMBER":"0.9","PHONE_HOME_CITY_AND_NUMBER":"0.9","PHONE_HOME_CITY_CODE":"0.9","PHONE_HOME_COUNTRY_CODE":"0.9","PHONE_HOME_EXTENSION":"0.9","PHONE_HOME_NUMBER":"0.9","PHONE_HOME_WHOLE_NUMBER":"0.9","PRICE":"0.6","PROBABLY_NEW_PASSWORD":"0.6","SEARCH_TERM":"0.6","UNKNOWN_TYPE":"0.6","USERNAME":"0.65"},"autofill_language_confidence_bar":{"default":0.8,"en":0.85},"autofill_max_sequence_length":384,"autofill_sliding_window":256},"model_descriptors":[{"allow_basic_extraction":false,"classification":"Autofill","classification_confidence":1.0,"classifier_model_major_version":"","classifier_model_name":"","engine":"picl","entity_type":"AutofillFull","extraction_scenario":"kProactive","extractor_model_major_version":"1","extractor_model_name":"autofillFull.en-us","page_locale":"en","platform":"desktop"},{"allow_basic_extraction":false,"classification":"Autofill","classification_confidence":1.0,"classifier_model_major_version":"","classifier_model_name":"","engine":"picl","entity_type":"AutofillName","extraction_scenario":"kProactive","extractor_model_major_version":"2","extractor_model_name":"autofillName.en-us","page_locale":"en","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Autofill","classification_confidence":1.0,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"autofillFull","extraction_scenario":"kOnDemand","extractor_model_major_version":"2","extractor_model_name":"onnx.autofill.desktop.en","page_locale":"","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Autofill","classification_confidence":1.0,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"autofillFull","extraction_scenario":"kOnDemand","extractor_model_major_version":"2","extractor_model_name":"onnx.autofill.desktop.ar","page_locale":"ar","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Autofill","classification_confidence":1.0,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"autofillFull","extraction_scenario":"kOnDemand","extractor_model_major_version":"2","extractor_model_name":"onnx.autofill.desktop.cs","page_locale":"cs","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Autofill","classification_confidence":1.0,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"autofillFull","extraction_scenario":"kOnDemand","extractor_model_major_version":"2","extractor_model_name":"onnx.autofill.desktop.de","page_locale":"de","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Autofill","classification_confidence":1.0,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"autofillFull","extraction_scenario":"kOnDemand","extractor_model_major_version":"2","extractor_model_name":"onnx.autofill.desktop.en","page_locale":"en","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Autofill","classification_confidence":1.0,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"autofillFull","extraction_scenario":"kOnDemand","extractor_model_major_version":"2","extractor_model_name":"onnx.autofill.desktop.es","page_locale":"es","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Autofill","classification_confidence":1.0,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"autofillFull","extraction_scenario":"kOnDemand","extractor_model_major_version":"2","extractor_model_name":"onnx.autofill.desktop.fr","page_locale":"fr","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Autofill","classification_confidence":1.0,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"autofillFull","extraction_scenario":"kOnDemand","extractor_model_major_version":"2","extractor_model_name":"onnx.autofill.desktop.id","page_locale":"id","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Autofill","classification_confidence":1.0,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"autofillFull","extraction_scenario":"kOnDemand","extractor_model_major_version":"2","extractor_model_name":"onnx.autofill.desktop.it","page_locale":"it","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Autofill","classification_confidence":1.0,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"autofillFull","extraction_scenario":"kOnDemand","extractor_model_major_version":"2","extractor_model_name":"onnx.autofill.desktop.ja","page_locale":"ja","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Autofill","classification_confidence":1.0,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"autofillFull","extraction_scenario":"kOnDemand","extractor_model_major_version":"2","extractor_model_name":"onnx.autofill.desktop.ko","page_locale":"ko","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Autofill","classification_confidence":1.0,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"autofillFull","extraction_scenario":"kOnDemand","extractor_model_major_version":"2","extractor_model_name":"onnx.autofill.desktop.nl","page_locale":"nl","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Autofill","classification_confidence":1.0,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"autofillFull","extraction_scenario":"kOnDemand","extractor_model_major_version":"2","extractor_model_name":"onnx.autofill.desktop.pl","page_locale":"pl","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Autofill","classification_confidence":1.0,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"autofillFull","extraction_scenario":"kOnDemand","extractor_model_major_version":"2","extractor_model_name":"onnx.autofill.desktop.pt","page_locale":"pt","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Autofill","classification_confidence":1.0,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"autofillFull","extraction_scenario":"kOnDemand","extractor_model_major_version":"2","extractor_model_name":"onnx.autofill.desktop.ru","page_locale":"ru","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Autofill","classification_confidence":1.0,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"autofillFull","extraction_scenario":"kOnDemand","extractor_model_major_version":"2","extractor_model_name":"onnx.autofill.desktop.sv","page_locale":"sv","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Autofill","classification_confidence":1.0,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"autofillFull","extraction_scenario":"kOnDemand","extractor_model_major_version":"2","extractor_model_name":"onnx.autofill.desktop.tr","page_locale":"tr","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Autofill","classification_confidence":1.0,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"autofillFull","extraction_scenario":"kOnDemand","extractor_model_major_version":"2","extractor_model_name":"onnx.autofill.desktop.vi","page_locale":"vi","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Autofill","classification_confidence":1.0,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"autofillFull","extraction_scenario":"kOnDemand","extractor_model_major_version":"2","extractor_model_name":"onnx.autofill.desktop.zh","page_locale":"zh","platform":"desktop"}]},"bg":{"price_regex":{"bg":"((\\d{1,3}\\s*(bgn|\\x{043B}\\x{0432}|\\x{043B}\\x{0432}\\.))|((bgn|\\x{043B}\\x{0432}|\\x{043B}\\x{0432}\\.)\\s*\\d{1,3}))"},"product_terms":"((\\x{0414}\\x{043E}\\x{0431}\\x{0430}\\x{0432}\\x{0438}\\s*\\x{0432}\\s*\\x{043A}\\x{043E}\\x{0448}\\x{043D}\\x{0438}\\x{0446}\\x{0430}\\x{0442}\\x{0430})|(\\x{0414}\\x{043E}\\x{0431}\\x{0430}\\x{0432}\\x{0438}\\s*\\x{0432}\\s*\\x{043A}\\x{043E}\\x{043B}\\x{0438}\\x{0447}\\x{043A}\\x{0430}\\x{0442}\\x{0430})|(\\x{0414}\\x{0440}\\x{0443}\\x{0433}\\x{0438}\\s*\\x{043E}\\x{0444}\\x{0435}\\x{0440}\\x{0442}\\x{0438})|(\\x{041F}\\x{043E}\\x{0434}\\x{043E}\\x{0431}\\x{043D}\\x{0438}\\s*\\x{043F}\\x{0440}\\x{043E}\\x{0434}\\x{0443}\\x{043A}\\x{0442}\\x{0438})|(\\x{0412}\\s*\\x{043D}\\x{0430}\\x{043B}\\x{0438}\\x{0447}\\x{043D}\\x{043E}\\x{0441}\\x{0442})|(\\x{041E}\\x{043F}\\x{0438}\\x{0441}\\x{0430}\\x{043D}\\x{0438}\\x{0435}\\s*\\x{043D}\\x{0430}\\s*\\x{043F}\\x{0440}\\x{043E}\\x{0434}\\x{0443}\\x{043A}\\x{0442}\\x{0430}))"},"bs":{"price_regex":{"ba":"((\\d{1,3}\\s*(bam|km|,-\\s*km))|((bam|km|,-\\s*km)\\s*\\d{1,3}))"},"product_terms":"((dodajte\\s*u\\s*korpu)|(dodaj\\s*u\\s*korpu)|(u\\s*ko\\x{0161}aricu)|(sli\\x{010D}nim\\s*proizvodima)|(opcije\\s*dostave)|(u\\s*prodavnici))"},"character_cutoff":400,"cs":{"price_regex":{"cz":"((\\d{1,3}\\s*(czk|k\\x{010D}))|((czk|k\\x{010D})\\s*\\d{1,3}))"},"product_terms":"((p\\x{0159}idat\\s*do\\s*n\\x{00E1}kupn\\x{00ED}ho\\s*ko\\x{0161}\\x{00ED}ku)|(do\\s*ko\\x{0161}\\x{00ED}ku)|(koupit)|(detaily\\s*o\\s*v\\x{00FD}robku)|(skladem)|(doprava\\s*zdarma))"},"currency_symbol_regex_map":{"AED":"\\x{0625}|\\x{062F}\\x{002E}\\x{0625}|\\x{062f}\\x{0631}\\x{0647}\\x{0645}","AFN":"\\x{060b}","AMD":"\\x{0534}|\\x{058F}","AWG":"\\x{0192}","AZN":"\\x{043C}\\x{0430}\\x{043D}","BDT":"\\x{09F3}","BGN":"\\x{043B}\\x{0432}","BHD":"\\x{0628}\\x{002E}\\x{062F}","DZD":"\\x{062f}\\x{064a}\\x{0646}\\x{0627}\\x{0631}","EGP":"\\x{062c}\\x{0646}\\x{064a}\\x{0647}","IQD":"\\x{0639}\\x{002E}\\x{062F}|\\x{062f}\\x{002E}\\x{0639}","JOD":"\\x{062F}\\x{002E}\\x{0627}","KHR":"\\x{17DB}","KRW":"\\x{ffe6}","KWD":"\\x{062F}\\x{002E}\\x{0643}|\\x{062f}\\x{064a}\\x{0646}\\x{0627}\\x{0631}\\s*\\x{0643}\\x{0648}\\x{064a}\\x{062a}\\x{064a}","KZT":"\\x{3012}","LBP":"\\x{0644}\\x{002E}\\x{0644}\\x{002E}?","MAD":"\\x{062F}\\x{002E}\\x{0645}\\x{002E}","MVR":"\\x{0783}\\x{002E}","OMR":"\\x{0631}\\x{002E}\\x{0639}\\x{002E}|\\x{0631}\\x{064a}\\x{0627}\\x{0644}","PLN":"z\\x{0142}","QAR":"\\x{0631}\\x{002E}\\x{0642}","RUB":"\\x{0440}\\x{0443}\\x{0431}","SAR":"\\x{0631}\\x{002E}\\x{0633}|\\x{0631}\\x{0633}|\\x{fdfc}","SYP":"\\x{0644}\\x{002E}\\x{0633}","THB":"\\x{0e1a}\\x{0e32}\\x{0e17}|\\x{0e3f}","TOP":"\\x{062F}\\x{002E}\\x{062A}","WON":"\\x{C6D0}","YEN":"\\x{5186}","YER":"\\x{0631}\\x{002E}\\x{064a}"},"da":{"price_regex":{"dk":"((\\d{1,3}\\s*(dkk|kr|,-))|((dkk|kr|,-)\\s*\\d{1,3}))"},"product_terms":"((l\\x{00E6}g\\s*i\\s*indk\\x{00F8}bskurv)|(lignende\\s*produkter)|(produktinformation)|(gratis\\s*levering)|(l\\x{00E6}g\\s*i\\s*kurv)|(tilf\\x{00F8}j\\s*til\\s*kurv)|(l\\x{00E6}g\\s*i\\s*indk\\x{00F8}bskurv)|(s\\x{00E6}lg\\s*tilbage)|(lignende\\s*produkter)|(hurtigere\\s*levering)|(levering)|(v\\x{00E6}lg\\s*varehus)|(k\\x{00F8}b)|(p\\x{00E5}\\s*lager)|(fri\\s*levering)|(fri\\s*fragt)|(returnering)|(\\d+\\s*anmeldelser))"},"de":{"price_regex":{"at":"((\\d{1,3}\\s*(eur|\\x{20ac}))|((eur|\\x{20ac})\\s*\\d{1,3}))","ch":"((\\d{1,3}\\s*(sfr\\.|fr\\.|chf|\\x{20a3}))|((sfr\\.|fr\\.|chf|\\x{20a3})\\s*\\d{1,3}))","de":"((\\d{1,3}\\s*(eur|\\x{20ac}))|((eur|\\x{20ac})\\s*\\d{1,3}))","li":"((\\d{1,3}\\s*(chf|\\x{20a3}))|((chf|\\x{20a3})\\s*\\d{1,3}))","lu":"((\\d{1,3}\\s*(eur|\\x{20ac}))|((eur|\\x{20ac})\\s*\\d{1,3}))"},"product_terms":"((in\\s*den\\s*warenkorb)|(in\\s*den\\s*kaufswagen\\s*hinzufügen)|(in\\s*den\\s*einkaufswagen\\s*hinzufügen)|(zum\\s*tasche\\s*hinzufügen)|(kauft\\s*es\\s*jetzt)|(jetzt\\s*kaufen)|(kostenlose\\s*lieferung)|(gratisversand)|(voraussichtliche\\s*lieferung)|(vergriffen)|(auf\\s*lager)|(ausverkauft)|(auf\\s*die\\s*liste)|((schnellster|express|lkw|für|zu hause)|(standard\\s*versand)|(versand\\s*es)|(finden sie\\s*in\\s*einemanderen\\s*geschäft)|(( bordsteinkante | abholung|im)\\s*laden)|((abholung|am)\\s*straßenrand)|(auf\\s*die\\s*(liste| wunchzettel | registrierung))|(nur\\s*\\d{1,3}\\s*noch)|(produkt\\s*(informationen|details| übersicht | spezifikationen))|(abholung\\s*vor\\s*ort)|(spezielle \\s* angebote)|(versand\\s* verfügbarkeit)|(größentabelle)|(über\\s*produkt)|(könnten\\s*ihnen\\s*auch\\s*gefallen)|(im\\s*geschäft\\s*finden)|(auch\\s* verfügbar)|(auf\\s*lager)|(über \\s*diese\\s*produkt)|(verfügbarkeit\\s*prüfen)|(fahrzeugdaten)|(fahrzeugeigenschaften)|(kontakt \\s*händler)|(verfügbarkeit\\s*bestätigen)|(fahrzeuginformationen)))"},"default_locale_map":{"bg":"bg-bg","bs":"bs-ba","cs":"cs-cz","da":"da-dk","de":"de-de","el":"el-gr","en":"en-us","es":"es-mx","et":"et-ee","fa":"fa-ir","fi":"fi-fi","fr":"fr-fr","he":"he-il","hr":"hr-hr","hu":"hu-hu","id":"id-id","is":"is-is","it":"it-it","ja":"ja-jp","ko":"ko-kr","lt":"lt-lt","lv":"lv-lv","mk":"mk-mk","nb":"nb-no","nl":"nl-nl","no":"no-no","pl":"pl-pl","pt":"pt-pt","ro":"ro-ro","ru":"ru-ru","sk":"sk-sk","sl":"sl-si","sr":"sr-rs","sv":"sv-se","th":"th-th","tr":"tr-tr","ua":"ua-ua","vi":"vi-vn","zh":"zh-cn"},"domain_page_locales":{"ajio.com":"en-in","asda.com":"en-gb","bigbasket.com":"en-in","blakelyclothing.com":"en-gb","boat-lifestyle.com":"en-in","dangdang.com":"zh-cn","discogs.com":"en-gb","diy.com":"en-gb","elpalaciodehierro.com":"es-mx","elsotano.com":"es-mx","enviaflores.com":"es-mx","fabindia.com":"en-in","fahorro.com":"es-mx","firstcry.com":"en-in","flipkart.com":"en-in","fnp.com":"en-in","grandandtoy.com":"en-ca","innovasport.com":"es-mx","intercompras.com":"es-mx","jianke.com":"zh-cn","kaola.com.hk":"zh-cn","kongfz.com":"zh-cn","mairuan.com":"zh-cn","marks.com":"en-ca","modicare.com":"en-in","moglix.com":"en-in","myntra.com":"en-in","netmeds.com":"en-in","nordstrom.com":"en-us","nordstromrack.com":"en-us","pcel.com":"es-mx","primor.eu":"es-es","princessauto.com":"en-ca","prohockeylife.com":"en-ca","rappi.com.mx":"es-mx","reitmans.com":"en-ca","sanborns.com.mx":"es-mx","sastasundar.com":"en-in","screwfix.com":"en-gb","shopclues.com":"en-in","shopperstop.com":"en-in","snapdeal.com":"en-in","soriana.com":"es-mx","suning.com":"zh-cn","superdrug.com":"en-gb","tatacliq.com":"en-in","tesco.com":"en-gb","tiendapanini.com.mx":"es-mx","todocoleccion.net":"es-es","waitrose.com":"en-gb","waitrosecellar.com":"en-gb"},"ee_timeout_threshold_seconds":5,"el":{"price_regex":{"cy":"((\\d{1,3}\\s*(eur|\\x{20ac}))|((eur|\\x{20ac})\\s*\\d{1,3}))","gr":"((\\d{1,3}\\s*(eur|\\x{20ac}))|((eur|\\x{20ac})\\s*\\d{1,3}))"},"product_terms":"((\\x{03A0}\\x{03C1}\\x{03BF}\\x{03C3}\\x{03B8}\\x{03AE}\\x{03BA}\\x{03B7})|(\\x{0391}\\x{03A0}\\x{039F}\\x{03A3}\\x{03A4}\\x{039F}\\x{039B}\\x{0397}\\s*\\x{039A}\\x{0391}\\x{0399}\\s*\\x{03A0}\\x{039B}\\x{0397}\\x{03A1}\\x{03A9}\\x{039C}\\x{0397})|(\\x{0394}\\x{0399}\\x{0391}\\x{0398}\\x{0395}\\x{03A3}\\x{0399}\\x{039C}\\x{039F}\\x{03A4}\\x{0397}\\x{03A4}\\x{0391}\\s*\\x{039A}\\x{0391}\\x{03A4}\\x{0391}\\x{03A3}\\x{03A4}\\x{0397}\\x{039C}\\x{0391}\\x{03A4}\\x{039F}\\x{03A3}))"},"en":{"price_regex":{"ae":"(((ae|aed|\\x{062F}\\x{0660}\\x{0625}\\x{0660})\\s*\\d{1,3})|(\\d{1,3}\\s*(ae|aed|\\x{062F}\\x{0660}\\x{0625}\\x{0660})))","am":"(((\\x{058F}|amd)\\s*\\d{1,3})|(\\d{1,3}\\s*(\\x{058F}|amd)))","au":"(((\\$|au|aud)\\s*\\d{1,3})|(\\d{1,3}\\s*(\\$|au|aud)))","aw":"(((awg|\\x{0192})\\s*\\d{1,3})|(\\d{1,3}\\s*(awg|\\x{0192})))","az":"(((\\x{20BC}|azn|m)\\s*\\d{1,3})|(\\d{1,3}\\s*(\\x{20BC}|azn|m)))","bd":"(((bdt\\s*\\x{09f3}|bdt|\\x{09f3})\\s*\\d{1,3})|(\\d{1,3}\\s*(bdt\\s*\\x{09f3}|bdt|\\x{09f3})))","bn":"(((bnd|b\\$)\\s*\\d{1,3})|(\\d{1,3}\\s*(bnd|b\\$)))","bs":"(((\\$|b\\$)\\s*\\d{1,3})|(\\d{1,3}\\s*(\\$|b\\$)))","bz":"(((bzd\\$|bzd|bz\\$|bz|\\$)\\s*\\d{1,3})|(\\d{1,3}\\s*(bzd\\$|bzd|bz\\$|bz|\\$)))","ca":"(((\\$|cdn|(c\\s*\\$))\\s*\\d{1,3})|(\\d{1,3}\\s*(\\$|cdn|(c\\s*\\$)))","cy":"((\\d{1,3}\\s*(eur|\\x{20ac}))|((eur|\\x{20ac})\\s*\\d{1,3}))","cz":"((\\d{1,3}\\s*(czk|k\\x{010D}))|((czk|k\\x{010D})\\s*\\d{1,3}))","de":"((\\d{1,3}\\s*(eur|\\x{20ac}))|((eur|\\x{20ac})\\s*\\d{1,3}))","dk":"((\\d{1,3}\\s*(dkk|kr|,-))|((dkk|kr|,-)\\s*\\d{1,3}))","dm":"(((xcd|\\$)\\s*\\d{1,3})|(\\d{1,3}\\s*(xcd|\\$)))","dz":"(((dzd|da|\\x{062F}\\x{062C})\\s*\\d{1,3})|(\\d{1,3}\\s*(dzd|da|\\x{062F}\\x{062C})))","eg":"(((e\\x{00a3}|egp)\\s*\\d{1,3})|(\\d{1,3}\\s*(e\\x{00a3}|egp)))","et":"(((br|etb)\\s*\\d{1,3})|(\\d{1,3}\\s*(br|etb)))","fi":"((\\d{1,3}\\s*(eur|\\x{20ac}))|((eur|\\x{20ac})\\s*\\d{1,3}))","gb":"(((\\x{00a3}|gbp)\\s*\\d{1,3})|(\\d{1,3}\\s*(\\x{00a3}|gbp)))","ge":"(((\\x{10DA}|gel)\\s*\\d{1,3})|(\\d{1,3}\\s*(\\x{10DA}|gel)))","gh":"((\\d{1,3}\\s*(ghs|gh\\x{00A2}|gh\\x{20B5}|\\x{20B5}|\\x{00A2}))|((ghs|gh\\x{00A2}|gh\\x{20B5}|\\x{20B5}|\\x{00A2})\\s*\\d{1,3}))","gm":"(((gmd|d)\\s*\\d{1,3})|(\\d{1,3}\\s*(gmd|d)))","gr":"((\\d{1,3}\\s*(eur|\\x{20ac}))|((eur|\\x{20ac})\\s*\\d{1,3}))","gu":"(((\\$|usd)\\s*\\d{1,3})|(\\d{1,3}\\s*(\\$|usd)))","gy":"(((\\$|gy|gyd)\\s*\\d{1,3})|(\\d{1,3}\\s*(\\$|gy|gyd)))","hk":"((\\d{1,3}\\s*(\\$|\\x{5143}))|((\\x{ffe5}|\\x{00a5}|hkd|\\$)\\s*\\d{1,3}))","hu":"(((ft|huf)\\s*\\d{1,3})|(\\d{1,3}\\s*(ft|huf)))","id":"(((rp|ind)\\s*\\d{1,3})|(\\d{1,3}\\s*(rp|ind)))","ie":"((\\d{1,3}\\s*(eur|\\x{20ac}))|((eur|\\x{20ac})\\s*\\d{1,3}))","il":"((\\d{1,3}\\s*(ils|\\x{20AA}))|((ils|\\x{20AA})\\s*\\d{1,3}))","in":"(((\\x{20B9}|rs|rs\\.)\\s*\\d{1,3})|(\\d{1,3}\\s*(\\x{20B9}|rs|rs\\.)))","jm":"(((jmd\\s*\\$|jmd|\\$)\\s*\\d{1,3})|(\\d{1,3}\\s*(jmd\\s*\\$|jmd|\\$)))","ke":"(((kes|ksh|k)\\s*\\d{1,3})|(\\d{1,3}\\s*(kes|ksh|k)))","kg":"(((kgs|\\x{041B}\\x{0432})\\s*\\d{1,3})|(\\d{1,3}\\s*(kgs|\\x{041B}\\x{0432})))","ky":"(((\\$|ky|kyd)\\s*\\d{1,3})|(\\d{1,3}\\s*(\\$|ky|kyd)))","lb":"((\\d{1,3}\\s*(lbp\\s*\\x{00a3}|lbp|\\x{00a3}\\s*l|\\x{00a3}))|((lbp\\s*\\x{00a3}|lbp|\\x{00a3}\\s*l|\\x{00a3})\\s*\\d{1,3}))","lk":"(((lkr|rs\\/.|rs|\\x{0BB0}\\x{0BC2}|\\x{0DBB}\\x{0DD4})\\s*\\d{1,3})|(\\d{1,3}\\s*(lkr|rs\\/.|rs|\\x{0BB0}\\x{0BC2}|\\x{0DBB}\\x{0DD4})))","ls":"(((lsl|m)\\s*\\d{1,3})|(\\d{1,3}\\s*(lsl|m)))","ly":"(((lyd|\\x{0644}\\x{002E}\\x{062F}|ld)\\s*\\d{1,3})|(\\d{1,3}\\s*(lyd|\\x{0644}\\x{002E}\\x{062F}|ld)))","ma":"(((mad|dhs|dh)\\s*\\d{1,3})|(\\d{1,3}\\s*(mad|dhs|dh)))","md":"(((mdl\\s*l|mdl|lei|l)\\s*\\d{1,3})|(\\d{1,3}\\s*(mdl\\s*l|mdl|lei|l)))","mn":"(((mnt|\\x{20AE})\\s*\\d{1,3})|(\\d{1,3}\\s*(mnt|\\x{20AE})))","mt":"((\\d{1,3}\\s*(eur|\\x{20ac}))|((eur|\\x{20ac})\\s*\\d{1,3}))","mv":"(((mvr|mrf|rf)\\s*\\d{1,3})|(\\d{1,3}\\s*(mvr|mrf|rf)))","my":"(((rm|myr)\\s*\\d{1,3})|(\\d{1,3}\\s*(rm|myr)))","ng":"(((ngn|ng|\\x{20a6})\\s*\\d{1,3})|(\\d{1,3}\\s*(ngn|ng|\\x{20a6})))","np":"(((npr\\s*rs|npr|rs\\/.|re\\/.|rs|re)\\s*\\d{1,3})|(\\d{1,3}\\s*(npr\\s*rs|npr|rs\\/.|re\\/.|rs|re)))","nz":"(((nz\\$|nzd|\\$)\\s*\\d{1,3})|(\\d{1,3}\\s*(nz\\$|nzd|\\$)))","pg":"(((pgk|k)\\s*\\d{1,3})|(\\d{1,3}\\s*(pgk|k)))","ph":"((\\d{1,3}\\s*(\\x{20b1}|php))|((\\x{20b1}|php)\\s*\\d{1,3}))","pk":"(((rs|pk|pkr)\\s*\\d{1,3})|(\\d{1,3}\\s*(rs|pk|pkr)))","pr":"(((\\$|usd)\\s*\\d{1,3})|(\\d{1,3}\\s*(\\$|usd)))","sa":"((\\d{1,3}\\s*(sar\\s*\\x{fdfc}|sar|sr|\\x{fdfc}|\\.\\x{0631}\\.\\x{0633}))|((sar\\s*\\x{fdfc}|sar|sr|\\x{fdfc}|\\.\\x{0631}\\.\\x{0633})\\s*\\d{1,3}))","sg":"(((s\\$|sgd|\\$)\\s*\\d{1,3})|(\\d{1,3}\\s*(s\\$|sgd|\\$)))","sk":"((\\d{1,3}\\s*(eur|\\x{20ac}))|((eur|\\x{20ac})\\s*\\d{1,3}))","th":"(((thb|\\x{0e3f})\\s*\\d{1,3})|(\\d{1,3}\\s*(thb|\\x{0e3f})))","tj":"(((tjs|\\x{0405}\\x{041C})\\s*\\d{1,3})|(\\d{1,3}\\s*(tjs|\\x{0405}\\x{041C})))","tt":"(((\\$|ttd)\\s*\\d{1,3})|(\\d{1,3}\\s*(\\$|ttd)))","us":"(((\\$|usd)\\s*\\d{1,3})|(\\d{1,3}\\s*(\\$|usd)))","vn":"(((vnd|\\x{20ab})\\s*\\d{1,3})|(\\d{1,3}\\s*(vnd|\\x{20ab})))","za":"(((r|zar)\\s*\\d{1,3})|(\\d{1,3}\\s*(r|zar)))"},"product_terms":"((add\\s*to\\s*cart)|(add\\s*to\\s*basket)|(add\\s*to\\s*bag))"},"equivalent_locale_map":{"-tw":"zh-tw","en-gb-au":"en-au","en-gb-ca":"en-ca","en-gb-gb":"en-gb","en-gb-in":"en-in","us-en":"en-us","zh-hans-cn":"zh-cn","zh-hant":"zh-tw"},"es":{"price_regex":{"ar":"(((\\$|ars)\\s*\\d{1,3})|(\\d{1,3}\\s*(\\$|ars)))","bo":"(((\\$b|bob|bs)\\s*\\d{1,3})|(\\d{1,3}\\s*(\\$b|bob|bs)))","cl":"(((cl\\$|clp|\\$)\\s*\\d{1,3})|(\\d{1,3}\\s*(cl\\$|clp|\\$)))","co":"(((\\$|cop)\\s*\\d{1,3})|(\\d{1,3}\\s*(\\$|cop)))","cr":"(((\\x{20a1}|crc)\\s*\\d{1,3})|(\\d{1,3}\\s*(\\x{20a1}|crc)))","do":"(((\\$|dop)\\s*\\d{1,3})|(\\d{1,3}\\s*(\\$|dop)))","ec":"(((\\$|usd)\\s*\\d{1,3})|(\\d{1,3}\\s*(\\$|usd)))","es":"((\\d{1,3}\\s*(eur|\\x{20ac}))|((eur|\\x{20ac})\\s*\\d{1,3}))","gt":"(((q|gt)\\s*\\d{1,3})|(\\d{1,3}\\s*(q|gt)))","hn":"(((l|hn)\\s*\\d{1,3})|(\\d{1,3}\\s*(l|hn)))","mx":"((\\d{1,3}\\s*(\\x{0024}\\s*mxn|\\x{0024}|mxn|mex\\s*\\x{0024}))|((\\x{0024}\\s*mxn|\\x{0024}|mxn|mex\\s*\\x{0024})\\s*\\d{1,3}))","ni":"((\\d{1,3}\\s*(nio|c\\$))|((nio|c\\$)\\s*\\d{1,3}))","pa":"(((pab|b\\/.)\\s*\\d{1,3})|(\\d{1,3}\\s*(pab|b\\/.)))","pe":"(((s\\/|sol|pen)\\s*\\d{1,3})|(\\d{1,3}\\s*(s\\/|sol|pen)))","pr":"(((\\$|usd)\\s*\\d{1,3})|(\\d{1,3}\\s*(\\$|usd)))","py":"(((pyg|gs)\\s*\\d{1,3})|(\\d{1,3}\\s*(pyg|gs)))","sv":"((\\d{1,3}\\s*(svc|\\x{20a1}|\\$))|((svc|\\x{20a1}|\\$)\\s*\\d{1,3}))","us":"(((\\$|usd)\\s*\\d{1,3})|(\\d{1,3}\\s*(\\$|usd)))","uy":"(((uyu|\\$u)\\s*\\d{1,3})|(\\d{1,3}\\s*(uyu|\\$u)))","ve":"(((bs\\s*f|bs\\.\\s*f|bs\\.|vef|\\$)\\s*\\d{1,3})|(\\d{1,3}\\s*(bs\\s*f|bs\\.\\s*f|bs\\.|vef|\\$)))"},"product_terms":"((\\x{00a1}c\\x{00f3}mpralo\\s*ya!)|(a\\x{00f1}adir\\s*al\\s*carro)|(a\\x{00f1}adido\\s*a\\s*su\\s*lista\\s*de\\s*deseos)|(a\\x{00f1}adir\\s*a\\s*favoritos)|(a\\x{00f1}adir\\s*a\\s*la\\s*bolsa)|(a\\x{00f1}adir\\s*a\\s*la\\s*cesta)|(a\\x{00f1}adir\\s*a\\s*la\\s*lista\\s*de\\s*deseos)|(a\\x{00f1}adir\\s*a\\s*mi\\s*bolsa)|(a\\x{00f1}adir\\s*a\\s*mi\\s*cesta)|(a\\x{00f1}adir\\s*a\\s*mi\\s*lista\\s*de\\s*deseos)|(a\\x{00f1}adir\\s*al\\s*carrito)|(buscar\\s*tienda)|(comprar\\s*en\\s*un\\s*clic)|(comprar\\s*ya)|(comprobar\\s*disponibilidad\\s*en\\s*tienda)|(consultar\\s*disponibilidad\\s*en\\s*tienda)|(descripci\\x{00f3}n\\s*del\\s*producto)|(detalles\\s*del\\s*producto)|(env\\x{00ed}o\\s*gratuito)|(evaluaciones\\s*de\\s*clientes)|(informaci\\x{00f3}n\\s*de\\s*producto)|(informaci\\x{00f3}n\\s*del\\s*producto)|(ir\\s*al\\s*carro)|(ir\\s*al\\s*chollo)|(nuestros\\s*clientes\\s*tambi\\x{00e9}n\\s*vieron)|(opiniones\\s*de\\s*los\\s*usuarios)|(productos\\s*relacionados)|(productos\\s*relacionados)|(productos\\s*similares)|(puja\\s*actual)|(recoger\\s*en\\s*tienda)|(sin\\s*existencias)|(valora\\s*este\\s*producto)|(valoraciones\\s*de\\s*clientes)|(comprar\\s*ahora))"},"et":{"price_regex":{"ee":"((\\d{1,3}\\s*(eur|\\x{20ac}))|((eur|\\x{20ac})\\s*\\d{1,3}))"},"product_terms":"((lisa\\s*korvi)|(osta)|(tarne\\s*v\\x{00F5}imalused)|(tootekirjeldus)|(sarnased\\s*tooted))"},"fa":{"price_regex":{"ir":"((\\d{1,3}\\s*(irr|\\x{FDFC}|\\x{0631}\\x{06CC}\\x{0627}\\x{0644}|\\x{062A}\\x{0648}\\x{0645}\\x{0627}\\x{0646}))|((irr|\\x{FDFC}|\\x{0631}\\x{06CC}\\x{0627}\\x{0644}|\\x{062A}\\x{0648}\\x{0645}\\x{0627}\\x{0646})\\s*\\d{1,3}))"},"product_terms":"((\\x{0627}\\x{0641}\\x{0632}\\x{0648}\\x{062F}\\x{0646}\\s*\\x{0628}\\x{0647}\\s*\\x{0633}\\x{0628}\\x{062F})|(\\x{0627}\\x{0631}\\x{0633}\\x{0627}\\x{0644}\\s*\\x{0631}\\x{0627}\\x{06CC}\\x{06AF}\\x{0627}\\x{0646})|(\\x{062E}\\x{0631}\\x{06CC}\\x{062F}\\s*\\x{0627}\\x{06CC}\\x{0646}\\x{062A}\\x{0631}\\x{0646}\\x{062A}\\x{06CC})|(\\x{062A}\\x{063A}\\x{06CC}\\x{06CC}\\x{0631}\\x{0627}\\x{062A}\\s*\\x{0642}\\x{06CC}\\x{0645}\\x{062A})|(\\x{0645}\\x{062D}\\x{0635}\\x{0648}\\x{0644}\\x{0627}\\x{062A}\\s*\\x{0645}\\x{0634}\\x{0627}\\x{0628}\\x{0647}))"},"fi":{"price_regex":{"fi":"((\\d{1,3}\\s*(eur|\\x{20ac}))|((eur|\\x{20ac})\\s*\\d{1,3}))"},"product_terms":"((lis\\x{00E4}\\x{00E4}\\s*ostoskoriin)|(myym\\x{00E4}l\\x{00E4}saatavuus)|(toimituskulut)|(tilaa\\s*netist\\x{00E4})|(nouda\\s*myym\\x{00E4}l\\x{00E4}st\\x{00E4}))"},"fr":{"price_regex":{"be":"((\\d{1,3}\\s*(eur|\\x{20ac}))|((eur|\\x{20ac})\\s*\\d{1,3}))","ca":"(((\\$|cdn|(c\\s*\\$))\\s*\\d{1,3})|(\\d{1,3}\\s*(\\$|cdn|(c\\s*\\$)))","cd":"(((cdf|fc|\\x{20A3})\\s*\\d{1,3})|(\\d{1,3}\\s*(cdf|fc|\\x{20A3})))","ch":"((\\d{1,3}\\s*(sfr\\.|fr\\.|chf|\\x{20a3}))|((sfr\\.|fr\\.|chf|\\x{20a3})\\s*\\d{1,3}))","dz":"(((dzd|da|\\x{062F}\\x{062C})\\s*\\d{1,3})|(\\d{1,3}\\s*(dzd|da|\\x{062F}\\x{062C})))","fr":"((\\d{1,3}\\s*(eur|\\x{20ac}))|((eur|\\x{20ac})\\s*\\d{1,3}))","gf":"((\\d{1,3}\\s*(eur|\\x{20ac}))|((eur|\\x{20ac})\\s*\\d{1,3}))","gh":"((\\d{1,3}\\s*(ghs|gh\\x{00A2}|gh\\x{20B5}|\\x{20B5}|\\x{00A2}))|((ghs|gh\\x{00A2}|gh\\x{20B5}|\\x{20B5}|\\x{00A2})\\s*\\d{1,3}))","gn":"(((gnf|fg|fr|gfr|\\x{20A3})\\s*\\d{1,3})|(\\d{1,3}\\s*(gnf|fg|fr|gfr|\\x{20A3})))","ht":"((\\d{1,3}\\s*(htg|g))|((htg|g)\\s*\\d{1,3}))","lb":"((\\d{1,3}\\s*(lbp\\s*\\x{00a3}|lbp|\\x{00a3}\\s*l|\\x{00a3}))|((lbp\\s*\\x{00a3}|lbp|\\x{00a3}\\s*l|\\x{00a3})\\s*\\d{1,3}))","li":"((\\d{1,3}\\s*(chf|\\x{20a3}))|((chf|\\x{20a3})\\s*\\d{1,3}))","lu":"((\\d{1,3}\\s*(eur|\\x{20ac}))|((eur|\\x{20ac})\\s*\\d{1,3}))","ma":"(((mad|dhs|dh)\\s*\\d{1,3})|(\\d{1,3}\\s*(mad|dhs|dh)))","mc":"((\\d{1,3}\\s*(eur|\\x{20ac}))|((eur|\\x{20ac})\\s*\\d{1,3}))","mq":"(((mga|ar)\\s*\\d{1,3})|(\\d{1,3}\\s*(mga|ar)))","mr":"(((mru|um)\\s*\\d{1,3})|(\\d{1,3}\\s*(mru|um)))","nc":"(((xpf|\\x{20A3}|f)\\s*\\d{1,3})|(\\d{1,3}\\s*(xpf|\\x{20A3}|f)))","pf":"(((xpf|\\x{20A3}|f)\\s*\\d{1,3})|(\\d{1,3}\\s*(xpf|\\x{20A3}|f)))","re":"((\\d{1,3}\\s*(eur|\\x{20ac}))|((eur|\\x{20ac})\\s*\\d{1,3}))"},"product_terms":"((ajouter\\s*au\\s*panier)|(ajoutez\\s*au\\s*panier)|(ajoutez\\s*au\\s*sac)|(achetez\\s*le\\s*maintenant)|(achetez\\s*maintenant)|(livraison\\s*gratuite)|(expédition\\s*gratuite)|(livraison\\s*estimée)|(produit\\s*épuisé)|(en\\s*stock)|(épuisé)|(ajoutez\\s*à\\s*la\\s*wish\\s*list)|(livraison\\s*standard)|(livrez\\s*le)|(trouvez\\s*en\\s*un\\s*autre\\s*boutique)|((ramassage\\s*en\\s*bordure\\s*de\\s*rue)\\s*pour|magasin)|((cueillette\\s*en\\s*bordure\\s*de\\s*rue)\\s*en\\s*boutique)|(ajoutez\\s*à\\s*votre\\s*(liste|votre\\s*wishlist|votre\\s*registre))|((information\\s*de\\s*produit)|(détails\\s*de\\s*Produit)|(aperçu\\s*de\\s*produit)|(spécifications\\s*de\\s*produit))|(cueillette\\s*à\\s*boutique)|(offres\\s*spéciales\\s*disponible)|(accessible\\s*à\\s*livrer)|(guides\\s*des\\s*tailles)|(description\\s*produit)|(vous\\s*pourriez\\s*aussi\\s*aimer)|(trouvez\\s*en\\s*boutique)|(aussi\\s*disponible)|(en\\s*magasin)|(a\\s*propos\\s*de\\s*ce\\s*produit)|(vérifiez\\s*disponibilité)|(détails\\s*de\\s*véhicule)|(caractéristiques\\s*de\\s*véhicule)|(contactez\\s*marchand)|(affirmez\\s*disponibilité)|(information\\s*de\\s*véhicule))"},"he":{"price_regex":{"il":"((\\d{1,3}\\s*(ils|\\x{20AA}))|((ils|\\x{20AA})\\s*\\d{1,3}))"},"product_terms":"((\\x{05D4}\\x{05D5}\\x{05E1}\\x{05D9}\\x{05E4}\\x{05D5}\\s*\\x{05DC}\\x{05E2}\\x{05D2}\\x{05DC}\\x{05D4})|(\\x{05E7}\\x{05E0}\\x{05D5}\\s*\\x{05E2}\\x{05DB}\\x{05E9}\\x{05D9}\\x{05D5}))"},"hr":{"price_regex":{"hr":"((\\d{1,3}\\s*(hrk|kn))|((hrk|kn)\\s*\\d{1,3}))"},"product_terms":"((dodaj\\s*u\\s*ko\\x{0161}aricu)|(dodajte\\s*u\\s*ko\\x{0161}aricu)|(brzo\\s*do\\s*ponude)|(sli\\x{010D}ni\\s*proizvodi)|(podaci\\s*o\\s*proizvodu))"},"hu":{"price_regex":{"hu":"((\\d{1,3}\\s*(huf\\s*ft|huf|ft))|((huf\\s*ft|huf|ft)\\s*\\d{1,3}))"},"product_terms":"((megveszem\\s*most)|(kos(a|\\x{00E1})rba\\s*(teszem){0,1})|(el(e|\\x{00E9})rhet(o|\\x{0151})\\s*sz(a|\\x{00E1})ll(i|\\x{00ED})t(a|\\x{00E1})si\\s*m(o|\\x{00F3})dok)|(boltok\\s*(e|\\x{00E9})s\\s*(a|\\x{00E1})rak)|(ir(a|\\x{00E1})ny\\s*a\\s*bolt)|(term(e|\\x{00E9})kle(i|\\x{00ED})r(a|\\x{00E1})s)|(\\d+\\s*((v(e|\\x{00E9})lem(e|\\x{00E9})ny)|((e|\\x{00E9})rt(e|\\x{00E9)kel(e|\\x{00E9})s)))|(a\\s*sz(a|\\x{00E1})ll(i|\\x{00ED})t(a|\\x{00E1})si\\s*hat(a|\\x{00E1})rid(o|\\x{0151})k\\s*megtekint(e|\\x{00E9})se)|(hozz(a|\\x{00E1})ad(a|\\x{00E1})s)|(v(a|\\x{00E1})s(a|\\x{00E1})roljon\\s*online))"},"is":{"price_regex":{"is":"((\\d{1,3}\\s*(isk|\\x{00CD}kr|kr|,-))|((isk|\\x{00CD}kr|kr|,-)\\s*\\d{1,3}))"},"product_terms":"((b\\x{00E6}ta\\s*vi\\x{00F0}\\s*k\\x{00F6}rfu)|(setja\\s*\\x{00ED}\\s*k\\x{00F6}rfu)|(sendingarkostna\\x{00F0})|(skilareglur)|(til\\s*\\x{00E1}\\s*lager))"},"iso_currency_regex_list":["AED|Dhs|Dh","AFN|Af","AMD","AOA|Kz","ARS","AWG","AZN|M","BAM|KM","BBD|BDS","BDT|Tk","BGN|BGL","BHD","BIF","BND|B\\s*\\$","BOB\\s*\\$b|BOB|\\$b|Bs|Bs\\.","R\\s*\\$|BRL","BSD","BTN|Nu\\.","BWP|P","BYN|Br|\\x{0440}\\.","BZD|BZ","CDF|KMF|FC","CL\\$|CLP","COP","CRC","CUP|\\$MN","CZK|K\\x{010D}|Kc","DJF","DKK|kr","DOP|RD\\$","DZD|DA|\\x{062F}\\x{062C}|\\x{062F}\\x{002E}\\x{062C}","EEK","EGP","ERN|Nfk","ETB","FJD|FJ\\$","FKP","GEL|\\x{10DA}","GHS|GH","GIP","GMD|D","GNF|FG|Fr|GFr","GTQ\\s*Q|GTQ|Q","GYD","HKD|HK\\s*\\$","HNL\\s*L|HNL|L","HRK|kn","HTG|G","HUF\\s*Ft|HUF|Ft","IDR|Rp","ILS","IQD","IRR|\\x{0631}\\x{06CC}\\x{0627}\\x{0644}|\\x{062A}\\x{0648}\\x{0645}\\x{0627}\\x{0646}","ISK|\\x{00CD}kr","JMD","JOD","KES|KSh","KGS|\\x{041B}\\x{0432}|\\x{0441}\\x{043e}\\x{043c}","KHR","KPW","KRW","KWD","KYD","KZT","LAK","LBP","Lek\\x{00EB}|ALL","LEV","LKR|Rs\\/\\.|Rs|\\x{0BB0}\\x{0BC2}|\\x{0DBB}\\x{0DD4}","LRD|LD\\$","LSL|LS","LYD|\\x{0644}\\x{002E}\\x{062F}|LD","MAD","MDL\\s*L|MDL,\\s*LEI|LEI","MGA|Ar","MKD|\\x{0434}\\x{0435}\\x{043D}|\\x{041C}\\x{041A}\\x{0434}","MMK|K","MNT","MOP","MRU|UM","MUR","MVR|MRf|Rf","MWK|MK","MYR|RM","MZN|MTn","NAD|N\\$","NGN","NIO|C\\$","NOK","NPR\\s*Rs|NPR|Re\\/\\.|Re","NZ\\s*\\$|NZD","OMR\\s*\\x{fdfc}|OMR","PAB\\s*B\\/\\.|PAB|B\\/\\.","PGK","PHP","PKR\\s*Rs|PKR","PLN","PYG\\s*Gs|PYG|Gs","QAR","RON","RSD|din|\\x{0414}\\x{0438}\\x{043d}","RUB|p\\.","RWF|FRw","S\\/|S\\.|S\\/\\.|Sol|PEN","S\\s*\\$|SGD","SAR\\s*\\x{fdfc}|SAR|SR","SBD|SI\\$","SCR","SDG","SEK|kkr","SHP","SLL|Le","SOS|Sh\\.So\\.|Sh","SRD","STN|Db","SVC","SYP","SZL","THB","TJS|\\x{0405}\\x{041C}","TMT","TND","TOP|T\\$","TRY|TL|x\\{20BA}","TTD","TWD|NT\\s*\\$","TZS","UAH|\\x{0433}\\x{0440}\\x{043D}","UGX|USh","UYU\\s*\\$U|UYU|\\$U","UZS","VEF|Bs\\.?\\s*f|Bs\\.S\\.","VND","VUV|Vt","WON","WST|T|WS\\$","XAF","XCD","XOF|CFA","XPF|F","YEN","YER","ZAR|R","ZMW|ZK"],"it":{"price_regex":{"ch":"((\\d{1,3}\\s*(sfr\\.|fr\\.|\\x{20a3}|chf))|((sfr\\.|fr\\.|\\x{20a3}|chf)\\s*\\d{1,3}))","it":"((\\d{1,3}\\s*(eur|\\x{20ac}))|((eur|\\x{20ac})\\s*\\d{1,3}))"},"product_terms":"((politica\\s*di\\s*reso)|(spedizione\\s*gratuita)|(\\d+\\s*ordini)|(\\d+\\s*recensioni)|(\\d+\\s*voti)|(venditore)|(disponibilit\\x{00E0}\\s*immediata)|(trova\\s*in\\s*negozio)|(aggiungi)|(aggiungi\\s*al\\s*carrello)|(acquista\\s*ora)|(aggiungi\\s*alla\\s*lista)|(dettagli\\s*prodotto)|(descrizione\\s*prodotto)|(recensioni\\s*de\\s*clienti)|(altri\\s*venditori)|(dettagli\\s*prodotto)|(specifiche\\s*prodotto)|(descrizione\\s*prodotto)|(recensioni\\s*clienti)|(consegna\\s*stimata)|(soddisfatti\\s*o\\s*rimborsati)|(prodotti\\s*correlati)|(in\\s*negozio)|(consegna)|(seleziona\\s*il\\s*negozio)|(informazioni\\s*sul\\s*prodotto)|(consegna\\s*e\\s*pagamento))"},"ja":{"price_regex":{"jp":"((\\d{1,3}\\s*(\\x{ffe5}|\\x{00a5}))|((\\x{ffe5}|\\x{00a5})\\s*\\d{1,3}))"},"product_terms":"((\\x{30ab}\\x{30fc}\\x{30c8}\\x{306b}\\x{5165}\\x{308c}\\x{308b})|(\\x{4eca}\\x{3059}\\x{3050}\\x{8cb7}\\x{3046})|((\\x{8a73}\\x{7d30})(\\x{60c5}\\x{5831}|\\x{30c7}\\x{30fc}\\x{30bf}))|(((\\x{30a2}\\x{30a4}\\x{30c6}\\x{30e0})|(\\x{5546}\\x{54c1}(\\x{306e}){0,1})|(\\x{57fa}\\x{672c})|(\\x{5185}\\x{5bb9}))((\\x{8aac}\\x{660e})|(\\x{60c5}\\x{5831})|(\\x{4ed5}\\x{69d8})))|(\\x{3054}\\x{8cfc}\\x{5165}\\x{624b}\\x{7d9a}\\x{304d}\\x{3078})|(\\x{30ab}\\x{30fc}\\x{30c8}\\x{306b}\\x{8ffd}\\x{52a0})|(\\x{9001}\\x{6599}\\x{7121}\\x{6599})|(\\x{767a}\\x{9001}\\x{4e88}\\x{5b9a})|(\\x{30d0}\\x{30b9}\\x{30b1}\\x{30c3}\\x{30c8}\\x{306b}\\x{5165}\\x{308c}\\x{308b})|(\\x{6ce8}\\x{610f})|(\\x{8cfc}\\x{5165}\\x{624b}\\x{7d9a}\\x{304d}\\x{3078})|(\\x{30d0}\\x{30b9}\\x{30b1}\\x{30c3}\\x{30c8}\\x{3092}\\x{898b}\\x{308b})|(\\x{8fd4}\\x{54c1}\\x{6761}\\x{4ef6})|(\\x{5728}\\x{5eab}\\x{3042}\\x{308a})|(\\x{30ab}\\x{30b4}\\x{306b}\\x{5165}\\x{308c}\\x{308b})|(\\x{30d0}\\x{30c3}\\x{30b0}\\x{306b}\\x{8ffd}\\x{52a0})|(\\x{5546}\\x{54c1}\\x{0051}\\x{0026}\\x{0041})|(\\x{3044}\\x{307e}\\x{3059}\\x{3050}\\x{8cfc}\\x{5165})|(\\x{5546}\\x{54c1}\\x{30b9}\\x{30da}\\x{30c3}\\x{30af})|(\\x{304a}\\x{652f}\\x{6255}\\x{65b9}\\x{6cd5})|(\\x{6ce8}\\x{610f}\\x{4e8b}\\x{9805})|(\\x{4ed5}\\x{69d8})|(\\x{914d}\\x{9001}\\x{65b9}\\x{6cd5})|(\\x{304b}\\x{3054}\\x{306b}\\x{5165}\\x{308c}\\x{308b})|(\\x{9001}\\x{6599})|(\\x{5728}\\x{5eab}\\x{72b6}\\x{6cc1})|(\\x{4f5c}\\x{54c1}\\x{5185}\\x{5bb9})|(((\\x{5546}\\x{54c1}(\\x{306e}){0,1})|(\\x{30a2}\\x{30a4}\\x{30c6}\\x{30e0}))(\\x{8a73}\\x{7d30}))|(\\x{756a}\\x{53f7})|(\\x{30b7}\\x{30e7}\\x{30c3}\\x{30d4}\\x{30f3}\\x{30b0}\\x{30d0}\\x{30c3}\\x{30b0}\\x{306b}\\x{5165}\\x{308c}\\x{308b})|(\\x{304a}\\x{6c17}\\x{306b}\\x{5165}\\x{308a}\\x{306b}\\x{8ffd}\\x{52a0})|(\\x{4fa1}\\x{683c}\\x{3092}\\x{78ba}\\x{8a8d})|(\\x{30ab}\\x{30fc}\\x{30c8}\\x{3078}\\x{9032}\\x{3080})|(\\x{30b5}\\x{30fc}\\x{30d3}\\x{30b9})|(\\x{5546}\\x{54c1}\\x{306e}\\x{767a}\\x{9001})|(\\x{5185}\\x{5bb9}\\x{7d39}\\x{4ecb})|(\\x{30ab}\\x{30fc}\\x{30c8}\\x{3078}\\x{5165}\\x{308c}\\x{308b})|(\\x{8cfc}\\x{5165}\\x{306f}\\x{3053}\\x{3061}\\x{3089}))"},"ko":{"price_regex":{"kr":"((\\d{1,3}\\s*(krw|\\x{20a9}|\\x{c6d0}))|((krw|\\x{20a9}|\\x{c6d0})\\s*\\d{1,3}))"},"product_terms":"((\\s*\\x{c7a5}\\x{bc14}\\x{ad6c}\\x{b2c8}\\s*)|(\\s*\\x{ad6c}\\x{b9e4}\\x{d558}\\x{ae30}\\s*)|(\\x{CD94}\\x{AC00})|(\\x{BC30}\\x{C1A1}\\s*\\x{BC0F}\\s*\\x{ACB0}\\x{C81C})|(\\x{C81C}\\x{D488}\\s*\\x{BC30}\\x{ACBD})|(\\x{C989}\\x{C2DC}\\s*\\x{AD6C}\\x{B9E4})|(\\x{CE74}\\x{D2B8}\\x{C5D0}\\s*\\x{B123}\\x{AE30})|(\\d+\\s*\\x{B9AC}\\x{BDF0})|(\\d+\\s*\\x{C8FC}\\x{BB38})|(\\x{BB34}\\x{B8CC}\\s*\\x{BC30}\\x{C1A1})|(\\x{ACB0}\\x{C81C}\\s*\\x{AE08}\\x{C561}\\s*\\x{D658}\\x{BD88}\\s*\\x{BCF4}\\x{C99D})|(\\x{BC30}\\x{C1A1}\\s*\\x{C608}\\x{C815})|(\\x{AD6C}\\x{B9E4}\\x{D558}\\x{AE30})|(\\x{C81C}\\x{D488}\\s*\\x{C124}\\x{BA85})|(\\x{BE44}\\x{C2B7}\\x{D55C}\\s*\\x{C81C}\\x{D488})|(\\x{B9E4}\\x{C7A5}\\s*\\x{AD6C}\\x{B9E4})|(\\x{BC30}\\x{C1A1})|(\\x{BC14}\\x{B85C}\\x{AD6C}\\x{B9E4})|(\\x{C7A5}\\x{BC14}\\x{AD6C}\\x{B2C8}\\s*\\x{B2F4}\\x{AE30}))"},"largest_contentful_paint_thresholds":{"proactive_contentful_paint_delay_seconds":2,"secondary_no_mutations_observed_ext_seconds":5,"secondary_no_mutations_observed_seconds":1,"secondary_observe_mutations_max_seconds":10,"secondary_observer_mutations_ext_max_seconds":20},"lt":{"price_regex":{"lt":"((\\d{1,3}\\s*(eur|\\x{20ac}))|((eur|\\x{20ac})\\s*\\d{1,3}))"},"product_terms":"((\\x{012E}d\\x{0117}ti\\s*\\x{012F}\\s*krep\\x{0161}el\\x{012F})|(\\x{012E}d\\x{0117}ti\\s*\\x{012F}\\s*pirkini\\x{0173}\\s*krep\\x{0161}el\\x{012F})|(\\x{012E}\\s*krep\\x{0161}el\\x{012F})|(nemokamas\\s*pristatymas)|(pradin\\x{0117}\\s*\\x{012F}moka))"},"lv":{"price_regex":{"lv":"((\\d{1,3}\\s*(eur|\\x{20ac}))|((eur|\\x{20ac})\\s*\\d{1,3}))"},"product_terms":"((ielikt\\s*groz\\x{0101})|(pieg\\x{0101}des\\s*veidi)|(sa\\x{0146}em\\x{0161}anas\\s*iesp\\x{0113}jas)|(pieejam\\x{012B}ba\\s*veikalos))"},"market_domain_regex_map":{"ae":"((\\.ae\\/)|(\\.com\\/ae\\/))","ar":"((\\.ar\\/)|(\\.com\\/ar\\/))","at":"((\\.at\\/)|(\\.com\\/at\\/)|(\\.com\\/de-at\\/)|(\\.com\\/de_at\\/))","au":"((\\.au\\/)|(\\.com\\/au\\/)|(\\.com\\/en-au\\/)|(\\.com\\/en_au\\/))","be":"((\\.be\\/)|(\\.com\\/be\\/)|(\\.com\\/fr-be\\/)|(\\.com\\/fr_be\\/)|(\\.com\\/nl-be\\/)|(\\.com\\/nl_be\\/))","bg":"((\\.bg\\/)|(\\.com\\/bg\\/))","br":"((\\.br\\/)|(\\.com\\/br\\/)|(\\.com\\/pt-br\\/)|(\\.com\\/pt_br\\/))","ca":"((\\.ca\\/)|(\\.com\\/ca\\/)|(\\.com\\/fr-ca\\/)|(\\.com\\/fr_ca\\/)|(\\.ca\\/fr-ca\\/)|(\\.ca\\/fr_ca\\/)|(\\.com\\/en-ca\\/)|(\\.com\\/en_ca\\/))","ch":"((\\.ch\\/)|(\\.com\\/ch\\/))","cl":"((\\.cl\\/)|(\\.com\\/cl\\/))","cn":"((\\.cn\\/)|(\\.com\\/cn\\/))","co":"((\\.co\\/)|(\\.com\\/co\\/))","cz":"((\\.cz\\/)|(\\.com\\/cz\\/))","de":"((\\.de\\/)|(\\.com\\/de\\/)|(\\.com\\/de-de\\/)|(\\.com\\/de_de\\/))","dk":"((\\.dk\\/)|(\\.com\\/dk\\/)|(\\.com\\/da-dk\\/)|(\\.com\\/da_dk\\/))","eg":"((\\.eg\\/)|(\\.com\\/eg\\/))","es":"((\\.es\\/)|(\\.com\\/es\\/)|(\\.com\\/es-es\\/)|(\\.com\\/es_es\\/))","fi":"((\\.fi\\/)|(\\.com\\/fi\\/)|(\\.com\\/fi-fi\\/)|(\\.com\\/fi_fi\\/))","fr":"((\\.fr\\/)|(\\.com\\/fr\\/)|(\\.com\\/fr-fr\\/)|(\\.com\\/fr_fr\\/))","gb":"((\\.uk\\/)|(\\.com\\/uk\\/)|(\\.com\\/en-gb\\/)|(\\.com\\/en_gb\\/))","gr":"((\\.gr\\/)|(\\.com\\/gr\\/)|(\\.com\\/el-gr\\/)|(\\.com\\/el_gr\\/))","hr":"((\\.hr\\/)|(\\.com\\/hr\\/))","hu":"((\\.hu\\/)|(\\.com\\/hu\\/)|(\\.com\\/hu-hu\\/)|(\\.com\\/hu_hu\\/))","id":"((\\.id\\/)|(\\.com\\/id\\/))","ie":"((\\.ie\\/)|(\\.com\\/ie\\/)|(\\.com\\/en-ie\\/)|(\\.com\\/en_ie\\/))","il":"((\\.il\\/)|(\\.com\\/il\\/)|(\\.com\\/hw-il\\/)|(\\.com\\/hw_il\\/))","in":"((\\.in\\/)|(\\.com\\/in\\/)|(\\.com\\/en-in\\/)|(\\.com\\/en_in\\/))","is":"((\\.is\\/)|(\\.com\\/is\\/))","it":"((\\.it\\/)|(\\.com\\/it\\/)|(\\.com\\/it-it\\/)|(\\.com\\/it_it\\/))","jp":"((\\.jp\\/)|(\\.com\\/jp\\/)|(\\.com\\/ja-jp\\/)|(\\.com\\/ja_jp\\/))","ke":"((\\.ke\\/)|(\\.com\\/ke\\/))","kr":"((\\.kr\\/)|(\\.com\\/kr\\/)|(\\.com\\/ko-kr\\/)|(\\.com\\/ko_kr\\/))","lt":"((\\.lt\\/)|(\\.com\\/lt\\/))","ma":"((\\.ma\\/)|(\\.com\\/ma\\/))","mx":"((\\.mx\\/)|(\\.com\\/mx\\/)|(\\.com\\/es-mx\\/)|(\\.com\\/es_mx\\/)|(\\.com\\/en-mx\\/)|(\\.com\\/en_mx\\/))","my":"((\\.my\\/)|(\\.com\\/my\\/)|(\\.com\\/en-my\\/)|(\\.com\\/en_my\\/))","ng":"((\\.ng\\/)|(\\.com\\/ng\\/))","nl":"((\\.nl\\/)|(\\.com\\/nl\\/)|(\\.com\\/nl-nl\\/)|(\\.com\\/nl_nl\\/))","no":"((\\.no\\/)|(\\.com\\/no\\/)|(\\.com\\/no-no\\/)|(\\.com\\/no_no\\/))","nz":"((\\.nz\\/)|(\\.com\\/nz\\/))","pe":"((\\.pe\\/)|(\\.com\\/pe\\/))","pk":"((\\.pk\\/)|(\\.com\\/pk\\/))","pl":"((\\.pl\\/)|(\\.com\\/pl\\/)|(\\.com\\/pl-pl\\/)|(\\.com\\/pl_pl\\/))","pt":"((\\.pt\\/)|(\\.com\\/pt\\/)|(\\.com\\/pt-pt\\/)|(\\.com\\/pt_pt\\/))","ro":"((\\.ro\\/)|(\\.com\\/ro\\/)|(\\.com\\/ro-ro\\/)|(\\.com\\/ro_ro\\/))","rs":"((\\.rs\\/)|(\\.com\\/rs\\/))","ru":"((\\.ru\\/)|(\\.com\\/ru\\/)|(\\.com\\/ru-ru\\/)|(\\.com\\/ru_ru\\/))","sa":"((\\.sa\\/)|(\\.com\\/sa\\/))","se":"((\\.se\\/)|(\\.com\\/se\\/)|(\\.com\\/sv-se\\/)|(\\.com\\/sv_se\\/))","sg":"((\\.sg\\/)|(\\.com\\/sg\\/)|(\\.com\\/en-sg\\/)|(\\.com\\/en_sg\\/))","si":"((\\.si\\/)|(\\.com\\/si\\/))","sk":"((\\.sk\\/)|(\\.com\\/sk\\/))","th":"((\\.th\\/)|(\\.com\\/th\\/))","tr":"((\\.tr\\/)|(\\.com\\/tr\\/)|(\\.com\\/tr-tr\\/)|(\\.com\\/tr_tr\\/))","tw":"((\\.tw\\/)|(\\.com\\/tw\\/))","ua":"((\\.ua\\/)|(\\.com\\/ua\\/))","vn":"((\\.vn\\/)|(\\.com\\/vn\\/))","za":"((\\.za\\/)|(\\.com\\/za\\/))"},"mk":{"price_regex":{"mk":"((\\d{1,3}\\s*(mkd|\\x{0414}\\x{0435}\\x{043D}|\\x{041C}\\x{041A}\\x{0414}))|((mkd|\\x{0414}\\x{0435}\\x{043D}|\\x{041C}\\x{041A}\\x{0414})\\s*\\d{1,3}))"},"product_terms":"((\\x{0434}\\x{043E}\\x{0434}\\x{0430}\\x{0434}\\x{0438}\\s*\\x{0432}\\x{043E}\\s*\\x{043A}\\x{043E}\\x{0448}\\x{043D}\\x{0438}\\x{0447}\\x{043A}\\x{0430})|(\\x{0414}\\x{043E}\\x{0434}\\x{0430}\\x{0434}\\x{0438}\\s*\\x{0432}\\x{043E}\\s*\\x{043A}\\x{043E}\\x{0448}\\x{043D}\\x{0438}\\x{0447}\\x{043A}\\x{0430})|(\\x{0414}\\x{041E}\\x{0414}\\x{0410}\\x{0414}\\x{0418}\\s*\\x{0412}\\x{041E}\\s*\\x{041A}\\x{041E}\\x{0428}\\x{041D}\\x{0418}\\x{0427}\\x{041A}\\x{0410})|(\\x{041A}\\x{0443}\\x{043F}\\x{0438})|(\\x{041D}\\x{0435}\\x{043C}\\x{0430}\\s*\\x{043D}\\x{0430}\\s*\\x{0437}\\x{0430}\\x{043B}\\x{0438}\\x{0445}\\x{0430})|(\\x{041F}\\x{043E}\\x{0432}\\x{0440}\\x{0437}\\x{0430}\\x{043D}\\x{0438}\\s*\\x{043F}\\x{0440}\\x{043E}\\x{0438}\\x{0437}\\x{0432}\\x{043E}\\x{0434}\\x{0438})|(\\x{0412}\\x{0440}\\x{0435}\\x{043C}\\x{0435}\\s*\\x{043D}\\x{0430}\\s*\\x{0438}\\x{0441}\\x{043F}\\x{043E}\\x{0440}\\x{0430}\\x{043A}\\x{0430}))"},"model_descriptors":[{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.en","page_locale":"en","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.en","page_locale":"en","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.pt","page_locale":"pt","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.pt","page_locale":"pt","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.it","page_locale":"it","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.it","page_locale":"it","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.fr","page_locale":"fr","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.fr","page_locale":"fr","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.de","page_locale":"de","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.de","page_locale":"de","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.nl","page_locale":"nl","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.nl","page_locale":"nl","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.zh","page_locale":"zh","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.zh","page_locale":"zh","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.ko","page_locale":"ko","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.ko","page_locale":"ko","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.ja","page_locale":"ja","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.ja","page_locale":"ja","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.es","page_locale":"es","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.es","page_locale":"es","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.am","page_locale":"am","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.am","page_locale":"am","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.ar","page_locale":"ar","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.ar","page_locale":"ar","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.az","page_locale":"az","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.az","page_locale":"az","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.bg","page_locale":"bg","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.bg","page_locale":"bg","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.bn","page_locale":"bn","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.bn","page_locale":"bn","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.bs","page_locale":"bs","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.bs","page_locale":"bs","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.cs","page_locale":"cs","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.cs","page_locale":"cs","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.da","page_locale":"da","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.da","page_locale":"da","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.dv","page_locale":"dv","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.dv","page_locale":"dv","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.dz","page_locale":"dz","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.dz","page_locale":"dz","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.el","page_locale":"el","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.el","page_locale":"el","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.et","page_locale":"et","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.et","page_locale":"et","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.fa","page_locale":"fa","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.fa","page_locale":"fa","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.fi","page_locale":"fi","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.fi","page_locale":"fi","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.fo","page_locale":"fo","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.fo","page_locale":"fo","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.he","page_locale":"he","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.he","page_locale":"he","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.hi","page_locale":"hi","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.hi","page_locale":"hi","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.hr","page_locale":"hr","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.hr","page_locale":"hr","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.ht","page_locale":"ht","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.ht","page_locale":"ht","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.hu","page_locale":"hu","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.hu","page_locale":"hu","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.hy","page_locale":"hy","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.hy","page_locale":"hy","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.id","page_locale":"id","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.id","page_locale":"id","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.is","page_locale":"is","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.is","page_locale":"is","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.ka","page_locale":"ka","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.ka","page_locale":"ka","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.kk","page_locale":"kk","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.kk","page_locale":"kk","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.km","page_locale":"km","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.km","page_locale":"km","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.ky","page_locale":"ky","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.ky","page_locale":"ky","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.lo","page_locale":"lo","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.lo","page_locale":"lo","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.lt","page_locale":"lt","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.lt","page_locale":"lt","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.lv","page_locale":"lv","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.lv","page_locale":"lv","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.mk","page_locale":"mk","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.mk","page_locale":"mk","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.mn","page_locale":"mn","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.mn","page_locale":"mn","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.ms","page_locale":"ms","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.ms","page_locale":"ms","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.mt","page_locale":"mt","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.mt","page_locale":"mt","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.my","page_locale":"my","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.my","page_locale":"my","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.nb","page_locale":"nb","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.nb","page_locale":"nb","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.ne","page_locale":"ne","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.ne","page_locale":"ne","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.no","page_locale":"no","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.no","page_locale":"no","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.pl","page_locale":"pl","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.pl","page_locale":"pl","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.ps","page_locale":"ps","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.ps","page_locale":"ps","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.ro","page_locale":"ro","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.ro","page_locale":"ro","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.ru","page_locale":"ru","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.ru","page_locale":"ru","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.si","page_locale":"si","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.si","page_locale":"si","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.sk","page_locale":"sk","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.sk","page_locale":"sk","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.sl","page_locale":"sl","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.sl","page_locale":"sl","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.sm","page_locale":"sm","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.sm","page_locale":"sm","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.sq","page_locale":"sq","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.sq","page_locale":"sq","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.sr","page_locale":"sr","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.sr","page_locale":"sr","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.sv","page_locale":"sv","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.sv","page_locale":"sv","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.sw","page_locale":"sw","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.sw","page_locale":"sw","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.ta","page_locale":"ta","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.ta","page_locale":"ta","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.tg","page_locale":"tg","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.tg","page_locale":"tg","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.th","page_locale":"th","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.th","page_locale":"th","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.ti","page_locale":"ti","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.ti","page_locale":"ti","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.tk","page_locale":"tk","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.tk","page_locale":"tk","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.tl","page_locale":"tl","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.tl","page_locale":"tl","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.tr","page_locale":"tr","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.tr","page_locale":"tr","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.uz","page_locale":"uz","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.uz","page_locale":"uz","platform":"desktop"},{"allow_basic_extraction":true,"classification":"Product","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.vi","page_locale":"vi","platform":"desktop"},{"allow_basic_extraction":true,"classification":"ProductByRegex","classification_confidence":0.9,"classifier_model_major_version":"","classifier_model_name":"","engine":"onnx","entity_type":"MainProduct","extraction_scenario":"kBoth","extractor_model_major_version":"2","extractor_model_name":"onnx.product.desktop.vi","page_locale":"vi","platform":"desktop"}],"nb":{"price_regex":{"no":"((\\d{1,3}\\s*(nok|kr|,-))|((nok|kr|,-)\\s*\\d{1,3}))"},"product_terms":"((legg\\s*i\\s*handlevogn)|(frakt\\s*og\\s*leveringsalternativ)|(hent\\s*i\\s*butikk)|(raskere\\s*leveranse))"},"nl":{"price_regex":{"be":"((\\d{1,3}\\s*(eur|\\x{20ac}))|((eur|\\x{20ac})\\s*\\d{1,3}))","nl":"((\\d{1,3}\\s*(eur|\\x{20ac}))|((eur|\\x{20ac})\\s*\\d{1,3}))"},"product_terms":"((verkoop\\s*door)|(productbeschrijving)|(productspecificaties)|(in\\s*winkelwagen)|(gratis\\s*retourneren)|(gratis\\s*verzending)|(gratis\\s*verzenden)|(geschatte\\s*levering)|(\\d+\\s*recensies)|(\\d+\\s*beoordelingen)|(\\d+\\s*bestellingen)|(koop\\s*nu)|(voeg\\s*aan\\s*winkelwagen\\s*toe)|(voeg\\s*toe\\s*aan\\s*winkelwagen)|(geldteruggarantie)|(bestverkopende)|(selecteer\\s*winkel)|(productinformatie)|(soortgelijke\\s*producten)|(in\\s*de\\s*winkel)|(levering)|(toevoegen)|(gratis\\s*bezorging)|(nu\\s*kopen)|(op\\s*voorraad)|(verkocht\\s*door)|(in\\s*(winkelwagen|winkelmandje|winkelmand))|(nu\\s*kopen)|(productgegevens)|(productbeschrijving)|(klantenrecensies)|(\\s*bestel\\s*nu)|(\\s*voeg\\s*toe))"},"no":{"price_regex":{"no":"((\\d{1,3}\\s*(nok|kr|,-))|((nok|kr|,-)\\s*\\d{1,3}))"},"product_terms":"((legg\\s*i\\s*handlevogn)|(frakt\\s*og\\s*leveringsalternativ)|(hent\\s*i\\s*butikk)|(raskere\\s*leveranse))"},"page_cutoff":4320,"pdp_regexes":{"amazon.com":["(?:\\/gp\\/product\\/|\\/dp\\/)([A-Z0-9]+)","/.*/ko/dp/[A-Za-z0-9]+/"]},"picl_currency_regex_map":{"AUD":"A\\s*\\$|AU\\s*\\$|AUD|AU","CAD":"C\\s*\\$|CAD\\s*\\$|CDN\\s*\\$|Can\\s*\\$|CDN|CAD","CHF":"CHF|Fr\\.|SFr\\.|\\x{20A3}","CNY":"CNY|RMB|\\x{00A5}","EUR":"EUR|Euro|\\x{20AC}","GBP:":"GBP|GB|\\x{00A3}","INR":"INR|RS|RS\\.|\\x{20B9}","JPY":"JPY|\\x{ffe5}|\\x{00A5}","MXN":"MXN|MEX\\s*\\$","USD":"USD\\s*\\$|USD|US\\s*\\$|US|\\$"},"pl":{"price_regex":{"pl":"((\\d{1,3}\\s*(pln|z\\s*\\x{0142}))|(pln|z\\s*\\x{0142})\\s*\\d{1,3}))"},"product_terms":"((dodaj\\s*do\\s*koszyka)|(kup\\s*teraz)|(darmowa\\s*dostawa)|(do\\s*koszyka)|(kup)|(w\\s*sklepie)|(szczeg\\x{00F3}\\x{0142}y\\s*produktu)|(przesy\\x{0142}ka)|(dostawa)|(w\\s*magazynie)|(informacje\\s*o\\s*produkcie)|(darmowa\\s*wysy\\x{0142}ka)|(bezp\\x{0142}atna\\s*dostawa)|(opis\\s*produktu)|(\\d+\\s*opinie))"},"price_comparison_cache_minutes":20,"product_onnx_model_config":{"char_limit_for_text_element":400,"cls_token_id":0,"example_start_index_increment":250,"features":["is_image","is_preceded_by_ws","is_preceded_by_line_break","bounding_box_is_same","is_clipped","is_visible","font_weight","font_size","bounding_x","bounding_y","bounding_w","bounding_h","color_a","color_r","color_g","color_b","bounding_xe","bounding_ye","bounding_we","bounding_he","is_anchor","part"],"features_with_max_bounding_box_size":["bounding_x","bounding_y","bounding_w","bounding_h","bounding_xe","bounding_ye","bounding_we","bounding_he"],"features_with_max_color_size":["color_a","color_r","color_g","color_b"],"image_word":"#IMAGE","labels":["O","B-image","I-image","B-manufacturer","I-manufacturer","B-name","I-name","B-offers/price","I-offers/price","B-aggregateRating/ratingValue","I-aggregateRating/ratingValue","B-aggregateRating/reviewCount","I-aggregateRating/reviewCount","B-product_codes","I-product_codes","B-out_of_stock","I-out_of_stock"],"labels_for_v4":["image","name","offers/price","product_codes","manufacturer","aggregateRating/reviewCount","out_of_stock","aggregateRating/ratingValue"],"max_bounding_box_size":200,"max_color_size":100,"max_example_size":400,"max_examples":10,"max_font_size_size":100,"max_font_weight_size":100,"max_name_price_token_distance":200,"max_sequence_length":512,"max_sliding_window_size":2,"model_output_layer":"output","name_image_prediction_threshold":0.3,"name_image_prediction_threshold_for_v4":0.3,"num_labels":17,"num_labels_for_v4":8,"num_special_tokens":2,"pad_token":1,"pad_token_label_id":-100,"price_prediction_screening_threshold":0.0001,"price_prediction_threshold":0.005,"price_prediction_threshold_for_v4":0.0001,"priority_entities_ids_map":{"image":1,"name":5,"offers/price":7,"product_codes":13},"priority_entities_ids_map_for_v4":{"aggregateRating/ratingValue":7,"aggregateRating/reviewCount":5,"image":0,"manufacturer":4,"name":1,"offers/price":2,"out_of_stock":6,"product_codes":3},"product_code_prediction_threshold":0.07,"product_code_prediction_threshold_for_v4":0.3,"product_page_prediction_threshold":0.5,"sep_token_id":2,"sliding_window_start_index_increment":400},"pt":{"price_regex":{"br":"((r\\x{0024}|brl)\\s*\\d{1,3})|(\\d{1,3}\\s*(r\\x{0024}|brl))","pt":"((\\d{1,3}\\s*(eur|\\x{20ac}))|((eur|\\x{20ac})\\s*\\d{1,3}))"},"product_terms":"((comprar)|(entrega)|(produtos\\s*patrocinados)(adicionar\\s*ao\\s*cesto)|(adicionar\\s*ao\\s*carrinho)|(comprar\\s*agora)|(adicionar)|(procurar\\s*nas\\s*lojas)|(pesquisar\\s*produtos)|(entrega)|(pagamento)|(estoque\\s*dispon\\x{00ED}vel)|(devolu\\x{00E7}\\x{00E3}o\\s*gr\\x{00E1}tis)|(compra\\s*garantida)|(\\d+\\s*vendidos)|(na\\s*loja)|(adicionar\\s*ao\\s*cesto)|(detalhes\\s*do\\s*produto)|(selecionar\\s*loja)|(produtos\\s*similares)|(frete\\s*gr\\x{00E1}tis)|(estimativa\\s*de\\s*entrega)|(garantia\\s*de\\s*reembolso)|(o\\s*envio\\s*come\\x{00E7}a)|(\\d+\\s*avalia\\x{00E7}\\x{00F5}es)|(\\d+\\s*pedidos)|(mais\\s*vendidos)|(\\x{00CD}tens\\s*promocionais))"},"ro":{"price_regex":{"ro":"((\\d{1,3}\\s*(ron|lei|l))|((ron|lei|l)\\s*\\d{1,3}))"},"product_terms":"((ad(a|\\x{0103})ugare)|(adaug(a|\\x{0102})\\s*(i|\\x{00CE})n\\s*co(s|\\x{0218}))|(v(a|\\x{00E2})ndut\\s*(s|\\x{0219})i\\s*livrat\\s*de)|(comand(a|\\x{0103})\\s*cu\\s*livrare)|(informa(t|\\x{021B})ii\\s*despre\\s*produs)|((i|\\x{02EE})n\\s*stoc)|(cumpara\\s*acum)|(optiuni\\s*de\\s*livrare)|(modalit(a|\\x{0103})(t|\\x{021B})ile\\s*de\\s*((livrare)|(plat(a|\\x{0103}))))|(livrare\\s*gratuit(a|\\x{0103}))|(descrierea\\s*produsului)|(spre\\s*magazin)|(((estimat)|(estimare))\\s*livrare)|(politica\\s*de\\s*retur)|(pret\\s*curent)|(cost\\s*livrare)|(\\d+\\s*review-uri))"},"ru":{"price_regex":{"by":"((\\d{1,3}\\s*(byn|br|\\x{0440}\\.|rub))|((byn|br|\\x{0440}\\.|rub)\\s*\\d{1,3}))","ru":"((\\d{1,3}\\s*(rub|\\x{0440}\\x{0443}\\x{0431}|\\x{20BD}))|((rub|\\x{0440}\\x{0443}\\x{0431}|\\x{20BD})\\s*\\d{1,3}))"},"product_terms":"((\\x{041F}\\x{043E}\\x{0434}\\x{043F}\\x{0438}\\x{0441}\\x{0430}\\x{0442}\\x{044C}\\x{0441}\\x{044F}\\s*\\x{043D}\\x{0430}\\s*\\x{043F}\\x{0440}\\x{043E}\\x{0434}\\x{0430}\\x{0432}\\x{0446}\\x{0430})|(\\x{0414}\\x{043E}\\x{0431}\\x{0430}\\x{0432}\\x{0438}\\x{0442}\\x{044C}\\s*\\x{0432}\\s*\\x{043A}\\x{043E}\\x{0440}\\x{0437}\\x{0438}\\x{043D}\\x{0443})|(\\x{0411}\\x{0435}\\x{0441}\\x{043F}\\x{043B}\\x{0430}\\x{0442}\\x{043D}\\x{0430}\\x{044F}\\s*\\x{0434}\\x{043E}\\x{0441}\\x{0442}\\x{0430}\\x{0432}\\x{043A}\\x{0430})|(\\x{043E}\\s*\\x{0442}\\x{043E}\\x{0432}\\x{0430}\\x{0440}\\x{0435})|(c\\s*\\x{044D}\\x{0442}\\x{0438}\\x{043C}\\s*\\x{0442}\\x{043E}\\x{0432}\\x{0430}\\x{0440}\\x{043E}\\x{043C}\\s*\\x{043F}\\x{043E}\\x{043A}\\x{0443}\\x{043F}\\x{0430}\\x{043B}\\x{0438})|(c\\s*\\x{044D}\\x{0442}\\x{0438}\\x{043C}\\s*\\x{0442}\\x{043E}\\x{0432}\\x{0430}\\x{0440}\\x{043E}\\x{043C}\\s*\\x{0438}\\x{0441}\\x{043A}\\x{0430}\\x{043B}\\x{0438})|(\\x{0438}\\x{043D}\\x{0444}\\x{043E}\\x{0440}\\x{043C}\\x{0430}\\x{0446}\\x{0438}\\x{044F}\\s*\\x{043E}\\s*\\x{0434}\\x{043E}\\x{0441}\\x{0442}\\x{0430}\\x{0432}\\x{043A}\\x{0435})|(c\\x{043E}\\x{0441}\\x{0442}\\x{043E}\\x{044F}\\x{043D}\\x{0438}\\x{0435}\\s*\\x{0442}\\x{043E}\\x{0432}\\x{0430}\\x{0440}\\x{0430})|(k\\x{0443}\\x{043F}\\x{0438}\\x{0442}\\x{044C}\\s*\\x{0441}\\x{0435}\\x{0439}\\x{0447}\\x{0430}\\x{0441})|(p\\x{0435}\\x{0439}\\x{0442}\\x{0438}\\x{043D}\\x{0433}\\s*\\x{0438}\\s*\\x{043E}\\x{0442}\\x{0437}\\x{044B}\\x{0432}\\x{044B})|(a\\x{0440}\\x{0442}\\x{0438}\\x{043A}\\x{0443}\\x{043B})|(c\\s*\\x{044D}\\x{0442}\\x{0438}\\x{043C}\\s*\\x{0442}\\x{043E}\\x{0432}\\x{0430}\\x{0440}\\x{043E}\\x{043C}\\s*\\x{043F}\\x{043E}\\x{043A}\\x{0443}\\x{043F}\\x{0430}\\x{044E}\\x{0442})|(\\x{041F}\\x{043E}\\x{0445}\\x{043E}\\x{0436}\\x{0438}\\x{0435}\\s*\\x{0442}\\x{043E}\\x{0432}\\x{0430}\\x{0440}\\x{044B})|(k\\x{043E}\\x{0434}\\s*\\x{0442}\\x{043E}\\x{0432}\\x{0430}\\x{0440}\\x{0430})|(o\\x{0442}\\x{0437}\\x{044B}\\x{0432}\\x{044B}\\s*\\x{043F}\\x{043E}\\x{043A}\\x{0443}\\x{043F}\\x{0430}\\x{0442}\\x{0435}\\x{043B}\\x{0435}\\x{0439})|(k\\x{0430}\\x{043A}\\s*\\x{0432}\\x{0435}\\x{0440}\\x{043D}\\x{0443}\\x{0442}\\x{044C})|(o\\x{043F}\\x{0438}\\x{0441}\\x{0430}\\x{043D}\\x{0438}\\x{0435}\\s*\\x{0442}\\x{043E}\\x{0432}\\x{0430}\\x{0440}\\x{0430})|(\\x{0438}\\x{0437}\\x{0433}\\x{043E}\\x{0442}\\x{043E}\\x{0432}\\x{0438}\\x{0442}\\x{0435}\\x{043B}\\x{044C})|(\\d+\\s*\\x{043E}\\x{0442}\\x{0437}\\x{044B}\\x{0432}\\x{043E}\\x{0432}))"},"sk":{"price_regex":{"sk":"((\\d{1,3}\\s*(eur|\\x{20ac}))|((eur|\\x{20ac})\\s*\\d{1,3}))"},"product_terms":"((prida(t|\\x{0165})\\s*do\\s*(n(a|\\x{00E1})kupn(e|\\x{00E9})ho){0,1}\\s*ko(s|\\x{0161})(i|\\x{00ED})ka)|(k(r|\\x{00FA})pi(t|\\x{0165}))|(vypredan(e|\\x{00E9})\\s*on-line)|(inform(a|\\x{00E1})cie\\s*o\\s*((v(y|\\x{00FD})robku)|(produkte)))|(kde\\s*k(u|\\x{00FA})pi(i|\\x{0165}))|(z(a|\\x{00E1})ruka\\s*\\d+\\s*mesiacov)|(\\d+\\s*((z(a|\\x{00E1})kazn(i|\\x{00ED})kov)|(hodnoten(i|\\x{00ED}))))|(na\\s*sklade)|(mo(z|\\x{017E})nosti\\s*doru(c|\\x{010D})enia)|(n(a|\\x{00E1})klady\\s*na\\s*dopravu))"},"sl":{"price_regex":{"si":"((\\d{1,3}\\s*(eur|\\x{20ac}))|((eur|\\x{20ac})\\s*\\d{1,3}))"},"product_terms":"((dodaj\\s*v\\s*ko\\x{0161}arico)|(podobne\\s*artikle)|(v\\s*ko\\x{0161}arico)|(podrobnosti\\s*o\\s*izdelku)|(v\\s*zalogi))"},"sq":{"price_regex":{"al":"((\\d{1,3}\\s*(lek\\x{00EB}|all|l))|((lek\\x{00EB}|all|l)\\s*\\d{1,3}))"},"product_terms":"((shto\\s*n\\x{00EB}\\s*shport\\x{00EB})|(shtoje\\s*n\\x{00EB}\\s*shport\\x{00EB})|(ne\\s*stok)|(ofert\\x{00CB}\\s*online)|(ka\\s*stok))"},"sr":{"price_regex":{"me":"((\\d{1,3}\\s*(eur|\\x{20ac}))|((eur|\\x{20ac})\\s*\\d{1,3}))","rs":"((\\d{1,3}\\s*(rsd|din))|((rsd|din)\\s*\\d{1,3}))"},"product_terms":"((dodaj\\s*u\\s*korpu)|(kupi\\s*odmah)|(obavesti\\s*me\\s*kada\\s*bude\\s*na\\s*sni\\x{017E}enju)|(opis\\s*proizvoda))"},"sv":{"price_regex":{"se":"((\\d{1,3}\\s*(kr|sek|:-))|((kr|sek|:-)\\s*\\d{1,3}))"},"product_terms":"((l\\x{00E4}gg\\s*i\\s*korgen)|(kundvagn)|(gratis\\s*leverans)|(L\\x{00E4}gg\\s*bud)|(k\\x{00F6}p)|(l\\x{00E4}gg\\s*i\\s*kundvagn)|(l\\x{00E4}gg\\s*i\\s*varukorg)|(i\\s*lager)|(fri\\s*frakt)|(leverans)|(k\\x{00F6}p)|(l\\x{00E4}gg\\s*till\\s*i\\s*kundvagn)|(returpolicy)|(s\\x{00E4}ljs\\s*av)|(andra\\s*s\\x{00E4}ljare)|(\\d+\\s*betyg)|(\\d+\\s*omd\\x{00F6}men)|(handla)|(produktinformation)|(fri\\s*retur))"},"th":{"price_regex":{"th":"((\\d{1,3}\\s*(thb\\s*\\x{0e3f}|thb|\\x{0e3f}))|((thb\\s*\\x{0e3f}|thb|\\x{0e3f})\\s*\\d{1,3}))"},"product_terms":"((\\x{0E40}\\x{0E1E}\\x{0E34}\\x{0E48}\\x{0E21}\\x{0E44}\\x{0E1B}\\x{0E22}\\x{0E31}\\x{0E07}\\x{0E23}\\x{0E16}\\x{0E40}\\x{0E02}\\x{0E47}\\x{0E19})|(\\x{0E0B}\\x{0E37}\\x{0E49}\\x{0E2D}\\x{0E2A}\\x{0E34}\\x{0E19}\\x{0E04}\\x{0E49}\\x{E032})|(\\x{0E2A}\\x{0E48}\\x{0E07}\\x{0E1F}\\x{0E23}\\x{0E35}\\x{0E17}\\x{0E31}\\x{0E48}\\x{0E27}\\x{0E44}\\x{0E17}\\x{0E22})|(\\x{0E0B}\\x{0E37}\\x{0E49}\\x{0E2D}\\x{0E40}\\x{0E25}\\x{0E22})|(\\x{0E2A}\\x{0E32}\\x{0E21}\\x{0E32}\\x{0E23}\\x{0E16}\\x{0E40}\\x{0E01}\\x{0E47}\\x{0E1A}\\x{0E40}\\x{0E07}\\x{0E34}\\x{0E19}\\x{0E1B}\\x{0E25}\\x{0E32}\\x{0E22}\\x{0E17}\\x{0E32}\\x{0E07}\\x{0E44}\\x{0E14}\\x{0E49}))"},"token_limit":1600,"tr":{"price_regex":{"cy":"((\\d{1,3}\\s*(eur|\\x{20ac}))|((eur|\\x{20ac})\\s*\\d{1,3}))","tr":"((\\d{1,3}\\s*(try|tl|x\\{20BA}))|((try|tl|x\\{20BA})\\s*\\d{1,3}))"},"product_terms":"((sepete\\s*ekle)|(\\x{015E}imdi\\s*sat\\x{0131}n\\s*al)|(taraf\\x{0131}ndan\\s*sat\\x{0131}l\\x{0131}r\\s*ve\\s*g\\x{00F6}nderilir))"},"ua":{"price_regex":{"ua":"((\\d{1,3}\\s*(uah|\\x{0433}\\x{0440}\\x{043D}|\\x{20B4}))|((uah|\\x{0433}\\x{0440}\\x{043D}|\\x{20B4})\\s*\\d{1,3}))"},"product_terms":"((\\x{041A}\\x{0443}\\x{043F}\\x{0438}\\x{0442}\\x{0438})|(\\x{0421}\\x{043F}\\x{043E}\\x{0441}\\x{043E}\\x{0431}\\x{0438}\\s*\\x{0434}\\x{043E}\\x{0441}\\x{0442}\\x{0430}\\x{0432}\\x{043A}\\x{0438})|(\\x{0421}\\x{0443}\\x{043F}\\x{0443}\\x{0442}\\x{043D}\\x{0456}\\s*\\x{0442}\\x{043E}\\x{0432}\\x{0430}\\x{0440}\\x{0438})|(\\x{0417}\\x{0431}\\x{0435}\\x{0440}\\x{0435}\\x{0433}\\x{0442}\\x{0438}\\s*\\x{0434}\\x{043E}\\s*\\x{0441}\\x{043F}\\x{0438}\\x{0441}\\x{043A}\\x{0443}\\s*\\x{043F}\\x{043E}\\x{043A}\\x{0443}\\x{043F}\\x{043E}\\x{043A})|(\\x{0421}\\x{043F}\\x{043E}\\x{0441}\\x{043E}\\x{0431}\\x{0438}\\s*\\x{043E}\\x{043F}\\x{043B}\\x{0430}\\x{0442}\\x{0438}))"},"url_filter_regex":"(((/s\\?.*)|(/cart([/?].*)+)|(/cart$)|(/shopping-?cart/?)|(/shopping-?bag/?)|(/my-?cart/?)|(/view-?cart/?)|(/co-?cart/?)|(/start-?my-?cart(/|\\?.*)?)|(/checkout/?)|(/search[./?].*))|(/basket([/.?].*)?)|(/cartReview([/.?].*)?)$)","vi":{"price_regex":{"vn":"((\\d{1,3}\\s*(vnd\\s*\\x{20ab}|vnd|\\x{20ab}))|((vnd\\s*\\x{20ab}|vnd|\\x{20ab})\\s*\\d{1,3}))"},"product_terms":"((mua\\s*ngay)|(th\\x{00EA}m\\s*v\\x{00E0}o\\s*gi\\x{1ECF}\\s*h\\x{00E0}ng)|(thanh\\s*to\\x{00E1}n\\s*khi\\s*nh\\x{1EAD}n\\s*h\\x{00E0}ng)|(ch\\x{1ECD}n\\s*mua))"},"zh":{"price_regex":{"cn":"((\\d{1,3}\\s*\\x{5143})|((\\x{ffe5}|\\x{00a5}|rmb|cny)\\s*\\d{1,3}))","hk":"((\\d{1,3}\\s*(\\$|\\x{5143}))|((\\x{ffe5}|\\x{00a5}|hkd|\\$)\\s*\\d{1,3}))","sg":"(((s\\$|sgd|\\$)\\s*\\d{1,3})|(\\d{1,3}\\s*(s\\$|sgd|\\$)))","tw":"((\\d{1,3}\\s*(\\$|\\x{5143}))|((\\x{ffe5}|\\x{00a5}|twd|\\$)\\s*\\d{1,3}))"},"product_terms":"((\\x{52a0}\\x{5165}\\x{8d2d}\\x{7269}\\x{8f66})|(\\x{73b0}\\x{5728}\\x{8d2d}\\x{4e70})|(\\x{73b0}\\x{5728}\\x{6709}\\x{8d27})|(\\x{52a0}\\x{5165}\\x{5fc3}\\x{613f}\\x{5355})|(\\x{7ecf}\\x{5e38}\\x{4e00}\\x{8d77}\\x{8d2d}\\x{4e70}\\x{7684}\\x{5546}\\x{54c1})|(\\x{514d}\\x{8d39}\\x{914d}\\x{9001})|(\\x{9884}\\x{8ba1}\\x{6700}\\x{5feb}\\x{9001}\\x{8fbe})|(\\x{6dfb}\\x{52a0}\\x{5230}\\x{8d2d}\\x{7269}\\x{888b})|(\\x{9884}\\x{8ba1}\\x{53d1}\\x{8d27}\\x{65e5}\\x{671f})|(\\x{514d}\\x{8d39}\\x{9001}\\x{8d27})|(\\x{514d}\\x{8fd0}\\x{8d39})|(\\x{6536}\\x{85cf}\\x{5546}\\x{54c1})|(\\x{5356}\\x{5149}\\x{4e86})|(\\x{67e5}\\x{770b}\\x{76f8}\\x{4f3c}\\x{4ea7}\\x{54c1})|(\\x{7f3a}\\x{8d27})|(\\x{67e5}\\x{770b}\\x{76f8}\\x{4f3c}\\x{5546}\\x{54c1})|(\\x{5546}\\x{54c1}\\x{8d27}\\x{53f7})|(\\x{5927}\\x{5bb6}\\x{6652})|(\\x{5e97}\\x{957f}\\x{63a8}\\x{8350})|(\\x{514d}\\x{5bc4}\\x{51fa}\\x{8fd0}\\x{8d39})|(\\x{7d2f}\\x{8ba1}\\x{8bc4}\\x{4ef7})|(\\x{770b}\\x{4e86}\\x{53c8}\\x{770b})|(\\x{5546}\\x{54c1}\\x{4ecb}\\x{7ecd})|(\\x{964d}\\x{4ef7}\\x{901a}\\x{77e5})|(\\x{7f3a}\\x{8d27}\\x{767b}\\x{8bb0})|(\\x{52a0}\\x{5165}\\x{6e05}\\x{5355})|(\\x{7acb}\\x{5373}\\x{8d2d}\\x{4e70})|(\\x{5546}\\x{54c1}\\x{8be6}\\x{60c5})|(\\x{76f8}\\x{5173}\\x{63a8}\\x{8350})|(\\x{624b}\\x{673a}\\x{626b}\\x{7801}\\x{8d2d}\\x{4e70})|(\\x{5546}\\x{54c1}\\x{7f16}\\x{53f7})|(\\x{5230}\\x{8d27}\\x{901a}\\x{77e5})|(\\x{6536}\\x{85cf}\\x{5b9d}\\x{8d1d})|(\\x{7d2f}\\x{8ba1}\\x{8bc4}\\x{8bba})|(\\x{5b9d}\\x{8d1d}\\x{8be6}\\x{60c5})|(\\x{624b}\\x{673a}\\x{8d2d}\\x{4e70})|(\\x{6b64}\\x{5546}\\x{54c1}\\x{6682}\\x{65f6}\\x{7f3a}\\x{8d27})|(\\x{5546}\\x{54c1}\\x{7f16}\\x{7801})|(\\x{5728}\\x{5c0f}\\x{7a0b}\\x{5e8f}\\x{4e2d}\\x{67e5}\\x{770b}\\x{6b64}\\x{5546}\\x{54c1})|(\\x{5546}\\x{54c1}\\x{5c55}\\x{793a})|(\\x{4ea7}\\x{54c1}\\x{8be6}\\x{60c5})|(\\d{1,6}\\s*\\x{4eba}\\x{6652}\\x{5355})|(\\x{52a0}\\x{5165}\\x{8cfc}\\x{7269}\\x{8eca})|(\\x{76f4}\\x{63a5}\\x{8cfc}\\x{8cb7})|(\\x{5546}\\x{54c1}\\x{7279}\\x{8272})|(\\x{5546}\\x{54c1}\\x{898f}\\x{683c})|(\\x{5546}\\x{54c1}\\x{8a73}\\x{60c5})|(\\x{7acb}\\x{5373}\\x{8cfc}\\x{8cb7})|(\\x{52a0}\\x{5165}\\x{6211}\\x{7684}\\x{8cfc}\\x{7269}\\x{8eca})|(\\x{5546}\\x{54c1}\\x{8aaa}\\x{660e}))"}},"domains_config_list":{"360.cn":{"image_traget_url_extraction":true},"6pm.com":{"image_traget_url_extraction":true},"9gag.com":{"image_traget_url_extraction":true,"picl_disabled":true},"aarp.org":{"image_traget_url_extraction":true},"abc.net.au":{"image_traget_url_extraction":true},"accuweather.com":{"image_traget_url_extraction":true,"picl_disabled":true},"acs.org":{"image_traget_url_extraction":true},"active.com":{"image_traget_url_extraction":true},"adobe.com":{"picl_disabled":true},"agoda.com":{"image_traget_url_extraction":true},"aircanada.com":{"image_traget_url_extraction":true},"alarabiya.net":{"image_traget_url_extraction":true},"alibaba.com":{"image_traget_url_extraction":true},"aliexpress.com":{"image_traget_url_extraction":true},"allrecipes.com":{"image_traget_url_extraction":true,"picl_disabled":true},"amartfurniture.com.au":{"picl_disabled":true},"amazon.ca":{"image_traget_url_extraction":true},"amazon.co.jp":{"image_traget_url_extraction":true},"amazon.co.uk":{"image_traget_url_extraction":true},"amazon.com":{"image_traget_url_extraction":true},"amazon.in":{"image_traget_url_extraction":true},"aol.com":{"image_traget_url_extraction":true,"picl_disabled":true},"archive.org":{"image_traget_url_extraction":true,"picl_disabled":true},"ask.com":{"image_traget_url_extraction":true,"picl_disabled":true},"asos.com":{"image_traget_url_extraction":true},"authenticwatches.com":{"picl_disabled":true},"autotrader.com":{"image_traget_url_extraction":true},"azlyrics.com":{"image_traget_url_extraction":true},"babycenter.com":{"image_traget_url_extraction":true},"baidu.com":{"image_traget_url_extraction":false},"bankofamerica.com":{"image_traget_url_extraction":true,"picl_disabled":true},"barnesandnoble.com":{"image_traget_url_extraction":true},"bartleby.com":{"image_traget_url_extraction":true},"basicinvite.com":{"picl_disabled":true},"bbc.co.uk":{"picl_disabled":true},"becu.com":{"picl_disabled":true},"bedbathandbeyond.com":{"image_traget_url_extraction":true},"berkeley.edu":{"image_traget_url_extraction":true},"bestbuy.com":{"image_traget_url_extraction":true},"bhg.com":{"image_traget_url_extraction":true},"bhphotovideo.com":{"image_traget_url_extraction":true},"bigw.com.au":{"picl_disabled":true},"bing.com":{"image_traget_url_extraction":true,"picl_disabled":true,"use_src_attr_for_image_extraction":true},"biomedcentral.com":{"image_traget_url_extraction":true},"bleacherreport.com":{"image_traget_url_extraction":true},"bloomberg.com":{"image_traget_url_extraction":true,"picl_disabled":true},"bmj.com":{"image_traget_url_extraction":true},"bodybuilding.com":{"image_traget_url_extraction":true},"bonappetit.com":{"image_traget_url_extraction":true},"booking.com":{"image_traget_url_extraction":true,"picl_disabled":true},"booktopia.com.au":{"picl_disabled":true},"boxrec.com":{"image_traget_url_extraction":true},"britannica.com":{"image_traget_url_extraction":true},"britishcouncil.org":{"image_traget_url_extraction":true},"businessinsider.com":{"image_traget_url_extraction":true,"picl_disabled":true},"buyma.com":{"picl_disabled":true},"cafemom.com":{"image_traget_url_extraction":true},"cambridge.org":{"image_traget_url_extraction":true},"canada.ca":{"picl_disabled":true},"caranddriver.com":{"image_traget_url_extraction":true},"cargurus.com":{"image_traget_url_extraction":true},"cars.com":{"image_traget_url_extraction":true},"carsons.com":{"picl_disabled":true},"castedduonline.it":{"picl_disabled":true},"catch.com.au":{"picl_disabled":true},"cavenders.com":{"picl_disabled":true},"cbc.ca":{"image_traget_url_extraction":true},"cbssports.com":{"image_traget_url_extraction":true},"cdc.gov":{"image_traget_url_extraction":true,"picl_disabled":true},"change.org":{"image_traget_url_extraction":true},"chase.com":{"picl_disabled":true},"chess.com":{"image_traget_url_extraction":true,"picl_disabled":true},"china.com.cn":{"image_traget_url_extraction":true},"chinadaily.com.cn":{"image_traget_url_extraction":true,"picl_disabled":true},"chron.com":{"image_traget_url_extraction":true},"citibank.com":{"picl_disabled":true},"classiccars.com":{"picl_disabled":true},"clevelandclinic.org":{"image_traget_url_extraction":true},"cnbc.com":{"image_traget_url_extraction":true,"picl_disabled":true},"cnn.com":{"image_traget_url_extraction":true,"picl_disabled":true},"codecademy.com":{"image_traget_url_extraction":true},"coles.com.au":{"picl_disabled":true},"colorado.edu":{"image_traget_url_extraction":true},"columbia.edu":{"image_traget_url_extraction":true},"cornell.edu":{"image_traget_url_extraction":true},"cosmopolitan.com":{"image_traget_url_extraction":true},"costco.com":{"image_traget_url_extraction":true},"countryliving.com":{"image_traget_url_extraction":true},"coursera.org":{"image_traget_url_extraction":true},"covers.com":{"image_traget_url_extraction":true},"cratejoy.com":{"picl_disabled":true},"crayola.com":{"picl_disabled":true},"cricbuzz.com":{"image_traget_url_extraction":true,"picl_disabled":true},"crtc.gc.ca":{"image_traget_url_extraction":true,"picl_disabled":true},"dailymail.co.uk":{"image_traget_url_extraction":true},"debenhams.com":{"picl_disabled":true},"desmos.com":{"image_traget_url_extraction":true},"dickblick.com":{"picl_disabled":true},"digg.com":{"image_traget_url_extraction":true},"diplomatie.gouv.fr":{"image_traget_url_extraction":true},"discogs.com":{"image_traget_url_extraction":true},"discord.com":{"picl_disabled":true},"diy.com":{"picl_disabled":true},"dpreview.com":{"image_traget_url_extraction":true},"dropbox.com":{"picl_disabled":true},"drudgereport.com":{"image_traget_url_extraction":true},"drugs.com":{"image_traget_url_extraction":true},"dw.com":{"image_traget_url_extraction":true},"ea.com":{"image_traget_url_extraction":true},"easports.com":{"image_traget_url_extraction":true},"ebay.co.uk":{"image_traget_url_extraction":true},"ebay.com":{"image_traget_url_extraction":true},"ebay.com.au":{"picl_disabled":true},"edmunds.com":{"image_traget_url_extraction":true},"ehow.com":{"image_traget_url_extraction":true},"elsevier.com":{"image_traget_url_extraction":true},"eonline.com":{"image_traget_url_extraction":true},"ereplacementparts.com":{"picl_disabled":true},"espn.com":{"image_traget_url_extraction":false,"picl_disabled":true},"espncricinfo.com":{"image_traget_url_extraction":true,"picl_disabled":true},"esquire.com":{"image_traget_url_extraction":true},"etsy.com":{"image_traget_url_extraction":true},"euronews.com":{"image_traget_url_extraction":true},"europa.eu":{"image_traget_url_extraction":true},"eurosport.com":{"image_traget_url_extraction":true},"expatriates.com":{"image_traget_url_extraction":true},"facebook.com":{"image_traget_url_extraction":true,"picl_disabled":true},"fandom.com":{"picl_disabled":true},"fanfiction.net":{"image_traget_url_extraction":true},"fao.org":{"image_traget_url_extraction":true},"fatbraintoys.com":{"picl_disabled":true},"fda.gov":{"image_traget_url_extraction":true,"picl_disabled":true},"filgoal.com":{"image_traget_url_extraction":true},"firmoo.com":{"picl_disabled":true},"fishpond.com.au":{"picl_disabled":true},"fixya.com":{"image_traget_url_extraction":true},"flipkart.com":{"image_traget_url_extraction":true},"fontsquirrel.com":{"image_traget_url_extraction":true},"food.com":{"image_traget_url_extraction":true},"foodnetwork.com":{"image_traget_url_extraction":true},"fool.com":{"image_traget_url_extraction":true},"football365.com":{"image_traget_url_extraction":true},"formula1.com":{"image_traget_url_extraction":true},"foxnews.com":{"image_traget_url_extraction":true,"picl_disabled":true},"foxsports.com":{"image_traget_url_extraction":true},"frontgate.com":{"picl_disabled":true},"gamespot.com":{"image_traget_url_extraction":true},"gap.com":{"image_traget_url_extraction":true},"ge.xhamster.desi":{"picl_disabled":true},"gizmodo.com":{"image_traget_url_extraction":true},"go.com":{"image_traget_url_extraction":false},"goal.com":{"image_traget_url_extraction":true},"godaddy.com":{"picl_disabled":true},"goodhousekeeping.com":{"image_traget_url_extraction":true},"goodreads.com":{"image_traget_url_extraction":true},"google.ca":{"image_traget_url_extraction":true,"picl_disabled":true},"google.cat":{"image_traget_url_extraction":true,"picl_disabled":true},"google.co.in":{"image_traget_url_extraction":true},"google.co.uk":{"image_traget_url_extraction":true,"picl_disabled":true},"google.com":{"image_traget_url_extraction":true,"picl_disabled":true},"gov.uk":{"picl_disabled":true},"groupon.com":{"image_traget_url_extraction":true},"grubhub.com":{"image_traget_url_extraction":true},"gsmarena.com":{"image_traget_url_extraction":true},"harvard.edu":{"image_traget_url_extraction":true},"health.com":{"image_traget_url_extraction":true},"healthgrades.com":{"image_traget_url_extraction":true},"heart.org":{"image_traget_url_extraction":true},"herroom.com":{"picl_disabled":true},"hgtv.com":{"image_traget_url_extraction":true},"hindustantimes.com":{"image_traget_url_extraction":true},"hm.com":{"image_traget_url_extraction":true},"hollywoodreporter.com":{"image_traget_url_extraction":true},"homedepot.com":{"image_traget_url_extraction":true},"hotels.com":{"image_traget_url_extraction":true},"howstuffworks.com":{"image_traget_url_extraction":true},"hp.com":{"image_traget_url_extraction":true},"hse.ru":{"image_traget_url_extraction":true},"hulu.com":{"picl_disabled":true},"humblebundle.com":{"image_traget_url_extraction":true},"icy-veins.com":{"image_traget_url_extraction":true},"ign.com":{"image_traget_url_extraction":true,"picl_disabled":true},"ikea.com":{"image_traget_url_extraction":true},"imdb.com":{"picl_disabled":true},"imgur.com":{"picl_disabled":true},"indeed.com":{"picl_disabled":true},"indiamart.com":{"image_traget_url_extraction":true},"indianexpress.com":{"image_traget_url_extraction":true},"indiatimes.com":{"image_traget_url_extraction":true,"picl_disabled":true},"instagram.com":{"picl_disabled":true},"instructables.com":{"image_traget_url_extraction":true},"investing.com":{"image_traget_url_extraction":true,"picl_disabled":true},"investopedia.com":{"image_traget_url_extraction":true,"picl_disabled":true},"irishtimes.com":{"image_traget_url_extraction":true},"irna.ir":{"image_traget_url_extraction":true},"irs.gov":{"image_traget_url_extraction":true,"picl_disabled":true},"jalopnik.com":{"image_traget_url_extraction":true},"japan-onlinestore.com":{"picl_disabled":true},"japanpost.jp":{"image_traget_url_extraction":true},"jnu.edu.cn":{"image_traget_url_extraction":true},"jw.org":{"image_traget_url_extraction":true},"jwpepper.com":{"picl_disabled":true},"khanacademy.org":{"image_traget_url_extraction":true,"picl_disabled":true},"kmart.com":{"picl_disabled":true},"kmart.com.au":{"picl_disabled":true},"kogan.com":{"picl_disabled":true},"kohls.com":{"image_traget_url_extraction":true},"komeri.com":{"picl_disabled":true},"kongregate.com":{"image_traget_url_extraction":true},"lanebryant.com":{"picl_disabled":true},"latimes.com":{"image_traget_url_extraction":true},"legacy.com":{"image_traget_url_extraction":true},"lego.com":{"image_traget_url_extraction":true},"lifehack.org":{"image_traget_url_extraction":true},"linkedin.com":{"image_traget_url_extraction":true,"picl_disabled":true},"littletoncoin.com":{"picl_disabled":true},"live.com":{"picl_disabled":true},"livemint.com":{"image_traget_url_extraction":true},"liverpoolfc.com":{"image_traget_url_extraction":true},"livescience.com":{"image_traget_url_extraction":true},"loc.gov":{"image_traget_url_extraction":true,"picl_disabled":true},"lonelyplanet.com":{"image_traget_url_extraction":true},"lordandtaylor.com":{"picl_disabled":true},"lowes.com":{"image_traget_url_extraction":true},"maccosmetics.com":{"picl_disabled":true},"macys.com":{"image_traget_url_extraction":true},"mail.google.com":{"picl_disabled":true},"mama.cn":{"image_traget_url_extraction":true},"marketwatch.com":{"image_traget_url_extraction":true},"mathrubhumi.com":{"image_traget_url_extraction":true,"picl_disabled":true},"mcafee.com":{"picl_disabled":true},"medicinenet.com":{"image_traget_url_extraction":true},"medscape.com":{"image_traget_url_extraction":true},"menshealth.com":{"image_traget_url_extraction":true},"mercola.com":{"image_traget_url_extraction":true},"merriam-webster.com":{"image_traget_url_extraction":true,"picl_disabled":true},"meteoblue.com":{"picl_disabled":true},"microsoft.com":{"image_traget_url_extraction":true},"microsoftonline.com":{"picl_disabled":true},"minecraft.net":{"image_traget_url_extraction":true},"miniclip.com":{"image_traget_url_extraction":true},"minne.com":{"picl_disabled":true},"minted.com":{"picl_disabled":true},"mit.edu":{"image_traget_url_extraction":true,"picl_disabled":true},"monotaro.com":{"picl_disabled":true},"motorsport.com":{"image_traget_url_extraction":true},"mozilla.org":{"image_traget_url_extraction":true,"picl_disabled":true},"msn.com":{"image_traget_url_extraction":true,"picl_disabled":true},"myer.com.au":{"picl_disabled":true},"myfitnesspal.com":{"image_traget_url_extraction":true},"nba.com":{"image_traget_url_extraction":true},"nbcnews.com":{"image_traget_url_extraction":true,"picl_disabled":true},"nbcsports.com":{"image_traget_url_extraction":true},"ndtv.com":{"image_traget_url_extraction":true,"picl_disabled":true},"nejm.org":{"image_traget_url_extraction":true},"netflix.com":{"picl_disabled":true},"newegg.com":{"image_traget_url_extraction":true},"news.com.au":{"image_traget_url_extraction":true},"newsweek.com":{"image_traget_url_extraction":true},"nexusmods.com":{"image_traget_url_extraction":true},"nhl.com":{"image_traget_url_extraction":true},"nih.gov":{"image_traget_url_extraction":true},"nike.com":{"image_traget_url_extraction":true},"nintendo.com":{"image_traget_url_extraction":true},"noaa.gov":{"image_traget_url_extraction":true,"picl_disabled":true},"nordstrom.com":{"image_traget_url_extraction":true},"npr.org":{"image_traget_url_extraction":true},"nps.gov":{"image_traget_url_extraction":true,"picl_disabled":true},"nypost.com":{"image_traget_url_extraction":true,"picl_disabled":true},"nytimes.com":{"image_traget_url_extraction":true,"picl_disabled":true},"office.com":{"picl_disabled":true},"ohiolottery.com":{"picl_disabled":true},"okezone.com":{"image_traget_url_extraction":true},"onlyfans.com":{"picl_disabled":true},"outlook-sdf.office.com":{"picl_disabled":true},"outlook.com":{"picl_disabled":true},"outlook.live.com":{"picl_disabled":true},"outlook.office.com":{"picl_disabled":true},"parents.com":{"image_traget_url_extraction":true},"pbs.org":{"image_traget_url_extraction":true},"pbskids.org":{"image_traget_url_extraction":true},"pcgamer.com":{"image_traget_url_extraction":true},"pgatour.com":{"image_traget_url_extraction":true},"pinkbike.com":{"image_traget_url_extraction":true},"pinterest.com":{"image_traget_url_extraction":true,"picl_disabled":true},"planetminecraft.com":{"image_traget_url_extraction":true,"picl_disabled":true},"playstation.com":{"image_traget_url_extraction":true},"plos.org":{"image_traget_url_extraction":true},"pointp.fr":{"picl_disabled":true},"pokemon.com":{"image_traget_url_extraction":true},"ponparemall.com":{"picl_disabled":true},"pornhub.com":{"picl_disabled":true},"powells.com":{"picl_disabled":true},"psu.edu":{"image_traget_url_extraction":true},"psychologytoday.com":{"image_traget_url_extraction":true},"puritan.com":{"picl_disabled":true},"purplewave.com":{"picl_disabled":true},"qq.com":{"image_traget_url_extraction":true},"raspberrypi.org":{"image_traget_url_extraction":true},"realsimple.com":{"image_traget_url_extraction":true},"realtor.com":{"image_traget_url_extraction":true,"picl_disabled":true},"reddit.com":{"image_traget_url_extraction":false,"picl_disabled":true},"redfin.com":{"picl_disabled":true},"rei.com":{"image_traget_url_extraction":true},"reuters.com":{"image_traget_url_extraction":true,"picl_disabled":true},"rightmove.co.uk":{"picl_disabled":true},"roblox.com":{"picl_disabled":true},"rockpapershotgun.com":{"image_traget_url_extraction":true},"rollingstone.com":{"image_traget_url_extraction":true},"rotoworld.com":{"image_traget_url_extraction":true},"rottentomatoes.com":{"image_traget_url_extraction":true,"picl_disabled":true},"royalbank.com":{"picl_disabled":true},"royalmail.com":{"image_traget_url_extraction":true},"rt.com":{"image_traget_url_extraction":true,"picl_disabled":true},"runnersworld.com":{"image_traget_url_extraction":true},"salon.com":{"image_traget_url_extraction":true},"sbnation.com":{"image_traget_url_extraction":true},"sciencedaily.com":{"image_traget_url_extraction":true},"sciencemag.org":{"image_traget_url_extraction":true},"scientificamerican.com":{"image_traget_url_extraction":true},"scotiaonline.scotiabank.com":{"picl_disabled":true},"screenrant.com":{"image_traget_url_extraction":true},"screwfix.com":{"picl_disabled":true},"scribd.com":{"image_traget_url_extraction":true},"sdsu.edu":{"image_traget_url_extraction":true},"sec.gov":{"image_traget_url_extraction":true,"picl_disabled":true},"secure.lloydsbank.co.uk":{"picl_disabled":true},"securebusiness.lloydsbank.co.uk":{"picl_disabled":true},"self.com":{"image_traget_url_extraction":true},"sherdog.com":{"image_traget_url_extraction":true},"shutterfly.com":{"image_traget_url_extraction":true},"sina.com.cn":{"image_traget_url_extraction":true},"sky.com":{"image_traget_url_extraction":true},"skyscanner.com":{"image_traget_url_extraction":true},"slate.com":{"image_traget_url_extraction":true},"slideshare.net":{"image_traget_url_extraction":true,"picl_disabled":true},"snopes.com":{"image_traget_url_extraction":true},"sohu.com":{"image_traget_url_extraction":true},"space.com":{"image_traget_url_extraction":true},"sparknotes.com":{"image_traget_url_extraction":true},"sportsmansguide.com":{"picl_disabled":true},"spotlightstores.com":{"picl_disabled":true},"square-enix.com":{"image_traget_url_extraction":true},"sstack.com":{"picl_disabled":true},"stackoverflow.com":{"picl_disabled":true},"stanford.edu":{"image_traget_url_extraction":true},"staples.com":{"image_traget_url_extraction":true},"state.gov":{"image_traget_url_extraction":true,"picl_disabled":true},"steampowered.com":{"image_traget_url_extraction":true},"studentdoctor.net":{"image_traget_url_extraction":true},"sulekha.com":{"image_traget_url_extraction":true},"superdrug.com":{"picl_disabled":true},"szu.edu.cn":{"image_traget_url_extraction":true},"taobao.com":{"image_traget_url_extraction":true},"target.com":{"image_traget_url_extraction":true},"tax.service.gov.uk":{"picl_disabled":true},"td.com":{"image_traget_url_extraction":true,"picl_disabled":true},"techstreet.com":{"picl_disabled":true},"tesco.com":{"picl_disabled":true},"theasianparent.com":{"image_traget_url_extraction":true},"theatlantic.com":{"image_traget_url_extraction":true},"thedailybeast.com":{"image_traget_url_extraction":true},"thefreedictionary.com":{"image_traget_url_extraction":true},"thehill.com":{"image_traget_url_extraction":true},"thelancet.com":{"image_traget_url_extraction":true},"thesaurus.com":{"image_traget_url_extraction":true,"picl_disabled":true},"thesimsresource.com":{"image_traget_url_extraction":true},"thespruce.com":{"image_traget_url_extraction":true},"thespruceeats.com":{"image_traget_url_extraction":true},"theverge.com":{"image_traget_url_extraction":true,"picl_disabled":true},"thoughtco.com":{"image_traget_url_extraction":true},"thrillist.com":{"image_traget_url_extraction":true},"ticketmaster.com":{"image_traget_url_extraction":true},"time.com":{"image_traget_url_extraction":true,"picl_disabled":true},"tmall.com":{"image_traget_url_extraction":true},"tmz.com":{"image_traget_url_extraction":true},"tomsguide.com":{"image_traget_url_extraction":true},"tomshardware.com":{"image_traget_url_extraction":true},"tonyrobbins.com":{"image_traget_url_extraction":true},"tribunnews.com":{"image_traget_url_extraction":true,"picl_disabled":true},"tripadvisor.co.uk":{"picl_disabled":true},"tripsavvy.com":{"image_traget_url_extraction":true},"trivago.com":{"image_traget_url_extraction":true},"tsn.ca":{"image_traget_url_extraction":true},"tums.ac.ir":{"image_traget_url_extraction":true},"turnitin.com":{"image_traget_url_extraction":true},"twitch.tv":{"image_traget_url_extraction":true,"picl_disabled":true},"twitter.com":{"image_traget_url_extraction":true,"picl_disabled":true},"ubisoft.com":{"image_traget_url_extraction":true},"udemy.com":{"image_traget_url_extraction":true},"un.org":{"image_traget_url_extraction":true},"unesco.org":{"image_traget_url_extraction":true},"unity3d.com":{"image_traget_url_extraction":true},"usatoday.com":{"image_traget_url_extraction":false,"picl_disabled":true},"usda.gov":{"image_traget_url_extraction":true,"picl_disabled":true},"usgs.gov":{"image_traget_url_extraction":true,"picl_disabled":true},"usps.com":{"picl_disabled":true},"utoronto.ca":{"image_traget_url_extraction":true},"vectorstock.com":{"image_traget_url_extraction":true},"verizonwireless.com":{"image_traget_url_extraction":true},"verywellfit.com":{"image_traget_url_extraction":true},"verywellmind.com":{"image_traget_url_extraction":true},"vice.com":{"image_traget_url_extraction":false,"picl_disabled":true},"vitals.com":{"image_traget_url_extraction":true},"walgreens.com":{"image_traget_url_extraction":true},"washingtonpost.com":{"image_traget_url_extraction":true,"picl_disabled":true},"wayfair.com":{"image_traget_url_extraction":true},"weather.com":{"image_traget_url_extraction":true,"picl_disabled":true},"weather.gov":{"image_traget_url_extraction":true,"picl_disabled":true},"weathertech.com":{"picl_disabled":true},"webmd.com":{"image_traget_url_extraction":true,"picl_disabled":true},"wellsfargo.com":{"image_traget_url_extraction":true,"picl_disabled":true},"whoscored.com":{"image_traget_url_extraction":true},"wikipedia.org":{"image_traget_url_extraction":true,"picl_disabled":true},"wired.com":{"image_traget_url_extraction":true},"worldbank.org":{"image_traget_url_extraction":true},"wsj.com":{"image_traget_url_extraction":true,"picl_disabled":true},"wunderground.com":{"image_traget_url_extraction":true},"wwe.com":{"image_traget_url_extraction":true},"xbox.com":{"image_traget_url_extraction":true},"xhamster.com":{"picl_disabled":true},"xinhuanet.com":{"image_traget_url_extraction":true},"xvideos.com":{"picl_disabled":true},"yahoo.co.jp":{"image_traget_url_extraction":true},"yahoo.com":{"image_traget_url_extraction":true,"picl_disabled":true},"yelp.com":{"image_traget_url_extraction":true},"yoox.com":{"image_traget_url_extraction":true},"youtube.com":{"image_traget_url_extraction":true,"picl_disabled":true},"zhanqi.tv":{"image_traget_url_extraction":true},"zillow.com":{"image_traget_url_extraction":true,"picl_disabled":true},"zocdoc.com":{"image_traget_url_extraction":true},"zoom.us":{"picl_disabled":true},"zumiez.com":{"picl_disabled":true},"zvab.com":{"picl_disabled":true}},"updated_at":1774484533.188791} \ No newline at end of file diff --git a/.edge-profile-render-1774484525680/Default/Extension Rules/CURRENT b/.edge-profile-render-1774484525680/Default/Extension Rules/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extension Rules/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile-render-1774484525680/Default/Extension Rules/LOCK b/.edge-profile-render-1774484525680/Default/Extension Rules/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/Extension Rules/LOG b/.edge-profile-render-1774484525680/Default/Extension Rules/LOG new file mode 100644 index 0000000..ab09763 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extension Rules/LOG @@ -0,0 +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 diff --git a/.edge-profile-render-1774484525680/Default/Extension Rules/MANIFEST-000001 b/.edge-profile-render-1774484525680/Default/Extension Rules/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Extension Rules/MANIFEST-000001 differ diff --git a/.edge-profile-render-1774484525680/Default/Extension Scripts/CURRENT b/.edge-profile-render-1774484525680/Default/Extension Scripts/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extension Scripts/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile-render-1774484525680/Default/Extension Scripts/LOCK b/.edge-profile-render-1774484525680/Default/Extension Scripts/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/Extension Scripts/LOG b/.edge-profile-render-1774484525680/Default/Extension Scripts/LOG new file mode 100644 index 0000000..8e471ea --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extension Scripts/LOG @@ -0,0 +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 diff --git a/.edge-profile-render-1774484525680/Default/Extension Scripts/MANIFEST-000001 b/.edge-profile-render-1774484525680/Default/Extension Scripts/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Extension Scripts/MANIFEST-000001 differ diff --git a/.edge-profile-render-1774484525680/Default/Extension State/CURRENT b/.edge-profile-render-1774484525680/Default/Extension State/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extension State/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile-render-1774484525680/Default/Extension State/LOCK b/.edge-profile-render-1774484525680/Default/Extension State/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/Extension State/LOG b/.edge-profile-render-1774484525680/Default/Extension State/LOG new file mode 100644 index 0000000..bf0d3f8 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extension State/LOG @@ -0,0 +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 diff --git a/.edge-profile-render-1774484525680/Default/Extension State/MANIFEST-000001 b/.edge-profile-render-1774484525680/Default/Extension State/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Extension State/MANIFEST-000001 differ diff --git a/.edge-profile-render-1774484525680/Default/ExtensionActivityComp b/.edge-profile-render-1774484525680/Default/ExtensionActivityComp new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/ExtensionActivityEdge b/.edge-profile-render-1774484525680/Default/ExtensionActivityEdge new file mode 100644 index 0000000..8ac5d91 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/ExtensionActivityEdge differ diff --git a/.edge-profile-render-1774484525680/Default/ExtensionActivityEdge-journal b/.edge-profile-render-1774484525680/Default/ExtensionActivityEdge-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/128.png b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/128.png new file mode 100644 index 0000000..a90585d Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/128.png differ diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/af/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/af/messages.json new file mode 100644 index 0000000..8e079ee --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/af/messages.json @@ -0,0 +1,23 @@ +{ + "createnew": { + "message": "SKEP NUWE" + }, + "explanationofflinedisabled": { + "message": "Jy is vanlyn. As jy Google Dokumente sonder 'n internetverbinding wil gebruik, moet jy die volgende keer as jy aan die internet gekoppel is na instellings op die Google Dokumente-tuisblad gaan en vanlynsinkronisering aanskakel." + }, + "explanationofflineenabled": { + "message": "Jy is vanlyn, maar jy kan nog steeds beskikbare lêers redigeer of nuwes skep." + }, + "extdesc": { + "message": "Skep, wysig en bekyk jou dokumente, sigblaaie en aanbiedings – alles sonder toegang tot die internet." + }, + "extname": { + "message": "Google Vanlyn Dokumente" + }, + "learnmore": { + "message": "Kom meer te wete" + }, + "popuphelptext": { + "message": "Skryf, redigeer en werk saam, waar jy ook al is, met of sonder 'n internetverbinding." + } +} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/am/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/am/messages.json new file mode 100644 index 0000000..3548751 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/am/messages.json @@ -0,0 +1,23 @@ +{ + "createnew": { + "message": "አዲስ ፍጠር" + }, + "explanationofflinedisabled": { + "message": "ከመስመር ውጭ ነዎት። Google ሰነዶችን ያለበይነመረብ ግንኙነት ለመጠቀም በGoogle ሰነዶች መነሻ ገፅ ላይ ወደ ቅንብሮች ይሂዱና ከበይነመረቡ ጋር በሚገናኙበት ቀጣዩ ጊዜ ላይ የመስመር ውጭ ስምረትን ያብሩ።" + }, + "explanationofflineenabled": { + "message": "ከመስመር ውጭ ነዎት፣ ነገር ግን አሁንም የሚገኙ ፋይሎችን ማርትዕ ወይም አዲሶችን መፍጠር ይችላሉ።" + }, + "extdesc": { + "message": "የእርስዎን ሰነዶች፣ የተመን ሉሆች እና የዝግጅት አቀራረቦች ያርትዑ፣ ይፍጠሩ እና ይመልከቱ — ሁሉንም ያለ በይነመረብ መዳረሻ።" + }, + "extname": { + "message": "ከመስመር ውጭ Google ሰነዶች" + }, + "learnmore": { + "message": "ተጨማሪ ለመረዳት" + }, + "popuphelptext": { + "message": "የትም ይሁኑ በበይነመረብ ግንኙነት ወይም ያለእሱ ይጻፉ፣ ያርትዑ እና ይተባበሩ።" + } +} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/ar/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/ar/messages.json new file mode 100644 index 0000000..3f4752b --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/ar/messages.json @@ -0,0 +1,23 @@ +{ + "createnew": { + "message": "إنشاء جديد" + }, + "explanationofflinedisabled": { + "message": "أنت بلا اتصال، لاستخدام مستندات Google بلا اتصال بالإنترنت، انتقل إلى الإعدادات في الصفحة الرئيسية لمستندات Google وشغّل المزامنة بلا اتصال في المرة القادمة التي تتصل فيها بالإنترنت." + }, + "explanationofflineenabled": { + "message": "أنت بلا اتصال، ولكن لا يزال بإمكانك تعديل الملفات المتاحة أو إنشاء ملفات جديدة." + }, + "extdesc": { + "message": "تعديل المستندات وجداول البيانات والعروض التقديمية وإنشاؤها وعرضها، كل ذلك بلا اتصال بالإنترنت" + }, + "extname": { + "message": "مستندات Google بلا إنترنت" + }, + "learnmore": { + "message": "المزيد من المعلومات" + }, + "popuphelptext": { + "message": "يمكنك الكتابة والتعديل والتعاون من أي مكان، سواء كنت متصلاً بالإنترنت أو لا." + } +} 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 new file mode 100644 index 0000000..d3d0ca7 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/as/messages.json @@ -0,0 +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"}} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/az/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/az/messages.json new file mode 100644 index 0000000..dc83fda --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/az/messages.json @@ -0,0 +1,23 @@ +{ + "createnew": { + "message": "YENİSİNİ YARADIN" + }, + "explanationofflinedisabled": { + "message": "Oflaynsınız. Google Sənədi internet bağlantısı olmadan istifadə etmək istəyirsinizsə, Google Sənədin əsas səhifəsində ayarlara gedin və növbəti dəfə internetə qoşulanda oflayn sinxronizasiyanı aktiv edin." + }, + "explanationofflineenabled": { + "message": "Oflaynsınız, amma mövcud faylları redaktə edə və yenilərini yarada bilərsiniz." + }, + "extdesc": { + "message": "Sənəd, cədvəl və təqdimatların hamısını internet olmadan redaktə edin, yaradın və baxın." + }, + "extname": { + "message": "Google Sənəd Oflayn" + }, + "learnmore": { + "message": "Ətraflı Məlumat" + }, + "popuphelptext": { + "message": "Harda olmağınızdan və internetə qoşulu olub-olmadığınızdan asılı olmayaraq, yazın, redaktə edin və əməkdaşlıq edin." + } +} 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 new file mode 100644 index 0000000..2af08fe --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/be/messages.json @@ -0,0 +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."}} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/bg/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/bg/messages.json new file mode 100644 index 0000000..5556a45 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/bg/messages.json @@ -0,0 +1,23 @@ +{ + "createnew": { + "message": "СЪЗДАВАНЕ" + }, + "explanationofflinedisabled": { + "message": "Офлайн сте. За да използвате Google Документи без интернет връзка, отворете настройките в началната страница на Google Документи и включете офлайн синхронизиране следващия път, когато имате връзка с интернет." + }, + "explanationofflineenabled": { + "message": "Офлайн сте, но пак можете да редактирате наличните файлове или да създавате нови." + }, + "extdesc": { + "message": "Редактирайте, създавайте и преглеждайте своите документи, електронни таблици и презентации – всичко това без достъп до интернет." + }, + "extname": { + "message": "Google Документи офлайн" + }, + "learnmore": { + "message": "Научете повече" + }, + "popuphelptext": { + "message": "Пишете, редактирайте и работете съвместно където и да сте, независимо дали имате връзка с интернет." + } +} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/bn/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/bn/messages.json new file mode 100644 index 0000000..6394410 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/bn/messages.json @@ -0,0 +1,23 @@ +{ + "createnew": { + "message": "নতুন তৈরী করুন" + }, + "explanationofflinedisabled": { + "message": "আপনি অফলাইনে রয়েছেন৷ কোনো ইন্টারনেট সংযোগ ছাড়াই Google দস্তাবেজ ব্যবহার করতে, Google দস্তাবেজের হোমপেজের সেটিংসে যান এবং আপনি যখন পরের বার ইন্টারনেটের সাথে সংযুক্ত হবেন তখন অফলাইন সিঙ্ক চালু করুন৷" + }, + "explanationofflineenabled": { + "message": "আপনি অফলাইনে রয়েছেন, কিন্তু আপনি এখনও উপলব্ধ ফাইলগুলিকে সম্পাদনা করতে বা একটি নতুন তৈরি করতে পারবেন৷" + }, + "extdesc": { + "message": "ইন্টারনেট অ্যাক্সেস ছাড়াই আপনার ডকুমেন্ট, স্প্রেডশিট এবং উপস্থাপনা এডিট, তৈরি করুন এবং দেখুন।" + }, + "extname": { + "message": "Google দস্তাবেজ অফলাইন" + }, + "learnmore": { + "message": "আরও জানুন" + }, + "popuphelptext": { + "message": "ইন্টারনেটে সংযোগ থাকা বা না থাকা অবস্থায় আপনি যে কোনো স্থান থেকে লিখুন, সম্পদনা এবং সহযোগিতা করুন৷" + } +} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/ca/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/ca/messages.json new file mode 100644 index 0000000..9a9b77a --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/ca/messages.json @@ -0,0 +1,23 @@ +{ + "createnew": { + "message": "CREA'N UN DE NOU" + }, + "explanationofflinedisabled": { + "message": "No tens connexió. Per utilitzar Documents de Google sense connexió a Internet, ves a la configuració de la pàgina d'inici d'aquest servei i activa l'opció per sincronitzar-se sense connexió la propera vegada que estiguis connectat a la xarxa." + }, + "explanationofflineenabled": { + "message": "Tot i que no tens connexió, pots editar o crear fitxers." + }, + "extdesc": { + "message": "Edita, crea i consulta documents, fulls de càlcul i presentacions, tot sense accés a Internet." + }, + "extname": { + "message": "Documents de Google sense connexió" + }, + "learnmore": { + "message": "Més informació" + }, + "popuphelptext": { + "message": "Escriu text, edita fitxers i col·labora-hi siguis on siguis, amb o sense connexió a Internet." + } +} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/cs/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/cs/messages.json new file mode 100644 index 0000000..b381255 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/cs/messages.json @@ -0,0 +1,23 @@ +{ + "createnew": { + "message": "VYTVOŘIT" + }, + "explanationofflinedisabled": { + "message": "Jste offline. Pokud chcete Dokumenty Google používat bez připojení k internetu, až budete příště online, přejděte do nastavení na domovské stránce Dokumentů Google a zapněte offline synchronizaci." + }, + "explanationofflineenabled": { + "message": "Jste offline, ale stále můžete upravovat dostupné soubory nebo vytvářet nové." + }, + "extdesc": { + "message": "Upravujte, vytvářejte a zobrazujte své dokumenty, tabulky a prezentace – vše bez přístupu k internetu." + }, + "extname": { + "message": "Dokumenty Google offline" + }, + "learnmore": { + "message": "Další informace" + }, + "popuphelptext": { + "message": "Pište, upravujte a spolupracujte kdekoli, s připojením k internetu i bez něj." + } +} 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 new file mode 100644 index 0000000..50c0c02 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/cy/messages.json @@ -0,0 +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."}} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/da/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/da/messages.json new file mode 100644 index 0000000..b40683a --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/da/messages.json @@ -0,0 +1,23 @@ +{ + "createnew": { + "message": "OPRET NYT" + }, + "explanationofflinedisabled": { + "message": "Du er offline. Hvis du vil bruge Google Docs uden en internetforbindelse, kan du gå til indstillinger på startsiden for Google Docs og aktivere offlinesynkronisering, næste gang du har internetforbindelse." + }, + "explanationofflineenabled": { + "message": "Du er offline, men du kan stadig redigere tilgængelige filer eller oprette nye." + }, + "extdesc": { + "message": "Rediger, opret og se dine dokumenter, regneark og præsentationer helt uden internetadgang." + }, + "extname": { + "message": "Google Docs Offline" + }, + "learnmore": { + "message": "Få flere oplysninger" + }, + "popuphelptext": { + "message": "Skriv, rediger og samarbejd, uanset hvor du er, og uanset om du har internetforbindelse." + } +} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/de/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/de/messages.json new file mode 100644 index 0000000..badd90a --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/de/messages.json @@ -0,0 +1,23 @@ +{ + "createnew": { + "message": "NEU ERSTELLEN" + }, + "explanationofflinedisabled": { + "message": "Sie sind offline. Um Google Docs ohne Internetverbindung zu verwenden, gehen Sie auf der Google Docs-Startseite auf \"Einstellungen\" und schalten die Offlinesynchronisierung ein, wenn Sie das nächste Mal mit dem Internet verbunden sind." + }, + "explanationofflineenabled": { + "message": "Sie sind offline, aber können weiterhin verfügbare Dateien bearbeiten oder neue Dateien erstellen." + }, + "extdesc": { + "message": "Mit der Erweiterung können Sie Dokumente, Tabellen und Präsentationen bearbeiten, erstellen und aufrufen – ganz ohne Internetverbindung." + }, + "extname": { + "message": "Google Docs Offline" + }, + "learnmore": { + "message": "Weitere Informationen" + }, + "popuphelptext": { + "message": "Mit oder ohne Internetverbindung: Sie können von überall Dokumente erstellen, ändern und zusammen mit anderen Nutzern bearbeiten." + } +} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/el/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/el/messages.json new file mode 100644 index 0000000..bbcf19b --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/el/messages.json @@ -0,0 +1,23 @@ +{ + "createnew": { + "message": "ΔΗΜΙΟΥΡΓΙΑ ΝΕΟΥ" + }, + "explanationofflinedisabled": { + "message": "Είστε εκτός σύνδεσης. Για να χρησιμοποιήσετε τα Έγγραφα Google χωρίς σύνδεση στο διαδίκτυο, μεταβείτε στις ρυθμίσεις στην αρχική σελίδα των Εγγράφων Google και ενεργοποιήστε τον συγχρονισμό εκτός σύνδεσης την επόμενη φορά που θα είστε συνδεδεμένοι στο διαδίκτυο." + }, + "explanationofflineenabled": { + "message": "Είστε εκτός σύνδεσης αλλά μπορείτε να επεξεργαστείτε τα διαθέσιμα αρχεία ή να δημιουργήσετε νέα αρχεία." + }, + "extdesc": { + "message": "Επεξεργαστείτε, δημιουργήστε και δείτε τα έγγραφα, τα υπολογιστικά φύλλα και τις παρουσιάσεις σας και όλα αυτά χωρίς πρόσβαση στο διαδίκτυο." + }, + "extname": { + "message": "Έγγραφα Google εκτός σύνδεσης" + }, + "learnmore": { + "message": "Μάθετε περισσότερα" + }, + "popuphelptext": { + "message": "Γράψτε, επεξεργαστείτε και συνεργαστείτε με άλλους χρήστες όπου και αν βρίσκεστε, με ή χωρίς σύνδεση στο διαδίκτυο." + } +} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/en/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/en/messages.json new file mode 100644 index 0000000..a7315cb --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/en/messages.json @@ -0,0 +1,23 @@ +{ + "createnew": { + "message": "CREATE NEW" + }, + "explanationofflinedisabled": { + "message": "You're offline. To use Google Docs without an internet connection, go to settings on the Google Docs homepage and turn on offline sync the next time you're connected to the internet." + }, + "explanationofflineenabled": { + "message": "You're offline, but you can still edit available files or create new ones." + }, + "extdesc": { + "message": "Edit, create, and view your documents, spreadsheets, and presentations — all without internet access." + }, + "extname": { + "message": "Google Docs Offline" + }, + "learnmore": { + "message": "Learn More" + }, + "popuphelptext": { + "message": "Write, edit, and collaborate wherever you are, with or without an internet connection." + } +} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/en_CA/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/en_CA/messages.json new file mode 100644 index 0000000..a7315cb --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/en_CA/messages.json @@ -0,0 +1,23 @@ +{ + "createnew": { + "message": "CREATE NEW" + }, + "explanationofflinedisabled": { + "message": "You're offline. To use Google Docs without an internet connection, go to settings on the Google Docs homepage and turn on offline sync the next time you're connected to the internet." + }, + "explanationofflineenabled": { + "message": "You're offline, but you can still edit available files or create new ones." + }, + "extdesc": { + "message": "Edit, create, and view your documents, spreadsheets, and presentations — all without internet access." + }, + "extname": { + "message": "Google Docs Offline" + }, + "learnmore": { + "message": "Learn More" + }, + "popuphelptext": { + "message": "Write, edit, and collaborate wherever you are, with or without an internet connection." + } +} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/en_GB/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/en_GB/messages.json new file mode 100644 index 0000000..a18dc32 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/en_GB/messages.json @@ -0,0 +1,23 @@ +{ + "createnew": { + "message": "CREATE NEW" + }, + "explanationofflinedisabled": { + "message": "You're offline. To use Google Docs without an Internet connection, go to settings on the Google Docs homepage and turn on offline sync the next time you're connected to the Internet." + }, + "explanationofflineenabled": { + "message": "You're offline, but you can still edit available files or create new ones." + }, + "extdesc": { + "message": "Edit, create and view your documents, spreadsheets and presentations – all without Internet access." + }, + "extname": { + "message": "Google Docs Offline" + }, + "learnmore": { + "message": "Learn more" + }, + "popuphelptext": { + "message": "Write, edit and collaborate wherever you are, with or without an Internet connection." + } +} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/en_US/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/en_US/messages.json new file mode 100644 index 0000000..095c1ad --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/en_US/messages.json @@ -0,0 +1,30 @@ +{ + "createNew": { + "description": "Text shown in the extension pop up for creating a new document", + "message": "CREATE NEW" + }, + "explanationOfflineDisabled": { + "description": "Text shown in the extension popup when the user is offline and offline is disabled.", + "message": "You're offline. To use Google Docs without an internet connection, go to settings on the Google Docs homepage and turn on offline sync the next time you're connected to the internet." + }, + "explanationOfflineEnabled": { + "description": "Text shown in the extension popup when the user is offline and offline is enabled.", + "message": "You're offline, but you can still edit available files or create new ones." + }, + "extDesc": { + "description": "Extension description", + "message": "Edit, create, and view your documents, spreadsheets, and presentations — all without internet access." + }, + "extName": { + "description": "Extension name", + "message": "Google Docs Offline" + }, + "learnMore": { + "description": "Text shown after the help text that the user can click to learn more.", + "message": "Learn More" + }, + "popupHelpText": { + "description": "Help text that is shown as part of the extension pop-up title", + "message": "Write, edit, and collaborate wherever you are, with or without an internet connection." + } +} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/es/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/es/messages.json new file mode 100644 index 0000000..7c3759c --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/es/messages.json @@ -0,0 +1,23 @@ +{ + "createnew": { + "message": "CREAR" + }, + "explanationofflinedisabled": { + "message": "No tienes conexión. Para usar Documentos de Google sin conexión a Internet, ve a Configuración en la página principal de Documentos de Google y activa la sincronización sin conexión la próxima vez que te conectes a Internet." + }, + "explanationofflineenabled": { + "message": "No tienes conexión. Aun así, puedes crear archivos o editar los que estén disponibles." + }, + "extdesc": { + "message": "Edita, crea y consulta tus documentos, hojas de cálculo y presentaciones; todo ello, sin acceso a Internet." + }, + "extname": { + "message": "Documentos de Google sin conexión" + }, + "learnmore": { + "message": "Más información" + }, + "popuphelptext": { + "message": "Escribe o edita contenido y colabora con otras personas desde cualquier lugar, con o sin conexión a Internet." + } +} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/es_419/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/es_419/messages.json new file mode 100644 index 0000000..091e842 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/es_419/messages.json @@ -0,0 +1,23 @@ +{ + "createnew": { + "message": "CREAR NUEVO" + }, + "explanationofflinedisabled": { + "message": "No tienes conexión. Para usar Documentos de Google sin conexión a Internet, ve a la configuración de la página principal de Documentos de Google y activa la sincronización sin conexión la próxima vez que estés conectado a Internet." + }, + "explanationofflineenabled": { + "message": "No tienes conexión, pero aún puedes modificar los archivos disponibles o crear otros nuevos." + }, + "extdesc": { + "message": "Edita, crea y consulta tus documentos, hojas de cálculo y presentaciones aunque no tengas acceso a Internet" + }, + "extname": { + "message": "Documentos de Google sin conexión" + }, + "learnmore": { + "message": "Más información" + }, + "popuphelptext": { + "message": "Escribe, modifica y colabora dondequiera que estés, con conexión a Internet o sin ella." + } +} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/et/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/et/messages.json new file mode 100644 index 0000000..b5e1704 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/et/messages.json @@ -0,0 +1,23 @@ +{ + "createnew": { + "message": "LOO UUS" + }, + "explanationofflinedisabled": { + "message": "Teil ei ole võrguühendust. Teenuse Google’i dokumendid kasutamiseks ilma Interneti-ühenduseta avage järgmine kord, kui olete Internetiga ühendatud, teenuse Google’i dokumendid avalehel seaded ja lülitage sisse võrguühenduseta sünkroonimine." + }, + "explanationofflineenabled": { + "message": "Teil ei ole võrguühendust, kuid saate endiselt saadaolevaid faile muuta või uusi luua." + }, + "extdesc": { + "message": "Saate luua, muuta ja vaadata oma dokumente, arvustustabeleid ning esitlusi ilma Interneti-ühenduseta." + }, + "extname": { + "message": "Võrguühenduseta Google’i dokumendid" + }, + "learnmore": { + "message": "Lisateave" + }, + "popuphelptext": { + "message": "Kirjutage, muutke ja tehke koostööd ükskõik kus olenemata sellest, kas teil on Interneti-ühendus." + } +} 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 new file mode 100644 index 0000000..b152542 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/eu/messages.json @@ -0,0 +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."}} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/fa/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/fa/messages.json new file mode 100644 index 0000000..081388b --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/fa/messages.json @@ -0,0 +1,23 @@ +{ + "createnew": { + "message": "ایجاد سند جدید" + }, + "explanationofflinedisabled": { + "message": "آفلاین هستید. برای استفاده از سندنگار Google بدون اتصال اینترنت، دفعه بعد که به اینترنت وصل شدید، به تنظیمات در صفحه اصلی سندنگار Google بروید و همگام‌سازی آفلاین را فعال کنید." + }, + "explanationofflineenabled": { + "message": "آفلاین هستید اما همچنان می‌توانید فایل‌هایی را که در دسترس هستند ویرایش کنید یا فایل‌های جدیدی ایجاد کنید." + }, + "extdesc": { + "message": "اسناد، صفحات‌گسترده و ارائه‌ها را ویرایش، ایجاد و مشاهده کنید — همه این کارها بدون دسترسی به اینترنت." + }, + "extname": { + "message": "سندنگار Google آفلاین" + }, + "learnmore": { + "message": "بیشتر بدانید" + }, + "popuphelptext": { + "message": "هرکجا هستید، با اتصال به اینترنت یا بدون اتصال به اینترنت، بنویسید، ویرایش و مشارکت کنید." + } +} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/fi/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/fi/messages.json new file mode 100644 index 0000000..7b63ab2 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/fi/messages.json @@ -0,0 +1,23 @@ +{ + "createnew": { + "message": "LUO UUSI" + }, + "explanationofflinedisabled": { + "message": "Olet offline-tilassa. Jos haluat käyttää Google Docsia ilman internetyhteyttä, siirry Google Docsin etusivulle ja ota asetuksissa käyttöön offline-synkronointi, kun seuraavan kerran olet yhteydessä internetiin." + }, + "explanationofflineenabled": { + "message": "Olet offline-tilassa. Voit kuitenkin muokata käytettävissä olevia tiedostoja tai luoda uusia." + }, + "extdesc": { + "message": "Muokkaa, luo ja katso dokumentteja, laskentataulukoita ja esityksiä ilman internetyhteyttä." + }, + "extname": { + "message": "Google Docsin offline-tila" + }, + "learnmore": { + "message": "Lisätietoja" + }, + "popuphelptext": { + "message": "Kirjoita, muokkaa ja tee yhteistyötä paikasta riippumatta, myös ilman internetyhteyttä." + } +} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/fil/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/fil/messages.json new file mode 100644 index 0000000..888fe8b --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/fil/messages.json @@ -0,0 +1,23 @@ +{ + "createnew": { + "message": "GUMAWA NG BAGO" + }, + "explanationofflinedisabled": { + "message": "Naka-offline ka. Upang magamit ang Google Docs nang walang koneksyon sa internet, pumunta sa mga setting sa homepage ng Google Docs at i-on ang offline na pag-sync sa susunod na nakakonekta ka sa internet." + }, + "explanationofflineenabled": { + "message": "Naka-offline ka, ngunit maaari mo pa ring i-edit ang mga available na file o gumawa ng mga bago." + }, + "extdesc": { + "message": "I-edit, gawin, at tingnan ang iyong mga dokumento, spreadsheet, at presentation — lahat ng ito nang walang access sa internet." + }, + "extname": { + "message": "Google Docs Offline" + }, + "learnmore": { + "message": "Matuto Pa" + }, + "popuphelptext": { + "message": "Magsulat, mag-edit at makipag-collaborate nasaan ka man, nang mayroon o walang koneksyon sa internet." + } +} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/fr/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/fr/messages.json new file mode 100644 index 0000000..03da432 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/fr/messages.json @@ -0,0 +1,23 @@ +{ + "createnew": { + "message": "CRÉER" + }, + "explanationofflinedisabled": { + "message": "Vous êtes hors connexion. Pour pouvoir utiliser Google Docs sans connexion Internet, accédez aux paramètres de la page d'accueil de Google Docs et activez la synchronisation hors connexion lors de votre prochaine connexion à Internet." + }, + "explanationofflineenabled": { + "message": "Vous êtes hors connexion, mais vous pouvez quand même modifier les fichiers disponibles ou créer des fichiers." + }, + "extdesc": { + "message": "Modifiez, créez et consultez des documents, feuilles de calcul et présentations, sans accès à Internet." + }, + "extname": { + "message": "Google Docs hors connexion" + }, + "learnmore": { + "message": "En savoir plus" + }, + "popuphelptext": { + "message": "Rédigez des documents, modifiez-les et collaborez où que vous soyez, avec ou sans connexion Internet." + } +} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/fr_CA/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/fr_CA/messages.json new file mode 100644 index 0000000..75dd191 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/fr_CA/messages.json @@ -0,0 +1,23 @@ +{ + "createnew": { + "message": "CRÉER" + }, + "explanationofflinedisabled": { + "message": "Vous êtes hors connexion. Pour utiliser Google Documents sans connexion Internet, accédez aux paramètres sur la page d'accueil Google Documents et activez la synchronisation hors ligne la prochaine fois que vous êtes connecté à Internet." + }, + "explanationofflineenabled": { + "message": "Vous êtes hors connexion, mais vous pouvez toujours modifier les fichiers disponibles ou en créer." + }, + "extdesc": { + "message": "Modifiez, créez et consultez vos documents, vos feuilles de calcul et vos présentations, le tout sans accès à Internet." + }, + "extname": { + "message": "Google Documents hors connexion" + }, + "learnmore": { + "message": "En savoir plus" + }, + "popuphelptext": { + "message": "Écrivez, modifiez et collaborez où que vous soyez, avec ou sans connexion Internet." + } +} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/gl/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/gl/messages.json new file mode 100644 index 0000000..6c30ab5 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/gl/messages.json @@ -0,0 +1,23 @@ +{ + "createnew": { + "message": "CREAR NOVO" + }, + "explanationofflinedisabled": { + "message": "Estás sen conexión. Para utilizar Documentos de Google sen conexión a Internet, accede ás opcións de configuración na páxina de inicio de Documentos de Google e activa a sincronización sen conexión a próxima vez que esteas conectado a Internet." + }, + "explanationofflineenabled": { + "message": "Estás sen conexión. Aínda podes editar os ficheiros dispoñibles ou crear outros novos." + }, + "extdesc": { + "message": "Modifica, crea e consulta os teus documentos, follas de cálculo e presentacións sen necesidade de acceder a Internet." + }, + "extname": { + "message": "Documentos de Google sen conexión" + }, + "learnmore": { + "message": "Máis información" + }, + "popuphelptext": { + "message": "Escribe, edita e colabora esteas onde esteas, tanto se tes conexión a Internet como se non a tes." + } +} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/gu/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/gu/messages.json new file mode 100644 index 0000000..f53a3e4 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/gu/messages.json @@ -0,0 +1,23 @@ +{ + "createnew": { + "message": "નવું બનાવો" + }, + "explanationofflinedisabled": { + "message": "તમે ઑફલાઇન છો. ઇન્ટરનેટ કનેક્શન વગર Google દસ્તાવેજનો ઉપયોગ કરવા માટે, તમે આગલી વખતે જ્યારે ઇન્ટરનેટ સાથે કનેક્ટ થાઓ ત્યારે Google દસ્તાવેજ હોમપેજ પર સેટિંગ્સ પર જાઓ અને ઑફલાઇન સમન્વયન ચાલુ કરો." + }, + "explanationofflineenabled": { + "message": "તમે ઑફલાઇન છો, પરંતુ તમે હજુ પણ ઉપલબ્ધ ફાઇલો સંપાદિત કરી શકો છો અથવા નવી બનાવી શકો છો." + }, + "extdesc": { + "message": "તમારા દસ્તાવેજો, સ્પ્રેડશીટ અને પ્રસ્તુતિ બનાવો, તેમાં ફેરફાર કરો તેમજ જુઓ - આ બધું ઇન્ટરનેટ ઍક્સેસ વગર." + }, + "extname": { + "message": "Google દસ્તાવેજ ઑફલાઇન" + }, + "learnmore": { + "message": "વધુ જાણો" + }, + "popuphelptext": { + "message": "ઇન્ટરનેટ કનેક્શન સાથે અથવા વગર, તમે ગમે ત્યાં હોવ લખો, સંપાદિત કરો અને સહયોગ કરો." + } +} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/hi/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/hi/messages.json new file mode 100644 index 0000000..24ba2a9 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/hi/messages.json @@ -0,0 +1,23 @@ +{ + "createnew": { + "message": "नया बनाएं" + }, + "explanationofflinedisabled": { + "message": "आप ऑफ़लाइन हैं. इंटरनेट कनेक्शन के बिना Google दस्तावेज़ का उपयोग करने के लिए, अगली बार इंटरनेट से कनेक्ट होने पर Google दस्तावेज़ के मुखपृष्ठ पर सेटिंग में जाएं और ऑफ़लाइन समन्वयन चालू करें." + }, + "explanationofflineenabled": { + "message": "आप ऑफ़लाइन हैं, लेकिन आप अब भी उपलब्ध फ़ाइलें बदलाव कर सकते हैं या नई फ़ाइलें बना सकते हैं." + }, + "extdesc": { + "message": "बिना किसी इंटरनेट ऐक्सेस के अपने दस्तावेज़, स्प्रेडशीट और प्रस्तुतिकरणों में बदलाव करें, उन्हें बनाएं और देखें." + }, + "extname": { + "message": "Google दस्तावेज़ ऑफ़लाइन" + }, + "learnmore": { + "message": "ज़्यादा जानें" + }, + "popuphelptext": { + "message": "इंटरनेट कनेक्शन के साथ या उसके बिना कहीं से भी लिखें, बदलाव करें और सहयोग करें." + } +} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/hr/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/hr/messages.json new file mode 100644 index 0000000..7b475c2 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/hr/messages.json @@ -0,0 +1,23 @@ +{ + "createnew": { + "message": "IZRADI NOVI" + }, + "explanationofflinedisabled": { + "message": "Vi ste izvan mreže. Da biste koristili Google dokumente bez internetske veze, idite na postavke na početnoj stranici Google dokumenata i uključite izvanmrežnu sinkronizaciju sljedeći put kada se povežete s internetom." + }, + "explanationofflineenabled": { + "message": "Vi ste izvan mreže, no i dalje možete uređivati dostupne datoteke i izrađivati nove." + }, + "extdesc": { + "message": "Uredite, izradite i pregledajte dokumente, proračunske tablice i prezentacije – sve bez pristupa internetu." + }, + "extname": { + "message": "Google dokumenti izvanmrežno" + }, + "learnmore": { + "message": "Saznajte više" + }, + "popuphelptext": { + "message": "Pišite, uređujte i surađujte gdje god se nalazili, povezani s internetom ili izvanmrežno." + } +} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/hu/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/hu/messages.json new file mode 100644 index 0000000..34cc494 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/hu/messages.json @@ -0,0 +1,23 @@ +{ + "createnew": { + "message": "ÚJ LÉTREHOZÁSA" + }, + "explanationofflinedisabled": { + "message": "Jelenleg offline állapotban van. Ha a Google Dokumentumokat internetkapcsolat nélkül szeretné használni, a legközelebbi internethasználata során nyissa meg a Google Dokumentumok kezdőoldalán található beállításokat, és tiltsa le az offline szinkronizálás beállítást." + }, + "explanationofflineenabled": { + "message": "Offline állapotban van, de az elérhető fájlokat így is szerkesztheti, valamint létrehozhat újakat." + }, + "extdesc": { + "message": "Szerkesszen, hozzon létre és tekintsen meg dokumentumokat, táblázatokat és prezentációkat – akár internetkapcsolat nélkül is." + }, + "extname": { + "message": "Google Dokumentumok Offline" + }, + "learnmore": { + "message": "További információ" + }, + "popuphelptext": { + "message": "Írjon, szerkesszen és dolgozzon együtt másokkal internetkapcsolattal vagy anélkül, bárhol is van." + } +} 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 new file mode 100644 index 0000000..ef19f42 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/hy/messages.json @@ -0,0 +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"}} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/id/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/id/messages.json new file mode 100644 index 0000000..41acabd --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/id/messages.json @@ -0,0 +1,23 @@ +{ + "createnew": { + "message": "BUAT BARU" + }, + "explanationofflinedisabled": { + "message": "Anda sedang offline. Untuk menggunakan Google Dokumen tanpa koneksi internet, buka setelan di beranda Google Dokumen dan aktifkan sinkronisasi offline saat terhubung ke internet." + }, + "explanationofflineenabled": { + "message": "Anda sedang offline, namun Anda masih dapat mengedit file yang tersedia atau membuat file baru." + }, + "extdesc": { + "message": "Edit, buat, dan lihat dokumen, spreadsheet, dan presentasi — tanpa perlu akses internet." + }, + "extname": { + "message": "Google Dokumen Offline" + }, + "learnmore": { + "message": "Pelajari Lebih Lanjut" + }, + "popuphelptext": { + "message": "Tulis, edit, dan gabungkan di mana saja, dengan atau tanpa koneksi internet." + } +} 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 new file mode 100644 index 0000000..74eed4c --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/is/messages.json @@ -0,0 +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."}} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/it/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/it/messages.json new file mode 100644 index 0000000..677a5c0 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/it/messages.json @@ -0,0 +1,23 @@ +{ + "createnew": { + "message": "CREA NUOVO" + }, + "explanationofflinedisabled": { + "message": "Sei offline. Per utilizzare Documenti Google senza una connessione Internet, apri le impostazioni nella home page di Documenti Google e attiva la sincronizzazione offline la prossima volta che ti colleghi a Internet." + }, + "explanationofflineenabled": { + "message": "Sei offline, ma puoi comunque modificare i file disponibili o crearne di nuovi." + }, + "extdesc": { + "message": "Modifica, crea e visualizza documenti, fogli di lavoro e presentazioni, senza accesso a Internet." + }, + "extname": { + "message": "Documenti Google offline" + }, + "learnmore": { + "message": "Ulteriori informazioni" + }, + "popuphelptext": { + "message": "Scrivi, modifica e collabora ovunque ti trovi, con o senza una connessione Internet." + } +} 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 new file mode 100644 index 0000000..69f051c --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/iw/messages.json @@ -0,0 +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."}} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/ja/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/ja/messages.json new file mode 100644 index 0000000..0bdbf22 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/ja/messages.json @@ -0,0 +1,23 @@ +{ + "createnew": { + "message": "新規作成" + }, + "explanationofflinedisabled": { + "message": "現在オフラインです。インターネットに接続せずに Google ドキュメントを使用するには、次回インターネットに接続したときに Google ドキュメントのホーム画面から [設定] にアクセスし、[オフライン同期] をオンにしてください。" + }, + "explanationofflineenabled": { + "message": "現在オフラインですが、アクセス可能なファイルの編集や新規ファイルの作成は引き続き行えます。" + }, + "extdesc": { + "message": "インターネットに接続していなくても、ドキュメント、スプレッドシート、プレゼンテーションを編集、作成、表示できます。" + }, + "extname": { + "message": "Google オフライン ドキュメント" + }, + "learnmore": { + "message": "詳細" + }, + "popuphelptext": { + "message": "インターネットに接続していなくてもファイルの作成、編集、共同作業を継続できます。" + } +} 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 new file mode 100644 index 0000000..a83cd82 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/ka/messages.json @@ -0,0 +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."}} 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 new file mode 100644 index 0000000..dde4912 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/kk/messages.json @@ -0,0 +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."}} 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 new file mode 100644 index 0000000..68add3b --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/km/messages.json @@ -0,0 +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"}} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/kn/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/kn/messages.json new file mode 100644 index 0000000..0fbb012 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/kn/messages.json @@ -0,0 +1,23 @@ +{ + "createnew": { + "message": "ಹೊಸದನ್ನು ರಚಿಸಿ" + }, + "explanationofflinedisabled": { + "message": "ನೀವು ಆಫ್‌ಲೈನ್‌ನಲ್ಲಿರುವಿರಿ. ಇಂಟರ್ನೆಟ್ ಸಂಪರ್ಕವಿಲ್ಲದೇ Google ಡಾಕ್ಸ್ ಬಳಸಲು, Google ಡಾಕ್ಸ್ ಮುಖಪುಟದಲ್ಲಿನ ಸೆಟ್ಟಿಂಗ್‌ಗಳಿಗೆ ಹೋಗಿ ಮತ್ತು ಮುಂದಿನ ಬಾರಿ ನೀವು ಇಂಟರ್ನೆಟ್‌ಗೆ ಸಂಪರ್ಕಿತವಾದಾಗ ಆಫ್‌ಲೈನ್ ಸಿಂಕ್ ಆನ್ ಮಾಡಿ." + }, + "explanationofflineenabled": { + "message": "ನೀವು ಆಫ್‌ಲೈನ್‌ನಲ್ಲಿರುವಿರಿ, ಆದರೆ ಈಗಲೂ ನೀವು ಲಭ್ಯವಿರುವ ಫೈಲ್‌ಗಳನ್ನು ಸಂಪಾದಿಸಬಹುದು ಅಥವಾ ಹೊಸದನ್ನು ರಚಿಸಬಹುದು." + }, + "extdesc": { + "message": "ಇಂಟರ್ನೆಟ್ ಪ್ರವೇಶವಿಲ್ಲದೆಯೇ ನಿಮ್ಮ ಡಾಕ್ಯುಮೆಂಟ್‌ಗಳು, ಸ್ಪ್ರೆಡ್‌ಶೀಟ್‌ಗಳು ಮತ್ತು ಪ್ರಸ್ತುತಿಗಳನ್ನು ಎಡಿಟ್ ಮಾಡಿ, ರಚಿಸಿ ಮತ್ತು ವೀಕ್ಷಿಸಿ." + }, + "extname": { + "message": "Google ಡಾಕ್ಸ್‌‌ ಆಫ್‌ಲೈನ್" + }, + "learnmore": { + "message": "ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ" + }, + "popuphelptext": { + "message": "ನೀವು ಎಲ್ಲೇ ಇರಿ ಇಂಟರ್ನೆಟ್ ಸಂಪರ್ಕ ಇರಲಿ ಅಥವಾ ಇಲ್ಲದಿರಲಿ, ಬರೆಯಿರಿ, ಎಡಿಟ್ ಮಾಡಿ ಮತ್ತು ಕೊಲಾಬೊರೇಟ್ ಮಾಡಿ." + } +} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/ko/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/ko/messages.json new file mode 100644 index 0000000..59c08b8 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/ko/messages.json @@ -0,0 +1,23 @@ +{ + "createnew": { + "message": "새로 만들기" + }, + "explanationofflinedisabled": { + "message": "오프라인 상태입니다. 인터넷 연결 없이 Google Docs를 사용하려면 Google Docs 홈페이지 설정으로 이동하여 다음번에 인터넷에 연결되었을 때 오프라인 동기화를 사용하도록 설정하세요." + }, + "explanationofflineenabled": { + "message": "오프라인 상태입니다. 하지만 사용 가능한 파일을 수정하거나 새로운 파일을 만들 수 있습니다." + }, + "extdesc": { + "message": "인터넷에 연결하지 않고도 문서, 스프레드시트 및 프레젠테이션을 수정, 생성, 확인합니다." + }, + "extname": { + "message": "Google Docs 오프라인" + }, + "learnmore": { + "message": "자세히 알아보기" + }, + "popuphelptext": { + "message": "인터넷 연결 여부와 관계없이 어디에서든 작성하고 수정하고 공동작업을 수행할 수 있습니다." + } +} 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 new file mode 100644 index 0000000..971637f --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/lo/messages.json @@ -0,0 +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."}} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/lt/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/lt/messages.json new file mode 100644 index 0000000..5c1909e --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/lt/messages.json @@ -0,0 +1,23 @@ +{ + "createnew": { + "message": "SUKURTI NAUJĄ" + }, + "explanationofflinedisabled": { + "message": "Esate neprisijungę. Jei norite naudoti „Google“ dokumentus be interneto ryšio, pagrindiniame „Google“ dokumentų puslapyje eikite į nustatymų skiltį ir įjunkite sinchronizavimą neprisijungus, kai kitą kartą būsite prisijungę prie interneto." + }, + "explanationofflineenabled": { + "message": "Esate neprisijungę, bet vis tiek galite redaguoti pasiekiamus failus arba sukurti naujų." + }, + "extdesc": { + "message": "Redaguokite, kurkite ir peržiūrėkite savo dokumentus, skaičiuokles ir pristatymus – viską darykite be prieigos prie interneto." + }, + "extname": { + "message": "„Google“ dokumentai neprisijungus" + }, + "learnmore": { + "message": "Sužinoti daugiau" + }, + "popuphelptext": { + "message": "Rašykite, redaguokite ir bendradarbiaukite bet kurioje vietoje naudodami interneto ryšį arba nenaudodami jo." + } +} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/lv/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/lv/messages.json new file mode 100644 index 0000000..40e1b94 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/lv/messages.json @@ -0,0 +1,23 @@ +{ + "createnew": { + "message": "IZVEIDOT JAUNU" + }, + "explanationofflinedisabled": { + "message": "Jūs esat bezsaistē. Lai lietotu pakalpojumu Google dokumenti bez interneta savienojuma, nākamajā reizē, kad ir izveidots savienojums ar internetu, atveriet Google dokumentu sākumlapas iestatījumu izvēlni un ieslēdziet sinhronizāciju bezsaistē." + }, + "explanationofflineenabled": { + "message": "Jūs esat bezsaistē, taču varat rediģēt pieejamos failus un izveidot jaunus." + }, + "extdesc": { + "message": "Rediģējiet, veidojiet un skatiet savus dokumentus, izklājlapas un prezentācijas, neizmantojot savienojumu ar internetu." + }, + "extname": { + "message": "Google dokumenti bezsaistē" + }, + "learnmore": { + "message": "Uzziniet vairāk" + }, + "popuphelptext": { + "message": "Rakstiet, rediģējiet un sadarbojieties ar interneta savienojumu vai bez tā neatkarīgi no tā, kur atrodaties." + } +} 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 new file mode 100644 index 0000000..9c0c023 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/mk/messages.json @@ -0,0 +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."}} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/ml/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/ml/messages.json new file mode 100644 index 0000000..62b4e74 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/ml/messages.json @@ -0,0 +1,23 @@ +{ + "createnew": { + "message": "പുതിയത് സൃഷ്‌ടിക്കുക" + }, + "explanationofflinedisabled": { + "message": "നിങ്ങൾ ഓഫ്‌ലൈനാണ്. ഇന്റർനെറ്റ് കണക്ഷനില്ലാതെ തന്നെ Google ഡോക്‌സ് ഉപയോഗിക്കാൻ, Google ഡോക്‌സ് ഹോം‌പേജിലെ ക്രമീകരണത്തിൽ പോയി നിങ്ങൾ അടുത്ത തവണ ഇന്റർനെറ്റുമായി കണക്‌റ്റുചെയ്യുമ്പോൾ 'ഓഫ്‌ലൈനായി സമന്വയിപ്പിക്കുക' ഓണാക്കുക." + }, + "explanationofflineenabled": { + "message": "ഓഫ്‌ലൈനാണെങ്കിലും, നിങ്ങൾക്ക് തുടർന്നും ലഭ്യമായ ഫയലുകൾ എഡിറ്റുചെയ്യുകയോ പുതിയവ സൃഷ്‌ടിക്കുകയോ ചെയ്യാം." + }, + "extdesc": { + "message": "നിങ്ങളുടെ ഡോക്യുമെന്റുകളും സ്‌പ്രെഡ്‌ഷീറ്റുകളും അവതരണങ്ങളും എഡിറ്റ് ചെയ്യുക, സൃഷ്‌ടിക്കുക, കാണുക — എല്ലാം ഇന്റർനെറ്റ് ആക്‌സസ് ഇല്ലാതെ." + }, + "extname": { + "message": "Google Docs ഓഫ്‌ലൈൻ" + }, + "learnmore": { + "message": "കൂടുതലറിയുക" + }, + "popuphelptext": { + "message": "നിങ്ങൾ എവിടെയാണെങ്കിലും ഇന്റർനെറ്റ് കണക്ഷൻ ഉപയോഗിച്ചോ അല്ലാതെയോ എഴുതുകയും എഡിറ്റുചെയ്യുകയും സഹകരിച്ച് പ്രവർത്തിക്കുകയും ചെയ്യുക." + } +} 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 new file mode 100644 index 0000000..129f4bc --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/mn/messages.json @@ -0,0 +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."}} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/mr/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/mr/messages.json new file mode 100644 index 0000000..b56a43c --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/mr/messages.json @@ -0,0 +1,23 @@ +{ + "createnew": { + "message": "नवीन तयार करा" + }, + "explanationofflinedisabled": { + "message": "तुम्ही ऑफलाइन आहात. कोणत्याही इंटरनेट कनेक्शन शिवाय Google दस्तऐवज वापरण्यासाठी, Google दस्तऐवज मुख्‍यपृष्ठावर सेटिंग्जवर जा आणि पुढील वेळी तुम्ही इंटरनेटशी कनेक्ट असताना ऑफलाइन सिंक सुरू करा." + }, + "explanationofflineenabled": { + "message": "तुम्ही ऑफलाइन आहात, परंतु तुम्ही अद्याप उपलब्ध फाइल संपादित करू किंवा नवीन तयार करू शकता." + }, + "extdesc": { + "message": "तुमचे दस्तऐवज, स्प्रेडशीट आणि प्रेझेंटेशन हे सर्व इंटरनेट ॲक्सेसशिवाय संपादित करा, तयार करा आणि पहा." + }, + "extname": { + "message": "Google Docs ऑफलाइन" + }, + "learnmore": { + "message": "अधिक जाणून घ्या" + }, + "popuphelptext": { + "message": "इंटरनेट कनेक्‍शनसह किंवा त्‍याशिवाय तुम्ही जेथे आहात तेथून लिहा, संपादित करा आणि योगदान द्या." + } +} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/ms/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/ms/messages.json new file mode 100644 index 0000000..d94bce1 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/ms/messages.json @@ -0,0 +1,23 @@ +{ + "createnew": { + "message": "BUAT BAHARU" + }, + "explanationofflinedisabled": { + "message": "Anda berada di luar talian. Untuk menggunakan Google Docs tanpa sambungan Internet, pergi ke tetapan di halaman utama Google Docs dan hidupkan penyegerakan luar talian apabila anda disambungkan ke Internet selepas ini." + }, + "explanationofflineenabled": { + "message": "Anda berada di luar talian, tetapi anda masih boleh mengedit fail yang tersedia atau buat fail baharu." + }, + "extdesc": { + "message": "Edit, buat dan lihat dokumen, hamparan dan pembentangan anda — kesemuanya tanpa akses Internet." + }, + "extname": { + "message": "Google Docs Luar Talian" + }, + "learnmore": { + "message": "Ketahui Lebih Lanjut" + }, + "popuphelptext": { + "message": "Tulis, edit dan bekerjasama di mana-mana sahaja anda berada, dengan atau tanpa sambungan Internet." + } +} 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 new file mode 100644 index 0000000..01803b3 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/my/messages.json @@ -0,0 +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"}} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/ne/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/ne/messages.json new file mode 100644 index 0000000..622610e --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/ne/messages.json @@ -0,0 +1,23 @@ +{ + "createnew": { + "message": "नयाँ सिर्जना गर्नुहोस्" + }, + "explanationofflinedisabled": { + "message": "तपाईं अफलाइन हुनुहुन्छ। कुनै इन्टरनेट जडान बिना Google कागजातको प्रयोग गर्न तपाईं अर्को पटक इन्टरनेटमा जोडिएको बेला Google कागजातको गृहपृष्ठमा रहेको सेटिङहरूमा गई अफलाइन हुँदा सिंक गर्ने सुविधालाई अन गर्नुहोस्।" + }, + "explanationofflineenabled": { + "message": "तपाईं अफलाइन हुनुहुन्छ, तर तपाईं अझै पनि उपलब्ध फाइलहरू सम्पादन वा नयाँ फाइलहरू सिर्जना गर्न सक्नुहुन्छ।" + }, + "extdesc": { + "message": "इन्टरनेटमाथिको पहुँचविनै आफ्ना कागजात, स्प्रेडसिट र प्रस्तुतिहरू सम्पादन गर्नुहोस्, सिर्जना गर्नुहोस् र हेर्नुहोस्।" + }, + "extname": { + "message": "Google Docs अफलाइन" + }, + "learnmore": { + "message": "थप जान्नुहोस्" + }, + "popuphelptext": { + "message": "इन्टरनेट होस् वा नहोस् जुनसुकै ठाउँबाट लेख्नुहोस्, सम्पादन गर्नुहोस् र सहकार्य गर्नुहोस्।" + } +} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/nl/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/nl/messages.json new file mode 100644 index 0000000..2bc4e10 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/nl/messages.json @@ -0,0 +1,23 @@ +{ + "createnew": { + "message": "NIEUW MAKEN" + }, + "explanationofflinedisabled": { + "message": "Je bent offline. Wil je Google Documenten zonder internetverbinding gebruiken, ga dan de volgende keer dat je verbinding met internet hebt naar 'Instellingen' op de homepage van Google Documenten en zet 'Offline synchronisatie' aan." + }, + "explanationofflineenabled": { + "message": "Je bent offline, maar je kunt nog wel beschikbare bestanden bewerken of nieuwe bestanden maken." + }, + "extdesc": { + "message": "Bewerk, maak en bekijk je documenten, spreadsheets en presentaties. Allemaal zonder internettoegang." + }, + "extname": { + "message": "Offline Documenten" + }, + "learnmore": { + "message": "Meer informatie" + }, + "popuphelptext": { + "message": "Overal schrijven, bewerken en samenwerken, met of zonder internetverbinding." + } +} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/no/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/no/messages.json new file mode 100644 index 0000000..1596825 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/no/messages.json @@ -0,0 +1,23 @@ +{ + "createnew": { + "message": "OPPRETT NYTT" + }, + "explanationofflinedisabled": { + "message": "Du er uten nett. For å bruke Google Dokumenter uten internettilkobling, gå til innstillingene på Google Dokumenter-nettsiden og slå på synkronisering uten nett neste gang du er koblet til Internett." + }, + "explanationofflineenabled": { + "message": "Du er uten nett, men du kan likevel endre tilgjengelige filer eller opprette nye." + }, + "extdesc": { + "message": "Rediger, opprett og se dokumentene, regnearkene og presentasjonene dine – uten nettilgang." + }, + "extname": { + "message": "Google Dokumenter uten nett" + }, + "learnmore": { + "message": "Finn ut mer" + }, + "popuphelptext": { + "message": "Skriv, rediger eller samarbeid uansett hvor du er, med eller uten internettilkobling." + } +} 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 new file mode 100644 index 0000000..e83597a --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/or/messages.json @@ -0,0 +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"}} 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 new file mode 100644 index 0000000..80d2951 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/pa/messages.json @@ -0,0 +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"}} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/pl/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/pl/messages.json new file mode 100644 index 0000000..8027348 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/pl/messages.json @@ -0,0 +1,23 @@ +{ + "createnew": { + "message": "UTWÓRZ NOWY" + }, + "explanationofflinedisabled": { + "message": "Jesteś offline. Aby korzystać z Dokumentów Google bez połączenia internetowego, otwórz ustawienia na stronie głównej Dokumentów Google i włącz synchronizację offline następnym razem, gdy będziesz mieć dostęp do internetu." + }, + "explanationofflineenabled": { + "message": "Jesteś offline, ale nadal możesz edytować dostępne pliki i tworzyć nowe." + }, + "extdesc": { + "message": "Edytuj, twórz i wyświetlaj swoje dokumenty, arkusze kalkulacyjne oraz prezentacje bez konieczności łączenia się z internetem." + }, + "extname": { + "message": "Dokumenty Google offline" + }, + "learnmore": { + "message": "Więcej informacji" + }, + "popuphelptext": { + "message": "Pisz, edytuj i współpracuj, gdziekolwiek jesteś – niezależnie od tego, czy masz połączenie z internetem." + } +} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/pt_BR/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/pt_BR/messages.json new file mode 100644 index 0000000..03c0be1 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/pt_BR/messages.json @@ -0,0 +1,23 @@ +{ + "createnew": { + "message": "CRIAR NOVO" + }, + "explanationofflinedisabled": { + "message": "Você está off-line. Para usar o Google Docs sem conexão com a Internet, na próxima vez que se conectar, acesse as configurações na página inicial do Google Docs e ative a sincronização off-line." + }, + "explanationofflineenabled": { + "message": "Você está off-line, mas mesmo assim pode editar os arquivos disponíveis ou criar novos arquivos." + }, + "extdesc": { + "message": "Edite, crie e veja seus documentos, planilhas e apresentações sem precisar de acesso à Internet." + }, + "extname": { + "message": "Google Docs off-line" + }, + "learnmore": { + "message": "Saiba mais" + }, + "popuphelptext": { + "message": "Escreva, edite e colabore onde você estiver, com ou sem conexão com a Internet." + } +} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/pt_PT/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/pt_PT/messages.json new file mode 100644 index 0000000..21fe9a4 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/pt_PT/messages.json @@ -0,0 +1,23 @@ +{ + "createnew": { + "message": "CRIAR NOVO" + }, + "explanationofflinedisabled": { + "message": "Está offline. Para utilizar o Google Docs sem uma ligação à Internet, aceda às definições na página inicial do Google Docs e ative a sincronização offline da próxima vez que estiver ligado à Internet." + }, + "explanationofflineenabled": { + "message": "Está offline, mas continua a poder editar os ficheiros disponíveis ou criar novos ficheiros." + }, + "extdesc": { + "message": "Edite, crie e veja os documentos, as folhas de cálculo e as apresentações, tudo sem precisar de aceder à Internet." + }, + "extname": { + "message": "Google Docs offline" + }, + "learnmore": { + "message": "Saber mais" + }, + "popuphelptext": { + "message": "Escreva edite e colabore onde quer que esteja, com ou sem uma ligação à Internet." + } +} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/ro/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/ro/messages.json new file mode 100644 index 0000000..21c001d --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/ro/messages.json @@ -0,0 +1,23 @@ +{ + "createnew": { + "message": "CREEAZĂ UN DOCUMENT" + }, + "explanationofflinedisabled": { + "message": "Ești offline. Pentru a utiliza Documente Google fără conexiune la internet, intră în setările din pagina principală Documente Google și activează sincronizarea offline data viitoare când ești conectat(ă) la internet." + }, + "explanationofflineenabled": { + "message": "Ești offline, dar poți încă să editezi fișierele disponibile sau să creezi altele." + }, + "extdesc": { + "message": "Editează, creează și accesează documente, foi de calcul și prezentări - totul fără acces la internet." + }, + "extname": { + "message": "Documente Google Offline" + }, + "learnmore": { + "message": "Află mai multe" + }, + "popuphelptext": { + "message": "Scrie, editează și colaborează oriunde ai fi, cu sau fără conexiune la internet." + } +} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/ru/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/ru/messages.json new file mode 100644 index 0000000..5095c18 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/ru/messages.json @@ -0,0 +1,23 @@ +{ + "createnew": { + "message": "СОЗДАТЬ" + }, + "explanationofflinedisabled": { + "message": "Чтобы использовать Google Документы без Интернета, подключитесь к Сети и разрешите синхронизацию в офлайн-режиме в настройках на стартовой странице." + }, + "explanationofflineenabled": { + "message": "Нет подключения к Интернету. Вы можете создавать новые файлы и редактировать те, к которым разрешен офлайн-доступ." + }, + "extdesc": { + "message": "Создавайте, просматривайте и редактируйте документы, таблицы и презентации – без доступа к интернету." + }, + "extname": { + "message": "Google Документы офлайн" + }, + "learnmore": { + "message": "Подробнее…" + }, + "popuphelptext": { + "message": "Создавайте документы и редактируйте их вместе с коллегами и друзьями, где бы вы ни находились. Даже без подключения к Интернету!" + } +} 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 new file mode 100644 index 0000000..5433d4d --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/si/messages.json @@ -0,0 +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."}} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/sk/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/sk/messages.json new file mode 100644 index 0000000..bf17bc1 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/sk/messages.json @@ -0,0 +1,23 @@ +{ + "createnew": { + "message": "VYTVORIŤ NOVÝ" + }, + "explanationofflinedisabled": { + "message": "Ste offline. Ak chcete použiť Dokumenty Google bez pripojenia na internet, po najbližšom pripojení na internet prejdite do nastavení na domovskej stránke Dokumentov Google a zapnite offline synchronizáciu." + }, + "explanationofflineenabled": { + "message": "Ste offline, no stále môžete upravovať dostupné súbory a vytvárať nové." + }, + "extdesc": { + "message": "Úprava, tvorba a zobrazenie dokumentov, tabuliek a prezentácií. To všetko bez prístupu na internet." + }, + "extname": { + "message": "Dokumenty Google v režime offline" + }, + "learnmore": { + "message": "Ďalšie informácie" + }, + "popuphelptext": { + "message": "Píšte, upravujte a spolupracuje, kdekoľvek ste, a to s pripojením na internet aj bez neho." + } +} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/sl/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/sl/messages.json new file mode 100644 index 0000000..8cf00d1 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/sl/messages.json @@ -0,0 +1,23 @@ +{ + "createnew": { + "message": "USTVARI NOVO" + }, + "explanationofflinedisabled": { + "message": "Nimate vzpostavljene povezave. Če želite uporabljati Google Dokumente brez internetne povezave, odprite nastavitve na domači strani Google Dokumentov in vklopite sinhronizacijo brez povezave, ko naslednjič vzpostavite internetno povezavo." + }, + "explanationofflineenabled": { + "message": "Nimate vzpostavljene povezave, vendar lahko še vedno urejate razpoložljive datoteke ali ustvarjate nove." + }, + "extdesc": { + "message": "Urejajte, ustvarjajte in si ogledujte dokumente, preglednice in predstavitve – vse to brez internetnega dostopa." + }, + "extname": { + "message": "Google Dokumenti brez povezave" + }, + "learnmore": { + "message": "Več o tem" + }, + "popuphelptext": { + "message": "Pišite, urejajte in sodelujte, kjer koli ste, z internetno povezavo ali brez nje." + } +} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/sq/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/sq/messages.json new file mode 100644 index 0000000..4a8b899 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/sq/messages.json @@ -0,0 +1,23 @@ +{ + "createnew": { + "message": "KRIJO TË RE" + }, + "explanationofflinedisabled": { + "message": "Je offline. Për të përdorur \"Dokumentet e Google\" pa lidhje interneti, shko te cilësimet në faqen kryesore të \"Dokumenteve të Google\" dhe aktivizo sinkronizimin offline herën tjetër që do të lidhesh me internetin." + }, + "explanationofflineenabled": { + "message": "Je offline, por sërish mund të modifikosh skedarët e disponueshëm ose të krijosh të rinj." + }, + "extdesc": { + "message": "Modifiko, krijo dhe shiko dokumentet, fletëllogaritëset dhe prezantimet e tua - të gjitha pa qasje në internet." + }, + "extname": { + "message": "\"Dokumentet e Google\" jashtë linje" + }, + "learnmore": { + "message": "Mëso më shumë" + }, + "popuphelptext": { + "message": "Shkruaj, modifiko dhe bashkëpuno kudo që të jesh, me ose pa lidhje interneti." + } +} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/sr/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/sr/messages.json new file mode 100644 index 0000000..703c357 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/sr/messages.json @@ -0,0 +1,23 @@ +{ + "createnew": { + "message": "НАПРАВИ НОВО" + }, + "explanationofflinedisabled": { + "message": "Офлајн сте. Да бисте користили Google документе без интернет везе, идите у подешавања на почетној страници Google докумената и укључите офлајн синхронизацију кад следећи пут будете повезани са интернетом." + }, + "explanationofflineenabled": { + "message": "Офлајн сте, али и даље можете да уносите измене у доступне датотеке или да правите нове." + }, + "extdesc": { + "message": "Правите и прегледајте документе, табеле и презентације и уносите измене у њих – све то без интернет приступа." + }, + "extname": { + "message": "Google документи офлајн" + }, + "learnmore": { + "message": "Сазнајте више" + }, + "popuphelptext": { + "message": "Пишите, уносите измене и сарађујте где год да сте, са интернет везом или без ње." + } +} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/sv/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/sv/messages.json new file mode 100644 index 0000000..a44bc50 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/sv/messages.json @@ -0,0 +1,23 @@ +{ + "createnew": { + "message": "SKAPA NYTT" + }, + "explanationofflinedisabled": { + "message": "Du är offline. Om du vill använda Google Dokument utan internetuppkoppling, öppna inställningarna på Google Dokuments startsida och aktivera offlinesynkronisering nästa gång du är ansluten till internet." + }, + "explanationofflineenabled": { + "message": "Du är offline, men det går fortfarande att redigera tillgängliga filer eller skapa nya." + }, + "extdesc": { + "message": "Redigera, skapa och visa dina dokument, kalkylark och presentationer – helt utan internetåtkomst." + }, + "extname": { + "message": "Google Dokument Offline" + }, + "learnmore": { + "message": "Läs mer" + }, + "popuphelptext": { + "message": "Skriv, redigera och samarbeta överallt, med eller utan internetanslutning." + } +} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/sw/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/sw/messages.json new file mode 100644 index 0000000..6f8458d --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/sw/messages.json @@ -0,0 +1,23 @@ +{ + "createnew": { + "message": "FUNGUA MPYA" + }, + "explanationofflinedisabled": { + "message": "Haupo mtandaoni. Ili uweze kutumia Hati za Google bila muunganisho wa intaneti, wakati utakuwa umeunganishwa kwenye intaneti, nenda kwenye sehemu ya mipangilio kwenye ukurasa wa kwanza wa Hati za Google kisha uwashe kipengele cha usawazishaji nje ya mtandao." + }, + "explanationofflineenabled": { + "message": "Haupo mtandaoni, lakini bado unaweza kubadilisha faili zilizopo au uunde mpya." + }, + "extdesc": { + "message": "Badilisha, unda na uangalie hati, malahajedwali na mawasilisho yako — yote bila kutumia muunganisho wa intaneti." + }, + "extname": { + "message": "Hati za Google Nje ya Mtandao" + }, + "learnmore": { + "message": "Pata Maelezo Zaidi" + }, + "popuphelptext": { + "message": "Andika hati, zibadilishe na ushirikiane na wengine popote ulipo, iwe una muunganisho wa intaneti au huna." + } +} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/ta/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/ta/messages.json new file mode 100644 index 0000000..b9163f2 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/ta/messages.json @@ -0,0 +1,23 @@ +{ + "createnew": { + "message": "புதிய ஆவணத்தை உருவாக்கு" + }, + "explanationofflinedisabled": { + "message": "ஆஃப்லைனில் உள்ளீர்கள். இணைய இணைப்பு இன்றி Google ஆவணத்தைப் பயன்படுத்த, அடுத்த முறை இணையத்துடன் இணைக்கும் போது, Google ஆவண முகப்புப்பக்கத்தில் அமைப்புகளுக்குச் சென்று, ஆஃப்லைன் ஒத்திசைவை இயக்கவும்." + }, + "explanationofflineenabled": { + "message": "ஆஃப்லைனில் இருந்தாலும், சாதனத்தில் ஒத்திசைத்த ஃபைல்களைத் தொடர்ந்து திருத்தலாம் அல்லது புதியவற்றை உருவாக்கலாம்." + }, + "extdesc": { + "message": "இணைய அணுகல் இல்லாமல், உங்கள் ஆவணங்கள், விரிதாள்கள், விளக்கக்காட்சிகள் ஆகியவற்றைத் திருத்தலாம், உருவாக்கலாம், பார்க்கலாம்." + }, + "extname": { + "message": "Google ஆவணம் ஆஃப்லைன்" + }, + "learnmore": { + "message": "மேலும் அறிக" + }, + "popuphelptext": { + "message": "இணைய இணைப்பு இருந்தாலும் இல்லையென்றாலும் எங்கிருந்தும் எழுதலாம், திருத்தலாம், கூட்டுப்பணி செய்யலாம்." + } +} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/te/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/te/messages.json new file mode 100644 index 0000000..910bc27 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/te/messages.json @@ -0,0 +1,23 @@ +{ + "createnew": { + "message": "కొత్త దాన్ని క్రియేట్ చేయండి" + }, + "explanationofflinedisabled": { + "message": "మీరు ఆఫ్‌లైన్‌లో ఉన్నారు. ఇంటర్నెట్ కనెక్షన్ లేకుండా Google Docs‌ను ఉపయోగించడానికి, మీరు ఇంటర్నెట్‌కు కనెక్ట్ చేసిన తదుపరి సారి Google Docs హోమ్ పేజీలో సెట్టింగ్‌లకు వెళ్లి, ఆఫ్‌లైన్ సింక్‌ను ఆన్ చేయండి." + }, + "explanationofflineenabled": { + "message": "మీరు ఆఫ్‌లైన్‌లో ఉన్నారు, కానీ మీరు ఇప్పటికీ అందుబాటులో ఉన్న ఫైళ్లను ఎడిట్ చేయగలరు లేదా కొత్త వాటిని క్రియేట్ చేయగలరు." + }, + "extdesc": { + "message": "మీ డాక్యుమెంట్‌లు, స్ప్రెడ్‌షీట్‌లు, ప్రెజెంటేషన్‌లను ఎడిట్ చేయండి, క్రియేట్ చేయండి, చూడండి — అన్నీ ఇంటర్నెట్ యాక్సెస్ లేకుండానే." + }, + "extname": { + "message": "Google Docs ఆఫ్‌లైన్" + }, + "learnmore": { + "message": "మరింత తెలుసుకోండి" + }, + "popuphelptext": { + "message": "మీరు ఎక్కడ ఉన్నా ఇంటర్నెట్ కనెక్షన్ ఉన్నా లేకున్నా రాయండి, ఎడిట్ చేయండి మరియు కలిసి పని చేయండి." + } +} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/th/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/th/messages.json new file mode 100644 index 0000000..f05fb54 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/th/messages.json @@ -0,0 +1,23 @@ +{ + "createnew": { + "message": "สร้างใหม่" + }, + "explanationofflinedisabled": { + "message": "คุณออฟไลน์อยู่ หากต้องการใช้ Google เอกสารโดยไม่เชื่อมต่อกับอินเทอร์เน็ต โปรดไปที่การตั้งค่าในหน้าแรกของ Google เอกสาร แล้วเปิดการซิงค์แบบออฟไลน์ในครั้งต่อไปที่เชื่อมต่อกับอินเทอร์เน็ต" + }, + "explanationofflineenabled": { + "message": "คุณออฟไลน์อยู่แต่ยังสามารถแก้ไขไฟล์ที่มีอยู่หรือสร้างไฟล์ใหม่ได้" + }, + "extdesc": { + "message": "แก้ไข สร้าง และดูเอกสาร สเปรดชีต และงานนำเสนอ — โดยไม่ต้องเชื่อมต่ออินเทอร์เน็ต" + }, + "extname": { + "message": "Google เอกสารแบบออฟไลน์" + }, + "learnmore": { + "message": "ดูข้อมูลเพิ่มเติม" + }, + "popuphelptext": { + "message": "เขียน แก้ไข และทำงานร่วมกันได้จากทุกที่ ไม่ว่าจะมีหรือไม่มีการเชื่อมต่ออินเทอร์เน็ต" + } +} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/tr/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/tr/messages.json new file mode 100644 index 0000000..cb412ca --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/tr/messages.json @@ -0,0 +1,23 @@ +{ + "createnew": { + "message": "YENİ OLUŞTUR" + }, + "explanationofflinedisabled": { + "message": "İnternet'e bağlı değilsiniz. Google Dokümanlar'ı İnternet bağlantısı olmadan kullanmak için, İnternet'e bağlanabildiğinizde Google Dokümanlar ana sayfasında Ayarlar'a gidin ve çevrimdışı senkronizasyonu etkinleştirin." + }, + "explanationofflineenabled": { + "message": "İnternet'e bağlı değilsiniz. Ancak, yine de mevcut dosyaları düzenleyebilir veya yeni dosyalar oluşturabilirsiniz." + }, + "extdesc": { + "message": "Doküman, e-tablo ve sunu oluşturun, bunları düzenleyin ve görüntüleyin. Tüm bu işlemleri internet erişimi olmadan yapabilirsiniz." + }, + "extname": { + "message": "Google Dokümanlar Çevrimdışı" + }, + "learnmore": { + "message": "Daha Fazla Bilgi" + }, + "popuphelptext": { + "message": "İnternet bağlantınız olsun veya olmasın, nerede olursanız olun yazın, düzenleyin, başka kullanıcılarla birlikte çalışın." + } +} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/uk/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/uk/messages.json new file mode 100644 index 0000000..435a7cd --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/uk/messages.json @@ -0,0 +1,23 @@ +{ + "createnew": { + "message": "СТВОРИТИ" + }, + "explanationofflinedisabled": { + "message": "Ви в режимі офлайн. Щоб користуватися Google Документами без з’єднання з Інтернетом, перейдіть у налаштування на домашній сторінці Google Документів і ввімкніть офлайн-синхронізацію, коли будете в мережі." + }, + "explanationofflineenabled": { + "message": "Ви в режимі офлайн, однак усе одно можете редагувати доступні файли або створювати нові." + }, + "extdesc": { + "message": "Редагуйте, створюйте й переглядайте документи, електронні таблиці та презентації без доступу до Інтернету." + }, + "extname": { + "message": "Google Документи офлайн" + }, + "learnmore": { + "message": "Докладніше" + }, + "popuphelptext": { + "message": "Створюйте та редагуйте файли, а також працюйте над ними разом з іншими навіть без Інтернету." + } +} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/ur/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/ur/messages.json new file mode 100644 index 0000000..8b482d4 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/ur/messages.json @@ -0,0 +1,23 @@ +{ + "createnew": { + "message": "نیا بنائیں" + }, + "explanationofflinedisabled": { + "message": "آپ آف لائن ہیں۔ Google Docs کو بغیر انٹرنیٹ کنکشن استعمال کرنے کیلئے اگلی بار جب آپ انٹرنیٹ سے منسلک ہوں تو Google Docs ہوم پیج پر ترتیبات پر جائیں اور آف لائن مطابقت پذیری کو آن کریں۔" + }, + "explanationofflineenabled": { + "message": "آپ آف لائن ہیں لیکن آپ پھر بھی دستیاب فائلز میں ترمیم کر سکتے ہیں یا نئی فائلز بنا سکتے ہیں۔" + }, + "extdesc": { + "message": "دستاویزات، اسپریڈشیٹس اور پیشکشوں — تمام میں انٹرنیٹ کی رسائی کے بغیر ترمیم، تخلیق کریں اور انہیں دیکھیں۔" + }, + "extname": { + "message": "Google Docs آف لائن" + }, + "learnmore": { + "message": "مزید جانیں" + }, + "popuphelptext": { + "message": "آپ کہیں بھی ہوں، انٹرنیٹ کنکشن کے ساتھ یا اس کے بغیر، لکھیں، ترمیم کریں اور اکٹھے کام کریں۔" + } +} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/uz/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/uz/messages.json new file mode 100644 index 0000000..02b4da8 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/uz/messages.json @@ -0,0 +1,23 @@ +{ + "createnew": { + "message": "YARATISH" + }, + "explanationofflinedisabled": { + "message": "Internetga ulanmagansiz. Google Docs xizmatidan internetsiz foydalanish uchun internetga ulaning va bosh sahifa sozlamalarida oflayn sinxronlashni yoqing." + }, + "explanationofflineenabled": { + "message": "Oflaynsiz, lekin mavjud fayllarni tahrirlashingiz yoki yangilarini yaratishingiz mumkin." + }, + "extdesc": { + "message": "Hujjatlar, elektron jadvallar va taqdimotlarni tahrirlash, yaratish va koʻrish – hammasi internetsiz." + }, + "extname": { + "message": "Google Docs Oflayn" + }, + "learnmore": { + "message": "Batafsil" + }, + "popuphelptext": { + "message": "Internetga ulangan yoki ulanmagan holda qayerda boʻlishingizdan qatʼi nazar, yozing, tahrirlang va hamkorlik qiling." + } +} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/vi/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/vi/messages.json new file mode 100644 index 0000000..acf41a1 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/vi/messages.json @@ -0,0 +1,23 @@ +{ + "createnew": { + "message": "TẠO MỚI" + }, + "explanationofflinedisabled": { + "message": "Bạn đang ngoại tuyến. Để sử dụng Google Tài liệu mà không cần kết nối Internet, đi đến cài đặt trên trang chủ của Google Tài liệu và bật đồng bộ hóa ngoại tuyến vào lần tiếp theo bạn được kết nối với mạng Internet." + }, + "explanationofflineenabled": { + "message": "Bạn đang ngoại tuyến, tuy nhiên bạn vẫn có thể chỉnh sửa các tệp có sẵn hoặc tạo các tệp mới." + }, + "extdesc": { + "message": "Chỉnh sửa, tạo và xem tài liệu, bảng tính và bản trình bày — tất cả mà không cần truy cập Internet." + }, + "extname": { + "message": "Google Tài liệu ngoại tuyến" + }, + "learnmore": { + "message": "Tìm hiểu thêm" + }, + "popuphelptext": { + "message": "Viết, chỉnh sửa và cộng tác ở mọi nơi khi có hoặc không có kết nối Internet." + } +} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/zh_CN/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/zh_CN/messages.json new file mode 100644 index 0000000..5a52c2a --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/zh_CN/messages.json @@ -0,0 +1,23 @@ +{ + "createnew": { + "message": "新建" + }, + "explanationofflinedisabled": { + "message": "您处于离线状态。要在未连接到互联网的情况下使用 Google 文档,请在下次连接到互联网时转到 Google 文档首页的“设置”,并开启离线同步功能。" + }, + "explanationofflineenabled": { + "message": "您处于离线状态,但是您仍然可以编辑可用的文件或创建新文件。" + }, + "extdesc": { + "message": "编辑、创建和查看文档、电子表格和演示文稿,无需连接互联网。" + }, + "extname": { + "message": "Google 文档的离线功能" + }, + "learnmore": { + "message": "了解详情" + }, + "popuphelptext": { + "message": "无论是否连接到互联网,您随时随地都可以撰写、编辑并与他人协作。" + } +} 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 new file mode 100644 index 0000000..b1d5848 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/zh_HK/messages.json @@ -0,0 +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"}} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/zh_TW/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/zh_TW/messages.json new file mode 100644 index 0000000..5b98cfa --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/zh_TW/messages.json @@ -0,0 +1,23 @@ +{ + "createnew": { + "message": "建立新文件" + }, + "explanationofflinedisabled": { + "message": "您處於離線狀態。如要在離線狀態下使用 Google 文件,請在下次連上網際網路時前往 Google 文件首頁的設定中啟用離線同步功能。" + }, + "explanationofflineenabled": { + "message": "您處於離線狀態,但仍可編輯可用的檔案或建立新檔案。" + }, + "extdesc": { + "message": "即使在離線狀態下,也能編輯、建立及瀏覽文件、試算表和簡報。" + }, + "extname": { + "message": "Google 文件離線版" + }, + "learnmore": { + "message": "瞭解詳情" + }, + "popuphelptext": { + "message": "無論上線或離線,您隨時隨地都能撰寫、編輯文件,並與他人協同合作。" + } +} 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 new file mode 100644 index 0000000..7e16a51 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/zu/messages.json @@ -0,0 +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."}} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_metadata/verified_contents.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_metadata/verified_contents.json new file mode 100644 index 0000000..ae4a204 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_metadata/verified_contents.json @@ -0,0 +1 @@ +[{"description":"treehash per file","signed_content":{"payload":"eyJjb250ZW50X2hhc2hlcyI6W3siYmxvY2tfc2l6ZSI6NDA5NiwiZGlnZXN0Ijoic2hhMjU2IiwiZmlsZXMiOlt7InBhdGgiOiIxMjgucG5nIiwicm9vdF9oYXNoIjoiZ2NWZy0xWWgySktRNVFtUmtjZGNmamU1dzVIc1JNN1ZCTmJyaHJ4eGZ5ZyJ9LHsicGF0aCI6Il9sb2NhbGVzL2FmL21lc3NhZ2VzLmpzb24iLCJyb290X2hhc2giOiJxaElnV3hDSFVNLWZvSmVFWWFiWWlCNU9nTm9ncUViWUpOcEFhZG5KR0VjIn0seyJwYXRoIjoiX2xvY2FsZXMvYW0vbWVzc2FnZXMuanNvbiIsInJvb3RfaGFzaCI6IlpPQWJ3cEs2THFGcGxYYjh4RVUyY0VkU0R1aVY0cERNN2lEQ1RKTTIyTzgifSx7InBhdGgiOiJfbG9jYWxlcy9hci9tZXNzYWdlcy5qc29uIiwicm9vdF9oYXNoIjoiUjJVaEZjdTVFcEJfUUZtU19QeGstWWRrSVZqd3l6WEoxdURVZEMyRE9BSSJ9LHsicGF0aCI6Il9sb2NhbGVzL2FzL21lc3NhZ2VzLmpzb24iLCJyb290X2hhc2giOiJBYlZKN3loY2xMTVlrWmw4ZlZjb3Z1ZTFZRUQ0aEg4bm44UnVYTUppeE9NIn0seyJwYXRoIjoiX2xvY2FsZXMvYXovbWVzc2FnZXMuanNvbiIsInJvb3RfaGFzaCI6IllVUncyanhRTkt6bVNmRjRhLXFxMHNsUFJIVzh5SVdEa0xjaDhHLTN2MlEifSx7InBhdGgiOiJfbG9jYWxlcy9iZS9tZXNzYWdlcy5qc29uIiwicm9vdF9oYXNoIjoiM2ZGb1dhRmZQck16VFdKQmwxeWptSXJENnZ3OWxrVXF3NlN2MDJSTWhWQSJ9LHsicGF0aCI6Il9sb2NhbGVzL2JnL21lc3NhZ2VzLmpzb24iLCJyb290X2hhc2giOiJJcnczdEh6b3FETHpsd0ZrSGNOWU5YWjI2YjRZZXBPa3hkU3dGdUtTT0s0In0seyJwYXRoIjoiX2xvY2FsZXMvYm4vbWVzc2FnZXMuanNvbiIsInJvb3RfaGFzaCI6IlBqenFvaFRZQjVzQ3ljbEJZMTlkUmVZaEkyMmNQNExnYXNZRThIY21jT2cifSx7InBhdGgiOiJfbG9jYWxlcy9jYS9tZXNzYWdlcy5qc29uIiwicm9vdF9oYXNoIjoiM20xN2ZDUW43RTV6aEFmWGcwdHhsQjlwRm1zREExWGdEekpmOFRrZDlhRSJ9LHsicGF0aCI6Il9sb2NhbGVzL2NzL21lc3NhZ2VzLmpzb24iLCJyb290X2hhc2giOiJXbkFkWjVFTHBzZk03Y0p1QXZwd2ZNaHFHLVY4MTlOaWtLUFNhSE1xUXNjIn0seyJwYXRoIjoiX2xvY2FsZXMvY3kvbWVzc2FnZXMuanNvbiIsInJvb3RfaGFzaCI6InBJSm1NcEtwRTdBcW5ONUdOY2ZKSW5DX1BJY21fU2RFZGR3c1NRQVpwOGsifSx7InBhdGgiOiJfbG9jYWxlcy9kYS9tZXNzYWdlcy5qc29uIiwicm9vdF9oYXNoIjoibE0zYm1Zd3NXclFMYndkTU5acGc1dTY2cWkxU3FXU2NJdlRxVEJ1Wk52SSJ9LHsicGF0aCI6Il9sb2NhbGVzL2RlL21lc3NhZ2VzLmpzb24iLCJyb290X2hhc2giOiJJdUtDaV8yN25EUU9lQWFKU3VCRUs5YklrMC1GLTdsa0tWN2ExNV9TZFNnIn0seyJwYXRoIjoiX2xvY2FsZXMvZWwvbWVzc2FnZXMuanNvbiIsInJvb3RfaGFzaCI6ImNvMk12WEVtTm9DazVCT1oyMld6OHJnWFhWREtZd3I5TUdRODdaXy1neDgifSx7InBhdGgiOiJfbG9jYWxlcy9lbi9tZXNzYWdlcy5qc29uIiwicm9vdF9oYXNoIjoiSkVYSzJHTy1SN3NjRmJWNlNXQzNzTkFZWk9ZODM5NWpsZk95YUozQlJFcyJ9LHsicGF0aCI6Il9sb2NhbGVzL2VuX0NBL21lc3NhZ2VzLmpzb24iLCJyb290X2hhc2giOiJKRVhLMkdPLVI3c2NGYlY2U1dDM3NOQVlaT1k4Mzk1amxmT3lhSjNCUkVzIn0seyJwYXRoIjoiX2xvY2FsZXMvZW5fR0IvbWVzc2FnZXMuanNvbiIsInJvb3RfaGFzaCI6Inh5VmVtM2hNUzQzMzMzdDQ4enBYTjZtcmM0TDNOR1UxRlpleDJwczlYLWMifSx7InBhdGgiOiJfbG9jYWxlcy9lbl9VUy9tZXNzYWdlcy5qc29uIiwicm9vdF9oYXNoIjoiVDNEc3FPS0ZRWVZhRWV4NlRtczd4dDBXeG5MX20xbHV6N2R4VzdPMWlZdyJ9LHsicGF0aCI6Il9sb2NhbGVzL2VzL21lc3NhZ2VzLmpzb24iLCJyb290X2hhc2giOiJBaGFKazZJLUIwNElBTXV6T1A0bm41bnZRZzR5YV9rcEZ2X3RnOEh3WlRNIn0seyJwYXRoIjoiX2xvY2FsZXMvZXNfNDE5L21lc3NhZ2VzLmpzb24iLCJyb290X2hhc2giOiI2RWhnTzNwenFJNF81N182SU9nemxfWFI2VDUzdXJzeFJ6ekpubVZLSjdjIn0seyJwYXRoIjoiX2xvY2FsZXMvZXQvbWVzc2FnZXMuanNvbiIsInJvb3RfaGFzaCI6ImZNeDdGN19nSER4OTB6N19qNERRdFhfSnNYV0JYblpzbkJ3ZWlUY2w0ZzgifSx7InBhdGgiOiJfbG9jYWxlcy9ldS9tZXNzYWdlcy5qc29uIiwicm9vdF9oYXNoIjoicEJadzFTUWp1bW5IcGw1LUZUNTdtWlRvM1FOd3hZUzlvSEZMMWh4SnhYZyJ9LHsicGF0aCI6Il9sb2NhbGVzL2ZhL21lc3NhZ2VzLmpzb24iLCJyb290X2hhc2giOiI1MWduUENYN3JZQlA2SVJZVGllWHl1LTcwY0tIZmYxdmg2c1RRTTBsSlM0In0seyJwYXRoIjoiX2xvY2FsZXMvZmkvbWVzc2FnZXMuanNvbiIsInJvb3RfaGFzaCI6InFDS3c1bTBFWkUwYy05SlJkelp5aERoME1XTERJVDhWMlliaTI0VzlBaE0ifSx7InBhdGgiOiJfbG9jYWxlcy9maWwvbWVzc2FnZXMuanNvbiIsInJvb3RfaGFzaCI6IlFjNXFleGcyVHY3TTdRUVp0Q0ZsMVBoc1EyUTd2aEJEQVUxQlFzLUdHR28ifSx7InBhdGgiOiJfbG9jYWxlcy9mci9tZXNzYWdlcy5qc29uIiwicm9vdF9oYXNoIjoiWnhPMm0yeWVnTEEtQ3AxS2ZSV0JsN0RIN0lxRlBHVEFyd3NhQmM1VTEwdyJ9LHsicGF0aCI6Il9sb2NhbGVzL2ZyX0NBL21lc3NhZ2VzLmpzb24iLCJyb290X2hhc2giOiJyNGljSGV0dmtraVdIQy1McERCNmdnYlhGallXcGJkRlhSZk9yUUFHZ3hjIn0seyJwYXRoIjoiX2xvY2FsZXMvZ2wvbWVzc2FnZXMuanNvbiIsInJvb3RfaGFzaCI6Im1KQnhEZkQ3OGR0QnZPUWY0dllrSktPOU9kZFYwcDZDbDBUdFBhREN6aDAifSx7InBhdGgiOiJfbG9jYWxlcy9ndS9tZXNzYWdlcy5qc29uIiwicm9vdF9oYXNoIjoiekQ2UWRfekp2UTM4WGRPU1RHeEl1RFJmTXM3aVQ4ekZDTUo1OUZzcXZtRSJ9LHsicGF0aCI6Il9sb2NhbGVzL2hpL21lc3NhZ2VzLmpzb24iLCJyb290X2hhc2giOiJGSWxiOUR6cHQyd1A5UG11LVQyLWk3YktTV2lVaHd6d3dBZXhpZURPOEE0In0seyJwYXRoIjoiX2xvY2FsZXMvaHIvbWVzc2FnZXMuanNvbiIsInJvb3RfaGFzaCI6Im1GbDJ0M2JuS1lOZUJIeUIwOWN4cHNTSXBrV2FxSkdOdkk3SUNNQ19jNkUifSx7InBhdGgiOiJfbG9jYWxlcy9odS9tZXNzYWdlcy5qc29uIiwicm9vdF9oYXNoIjoienlZeEN3YzdDSkdaYnMxMkhHeTFQd0FaUGU1U1FoT3AtelFpWFdOdXhMYyJ9LHsicGF0aCI6Il9sb2NhbGVzL2h5L21lc3NhZ2VzLmpzb24iLCJyb290X2hhc2giOiJDeGJqLUwyUVNuWnloRFJhNkdvS21TZkVldjZKNEY2aXNUcllBQW05LWVRIn0seyJwYXRoIjoiX2xvY2FsZXMvaWQvbWVzc2FnZXMuanNvbiIsInJvb3RfaGFzaCI6Ik5ZY3FNMFBVdEhhUDVIQXFqY0dMZEprejZCSVEyeE5HYXRGeXZTaUE5dXMifSx7InBhdGgiOiJfbG9jYWxlcy9pcy9tZXNzYWdlcy5qc29uIiwicm9vdF9oYXNoIjoibEQ1aG1JeUZtN0NJOVVpSW53UkppRlVsM1dZR0pxaWJwbnNzbE0tX3V4cyJ9LHsicGF0aCI6Il9sb2NhbGVzL2l0L21lc3NhZ2VzLmpzb24iLCJyb290X2hhc2giOiJNM2VvYzl0VEVSUFhtUm5ucUpOcHA1cGdLNnhxNEp1WVpMazNqY0tGODBVIn0seyJwYXRoIjoiX2xvY2FsZXMvaXcvbWVzc2FnZXMuanNvbiIsInJvb3RfaGFzaCI6InU3Z2NNdlNDdWpJV3liRVluSERPODV5b3doZ2E4MU9QLWdlMHhxMVM4R28ifSx7InBhdGgiOiJfbG9jYWxlcy9qYS9tZXNzYWdlcy5qc29uIiwicm9vdF9oYXNoIjoid1FsS0hZUlg1NEx5S1pFTGNQeDY3T05XcW5lYVFqNkdrUVNVYUJSbURUVSJ9LHsicGF0aCI6Il9sb2NhbGVzL2thL21lc3NhZ2VzLmpzb24iLCJyb290X2hhc2giOiJNSW1MdjFHOTFZMnpsXzk0RHdZZU0wTWFPTzljX0NpTFVYZnM5MnM1bnlZIn0seyJwYXRoIjoiX2xvY2FsZXMva2svbWVzc2FnZXMuanNvbiIsInJvb3RfaGFzaCI6IlZJM0d5VzR4b1d6alZkeFZ4a2d6c0k3ei02aV9NeFNRTWJTbWhaV2VPdlEifSx7InBhdGgiOiJfbG9jYWxlcy9rbS9tZXNzYWdlcy5qc29uIiwicm9vdF9oYXNoIjoicGhHUENnM2pLZUI4QWZVODF2dFA3VVBsVEY5VDIwelJ4X1d5dE5uN0VPWSJ9LHsicGF0aCI6Il9sb2NhbGVzL2tuL21lc3NhZ2VzLmpzb24iLCJyb290X2hhc2giOiJYNkFNUmx3Y1h1MUw2b1lNNjNqYWxCbnFFVk5IdWxROTJ3QjI1Y0dJX3UwIn0seyJwYXRoIjoiX2xvY2FsZXMva28vbWVzc2FnZXMuanNvbiIsInJvb3RfaGFzaCI6IlZfZ2FYOHZSX3YxdXc4M1ZKYWhiY0h0TzZ0VXl3Yk1KTGFyOWlPNlNhT3cifSx7InBhdGgiOiJfbG9jYWxlcy9sby9tZXNzYWdlcy5qc29uIiwicm9vdF9oYXNoIjoiaVFndnNGSXBnbXZDSXZYU0xCV0NOZkFsOE9iZlpfOFRXaGk5aVo0VHU0OCJ9LHsicGF0aCI6Il9sb2NhbGVzL2x0L21lc3NhZ2VzLmpzb24iLCJyb290X2hhc2giOiJ0QzZfNEhIdkRzUzB0bFU2dnpvc05yR1hrc0k0Q0FwdnZCbllCTkdzdGh3In0seyJwYXRoIjoiX2xvY2FsZXMvbHYvbWVzc2FnZXMuanNvbiIsInJvb3RfaGFzaCI6ImdOWlBBOXdzeFNnX3J4TlU0RjA4UExqd3pGU3o1Ml9hNDYyS0NjblY4bWMifSx7InBhdGgiOiJfbG9jYWxlcy9tay9tZXNzYWdlcy5qc29uIiwicm9vdF9oYXNoIjoiMEs1M09hM3FONXRqa05IdVpXbWZ4NDJHU2JlWGRRT3dZdk5LVW1rS1YwUSJ9LHsicGF0aCI6Il9sb2NhbGVzL21sL21lc3NhZ2VzLmpzb24iLCJyb290X2hhc2giOiJrSDhuQ2RIVHlQb21LVWs0OUFnTHhIZm1Jb0hFeFFvSUxDTGJBWlhOcG1NIn0seyJwYXRoIjoiX2xvY2FsZXMvbW4vbWVzc2FnZXMuanNvbiIsInJvb3RfaGFzaCI6IllUMkhVZmJNblQtakdmUzM2b3NyMDc3VGY5QjNTQ3lvSlpLZDE4RXFhYWcifSx7InBhdGgiOiJfbG9jYWxlcy9tci9tZXNzYWdlcy5qc29uIiwicm9vdF9oYXNoIjoiSjE1X3JiazZnUU1vNDYzcTJIVk4wS0dhQmkxZElLaHk5MGNmLXJSNnA3TSJ9LHsicGF0aCI6Il9sb2NhbGVzL21zL21lc3NhZ2VzLmpzb24iLCJyb290X2hhc2giOiJtekxFa2RDXzY5eWhSVjl6dzhiM0Y1YlVNNk9ZR01Cc05UMmxpTjVsRDRFIn0seyJwYXRoIjoiX2xvY2FsZXMvbXkvbWVzc2FnZXMuanNvbiIsInJvb3RfaGFzaCI6IkpEdnZ2V3Rub2hRejNNbDl3YWNvaVcwNkJ3M0NBRlhyQk5aRTRidVZYLWMifSx7InBhdGgiOiJfbG9jYWxlcy9uZS9tZXNzYWdlcy5qc29uIiwicm9vdF9oYXNoIjoiTk1BT1hnYVFvdF9sNWRSOGJuclBjRkpSRGZndGtDelNzLXZON2RmQnBodyJ9LHsicGF0aCI6Il9sb2NhbGVzL25sL21lc3NhZ2VzLmpzb24iLCJyb290X2hhc2giOiI2WXhjX2lkNk00cVRqbkozM3V3VEwxNm9LbFByMjJYX0VPaWlfMVNLd1pnIn0seyJwYXRoIjoiX2xvY2FsZXMvbm8vbWVzc2FnZXMuanNvbiIsInJvb3RfaGFzaCI6InMtemllWlE3S01qWVZleUdyQnpsTzktMnB3a2tEV1UxQ0haRWs2ZGZkUmcifSx7InBhdGgiOiJfbG9jYWxlcy9vci9tZXNzYWdlcy5qc29uIiwicm9vdF9oYXNoIjoiVDZmVDdWdGdBN1N3czlITzN3cDkxa2libGpFYlM4TWc2S1BkRm9VdFdkayJ9LHsicGF0aCI6Il9sb2NhbGVzL3BhL21lc3NhZ2VzLmpzb24iLCJyb290X2hhc2giOiJ1OU45UWJmZWI1T1VqNkpEZW5hWjFNTUtQRG5uTmhlWEF2SVN5emFqRXp3In0seyJwYXRoIjoiX2xvY2FsZXMvcGwvbWVzc2FnZXMuanNvbiIsInJvb3RfaGFzaCI6IlpUajFZcjBicW9LTUR2Q3R4ZmZKYTBvT3Q0Rk9hNW9yV0Y1Tk81S3c1aDAifSx7InBhdGgiOiJfbG9jYWxlcy9wdF9CUi9tZXNzYWdlcy5qc29uIiwicm9vdF9oYXNoIjoiS2FqZE9nZmYyMjNaQzBuOFdPcU84VC1wSmprZ1c0cmhKN1p3THZxckJFWSJ9LHsicGF0aCI6Il9sb2NhbGVzL3B0X1BUL21lc3NhZ2VzLmpzb24iLCJyb290X2hhc2giOiJGV19IdXB0WEtKQ09HblNWQzVkSFQzUFk5WWt6MDBYSTd1cUNoRlpjZzFjIn0seyJwYXRoIjoiX2xvY2FsZXMvcm8vbWVzc2FnZXMuanNvbiIsInJvb3RfaGFzaCI6IlRzN2JuQjg5ME5EanJyaGhSbFliUFg1WVpXeTl2dEdqbTVGemUxTHNmeXcifSx7InBhdGgiOiJfbG9jYWxlcy9ydS9tZXNzYWdlcy5qc29uIiwicm9vdF9oYXNoIjoiaUh2RjlGZGNjWHJucEppajFoNlpJeU1uRndvelBQeTltSURmSG92TVZHcyJ9LHsicGF0aCI6Il9sb2NhbGVzL3NpL21lc3NhZ2VzLmpzb24iLCJyb290X2hhc2giOiJWQ1Fldm1VYWcwUWpYTVI2X1NkTUNBcTY2OGpEb2xyN2xkZzNPMnBXY0tJIn0seyJwYXRoIjoiX2xvY2FsZXMvc2svbWVzc2FnZXMuanNvbiIsInJvb3RfaGFzaCI6IlhvaHVlMkZ2dl9ObkhhdGpMUnR0amM3di1RQkNHRWhmRzVFZHpZeVdsS00ifSx7InBhdGgiOiJfbG9jYWxlcy9zbC9tZXNzYWdlcy5qc29uIiwicm9vdF9oYXNoIjoiZGRBWXpJVWxZRjNjV1I5cl9sdmFvdS14WkpOT25WUTRseVpSLU1nWTFZRSJ9LHsicGF0aCI6Il9sb2NhbGVzL3NxL21lc3NhZ2VzLmpzb24iLCJyb290X2hhc2giOiI2a0xJLVd3bXpMVmFsZkgzdTdyeFVlMDI2Y2MzeFV1enhRZ2ZQOXVla0dZIn0seyJwYXRoIjoiX2xvY2FsZXMvc3IvbWVzc2FnZXMuanNvbiIsInJvb3RfaGFzaCI6Im8tc25iNzBaM09Ld0RiYVRkWGl5RkxualBXZElkbG4tQ19JYWhpSmV6bk0ifSx7InBhdGgiOiJfbG9jYWxlcy9zdi9tZXNzYWdlcy5qc29uIiwicm9vdF9oYXNoIjoiWDBJcDBZNVdCak1CUnU0VHZmY200UXdlQnN1eFUyakVmeHJtaXI2YzVMbyJ9LHsicGF0aCI6Il9sb2NhbGVzL3N3L21lc3NhZ2VzLmpzb24iLCJyb290X2hhc2giOiJMR3RDMFNLVVBjREtrcU13ZE5HbUJ6VWRPOGY1ZG80WFJoZjZjQkdqM3A4In0seyJwYXRoIjoiX2xvY2FsZXMvdGEvbWVzc2FnZXMuanNvbiIsInJvb3RfaGFzaCI6IlA4ZjFiMjF0VVVzeVZIVUpzNTlqZ1B4NGJ2dk1wTG1GbnlCRVZzb3VlVmMifSx7InBhdGgiOiJfbG9jYWxlcy90ZS9tZXNzYWdlcy5qc29uIiwicm9vdF9oYXNoIjoia0lhS2lrcE52MGgzREJTaFlmcnFRRzc1cEZPM1gweTNwVHdiVHBhb2haayJ9LHsicGF0aCI6Il9sb2NhbGVzL3RoL21lc3NhZ2VzLmpzb24iLCJyb290X2hhc2giOiIwcG1xREU4cHhjZ2tpaHhScjl0ME9mVFBlOEtPNENRSXBaajRxdG4zQ0JBIn0seyJwYXRoIjoiX2xvY2FsZXMvdHIvbWVzc2FnZXMuanNvbiIsInJvb3RfaGFzaCI6InJDaVV6cVl6SkZBSlduLVB5YmwxVU5xSDVMUzI1dnVWM3hvZlNmSmVEalUifSx7InBhdGgiOiJfbG9jYWxlcy91ay9tZXNzYWdlcy5qc29uIiwicm9vdF9oYXNoIjoiQ0plS0ZDWGV3d1JJTzd0OTBPVmFmWVVNUldHcjFCdXNHLVhaUFhCR1VYUSJ9LHsicGF0aCI6Il9sb2NhbGVzL3VyL21lc3NhZ2VzLmpzb24iLCJyb290X2hhc2giOiJVRVZKQlhwcUdDcEFURFlSTFNSUWhrcHN0RmRNME9qME5jcFZiNnhTcXdvIn0seyJwYXRoIjoiX2xvY2FsZXMvdXovbWVzc2FnZXMuanNvbiIsInJvb3RfaGFzaCI6InBHUUJiWGREcEJSOWpjQkh4a3I4dUxjMjBuM2Q1Q0V3YUdaM0VzbDY0N2sifSx7InBhdGgiOiJfbG9jYWxlcy92aS9tZXNzYWdlcy5qc29uIiwicm9vdF9oYXNoIjoiOGRxVjRkV09rekJRellwUDZoTHowYm1pZFpSNV85dDBfY0hQdjRsV2d5YyJ9LHsicGF0aCI6Il9sb2NhbGVzL3poX0NOL21lc3NhZ2VzLmpzb24iLCJyb290X2hhc2giOiJNZXRQX2R6T3dKOGRlWDFjSlFzSmJoSUNJcEN3ZXBxd01FNlhVYUZGNkJVIn0seyJwYXRoIjoiX2xvY2FsZXMvemhfSEsvbWVzc2FnZXMuanNvbiIsInJvb3RfaGFzaCI6Ik1QUk0tdEJTMXoyRzBTLWlEUHdSRldPanN1UlNPMFAzMW0yVFM2amF6cEUifSx7InBhdGgiOiJfbG9jYWxlcy96aF9UVy9tZXNzYWdlcy5qc29uIiwicm9vdF9oYXNoIjoiRnJqM3ZrSzVndFd0bjJPT2NkbzQwVFE1UzV1cmtsWDNQUFVVcTctcThVWSJ9LHsicGF0aCI6Il9sb2NhbGVzL3p1L21lc3NhZ2VzLmpzb24iLCJyb290X2hhc2giOiI3SGpkMU16eksxMTI3SEFhSUJaOFA3MFViWG1sQmVUN0JDSDhIbHowcW1NIn0seyJwYXRoIjoiZGFzaGVyU2V0dGluZ1NjaGVtYS5qc29uIiwicm9vdF9oYXNoIjoiYkduT0QtYjZzVThaa0tNZzF3VC00MkxCZGNBT3Rza2lTcWIwRVFpUmpLWSJ9LHsicGF0aCI6Im1hbmlmZXN0Lmpzb24iLCJyb290X2hhc2giOiJHNGdRdHA3ZzFKSlRuSUoySGZIYU9ZeS1KUnExU1Zla2xiWGpHNmFvUG1nIn0seyJwYXRoIjoib2Zmc2NyZWVuZG9jdW1lbnQuaHRtbCIsInJvb3RfaGFzaCI6InVmb3RVcVRfcTdRNHRXR0VFeHVKT3dSbFd3SHpOZ1prRmRULWc1Ny1aT2MifSx7InBhdGgiOiJvZmZzY3JlZW5kb2N1bWVudF9tYWluLmpzIiwicm9vdF9oYXNoIjoiRk10cjNXYmxpdGNoSFFROGREZEJidDE0T2VDUl9aOFhUbzhQd01nek1RdyJ9LHsicGF0aCI6InBhZ2VfZW1iZWRfc2NyaXB0LmpzIiwicm9vdF9oYXNoIjoiS1BpWFBfcXBWdDFocXFRdUxnRmpGM25RdVUzNklrRmxGelcxWDdYSDk4VSJ9LHsicGF0aCI6InNlcnZpY2Vfd29ya2VyX2Jpbl9wcm9kLmpzIiwicm9vdF9oYXNoIjoid2Rxd0h4VUJaQ3NSSC1Nbm1RQmNfT0V3Vnd4MnU1SzdqMFE5UFBDaHFCWSJ9XSwiZm9ybWF0IjoidHJlZWhhc2giLCJoYXNoX2Jsb2NrX3NpemUiOjQwOTZ9XSwiaXRlbV9pZCI6ImdoYm1ubmpvb2VrcG1vZWNubm5pbG5uYmRsb2xoa2hpIiwiaXRlbV92ZXJzaW9uIjoiMS4xMDIuMSIsInByb3RvY29sX3ZlcnNpb24iOjF9","signatures":[{"header":{"kid":"webstore"},"protected":"eyJhbGciOiJSUzI1NiJ9","signature":"W0_SwR8-agqCIHqzozgNtjsI9x64T3Xg2_5FT4b6dLJHfAf0lyl24a0bc3FEEgiRzZylNR1tNg7WkC-GMW-99P5cF5QEFdA_pqBHNdhCaq4yepCyJmxizNDSLIB8h4RYea_e2bTN-rtowDpmhsLi0UCmTJz5lneLvkmdyo_1168tqMPVy8ExjgcK48l6Aq2EfzkSv4_6JAR-rclfQnePRBIxAEr0g9Oz4xN13f0XPKhVgVYo4AxHl2LEDZuWJ4iXShhiglK0agYMFuPEmxDszyzui0YbAfBkRteVLScAahzRV_c0JUwkFnDE-Bev5Bn2iK11bOGcS8VQB4ie8c6tHg"}]}}] \ No newline at end of file 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 new file mode 100644 index 0000000..900d263 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/dasherSettingSchema.json @@ -0,0 +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." + } + } +} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/manifest.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/manifest.json new file mode 100644 index 0000000..90640fa --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/manifest.json @@ -0,0 +1,38 @@ +{ + "author": { + "email": "docs-hosted-app-own@google.com" + }, + "background": { + "service_worker": "service_worker_bin_prod.js" + }, + "content_capabilities": { + "matches": [ "https://docs.google.com/*", "https://drive.google.com/*", "https://drive-autopush.corp.google.com/*", "https://drive-daily-0.corp.google.com/*", "https://drive-daily-1.corp.google.com/*", "https://drive-daily-2.corp.google.com/*", "https://drive-daily-3.corp.google.com/*", "https://drive-daily-4.corp.google.com/*", "https://drive-daily-5.corp.google.com/*", "https://drive-daily-6.corp.google.com/*", "https://drive-preprod.corp.google.com/*", "https://drive-staging.corp.google.com/*" ], + "permissions": [ "clipboardRead", "clipboardWrite", "unlimitedStorage" ] + }, + "content_security_policy": { + "extension_pages": "script-src 'self'; object-src 'self'" + }, + "default_locale": "en_US", + "description": "__MSG_extDesc__", + "externally_connectable": { + "matches": [ "https://docs.google.com/*", "https://drive.google.com/*", "https://drive-autopush.corp.google.com/*", "https://drive-daily-0.corp.google.com/*", "https://drive-daily-1.corp.google.com/*", "https://drive-daily-2.corp.google.com/*", "https://drive-daily-3.corp.google.com/*", "https://drive-daily-4.corp.google.com/*", "https://drive-daily-5.corp.google.com/*", "https://drive-daily-6.corp.google.com/*", "https://drive-preprod.corp.google.com/*", "https://drive-staging.corp.google.com/*" ] + }, + "host_permissions": [ "https://docs.google.com/*", "https://drive.google.com/*" ], + "icons": { + "128": "128.png" + }, + "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnF7RGLAxIon0/XeNZ4MLdP3DMkoORzEAKVg0sb89JpA/W2osTHr91Wqwdc9lW0mFcSpCYS9Y3e7cUMFo/M2ETASIuZncMiUzX2/0rrWtGQ3UuEj3KSe5PdaVZfisyJw/FebvHwirEWrhqcgzVUj9fL9YjE0G45d1zMKcc1umKvLqPyTznNuKBZ9GJREdGLRJCBmUgCkI8iwtwC+QZTUppmaD50/ksnEUXv+QkgGN07/KoNA5oAgo49Jf1XBoMv4QXtVZQlBYZl84zAsI82hb63a6Gu29U/4qMWDdI7+3Ne5TRvo6Zi3EI4M2NQNplJhik105qrz+eTLJJxvf4slrWwIDAQAB", + "manifest_version": 3, + "minimum_chrome_version": "88", + "name": "__MSG_extName__", + "permissions": [ "alarms", "storage", "unlimitedStorage", "offscreen" ], + "storage": { + "managed_schema": "dasherSettingSchema.json" + }, + "update_url": "https://clients2.google.com/service/update2/crx", + "version": "1.102.1", + "web_accessible_resources": [ { + "matches": [ "\u003Call_urls>" ], + "resources": [ "page_embed_script.js" ] + } ] +} 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 new file mode 100644 index 0000000..8658fdf --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/offscreendocument.html @@ -0,0 +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 new file mode 100644 index 0000000..4463ef2 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/offscreendocument_main.js @@ -0,0 +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; 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 new file mode 100644 index 0000000..e8f16d6 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/page_embed_script.js @@ -0,0 +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); 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 new file mode 100644 index 0000000..ab156da --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/service_worker_bin_prod.js @@ -0,0 +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(); diff --git a/.edge-profile-render-1774484525680/Default/Extensions/jmjflgjpcpepeafmmgdpfkogkghcpiha/1.2.1_0/_metadata/computed_hashes.json b/.edge-profile-render-1774484525680/Default/Extensions/jmjflgjpcpepeafmmgdpfkogkghcpiha/1.2.1_0/_metadata/computed_hashes.json new file mode 100644 index 0000000..494076d --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/jmjflgjpcpepeafmmgdpfkogkghcpiha/1.2.1_0/_metadata/computed_hashes.json @@ -0,0 +1 @@ +{"file_hashes":[{"block_hashes":["OdZL4YFLwCTKbdslekC6/+U9KTtDUk+T+nnpVOeRzUc=","6RbL+qKART8FehO4s7U0u67iEI8/jaN+8Kg3kII+uy4=","CuN6+RcZAysZCfrzCZ8KdWDkQqyaIstSrcmsZ/c2MVs="],"block_size":4096,"path":"content.js"},{"block_hashes":["OdZL4YFLwCTKbdslekC6/+U9KTtDUk+T+nnpVOeRzUc=","UL53sQ5hOhAmII/Yx6muXikzahxM+k5gEmVOh7xJ3Rw=","u6MdmVNzBUfDzMwv2LEJ6pXR8k0nnvpYRwOL8aApwP8="],"block_size":4096,"path":"content_new.js"}],"version":2} \ No newline at end of file diff --git a/.edge-profile-render-1774484525680/Default/Extensions/jmjflgjpcpepeafmmgdpfkogkghcpiha/1.2.1_0/_metadata/verified_contents.json b/.edge-profile-render-1774484525680/Default/Extensions/jmjflgjpcpepeafmmgdpfkogkghcpiha/1.2.1_0/_metadata/verified_contents.json new file mode 100644 index 0000000..27a1ed1 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/jmjflgjpcpepeafmmgdpfkogkghcpiha/1.2.1_0/_metadata/verified_contents.json @@ -0,0 +1,24 @@ +[ + { + "description": "treehash per file", + "signed_content": { + "payload": "eyJpdGVtX2lkIjoiam1qZmxnanBjcGVwZWFmbW1nZHBma29na2doY3BpaGEiLCJpdGVtX3ZlcnNpb24iOiIxLjIuMSIsInByb3RvY29sX3ZlcnNpb24iOjEsImNvbnRlbnRfaGFzaGVzIjpbeyJmb3JtYXQiOiJ0cmVlaGFzaCIsImRpZ2VzdCI6InNoYTI1NiIsImJsb2NrX3NpemUiOjQwOTYsImhhc2hfYmxvY2tfc2l6ZSI6NDA5NiwiZmlsZXMiOlt7InBhdGgiOiJjb250ZW50LmpzIiwicm9vdF9oYXNoIjoiQS13R1JtV0VpM1lybmxQNktneUdrVWJ5Q0FoTG9JZnRRZGtHUnBEcnp1QSJ9LHsicGF0aCI6ImNvbnRlbnRfbmV3LmpzIiwicm9vdF9oYXNoIjoiVU00WVRBMHc5NFlqSHVzVVJaVTFlU2FBSjFXVENKcHhHQUtXMGxhcDIzUSJ9LHsicGF0aCI6Im1hbmlmZXN0Lmpzb24iLCJyb290X2hhc2giOiJKNXYwVTkwRmN0ejBveWJMZmZuNm5TbHFLU0h2bHF2YkdWYW9FeWFOZU1zIn1dfV19", + "signatures": [ + { + "header": { + "kid": "publisher" + }, + "protected": "eyJhbGciOiJSUzI1NiJ9", + "signature": "UglEEilkOml5P1W0X6wc-_dB87PQB73uMir11923av57zPKujb4IUe_lbGpn7cRZsy6x-8i9eEKxAW7L2TSmYqrcp4XtiON6ppcf27FWACXOUJDax9wlMr-EOtyZhykCnB9vRGKTw9I-3rXYiwKjK3YaYCOvXZyskadBu1toKyv2BLfMRVcRJYyG3Yn0vbUc2PwUMn-rQOCIWZD9GEEPLTYRiqsRkBDi03GnhNlgC0k7snp6vnetpduysr0hYjeezk3dC97Sv99R_-j4LsTYy8XN4AmCYMbEQLcWbY5RMNBE28mfyLSRm_H3BjiO1otIg0wkSBeE6_z7NFKiz95H6w" + }, + { + "header": { + "kid": "webstore" + }, + "protected": "eyJhbGciOiJSUzI1NiJ9", + "signature": "Q81ZBX6yEwDV2z8PShlrMn9rcJfSRdV4KVg5cZEhRcHrEZHp44LwOdyl3NlHpOPkGj3PeucVxD7j43iuYNcrQ2vSW1UkcbcNE0m9TKrGh3XH4acw3BC6pEMRRxcPjeGVVN_6_L8D3Ns_fDipUL1zyi2X5AaPY5E0etkb9O_UJxtP3VylPu-UdsVk9VkMu-BwhD82skujDsqDzS0y1PFEwccN64WTZtsXzkmMrRMwyXHq8PQYANghDCH6U4OxTrIK-FafMqit-79KcfWknrBAudzPGlB44bYpCeo2__cwx_Eejk3CgTzVkFjN-8bDNmiHkpw9Qon7aUq4X4f9vqF5AQ" + } + ] + } + } +] \ No newline at end of file diff --git a/.edge-profile-render-1774484525680/Default/Extensions/jmjflgjpcpepeafmmgdpfkogkghcpiha/1.2.1_0/content.js b/.edge-profile-render-1774484525680/Default/Extensions/jmjflgjpcpepeafmmgdpfkogkghcpiha/1.2.1_0/content.js new file mode 100644 index 0000000..31039eb --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/jmjflgjpcpepeafmmgdpfkogkghcpiha/1.2.1_0/content.js @@ -0,0 +1 @@ +(()=>{"use strict";var e={1:(e,o)=>{Object.defineProperty(o,"__esModule",{value:!0}),o.newCwsPromotionalButtonCta=o.chromeToEdgeCwsButtonCtaMapping=void 0,o.chromeToEdgeCwsButtonCtaMapping={"‏إضافة إلى Chrome":"الحصول عليه","‏الإزالة من Chrome":"إزالة",Добавяне:"Получаване","Премахване от Chrome":"Премахване","Chrome এ জুড়ুন":"পান","Chrome থেকে সরান":"সরান","Afegeix a Chrome":"Obtén","Suprimeix de Chrome":"Suprimeix","Přidat do Chromu":"Získat","Odstranit z Chromu":"Odebrat","Føj til Chrome":"Få","Fjern fra Chrome":"Fjerne",Hinzufügen:"Abrufen","Aus Chrome entfernen":"Entfernen","Add to Chrome":"Get","Remove from Chrome":"Remove","Añadir a Chrome":"Obtener",Desinstalar:"Quitar","Agregar a Chrome":"Obtener","Eliminar de Chrome":"Quitar","Lisa Chrome'i":"Hangi","Chrome'ist eemaldamine":"Eemalda",ΠΡΟΣΘΗΚH:"Απόκτηση","Κατάργηση από το Chrome":"Κατάργηση","‏افزودن به Chrome":"دریافت","‏حذف از Chrome":"حذف","Idagdag sa Chrome":"Kunin","Alisin sa Chrome":"Tanggalin","Lisää Chromeen":"Hanki","Poista Chromesta":"Poista","Ajouter à Chrome":"Obtenir","Supprimer de Chrome":"Supprimer","Chrome માં ઉમેરો":"મેળવો","Chrome માંથી દૂર કરો":"દૂર કરો","Chrome में जोड़ें":"प्राप्त करें","Chrome से हटाएं":"निकालें","Dodaj u Chrome":"Dohvati","Ukloni iz programa Chrome":"Ukloni",Hozzáadás:"Letöltés","Eltávolítás a Chrome-ból":"Eltávolítás","Tambahkan ke Chrome":"Dapatkan","Hapus dari Chrome":"Hapus",Aggiungi:"Ottieni","Rimuovi da Google Chrome":"Rimuovi","‏הוספה ל-Chrome":"לקבל","‏הסרה מ-Chrome":"לְהַסִיר","Chrome に追加":"インストール","Chrome から削除します":"削除","Chrome에 추가":"다운로드","Chrome에서 삭제":"제거","Pridėt į „Chrome“":"Gauti","Pašalinti iš „Chrome“":"Pašalinti","Pievienot Chrome":"Iegūt","Noņemt no pārlūka Chrome":"Noņemt","Tambahkan pada Chrome":"Dapatkannya","Alih Keluar dari Chrome":"Alih keluar","Chrome-ലേക്ക് ചേർക്കുക":"ലഭ്യമാക്കുക","Chrome-ൽ നിന്ന് നീക്കംചെയ്യുക":"നീക്കംചെയ്യുക","Chrome मध्ये जोडा":"मिळवा","Chrome मधून काढून टाका":"काढून टाका","Toev. aan Chrome":"Downloaden","Verwijderen uit Chrome":"Verwijderen","Legg til i Chrome":"Få","Dodaj do Chrome":"Pobierz","Usuń z Chrome":"Usuń","Usar no Chrome":"Obter","Remover do Google Chrome":"Remover",Instalar:"Obter","Remover do Chrome":"Remover","Adaugă în Chrome":"Obțineți","Eliminați din Chrome":"Eliminați",Установить:"Получить","Удалить из Chrome":"Удалить","Pridať do Chromu":"Získať","Odstrániť z prehliadača Chrome":"Odstrániť","Dodaj v Chrome":"Pridobi","Odstrani iz Chroma":"Odstrani","Додај у Chrome":"Преузми","Уклоните из Chrome-а":"Уклони","Lägg till":"Hämta","Ta bort från Chrome":"Ta bort","Chrome இல் சேர்":"பெறுக","Chrome இலிருந்து அகற்று":"அகற்று","Chromeకి జోడించండి":"పొందండి","Chrome నుండి తీసివేయండి":"తీసివేయి","เพิ่มใน Chrome":"รับ","นำออกจาก Chrome":"ลบออก","Chrome'a ekle":"Al","Chrome'dan kaldır":"Kaldır","Додати в Chrome":"Отримати","Видалити з Chrome":"Видалити","Thêm vào Chrome":"Tải về","Xóa khỏi Chrome":"Xóa","添加至 Chrome":"获取","从 Chrome 中删除":"删除","加到 Chrome":"取得","從 Chrome 中移除":"移除","‏أضيف إلى Chrome":"إزالة","Добавено към Chrome":"Премахване","Chrome এ জুড়েছে":"সরান","Afegit a Chrome":"Suprimeix","Přidáno do Chromu":"Odebrat","Føjet til Chrome":"Fjerne",Hinzugefügt:"Entfernen","Added to Chrome":"Remove","Añadido a Chrome":"Quitar","Agregado a Chrome":"Quitar","Chrome'ile lisatud":"Eemalda",ΠΡΟΣΤΕΘΗΚΕ:"Κατάργηση","‏به Chrome اضافه شد":"حذف","Idinagdag sa Chrome":"Tanggalin","Lisätty Chromeen":"Poista","Ajouté à Chrome":"Supprimer","Chrome માં ઉમેર્યું":"દૂર કરો","Chrome में शामिल":"निकालें","Dodano u Chrome":"Ukloni",Hozzáadva:"Eltávolítás","Selesai ditambahkan":"Hapus","Aggiunto a Chrome":"Rimuovi","Chrome に追加済み":"削除","Chrome에 추가됨":"제거","Pridėta į „Chrome“":"Pašalinti","Pievienots Chrome":"Noņemt","Ditambahkan pada Chrome":"Alih keluar","Chrome-ലേക്ക് ചേർത്തു":"നീക്കംചെയ്യുക","Chrome मध्ये जोडले":"काढून टाका","Toegevoegd aan Chrome":"Verwijderen","Dodano do Chrome":"Usuń","Adicionado ao Chrome":"Remover","Adăugat la Chrome":"Eliminați","Добавлено в Chrome":"Удалить","Pridané do Chromu":"Odstrániť","Dodano v Chrome":"Odstrani","Додато у Chrome":"Уклони","Tillagd i Chrome":"Ta bort",சேர்க்கப்பட்டது:"அகற்று","Chromeకు జోడించబడింది":"తీసివేయి","เพิ่มใน Chrome แล้ว":"ลบออก","Chrome'a eklendi":"Kaldır","Додано в Chrome":"Видалити","Đã thêm vào Chrome":"Xóa","已添加至 Chrome":"删除","已加到 Chrome":"移除"},o.newCwsPromotionalButtonCta=["‏تثبيت Chrome","Инсталиране на Chrome","Chrome ইনস্টল করুন","Instal·la Chrome","Nainstalovat Chrome","Installer Chrome","Chrome installieren","Install Chrome","Instalar Chrome","Installi Chrome","Εγκατάσταση του Chrome","‏نصب Chrome","I-install ang Chrome","Asenna Chrome","Chrome ઇન્સ્ટૉલ કરો","Chrome इंस्टॉल करें","Instaliraj Chrome","A Chrome telepítése","Instal Chrome","Installa Chrome","‏התקנת Chrome","Chrome をインストール","Chrome 설치하기","Įdiegti „Chrome“","Instalēt pārlūku Chrome","Pasang Chrome","Chrome ഇൻസ്റ്റാൾ ചെയ്യുക","Chrome इंस्टॉल करा","Chrome installeren","Zainstaluj Chrome","Instalar o Google Chrome","Instalează Chrome","Установить Chrome","Inštalovať Chrome","Namestitev Chroma","Инсталирај Chrome","Installera Chrome","Chromeமை நிறுவு","Chromeను ఇన్‌స్టాల్ చేయండి","ติดตั้ง Chrome","Chrome'u yükle","Установити Chrome","Cài đặt Chrome","安装 Chrome","安裝 Chrome"]},200:(e,o)=>{var r,a;Object.defineProperty(o,"__esModule",{value:!0}),o.CwsPageEvents=o.CwsPageEventsHistogram=o.ClientFeatureStatus=void 0,(a=o.ClientFeatureStatus||(o.ClientFeatureStatus={})).Enabled="Enabled",a.Disabled="Disabled",a.NotPresent="NotPresent",o.CwsPageEventsHistogram="Microsoft.Extensions.CwsPageEvents",(r=o.CwsPageEvents||(o.CwsPageEvents={}))[r.CWS_PAGE_LOADED=0]="CWS_PAGE_LOADED",r[r.PROMOTIONAL_DIALOG_SHOWN=1]="PROMOTIONAL_DIALOG_SHOWN",r[r.NEW_CWS_PAGE_LOADED=2]="NEW_CWS_PAGE_LOADED",r[r.NEW_CWS_PROMOTIONAL_DIALOG_SHOWN=3]="NEW_CWS_PROMOTIONAL_DIALOG_SHOWN",r[r.NEW_CWS_PROMOTIONAL_MESSAGE_SHOWN=4]="NEW_CWS_PROMOTIONAL_MESSAGE_SHOWN",r[r.OLD_DIALOG_IMPACTED_USER=5]="OLD_DIALOG_IMPACTED_USER",r[r.NEW_DIALOG_IMPACTED_USER=6]="NEW_DIALOG_IMPACTED_USER",r[r.NEW_MESSAGE_IMPACTED_USER=7]="NEW_MESSAGE_IMPACTED_USER",r[r.END=8]="END"}},o={};function r(a){var t=o[a];if(void 0!==t)return t.exports;var m=o[a]={exports:{}};return e[a](m,m.exports,r),m.exports}(()=>{const e=r(1),o=r(200);var a;!function(r){var a,t;let m=o.ClientFeatureStatus.NotPresent,C=!1;function n(o){const r=o.innerText||"";if(r in e.chromeToEdgeCwsButtonCtaMapping){const a=e.chromeToEdgeCwsButtonCtaMapping[r];o.innerText=a,function(e,o){document.querySelectorAll(`[aria-label="${e}"]`).forEach((e=>{e.ariaLabel=o}))}(r,a)}}function i(){m!=o.ClientFeatureStatus.Disabled&&function(){const o=document.querySelectorAll("div.webstore-test-button-label");o.forEach(n),function(o){var r;let a=!1;o.length>0&&(o.forEach((o=>{const r=o.innerText||"";null!=Object.keys(e.chromeToEdgeCwsButtonCtaMapping).find((o=>e.chromeToEdgeCwsButtonCtaMapping[o]===r))&&(a=!0)})),null===(r=chrome.metricsPrivate)||void 0===r||r.recordBoolean("Microsoft.Extensions.CwsCtaUpdateSuccessState",a))}(o)}(),function(){var e;if(C)return;const r=document.getElementsByTagName("a");for(var a=0;a{m=e[0].featureStatus,i(),new MutationObserver((e=>i())).observe(document.documentElement,{childList:!0,subtree:!0})}))}(a||(a={}))})()})(); \ No newline at end of file diff --git a/.edge-profile-render-1774484525680/Default/Extensions/jmjflgjpcpepeafmmgdpfkogkghcpiha/1.2.1_0/content_new.js b/.edge-profile-render-1774484525680/Default/Extensions/jmjflgjpcpepeafmmgdpfkogkghcpiha/1.2.1_0/content_new.js new file mode 100644 index 0000000..02816eb --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/jmjflgjpcpepeafmmgdpfkogkghcpiha/1.2.1_0/content_new.js @@ -0,0 +1 @@ +(()=>{"use strict";var e={1:(e,o)=>{Object.defineProperty(o,"__esModule",{value:!0}),o.newCwsPromotionalButtonCta=o.chromeToEdgeCwsButtonCtaMapping=void 0,o.chromeToEdgeCwsButtonCtaMapping={"‏إضافة إلى Chrome":"الحصول عليه","‏الإزالة من Chrome":"إزالة",Добавяне:"Получаване","Премахване от Chrome":"Премахване","Chrome এ জুড়ুন":"পান","Chrome থেকে সরান":"সরান","Afegeix a Chrome":"Obtén","Suprimeix de Chrome":"Suprimeix","Přidat do Chromu":"Získat","Odstranit z Chromu":"Odebrat","Føj til Chrome":"Få","Fjern fra Chrome":"Fjerne",Hinzufügen:"Abrufen","Aus Chrome entfernen":"Entfernen","Add to Chrome":"Get","Remove from Chrome":"Remove","Añadir a Chrome":"Obtener",Desinstalar:"Quitar","Agregar a Chrome":"Obtener","Eliminar de Chrome":"Quitar","Lisa Chrome'i":"Hangi","Chrome'ist eemaldamine":"Eemalda",ΠΡΟΣΘΗΚH:"Απόκτηση","Κατάργηση από το Chrome":"Κατάργηση","‏افزودن به Chrome":"دریافت","‏حذف از Chrome":"حذف","Idagdag sa Chrome":"Kunin","Alisin sa Chrome":"Tanggalin","Lisää Chromeen":"Hanki","Poista Chromesta":"Poista","Ajouter à Chrome":"Obtenir","Supprimer de Chrome":"Supprimer","Chrome માં ઉમેરો":"મેળવો","Chrome માંથી દૂર કરો":"દૂર કરો","Chrome में जोड़ें":"प्राप्त करें","Chrome से हटाएं":"निकालें","Dodaj u Chrome":"Dohvati","Ukloni iz programa Chrome":"Ukloni",Hozzáadás:"Letöltés","Eltávolítás a Chrome-ból":"Eltávolítás","Tambahkan ke Chrome":"Dapatkan","Hapus dari Chrome":"Hapus",Aggiungi:"Ottieni","Rimuovi da Google Chrome":"Rimuovi","‏הוספה ל-Chrome":"לקבל","‏הסרה מ-Chrome":"לְהַסִיר","Chrome に追加":"インストール","Chrome から削除します":"削除","Chrome에 추가":"다운로드","Chrome에서 삭제":"제거","Pridėt į „Chrome“":"Gauti","Pašalinti iš „Chrome“":"Pašalinti","Pievienot Chrome":"Iegūt","Noņemt no pārlūka Chrome":"Noņemt","Tambahkan pada Chrome":"Dapatkannya","Alih Keluar dari Chrome":"Alih keluar","Chrome-ലേക്ക് ചേർക്കുക":"ലഭ്യമാക്കുക","Chrome-ൽ നിന്ന് നീക്കംചെയ്യുക":"നീക്കംചെയ്യുക","Chrome मध्ये जोडा":"मिळवा","Chrome मधून काढून टाका":"काढून टाका","Toev. aan Chrome":"Downloaden","Verwijderen uit Chrome":"Verwijderen","Legg til i Chrome":"Få","Dodaj do Chrome":"Pobierz","Usuń z Chrome":"Usuń","Usar no Chrome":"Obter","Remover do Google Chrome":"Remover",Instalar:"Obter","Remover do Chrome":"Remover","Adaugă în Chrome":"Obțineți","Eliminați din Chrome":"Eliminați",Установить:"Получить","Удалить из Chrome":"Удалить","Pridať do Chromu":"Získať","Odstrániť z prehliadača Chrome":"Odstrániť","Dodaj v Chrome":"Pridobi","Odstrani iz Chroma":"Odstrani","Додај у Chrome":"Преузми","Уклоните из Chrome-а":"Уклони","Lägg till":"Hämta","Ta bort från Chrome":"Ta bort","Chrome இல் சேர்":"பெறுக","Chrome இலிருந்து அகற்று":"அகற்று","Chromeకి జోడించండి":"పొందండి","Chrome నుండి తీసివేయండి":"తీసివేయి","เพิ่มใน Chrome":"รับ","นำออกจาก Chrome":"ลบออก","Chrome'a ekle":"Al","Chrome'dan kaldır":"Kaldır","Додати в Chrome":"Отримати","Видалити з Chrome":"Видалити","Thêm vào Chrome":"Tải về","Xóa khỏi Chrome":"Xóa","添加至 Chrome":"获取","从 Chrome 中删除":"删除","加到 Chrome":"取得","從 Chrome 中移除":"移除","‏أضيف إلى Chrome":"إزالة","Добавено към Chrome":"Премахване","Chrome এ জুড়েছে":"সরান","Afegit a Chrome":"Suprimeix","Přidáno do Chromu":"Odebrat","Føjet til Chrome":"Fjerne",Hinzugefügt:"Entfernen","Added to Chrome":"Remove","Añadido a Chrome":"Quitar","Agregado a Chrome":"Quitar","Chrome'ile lisatud":"Eemalda",ΠΡΟΣΤΕΘΗΚΕ:"Κατάργηση","‏به Chrome اضافه شد":"حذف","Idinagdag sa Chrome":"Tanggalin","Lisätty Chromeen":"Poista","Ajouté à Chrome":"Supprimer","Chrome માં ઉમેર્યું":"દૂર કરો","Chrome में शामिल":"निकालें","Dodano u Chrome":"Ukloni",Hozzáadva:"Eltávolítás","Selesai ditambahkan":"Hapus","Aggiunto a Chrome":"Rimuovi","Chrome に追加済み":"削除","Chrome에 추가됨":"제거","Pridėta į „Chrome“":"Pašalinti","Pievienots Chrome":"Noņemt","Ditambahkan pada Chrome":"Alih keluar","Chrome-ലേക്ക് ചേർത്തു":"നീക്കംചെയ്യുക","Chrome मध्ये जोडले":"काढून टाका","Toegevoegd aan Chrome":"Verwijderen","Dodano do Chrome":"Usuń","Adicionado ao Chrome":"Remover","Adăugat la Chrome":"Eliminați","Добавлено в Chrome":"Удалить","Pridané do Chromu":"Odstrániť","Dodano v Chrome":"Odstrani","Додато у Chrome":"Уклони","Tillagd i Chrome":"Ta bort",சேர்க்கப்பட்டது:"அகற்று","Chromeకు జోడించబడింది":"తీసివేయి","เพิ่มใน Chrome แล้ว":"ลบออก","Chrome'a eklendi":"Kaldır","Додано в Chrome":"Видалити","Đã thêm vào Chrome":"Xóa","已添加至 Chrome":"删除","已加到 Chrome":"移除"},o.newCwsPromotionalButtonCta=["‏تثبيت Chrome","Инсталиране на Chrome","Chrome ইনস্টল করুন","Instal·la Chrome","Nainstalovat Chrome","Installer Chrome","Chrome installieren","Install Chrome","Instalar Chrome","Installi Chrome","Εγκατάσταση του Chrome","‏نصب Chrome","I-install ang Chrome","Asenna Chrome","Chrome ઇન્સ્ટૉલ કરો","Chrome इंस्टॉल करें","Instaliraj Chrome","A Chrome telepítése","Instal Chrome","Installa Chrome","‏התקנת Chrome","Chrome をインストール","Chrome 설치하기","Įdiegti „Chrome“","Instalēt pārlūku Chrome","Pasang Chrome","Chrome ഇൻസ്റ്റാൾ ചെയ്യുക","Chrome इंस्टॉल करा","Chrome installeren","Zainstaluj Chrome","Instalar o Google Chrome","Instalează Chrome","Установить Chrome","Inštalovať Chrome","Namestitev Chroma","Инсталирај Chrome","Installera Chrome","Chromeமை நிறுவு","Chromeను ఇన్‌స్టాల్ చేయండి","ติดตั้ง Chrome","Chrome'u yükle","Установити Chrome","Cài đặt Chrome","安装 Chrome","安裝 Chrome"]},200:(e,o)=>{var r,t;Object.defineProperty(o,"__esModule",{value:!0}),o.CwsPageEvents=o.CwsPageEventsHistogram=o.ClientFeatureStatus=void 0,(t=o.ClientFeatureStatus||(o.ClientFeatureStatus={})).Enabled="Enabled",t.Disabled="Disabled",t.NotPresent="NotPresent",o.CwsPageEventsHistogram="Microsoft.Extensions.CwsPageEvents",(r=o.CwsPageEvents||(o.CwsPageEvents={}))[r.CWS_PAGE_LOADED=0]="CWS_PAGE_LOADED",r[r.PROMOTIONAL_DIALOG_SHOWN=1]="PROMOTIONAL_DIALOG_SHOWN",r[r.NEW_CWS_PAGE_LOADED=2]="NEW_CWS_PAGE_LOADED",r[r.NEW_CWS_PROMOTIONAL_DIALOG_SHOWN=3]="NEW_CWS_PROMOTIONAL_DIALOG_SHOWN",r[r.NEW_CWS_PROMOTIONAL_MESSAGE_SHOWN=4]="NEW_CWS_PROMOTIONAL_MESSAGE_SHOWN",r[r.OLD_DIALOG_IMPACTED_USER=5]="OLD_DIALOG_IMPACTED_USER",r[r.NEW_DIALOG_IMPACTED_USER=6]="NEW_DIALOG_IMPACTED_USER",r[r.NEW_MESSAGE_IMPACTED_USER=7]="NEW_MESSAGE_IMPACTED_USER",r[r.END=8]="END"}},o={};function r(t){var a=o[t];if(void 0!==a)return a.exports;var m=o[t]={exports:{}};return e[t](m,m.exports,r),m.exports}(()=>{const e=r(1),o=r(200);var t;!function(r){var t,a;let m=o.ClientFeatureStatus.NotPresent,n=!1,C=!1;function i(e,o,r){if(e.innerHTML===o)return void(e.textContent=r);const t=e.children;for(var a=0;ae.chromeToEdgeCwsButtonCtaMapping[o]===r))&&(t=!0)}null===(r=chrome.metricsPrivate)||void 0===r||r.recordBoolean("Microsoft.Extensions.NewCwsCtaUpdateSuccessState",t)}(o)}(),function(){var r,t;if(!n||!C){if(!n){const e=document.getElementsByTagName("a");for(var a=0;a{m=e[0].featureStatus,s(),new MutationObserver((e=>s())).observe(document.documentElement,{childList:!0,subtree:!0})}))}(t||(t={}))})()})(); \ No newline at end of file diff --git a/.edge-profile-render-1774484525680/Default/Extensions/jmjflgjpcpepeafmmgdpfkogkghcpiha/1.2.1_0/manifest.json b/.edge-profile-render-1774484525680/Default/Extensions/jmjflgjpcpepeafmmgdpfkogkghcpiha/1.2.1_0/manifest.json new file mode 100644 index 0000000..e693f4e --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Extensions/jmjflgjpcpepeafmmgdpfkogkghcpiha/1.2.1_0/manifest.json @@ -0,0 +1,15 @@ +{ + "content_scripts": [ { + "js": [ "content.js" ], + "matches": [ "https://chrome.google.com/webstore/*" ] + }, { + "js": [ "content_new.js" ], + "matches": [ "https://chromewebstore.google.com/*" ] + } ], + "description": "Edge relevant text changes on select websites to improve user experience and precisely surfaces the action they want to take.", + "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu06p2Mjoy6yJDUUjCe8Hnqvtmjll73XqcbylxFZZWe+MCEAEK+1D0Nxrp0+IuWJL02CU3jbuR5KrJYoezA36M1oSGY5lIF/9NhXWEx5GrosxcBjxqEsdWv/eDoOOEbIvIO0ziMv7T1SUnmAA07wwq8DXWYuwlkZU/PA0Mxx0aNZ5+QyMfYqRmMpwxkwPG8gyU7kmacxgCY1v7PmmZo1vSIEOBYrxl064w5Q6s/dpalSJM9qeRnvRMLsszGY/J2bjQ1F0O2JfIlBjCOUg/89+U8ZJ1mObOFrKO4um8QnenXtH0WGmsvb5qBNrvbWNPuFgr2+w5JYlpSQ+O8zUCb8QZwIDAQAB", + "manifest_version": 3, + "name": "Edge relevant text changes", + "update_url": "https://edge.microsoft.com/extensionwebstorebase/v1/crx", + "version": "1.2.1" +} diff --git a/.edge-profile-render-1774484525680/Default/Favicons b/.edge-profile-render-1774484525680/Default/Favicons new file mode 100644 index 0000000..e589db8 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Favicons differ diff --git a/.edge-profile-render-1774484525680/Default/Favicons-journal b/.edge-profile-render-1774484525680/Default/Favicons-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/Feature Engagement Tracker/AvailabilityDB/LOCK b/.edge-profile-render-1774484525680/Default/Feature Engagement Tracker/AvailabilityDB/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/Feature Engagement Tracker/AvailabilityDB/LOG b/.edge-profile-render-1774484525680/Default/Feature Engagement Tracker/AvailabilityDB/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/Feature Engagement Tracker/EventDB/LOCK b/.edge-profile-render-1774484525680/Default/Feature Engagement Tracker/EventDB/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/Feature Engagement Tracker/EventDB/LOG b/.edge-profile-render-1774484525680/Default/Feature Engagement Tracker/EventDB/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/GPUCache/data_0 b/.edge-profile-render-1774484525680/Default/GPUCache/data_0 new file mode 100644 index 0000000..d76fb77 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/GPUCache/data_0 differ diff --git a/.edge-profile-render-1774484525680/Default/GPUCache/data_1 b/.edge-profile-render-1774484525680/Default/GPUCache/data_1 new file mode 100644 index 0000000..035d06d Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/GPUCache/data_1 differ diff --git a/.edge-profile-render-1774484525680/Default/GPUCache/data_2 b/.edge-profile-render-1774484525680/Default/GPUCache/data_2 new file mode 100644 index 0000000..c7e2eb9 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/GPUCache/data_2 differ diff --git a/.edge-profile-render-1774484525680/Default/GPUCache/data_3 b/.edge-profile-render-1774484525680/Default/GPUCache/data_3 new file mode 100644 index 0000000..5eec973 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/GPUCache/data_3 differ diff --git a/.edge-profile-render-1774484525680/Default/GPUCache/index b/.edge-profile-render-1774484525680/Default/GPUCache/index new file mode 100644 index 0000000..6b00ba8 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/GPUCache/index differ diff --git a/.edge-profile-render-1774484525680/Default/History b/.edge-profile-render-1774484525680/Default/History new file mode 100644 index 0000000..fa97468 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/History differ diff --git a/.edge-profile-render-1774484525680/Default/History-journal b/.edge-profile-render-1774484525680/Default/History-journal new file mode 100644 index 0000000..9282972 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/History-journal differ diff --git a/.edge-profile-render-1774484525680/Default/HubApps b/.edge-profile-render-1774484525680/Default/HubApps new file mode 100644 index 0000000..99f8e68 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/HubApps @@ -0,0 +1,1948 @@ +{ + "current_locale": "en-US", + "hub_apps": [ { + "auto_open_v2": [ { + "approved_channels": [ "canary" ], + "enabled": false, + "enabled|auth:aad": false, + "enabled|flight:msEdgeHubAppsCopilotAutoOpenOnNtp": true, + "force_auto_open": false, + "id": "e06e75c1-a59a-4ab6-8361-e8b038e00a8c", + "non_visible_user_friendly_name": "Open Copilot on every new tab page", + "settings_toggle": { + "description": "When you open a new tab on Edge, Copilot will also open in the side pane.", + "title": "Open Copilot on every new tab page" + } + }, { + "approved_channels": [ "canary", "dev", "beta", "stable" ], + "enabled": false, + "enabled|auth:aad|flight:msM365LinkInsights": true, + "footer": { + "open_count": 3, + "text": "Understand links faster with email context in Copilot." + }, + "id": "a7c3d8e2-5f19-4b6a-8e91-2c4f7d0a3b5e", + "min_page_width_pixels": 1000, + "non_visible_user_friendly_name": "M365 Links Insights", + "settings_toggle": { + "description": "When a web link is opened from an Outlook email, Copilot side pane will automatically open to show the page insights.", + "title": "Automatically open Copilot chat with contextual insights in the side pane" + }, + "supported_platforms": [ "win", "mac" ] + } ], + "capabilities": { + "deprecated_hide_header": true + }, + "custom_actions": [ { + "action": { + "target": "sidepane", + "type": "url_action" + }, + "icon": { + "builtin_icon": "Reload" + }, + "location": "header_button", + "name": "Reload" + } ], + "default_locale": "en", + "description": "Contextually relevant info for any page", + "icon": { + "raster_icon": { + "dark_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_copilot_rainbow.png/1.3.26/asset", + "high_contrast": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_copilot_hc.png/1.3.26/asset", + "light_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_copilot_rainbow.png/1.3.26/asset" + } + }, + "id": "cd4688a9-e888-48ea-ad81-76193d56b1be", + "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApf0j4GhOqQc886k4RFGJAt75zJgXJwO3kyeFebdCFpuW99J0EJxuYd5k422iWrW0xYN+0/BwdH/Z7+9iDKA3J1wpl5Q9AYv9ztKZD0ti3FftogxhaDckCQzmE5Ja+Dkopx+f4rY1sD/A0QLmsxfJRYYaKsBbUNGHdv4ee96m2/q5y8Bc6Avc3//tLkdmyR3re8YLe1KZKo5GBKqRfw0Wpor+CbrCnko/uGONn7YaV4v8shLuiTUJof6h1Wv0HsW3jLSrOqJ8pdQM9wh/PepetksLptaBE6QSPDJ1b21flecrsmYRJt2HTsfzvjmt27Mi6H5MSC9wKIo85hN93HcwIQIDAQAB", + "lifetime": "background", + "locales": [ "af", "am", "ar", "as", "az", "bg", "bn_IN", "bs", "ca", "ca_Es_VALENCIA", "cs", "cy", "da", "de", "el", "en", "en_GB", "es", "es_MX", "et", "eu", "fa", "fi", "fil", "fil", "fr", "fr_CA", "ga", "gd", "gl", "gu", "he", "hi", "hr", "hu", "hy", "id", "is", "it", "ja", "ka", "kk", "km", "kn", "ko", "kok", "kok", "lb", "lo", "lt", "lv", "mi", "mk", "ml", "mr", "ms", "mt", "nb", "ne", "nl", "nn", "or", "pa", "pl", "pt_BR", "pt_PT", "quz", "ro", "ru", "sk", "sl", "sq", "sr_Cyrl_BA", "sr_Cyrl_RS", "sr_Latn_RS", "sv", "ta", "te", "th", "tr", "tt", "ug", "uk", "ur", "uz", "vi", "zh_CN", "zh_TW" ], + "manifest_version": 3, + "name": "Copilot", + "notifications": { + "enabled": true, + "nudge_triggers": [ { + "configs": { + "cooldown_cap": 86400, + "endpoints": { + "commercial": true, + "consumer": false + }, + "form_code": "CMMZZS81TSY", + "max_nudge_display_count": 10, + "min_sec_between_nudges": 3600, + "nudge_display_basis": "signal", + "prompt": "Summarize this page.", + "signal_name": "IsKnowledgeCardQuery", + "signal_threshold_value": 0.7 + }, + "text": "Summarize", + "type": "triggering_config" + }, { + "configs": { + "cooldown_cap": 86400, + "endpoints": { + "commercial": true, + "consumer": false + }, + "form_code": "CMM5YEJMIQX", + "max_nudge_display_count": 10, + "min_sec_between_nudges": 3600, + "nudge_display_basis": "signal", + "prompt": "Summarize this page.", + "signal_name": "IsTopNewsDomain", + "signal_threshold_value": 0.7 + }, + "text": "Summarize", + "type": "triggering_config" + } ], + "triggers|flight:msOmniboxSummarizeNotification": [ { + "config": { + "min_sec_between_auto_show": 7200, + "show_count_basis": "signal", + "signal_name": "IsTextPage", + "signal_threshold": 0.5 + }, + "location": "omnibox", + "text": "__MSG_summarize_the_text_page_with_copilot_text__", + "type": "triggering_config" + }, { + "config": { + "min_sec_between_auto_show": 7200, + "show_count_basis": "signal", + "signal_name": "IsVideoPage", + "signal_threshold": 0.5 + }, + "location": "omnibox", + "text": "__MSG_summarize_the_video_page_with_copilot_text__", + "type": "triggering_config" + } ], + "triggers|flight:msUndersideGamingNotification": [ { + "config": { + "max_show_count": 3, + "min_sec_between_auto_show": 86400, + "show_count_basis": "signal", + "signal_name": "IsTwitchNonStreamPage", + "signal_threshold": 0.5 + }, + "text": "__MSG_gaming_underside_notification_nonstream_text__", + "type": "triggering_config" + }, { + "config": { + "max_show_count": 3, + "min_sec_between_auto_show": 86400, + "show_count_basis": "signal", + "signal_name": "IsTwitchSubPage", + "signal_threshold": 0.5 + }, + "text": "__MSG_gaming_underside_notification_text__", + "type": "triggering_config" + } ], + "triggers|flight:msUndersideMsnArticleNotification": [ { + "config": { + "max_accept_count": 1, + "max_dismiss_count": 2, + "max_show_count": 3, + "min_sec_between_auto_show": 604800, + "show_count_basis": "signal", + "signal_name": "IsMsnArticleUrlFromNtpP1P2", + "signal_threshold": 0.5 + }, + "text": "__MSG_msn_article_underside_notification_text__", + "type": "triggering_config" + } ] + }, + "on_by_default": true, + "tags": [ "no_auto_cleanup" ], + "target": { + "command": "discover_chat" + }, + "version": "1.3.26" + }, { + "capabilities": { + "deprecated_hide_header": true + }, + "default_locale": "en", + "description": "Search without losing your place", + "icon": { + "raster_icon": { + "dark_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_search_maximal_dark.png/1.3.20/asset", + "high_contrast": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_search_hc.png/1.3.20/asset", + "light_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_search_maximal_light.png/1.3.20/asset" + } + }, + "id": "8ac719c5-140b-4bf2-a0b7-c71617f1f377", + "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAt4hQKaectrxRqrwVypOGrEzwskegvlsFoamNaSDGR8t7k/iuwOjFqeI8nzugCcPgRRRDT3bWJ2YqUeUHxEzQvinK2qpnsXm33wVddnsnj5eH5oI001qTXolK5ia78+Y8bq16GMM4S7jzIJLxKlRwvI7Mus3xt3kcxeQNk0afzHoDB+C8TsqGUWsbG0AzpvMn4BJC1szWHrVHPCx+vEztXAbglgt8g7bqqB5fJ4A50QA3GIbCYv2nnTCyPXOYayRjjRqNj+GuwZFRMvbKzyym2woCIhyJ43wIEUmOX1e+VbLHA5M5O2r9+dypMXif3jJLMC8drisNJuaPVxSAj+qDTwIDAQAB", + "locales": [ "af", "am", "ar", "as", "az", "bg", "bn_IN", "bs", "ca", "ca_Es_VALENCIA", "cs", "cy", "da", "de", "el", "en", "en_GB", "es", "es_MX", "et", "eu", "fa", "fi", "fil", "fil", "fr", "fr_CA", "ga", "gd", "gl", "gu", "he", "hi", "hr", "hu", "hy", "id", "is", "it", "ja", "ka", "kk", "km", "kn", "ko", "kok", "kok", "lb", "lo", "lt", "lv", "mi", "mk", "ml", "mr", "ms", "mt", "nb", "ne", "nl", "nn", "or", "pa", "pl", "pt_BR", "pt_PT", "quz", "ro", "ru", "sk", "sl", "sq", "sr_Cyrl_BA", "sr_Cyrl_RS", "sr_Latn_RS", "sv", "ta", "te", "th", "tr", "tt", "ug", "uk", "ur", "uz", "vi", "zh_CN", "zh_TW" ], + "manifest_version": 3, + "microfeedback": { + "area_path": "Features\\Sidebar\\Search", + "service_id": "c5fa07d0-62e6-46d4-a28a-ba4dcaced54f" + }, + "name": "Search", + "notifications": { + "enabled": true + }, + "on_by_default": true, + "tags": [ "no_auto_cleanup" ], + "target": { + "command": "search" + }, + "version": "1.3.20" + }, { + "capabilities": { + "deprecated_hide_header": true + }, + "default_locale": "en", + "description": "Contextually relevant info for any page", + "icon": { + "raster_icon": { + "dark_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_chatB_active_dark.png/1.6.8/asset", + "high_contrast": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_chatB_hc.png/1.6.8/asset", + "light_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_chatB_active_light.png/1.6.8/asset" + } + }, + "id": "2354565a-f412-4654-b89c-f92eaa9dbd20", + "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAkir9eBusSu3fIWbShjTCGKwVouE42cYbsA86vz0rVOp41mAegrFS8udIYkX9hhtwlRZ+VY3HNX5drrknB188JTpap5fCKuOc1e8GoFXEOXCdb9MHjLwZsFjB6lwQcCMqtBJSQs9zeO3FxyDkoU/KKWLIK4XCG8Mze5pVsGkIeRbjO8IR1/xhAyLbXItjstlbTk1z6kffUkXk47DYVtX8k8K5havcW9itCyRmVSl+yeTyORmiqJ2kafPALff5iHc11xogtv331dv7F2ZUsxcEKo0v3BeZvUnFiRFEh8iizlS3OY1vw9CA1kTFpaMUFKCf2xMbWNraNgAGGi32wApvNQIDAQAB", + "locales": [ "af", "am", "ar", "as", "az", "bg", "bn_IN", "bs", "ca", "ca_Es_VALENCIA", "cs", "cy", "da", "de", "el", "en", "en_GB", "es", "es_MX", "et", "eu", "fa", "fi", "fil", "fil", "fr", "fr_CA", "ga", "gd", "gl", "gu", "he", "hi", "hr", "hu", "hy", "id", "is", "it", "ja", "ka", "kk", "km", "kn", "ko", "kok", "kok", "lb", "lo", "lt", "lv", "mi", "mk", "ml", "mr", "ms", "mt", "nb", "ne", "nl", "nn", "or", "pa", "pl", "pt_BR", "pt_PT", "quz", "ro", "ru", "sk", "sl", "sq", "sr_Cyrl_BA", "sr_Cyrl_RS", "sr_Latn_RS", "sv", "ta", "te", "th", "tr", "tt", "ug", "uk", "ur", "uz", "vi", "zh_CN", "zh_TW" ], + "manifest_version": 3, + "name": "Discover", + "notifications": { + "enabled": true + }, + "on_by_default": true, + "target": { + "command": "discover" + }, + "version": "1.6.8" + }, { + "custom_actions": [ { + "action": { + "target": "sidepane", + "type": "url_action" + }, + "icon": { + "builtin_icon": "Reload" + }, + "location": "header_button", + "name": "Reload" + } ], + "default_locale": "en", + "description": "Your AI-Powered Content Writer", + "flights": [ "msEdgeComposeSidebar" ], + "icon": { + "raster_icon": { + "dark_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_compose_maximal_dark.png/1.0.2/asset", + "high_contrast": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_compose_hc.png/1.0.2/asset", + "light_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_compose_maximal_dark.png/1.0.2/asset" + } + }, + "id": "f40a17d3-0f1b-456e-b6e4-3d17f016a811", + "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtD7GjYVpZiieGjPYHEn7GGoY4vQOGZ16+ClS0AObZkBCO+buuGmzfnUiWyYa+rHrMIkNPsEFydIX68ytNfIDgPmNvwTLbPdKXKvR/fOt2e/HY5ezwhxxDU9wG4wav9NCeDRDqJvw5Wug0ubBlhYq7EAChLjRJRk3kMc15x+5qferxRw0MAbxYBLhhHIFcZPqcSzMsmaLt9WSu/ABUT1XvEa5AG8BXIqHn00Fhj0SESWZLUf+N4PBFCNdKoq8uA4EG9EoK25mozrydXiPuH63rv7888bRrdYmaLwaOqVKfsMeGvzxFUFnuUufLnJSsf8lO7HDE4LophuIjAUcdtY1TwIDAQAB", + "locales": [ "en" ], + "manifest_version": 3, + "name": "Compose", + "notifications": { + "enabled": false + }, + "target": { + "url": "https://edgeservices.bing.com/edgesvc/compose?composedetachedux=1&clientscopes=chat,compose&lightschemeovr=1", + "url|theme:dark": "https://edgeservices.bing.com/edgesvc/compose?composedetachedux=1&clientscopes=chat,compose&darkschemeovr=1" + }, + "version": "1.0.2" + }, { + "capabilities": { + "resize_disabled": true + }, + "custom_actions": [ { + "action": { + "event": "openShoppingHeaderSettings", + "type": "event_action" + }, + "icon": { + "raster_icon": { + "dark_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_settings_dark.png/1.5.7/asset", + "high_contrast": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_settings_hc.png/1.5.7/asset", + "light_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_settings_light.png/1.5.7/asset" + } + }, + "location": "header_context_menu", + "name": "Shopping settings" + } ], + "custom_actions|flight:msEdgeShoppingRefresh": [ { + "action": { + "event": "openShoppingHeaderSettings", + "type": "event_action" + }, + "icon": { + "raster_icon": { + "dark_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_settings_dark.png/1.5.7/asset", + "high_contrast": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_settings_hc.png/1.5.7/asset", + "light_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_settings_light.png/1.5.7/asset" + } + }, + "location": "header_context_menu", + "name": "Shopping settings" + }, { + "action": { + "target": "sidepane", + "type": "url_action" + }, + "icon": { + "builtin_icon": "Reload" + }, + "location": "header_button", + "name": "Refresh" + } ], + "default_locale": "en", + "description": "Coupons, compare savings and save money while you shop", + "disabled": false, + "disabled|flight:msEdgeHubAppDisableShopping": true, + "icon": { + "raster_icon": { + "dark_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_shopping_maximal_dark.png/1.5.7/asset", + "high_contrast": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_shopping_hc.png/1.5.7/asset", + "light_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_shopping_maximal_light.png/1.5.7/asset" + } + }, + "id": "523b5ef3-0b10-4154-8b62-10b2ebd00921", + "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArFrwkQUT/uXs4cLue1wGM6IVLwAHKQTC3dVBqKRRWqYisp9Y4LQvawAWT+rTjoQlWXMmlLW6y+EhyqgXIfI8HQxH0yi4eK9mzOQh1X8qTDhOggE37QdVw4Xx5f5qrqPiGdS538gNT6PtJNg+STB1MjLrfGjd+Sld3FnBhSgGYzP31HpN9WdPcaTuq6Z7bhhWvGyQMDIZPfIgGYnCGrHsNFkbYVNtCLd9e6xPadb2Yt2WFBkA0yFXt6XyQI0zRM8llUYnoFhhAKW30QCGF2rYdrb3hsPBhZ1LFUxGwSUI3HRB9y4CFNKkN84ebft+2YrZoClV3kXjXUPCLRinHxhkjwIDAQAB", + "lifetime": "window", + "locales": [ "af", "am", "ar", "as", "az", "bg", "bn_IN", "bs", "ca", "ca_Es_VALENCIA", "cs", "cy", "da", "de", "el", "en", "en_GB", "es", "es_MX", "et", "eu", "fa", "fi", "fil", "fil", "fr", "fr_CA", "ga", "gd", "gl", "gu", "he", "hi", "hr", "hu", "hy", "id", "is", "it", "ja", "ka", "kk", "km", "kn", "ko", "kok", "kok", "lb", "lo", "lt", "lv", "mi", "mk", "ml", "mr", "ms", "mt", "nb", "ne", "nl", "nn", "or", "pa", "pl", "pt_BR", "pt_PT", "quz", "ro", "ru", "sk", "sl", "sq", "sr_Cyrl_BA", "sr_Cyrl_RS", "sr_Latn_RS", "sv", "ta", "te", "th", "tr", "tt", "ug", "uk", "ur", "uz", "vi", "zh_CN", "zh_TW" ], + "manifest_version": 3, + "microfeedback": { + "area_path": "Shopping", + "service_id": "16236ae0-419b-4e28-b29d-9a69f25d8428" + }, + "name": "Microsoft Shopping", + "notifications": { + "enabled": true + }, + "surfaces": [ "in_browser_sidebar" ], + "surfaces|flight:msEdgeShoppingInEdgeBar": [ "in_browser_sidebar", "standalone_sidebar" ], + "target": { + "url": "edge://shopping" + }, + "version": "1.5.7" + }, { + "capabilities": { + "resize_disabled": true + }, + "custom_actions": [ { + "action": { + "target": "sidepane", + "type": "url_action", + "url": "https://edgeservices.bing.com/edgesvc/toolbox?lightschemeovr=1#settings", + "url|flight:msEdgeHubAppToolsVnext": "https://edgeservices.bing.com/edgesvc/toolbox?lightschemeovr=1#settings", + "url|flight:msEdgeHubAppToolsVnext|theme:dark": "https://edgeservices.bing.com/edgesvc/toolbox?darkschemeovr=1#settings", + "url|theme:dark": "https://edgeservices.bing.com/edgesvc/toolbox?darkschemeovr=1#settings" + }, + "condition": { + "action": "visible", + "type": "regex", + "value": "^https:\\/\\/edgeservices\\.bing\\.com\\/edgesvc\\/toolbox\\?lightschemeovr=1$", + "value|flight:msEdgeHubAppToolsVnext": "^https:\\/\\/edgeservices\\.bing\\.com\\/edgesvc\\/toolbox\\?lightschemeovr=1$", + "value|flight:msEdgeHubAppToolsVnext|theme:dark": "^https:\\/\\/edgeservices\\.bing\\.com\\/edgesvc\\/toolbox\\?darkschemeovr=1$", + "value|theme:dark": "^https:\\/\\/edgeservices\\.bing\\.com\\/edgesvc\\/toolbox\\?darkschemeovr=1$" + }, + "icon": { + "raster_icon": { + "dark_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_settings_dark.png/1.5.18/asset", + "high_contrast": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_settings_hc.png/1.5.18/asset", + "light_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_settings_light.png/1.5.18/asset" + } + }, + "location": "header_button", + "name": "Open Settings" + } ], + "default_locale": "en", + "description": "Easy access to commonly used tools", + "icon": { + "raster_icon": { + "dark_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_toolbox_maximal_dark.png/1.5.18/asset", + "high_contrast": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_toolbox_hc.png/1.5.18/asset", + "light_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_toolbox_maximal_light.png/1.5.18/asset" + } + }, + "id": "0c835d2d-9592-4c7a-8d0a-0e283c9ad3cd", + "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwObPXnwvVIsgkbS1X0HoELYiBj9YIW7EKutbhdvquZGefN+dS+3hK9uBUtnDPFQzfwoFJQFxFMvQLo+7eg0XK+z6Z/pGCQ2t9ytblqOh4burwHqlx+ZY4RvRuJpmm6c28Au8FAvL7oJYFl3eM1zmktdghpri4K7AKy/8icvg7qgI8jteQqVXAkDXWD29hODexg2+7ISmmvj+3OFIHqCX5At0PKYuu4EJSY06QPksOfV3Rpapc4JuN7laggUxhFhCuobg6PmGVs3W06YqmLp8yFJ7aBUoQOFTkJrG8pQ8OMpRbxtsFs6jaTo0drmoSsw5uaKqLqRdVicxFdjnpHp5KwIDAQAB", + "locales": [ "af", "am", "ar", "as", "az", "bg", "bn_IN", "bs", "ca", "ca_Es_VALENCIA", "cs", "cy", "da", "de", "el", "en", "en_GB", "es", "es_MX", "et", "eu", "fa", "fi", "fil", "fil", "fr", "fr_CA", "ga", "gd", "gl", "gu", "he", "hi", "hr", "hu", "hy", "id", "is", "it", "ja", "ka", "kk", "km", "kn", "ko", "kok", "kok", "lb", "lo", "lt", "lv", "mi", "mk", "ml", "mr", "ms", "mt", "nb", "ne", "nl", "nn", "or", "pa", "pl", "pt_BR", "pt_PT", "quz", "ro", "ru", "sk", "sl", "sq", "sr_Cyrl_BA", "sr_Cyrl_RS", "sr_Latn_RS", "sv", "ta", "te", "th", "tr", "tt", "ug", "uk", "ur", "uz", "vi", "zh_CN", "zh_TW" ], + "manifest_version": 3, + "microfeedback": { + "area_path": "Features\\Sidebar\\Tools", + "service_id": "07181d09-bb0c-4be4-a804-9875fb000755" + }, + "name": "Tools", + "target": { + "url": "https://edgeservices.bing.com/edgesvc/toolbox?lightschemeovr=1", + "url|flight:msEdgeHubAppToolsVnext": "https://edgeservices.bing.com/edgesvc/toolbox?lightschemeovr=1", + "url|flight:msEdgeHubAppToolsVnext|theme:dark": "https://edgeservices.bing.com/edgesvc/toolbox?darkschemeovr=1", + "url|theme:dark": "https://edgeservices.bing.com/edgesvc/toolbox?darkschemeovr=1" + }, + "version": "1.5.18" + }, { + "capabilities": { + "resize_disabled": true + }, + "custom_actions": [ { + "action": { + "move": true, + "target": "new_tab", + "type": "url_action" + }, + "condition": { + "action": "hidden", + "type": "string", + "value": "msn.com/widgets" + }, + "icon": { + "builtin_icon": "OpenInNew" + }, + "location": "header_button", + "name": "Open link in new tab" + } ], + "default_locale": "en", + "description": "Play popular games for free", + "disabled|locale:vi": true, + "icon": { + "raster_icon": { + "dark_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_games_maximal_dark.png/1.7.18/asset", + "high_contrast": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_games_hc.png/1.7.18/asset", + "light_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_games_maximal_light.png/1.7.18/asset" + }, + "raster_icon|flight:msEdgeHubAppGamesNewIconCard": { + "dark_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_games_maximal_dark_card.png/1.7.18/asset", + "high_contrast": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_games_hc_card.png/1.7.18/asset", + "light_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_games_maximal_light_card.png/1.7.18/asset" + }, + "raster_icon|flight:msEdgeHubAppGamesNewIconController": { + "dark_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_games_maximal_dark_controller.png/1.7.18/asset", + "high_contrast": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_games_hc_controller.png/1.7.18/asset", + "light_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_games_maximal_light_controller.png/1.7.18/asset" + }, + "raster_icon|flight:msEdgeHubAppGamesNewIconJoystick": { + "dark_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_games_maximal_dark_joystick.png/1.7.18/asset", + "high_contrast": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_games_hc_joystick.png/1.7.18/asset", + "light_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_games_maximal_light_joystick.png/1.7.18/asset" + }, + "raster_icon|flight:msEdgeHubAppGamesNewIconPuzzle": { + "dark_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_games_maximal_dark_puzzle.png/1.7.18/asset", + "high_contrast": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_games_hc_puzzle.png/1.7.18/asset", + "light_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_games_maximal_light_puzzle.png/1.7.18/asset" + } + }, + "id": "96defd79-4015-4a32-bd09-794ff72183ef", + "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyhZ1RwLSI4aEplpF6h28XAlLdOKZTDHs/hZrlCarhgS7Umty+81JzHSae2McS7vrETtULFYVdc0O5qSVOWtqABGMm16voA0OohGM2wuJXMxV4+jIgcUHz5BzGIYTBhQJ6eRFAXVRvG0R/TrG/iiOfwBKH5gbQW/J+ojGcGTBu41uSNThFuynZp9rt73y0llJWRNydgvBYOXnM+XAutaAmxm24VdikFY/57gVBDEb6btHG0icgkSUAcYTVi4vKWHomer76KzXmoJxlYKwZOOFmiAtjzZlN+c6RzE833sGGjFH73pvExJzjEELWGcN+3sSB17PRD8fS53dLni+7UFXkwIDAQAB", + "locales": [ "af", "am", "ar", "as", "az", "bg", "bn_IN", "bs", "ca", "ca_Es_VALENCIA", "cs", "cy", "da", "de", "el", "en", "en_GB", "es", "es_MX", "et", "eu", "fa", "fi", "fil", "fil", "fr", "fr_CA", "ga", "gd", "gl", "gu", "he", "hi", "hr", "hu", "hy", "id", "is", "it", "ja", "ka", "kk", "km", "kn", "ko", "kok", "kok", "lb", "lo", "lt", "lv", "mi", "mk", "ml", "mr", "ms", "mt", "nb", "ne", "nl", "nn", "or", "pa", "pl", "pt_BR", "pt_PT", "quz", "ro", "ru", "sk", "sl", "sq", "sr_Cyrl_BA", "sr_Cyrl_RS", "sr_Latn_RS", "sv", "ta", "te", "th", "tr", "tt", "ug", "uk", "ur", "uz", "zh_CN", "zh_TW" ], + "manifest_version": 3, + "microfeedback": { + "area_path": "Features\\Sidebar\\Gaming", + "service_id": "f31588cc-c9db-465c-9b8b-099b79dd9ac1" + }, + "name": "Games", + "notifications": { + "enabled": true, + "triggers|flight:msHubAppsGamesCNPop|market:CN": [ { + "config": { + "delay_trigger_in_seconds": 300, + "max_show_count": 3, + "min_sec_between_auto_show": 86400, + "show_count_basis": "signal", + "signal_name": "Is1PGameDomain", + "signal_threshold": 0.5 + }, + "text": "__MSG_notification_text_when_hit_domain__", + "type": "triggering_config" + } ], + "triggers|flight:msHubAppsGamesGlobalPop": [ { + "config": { + "delay_trigger_in_seconds": 300, + "max_show_count": 3, + "min_sec_between_auto_show": 86400, + "show_count_basis": "signal", + "signal_name": "Is3PGameDomain", + "signal_threshold": 0.5 + }, + "text": "__MSG_notification_text_when_hit_domain__", + "type": "triggering_config" + } ] + }, + "target": { + "url": "https://www.msn.com/widgets/fullpage/gaming/widget?experiences=CasualGamesHub&sharedHeader=1", + "url|flight:msEdgeHubAppGameSearchEnabled": "https://www.msn.com/widgets/fullpage/gaming/widget?experiences=CasualGamesHub&sharedHeader=1&playInSidebar=1&gameSearchEnabled=1", + "url|flight:msEdgeHubAppGamesNewIconCard": "https://www.msn.com/widgets/fullpage/cgSideBar/widget?experiences=CasualGamesHub&sharedHeader=1&ocid=iconCard", + "url|flight:msEdgeHubAppGamesNewIconController": "https://www.msn.com/widgets/fullpage/cgSideBar/widget?experiences=CasualGamesHub&sharedHeader=1&ocid=iconController", + "url|flight:msEdgeHubAppGamesNewIconExpC": "https://www.msn.com/widgets/fullpage/cgSideBar/widget?experiences=CasualGamesHub&sharedHeader=1&ocid=iconExpC", + "url|flight:msEdgeHubAppGamesNewIconJoystick": "https://www.msn.com/widgets/fullpage/cgSideBar/widget?experiences=CasualGamesHub&sharedHeader=1&ocid=iconJoystick", + "url|flight:msEdgeHubAppGamesNewIconPuzzle": "https://www.msn.com/widgets/fullpage/cgSideBar/widget?experiences=CasualGamesHub&sharedHeader=1&ocid=iconPuzzle", + "url|flight:msEdgeHubAppPlayGamesInSidebar": "https://www.msn.com/widgets/fullpage/gaming/widget?experiences=CasualGamesHub&sharedHeader=1&playInSidebar=1", + "url|flight:msEdgeHubAppUseCGSideBar": "https://www.msn.com/widgets/fullpage/cgSideBar/widget?experiences=CasualGamesHub&sharedHeader=1", + "url|flight:msEdgeHubAppUseCGSideBarPlayGamesInSidebar": "https://www.msn.com/widgets/fullpage/cgSideBar/widget?experiences=CasualGamesHub&sharedHeader=1", + "url|flight:msEdgeHubAppUseCGSideBarWGICard": "https://www.msn.com/widgets/fullpage/cgSideBar/widget?experiences=CasualGamesHub&sharedHeader=1&gameSearchEnabled=1", + "url|flight:msEdgeHubAppUseCGSideBarWGITopGames": "https://www.msn.com/widgets/fullpage/cgSideBar/widget?experiences=CasualGamesHub&sharedHeader=1&item=flights%3Aprg-cg-wgitg", + "url|flight:msEdgeHubAppUseCGSideBarWGITopSearchbar": "https://www.msn.com/widgets/fullpage/cgSideBar/widget?experiences=CasualGamesHub&sharedHeader=1&item=flights%3Aprg-cg-l1wgi", + "url|flight:msEdgeHubAppWGITopGames": "https://www.msn.com/widgets/fullpage/gaming/widget?experiences=CasualGamesHub&sharedHeader=1&item=flights%3Aprg-cg-wgitg", + "url|flight:msEdgeHubAppWGITopGamesAndSearchbar": "https://www.msn.com/widgets/fullpage/gaming/widget?experiences=CasualGamesHub&sharedHeader=1&item=flights%3Aprg-cg-wgitg,prg-cg-l1wgi", + "url|flight:msEdgeHubAppWGITopSearchbar": "https://www.msn.com/widgets/fullpage/gaming/widget?experiences=CasualGamesHub&sharedHeader=1&item=flights%3Aprg-cg-l1wgi", + "url|locale:zh_CN": "https://www.msn.cn/widgets/fullpage/gaming/widget?experiences=CasualGamesHub&sharedHeader=1", + "url|locale:zh_CN|flight:msEdgeHubAppGamesNewIconCard": "https://www.msn.cn/widgets/fullpage/cgSideBar/widget?experiences=CasualGamesHub&sharedHeader=1&ocid=iconCard", + "url|locale:zh_CN|flight:msEdgeHubAppGamesNewIconController": "https://www.msn.cn/widgets/fullpage/cgSideBar/widget?experiences=CasualGamesHub&sharedHeader=1&ocid=iconController", + "url|locale:zh_CN|flight:msEdgeHubAppGamesNewIconExpC": "https://www.msn.cn/widgets/fullpage/cgSideBar/widget?experiences=CasualGamesHub&sharedHeader=1&ocid=iconExpC", + "url|locale:zh_CN|flight:msEdgeHubAppGamesNewIconJoystick": "https://www.msn.cn/widgets/fullpage/cgSideBar/widget?experiences=CasualGamesHub&sharedHeader=1&ocid=iconJoystick", + "url|locale:zh_CN|flight:msEdgeHubAppGamesNewIconPuzzle": "https://www.msn.cn/widgets/fullpage/cgSideBar/widget?experiences=CasualGamesHub&sharedHeader=1&ocid=iconPuzzle", + "url|locale:zh_CN|flight:msEdgeHubAppUseCGSideBar": "https://www.msn.cn/widgets/fullpage/cgSideBar/widget?experiences=CasualGamesHub&sharedHeader=1" + }, + "version": "1.7.18" + }, { + "custom_actions": [ { + "action": { + "target": "new_tab", + "type": "url_action", + "url": "https://word.new?from=EdgeM365Shoreline" + }, + "icon": { + "raster_icon": { + "light_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_word.png/1.7.43/asset" + } + }, + "location": "hovercard", + "name": "Create new document" + }, { + "action": { + "target": "new_tab", + "type": "url_action", + "url": "https://excel.new?from=EdgeM365Shoreline" + }, + "icon": { + "raster_icon": { + "light_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_excel.png/1.7.43/asset" + } + }, + "location": "hovercard", + "name": "Create new workbook" + }, { + "action": { + "target": "new_tab", + "type": "url_action", + "url": "https://powerpoint.new?from=EdgeM365Shoreline" + }, + "icon": { + "raster_icon": { + "light_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_power_point.png/1.7.43/asset" + } + }, + "location": "hovercard", + "name": "Create new presentation" + }, { + "action": { + "target": "sidepane", + "type": "url_action", + "url": "edge://free-office/search?sharedHeader=1" + }, + "icon": { + "builtin_icon": "Search" + }, + "location": "header_button", + "name": "Search" + } ], + "custom_actions|auth:aad|flight:msEdgeSharedLinksHubApp": [ ], + "custom_actions|flight:msEdgeHubAppOfficePlusChina": [ ], + "default_locale": "en", + "description": "Access Microsoft 365 apps for free", + "icon": { + "raster_icon": { + "dark_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_M365_dark.png/1.7.43/asset", + "high_contrast": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_M365_hc.png/1.7.43/asset", + "light_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_M365_light.png/1.7.43/asset" + } + }, + "id": "64be4f9b-3b81-4b6e-b354-0ba00d6ba485", + "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxAd1wVwxRvofGvfNkLNw5uPwUK2+GEM2l046td7lUEX8TN6wvHeiPXgnyILTCa2zpP66VpLkDuu+2NH7Ks8Z7Xzfy7S8dqm6GciANl3bLZn36KOvIS1GWK/yyFxkmsA826soFl+BK8v6s3VQB8zUE+Typ2IZJn3AKAG7+LGVZs932N41BfzZDKFquVKsZElhAeGMtQZl98SgK0mARy4ZpY1ska5QwBACWwsZtjdMSX8goZR3CKUfrG1jinA9dMFS+Xe4xiJBtohYi4l6bDUjshIhc0ugGfU/TEZkP2/vHRKbEGOjI5j8qctRnJnUm4SUQa1EM/zO0l/FwjfX7TyojQIDAQAB", + "locales": [ "af", "am", "ar", "as", "az", "bg", "bn_IN", "bs", "ca", "ca_Es_VALENCIA", "cs", "cy", "da", "de", "el", "en", "en_GB", "es", "es_MX", "et", "eu", "fa", "fi", "fil", "fil", "fr", "fr_CA", "ga", "gd", "gl", "gu", "he", "hi", "hr", "hu", "hy", "id", "is", "it", "ja", "ka", "kk", "km", "kn", "ko", "kok", "kok", "lb", "lo", "lt", "lv", "mi", "mk", "ml", "mr", "ms", "mt", "nb", "ne", "nl", "nn", "or", "pa", "pl", "pt_BR", "pt_PT", "quz", "ro", "ru", "sk", "sl", "sq", "sr_Cyrl_BA", "sr_Cyrl_RS", "sr_Latn_RS", "sv", "ta", "te", "th", "tr", "tt", "ug", "uk", "ur", "uz", "vi", "zh_CN", "zh_TW" ], + "manifest_version": 3, + "microfeedback": { + "area_path": "Features\\Sidebar\\Office", + "service_id": "eb1e5d9e-3046-4858-913b-35ac97c27ffa" + }, + "microfeedback|auth:aad|flight:msEdgeSharedLinksHubApp": { + }, + "name": "Microsoft 365", + "preferred_side_pane_width|flight:msEdgeHubAppOfficeCom": 920, + "preferred_side_pane_width|flight:msEdgeHubAppOfficePlusChina": 885, + "target": { + "url": "edge://free-office/?sharedHeader=1", + "url|auth:aad|flight:msEdgeSharedLinksHubApp": "edge://shared-links", + "url|flight:msEdgeHubAppOfficeCom": "https://www.office.com", + "url|market:CN": "https://www.officeplus.cn/?source=Edgeshoreline&origin=Edgeshoreline&sid=Edgeshoreline" + }, + "version": "1.7.43" + }, { + "auto_open_v2": [ { + "approved_channels": [ "canary", "dev", "beta", "stable" ], + "arbitration_settings": { + "force_auto_open": { + "edge_db_count": 0, + "edge_non_db_count": 4, + "enabled": true + } + }, + "enabled": true, + "fallback_notification": { + "show_count": 5, + "text": "View source email" + }, + "footer": { + "enabled": true, + "open_count": 10, + "text": "See your email side-by-side with the link you opened" + }, + "force_auto_open": true, + "id": "f5b8c725-cb2e-4c12-accd-73e500d88d47", + "lifetime": "tab", + "min_page_width_pixels": 1000, + "non_visible_user_friendly_name": "Win32 Outlook Protocol launch", + "red_dot_notification_data": { + "footer": { + "description": "See your email side-by-side with the link you opened", + "enabled": true + } + }, + "remember_context": { + "time_to_live_sec": 86400 + }, + "settings_toggle": { + "description": "When a web link is opened from an Outlook email, the side pane will automatically open to show that email for context.", + "learn_more_link": "https://go.microsoft.com/fwlink/?linkid=2213996", + "title": "Automatically open Outlook email context in the side pane" + } + } ], + "auto_show": { + "enabled": false, + "fre_notification": { + "enabled": true, + "header": "We opened Outlook to show your email side-by-side with the link you opened", + "show_count": 3, + "text": "We opened Outlook to show your email side-by-side with the link you opened" + }, + "lifetime": "tab", + "remember_context": { + "time_to_live_sec": 86400 + }, + "settings_description": "When a web link is opened from an Outlook email, the side pane will automatically open to show that email for context.", + "settings_learn_more_link": "https://go.microsoft.com/fwlink/?linkid=2213996", + "settings_title": "Automatically open Outlook email context in the side pane" + }, + "capabilities": { + "enable_force_dark_mode": true, + "show_domain_in_header": true + }, + "custom_actions": [ { + "action": { + "target": "sidepane", + "type": "url_action", + "url": "https://outlook.live.com/mail/compose?isExtension=true", + "url|auth:aad": "https://outlook.office.com/mail/compose?isExtension=true" + }, + "icon": { + "builtin_icon": "NewEmail" + }, + "location": "hovercard", + "name": "Compose new email" + }, { + "action": { + "target": "sidepane", + "type": "url_action", + "url": "https://outlook.live.com/calendar/view/agenda/quickcapture/moreDetails?isExtension=true", + "url|auth:aad": "https://outlook.office.com/calendar/view/agenda/quickcapture/moreDetails?isExtension=true" + }, + "icon": { + "builtin_icon": "NewEvent" + }, + "location": "hovercard", + "name": "Create new event" + }, { + "action": { + "target": "sidepane", + "type": "url_action", + "url": "https://outlook.live.com/mail/0/", + "url|auth:aad": "https://outlook.office.com/mail/0/" + }, + "icon": { + "builtin_icon": "Home" + }, + "location": "header_button", + "name": "Home" + } ], + "default_locale": "en", + "description": "Check email while staying in your flow", + "icon": { + "raster_icon": { + "dark_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_outlook_dark.png/1.12.17/asset", + "high_contrast": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_outlook_hc.png/1.12.17/asset", + "light_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_outlook_light.png/1.12.17/asset" + } + }, + "id": "8682d0fa-50b3-4ece-aa5b-e0b33f9919e2", + "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvWf8pSy4uSYA7CQ1otPqKjP/2yignBTL6Du7cCvasVderpQvnNM/X8jhzORTTKlcvA24qPqbDZ/lSHREYK7dJCPS8B82N4XAHMHQELzPx1Dpa2Mvc10vCKgL0sgpIYXuE78HwvP9vpfn8dKwO2WqAXtDvpiWYk/Sn4KqB6iV/Jzi7pXwfd8GxJzSMQ7K7oD5n1z2rqzU5Hllbj4h6oyRBGYgT0doS8cx7pQWawOUdyL4DmBm683Gq1fbD6Ob0fpaUUx5C2QMoJCEvYFLloEwsI5OF/cRSztOYjzNgDUCJnMzLW6b+6ACoPTV/q4wnLwGrqp8TQ4ogbb4RF+Tezz2wwIDAQAB", + "lifetime": "window", + "lifetime|flight:msHubAppOutlookTabLifetime": "tab", + "locales": [ "af", "am", "ar", "as", "az", "bg", "bn_IN", "bs", "ca", "ca_Es_VALENCIA", "cs", "cy", "da", "de", "el", "en", "en_GB", "es", "es_MX", "et", "eu", "fa", "fi", "fil", "fil", "fr", "fr_CA", "ga", "gd", "gl", "gu", "he", "hi", "hr", "hu", "hy", "id", "is", "it", "ja", "ka", "kk", "km", "kn", "ko", "kok", "kok", "lb", "lo", "lt", "lv", "mi", "mk", "ml", "mr", "ms", "mt", "nb", "ne", "nl", "nn", "or", "pa", "pl", "pt_BR", "pt_PT", "quz", "ro", "ru", "sk", "sl", "sq", "sr_Cyrl_BA", "sr_Cyrl_RS", "sr_Latn_RS", "sv", "ta", "te", "th", "tr", "tt", "ug", "uk", "ur", "uz", "vi", "zh_CN", "zh_TW" ], + "manifest_version": 3, + "microfeedback": { + "area_path": "Features\\Sidebar\\Outlook", + "service_id": "39f2d170-852b-4e8b-aa58-04e34218acef" + }, + "name": "Outlook", + "notifications": { + "enabled": true, + "title_change_clear_pattern": ".*clear-red-dot.*" + }, + "remember_last_path": true, + "target": { + "url": "https://outlook.live.com/mail/inbox?isExtension=true&sharedHeader=1&nlp=1&client_flight=outlookedge", + "url|auth:aad": "https://outlook.office.com/mail/inbox?isExtension=true&sharedHeader=1&client_flight=outlookedge" + }, + "trusted_domains": [ "live.com", "office.com", "microsoftonline.com", "microsoft.com", "office365.com" ], + "trusted_types": [ "default", "dompurify" ], + "version": "1.12.17" + }, { + "capabilities|flight:msDesignerSinglePrompt": { + "enable_force_dark_mode": true + }, + "default_locale": "en", + "description": "Empower people to express themselves creatively", + "description|flight:msDesignerSinglePrompt": "Create engaging visuals with ease", + "device_emulation": "mobile", + "disabled|device:managed": true, + "icon": { + "raster_icon": { + "dark_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_ImageCreator_DarkMode.png/1.0.25/asset", + "high_contrast": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_ImageCreator_HighContrast.png/1.0.25/asset", + "light_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_ImageCreator_LightMode.png/1.0.25/asset" + } + }, + "id": "2caf0cf4-ea42-4083-b928-29b39da1182b", + "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAju1cpOiJGRRD8vo1C3uJF4+a2yG916AybO9KMjXs8cHf13sauoXVVh2W21bO1rMhB185eo8PkFBqk6s7TZ4idCHbShdvPUKuzVKNTAbDpg11w8QqZ338q2Dc+ddvhSOj7Y6vgDIKHE92XgfhB63Sw2EjNYMHdBVz03ZKZrmDti11cCegzdNchR41K3b3hiNsQXUV/SwHF6gv6QGZWt80OkUaXDlPt5LmMc/fwW+ib2O13MMhE3uKQtn2XMZEcnkWpdt9XKfVf8jqUdQLiBEByo0xCL5K0Qv/P966OiHxE7lkCgThfOOqY3Q3rEH9V+harnMEhQvQJ/z/G+ebfvHI2QIDAQAB", + "locales": [ "en" ], + "manifest_version": 3, + "market_constraints": { + "markets": [ "CN", "RU" ], + "type": "disable" + }, + "market_constraints|flight:msDesignerSinglePrompt": { + "markets": [ "AU", "IN", "NZ", "SA", "US" ], + "type": "enable" + }, + "microfeedback": { + "area_path": "Features\\Sidebar\\Image Creator", + "service_id": "e90c3ebe-36d8-4d05-9689-564773d48f49" + }, + "name": "Bing Image Creator", + "name|flight:msDesignerSinglePrompt": "Designer (Preview)", + "notifications": { + "enabled": false + }, + "target": { + "url": "https://www.bing.com/images/create?FORM=ESHBIC&edgehub=1&lightschemeovr=1&partner=edgehub", + "url|flight:msDesignerSinglePrompt": "edge://designer/", + "url|theme:dark": "https://www.bing.com/images/create?FORM=ESHBIC&edgehub=1&darkschemeovr=1&partner=edgehub" + }, + "version": "1.0.25" + }, { + "capabilities": { + "deprecated_hide_header": false + }, + "custom_actions": [ { + "action": { + "event": "nav_header_nav_to_settings", + "type": "event_action" + }, + "icon": { + "raster_icon": { + "dark_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_settings_dark.png/1.1.18/asset", + "high_contrast": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_settings_hc.png/1.1.18/asset", + "light_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_settings_light.png/1.1.18/asset" + } + }, + "icon|flight:msEdgeEDropSharedHeaderVectorIcon": { + "builtin_icon": "Settings" + }, + "location": "header_context_menu", + "name": "Drop settings" + }, { + "action": { + "event": "action_refresh_sync", + "type": "event_action" + }, + "icon": { + "builtin_icon": "Reload" + }, + "location": "header_button", + "name": "Refresh" + } ], + "default_locale": "en", + "description": "Send files across your mobile and desktop devices", + "disabled|device:xbox": true, + "icon": { + "raster_icon": { + "dark_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_edrop_maximal_dark.png/1.1.18/asset", + "high_contrast": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_edrop_hc.png/1.1.18/asset", + "light_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_edrop_maximal_light.png/1.1.18/asset" + } + }, + "id": "92f1b743-e26b-433b-a1ec-912d1f0ad1fa", + "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA9BhGcpOnNnAz2Uq1+G168ATHAwW/+lmtwhoktOmZQmB0xmQu6glBP9iSqW8wuy7+qpB7ekGtN3BylvAyFjAKvfd9OJhG2mw7uzAiti7fJssSwmNB1o8yfy6A5cqFDYyf4wjp0Uw66ye8V85Y26efYnERWYZzExPRy0wWfjwqfCgcskDwFIv7w6UYoA3UKh79OsBNDUyVAEcs81FaFp0QB3P96uHmhBAuwsm4XsWnejWC40JgcFtd/+ugcnI8ZiXiEhlX6QQeOLUQxD/0yoqQuh3u1olSTXFRuBsvyQQCImYOPRV6l50uC33T2qQz8f+UbswaJ/7WVyVKBRwZ8vQBgQIDAQAB", + "locales": [ "af", "am", "ar", "as", "az", "bg", "bn_IN", "bs", "ca", "ca_Es_VALENCIA", "cs", "cy", "da", "de", "el", "en", "en_GB", "es", "es_MX", "et", "eu", "fa", "fi", "fil", "fr", "fr_CA", "ga", "gd", "gl", "gu", "he", "hi", "hr", "hu", "hy", "id", "is", "it", "ja", "ka", "kk", "km", "kn", "ko", "kok", "lb", "lo", "lt", "lv", "mi", "mk", "ml", "mr", "ms", "mt", "nb", "ne", "nl", "nn", "or", "pa", "pl", "pt_BR", "pt_PT", "quz", "ro", "ru", "sk", "sl", "sq", "sr_Cyrl_BA", "sr_Cyrl_RS", "sr_Latn_RS", "sv", "ta", "te", "th", "tr", "tt", "ug", "uk", "ur", "uz", "vi", "zh_CN", "zh_TW" ], + "manifest_version": 3, + "microfeedback": { + "area_path": "Features\\Sidebar\\Drop", + "service_id": "950b08f1-dea2-4696-b651-524063b56d8a" + }, + "name": "Drop", + "notifications": { + "enabled": true + }, + "target": { + "url": "edge://e-drop/?shared_header=1" + }, + "version": "1.1.18" + }, { + "capabilities": { + "resize_disabled": true + }, + "default_locale": "en", + "description": "Plant trees to protect our earth together", + "disabled": true, + "flights": [ ], + "icon": { + "raster_icon": { + "dark_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_etree_maximal_dark.png/1.2.3/asset", + "high_contrast": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_etree_hc.png/1.2.3/asset", + "light_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_etree_maximal_light.png/1.2.3/asset" + } + }, + "id": "9ce3c9c2-462f-4cc9-bbd7-57d656445be0", + "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAryTOjscde75K7N5RfwNOpVRktOARktkmV2vyls5g2rOEQXUHQu0qhbfu8KhM3VNZS2qiTEhFtx3KNP8qX5aXjiuPIopsfiKaDo7Dli8gIN0KUkAStl9orm7LZfGx9B1Sj5uMPJq68KZ+zGci/YGDoXo8Pwp4t0mXtFVNy0gJEcYFFYf1EC3uIVKCukoohBQ96vsMf5zel4x0J6gLXm/Y4kDHZEH+LPW2xSVcZpnK1i91oYmk3NblJLYJviTMXQl5HSNffD3GHNkEdWneBqI48pyFdXSusG0fx6hamk2pv1CDyMlICxYaoVI1Uoma6I+uuKHv0yYtfB42ZKeMu9CcxQIDAQAB", + "locales": [ "af", "am", "ar", "as", "az", "bg", "bn_IN", "bs", "ca", "ca_Es_VALENCIA", "cs", "cy", "da", "de", "el", "en", "en_GB", "es", "es_MX", "et", "eu", "fa", "fi", "fil", "fr", "fr_CA", "ga", "gd", "gl", "gu", "he", "hi", "hr", "hu", "hy", "id", "is", "it", "ja", "ka", "kk", "km", "kn", "ko", "kok", "lb", "lo", "lt", "lv", "mi", "mk", "ml", "mr", "ms", "mt", "nb", "ne", "nl", "nn", "or", "pa", "pl", "pt_BR", "pt_PT", "quz", "ro", "ru", "sk", "sl", "sq", "sr_Cyrl_BA", "sr_Cyrl_RS", "sr_Latn_RS", "sv", "ta", "te", "th", "tr", "tt", "ug", "uk", "ur", "uz", "vi", "zh_CN", "zh_TW" ], + "manifest_version": 3, + "name": "E-tree", + "notifications": { + "awareness_prompts": { + "bubble_notifications": { + "domains": [ "scorecard.org", "greenpeace.org", "sierraclub.org", "enn.com", "edf.org", "panda.org", "climateark.org", "unep.org", "conservation.org", "audubon.org", "earthday.net", "nature.org", "1800cleanup.org", "foe.org", "cleanup.com.au", "earthtimes.org", "ase.org", "nwf.org", "nature.com", "ucsusa.org", "amrivers.org", "epa.gov", "ran.org", "oneworld.net", "auduboninstitute.org", "earthvision.net", "earthwatch.org", "worldwatch.org", "crest.org", "ecologyfund.com", "therainforestsite.com", "climate.org", "treehugger.com", "saveourenvironment.org", "whitehouse.gov", "uli.org", "wcs.org", "rff.org", "wilderness.org", "ens-newswire.com", "earthsite.org", "sustainable.org", "wwfcanada.org", "weathervane.rff.org", "bbc.co.uksn", "faircompanies.com", "afdc.doe.gov", "earthcharter.org", "crest.orggem.html", "earthtrends.wri.org", "carfree.com", "awea.org", "envirosense.org", "cousteau.org", "davidsuzuki.org", "rainforestweb.org", "emagazine.com", "iucn.orgthemeslaw", "cnie.org", "amazonwatch.org", "fws.gov", "ata.org.au", "recycle.netrecycle", "eerc.und.nodak.edu", "recycle.com", "globalforestwatch.org", "nrdc.org.", "panda.org", "ccap.org", "ecoworld.com", "carnivorousplants.org", "envsc.org", "epa.gov", "ases.org", "noaa.gov", "ctic.purdue.edu", "cei.org", "ourplanet.com", "geocities.com", "ecowise.com", "ramsar.org", "sbeap.org", "wmo.ch", "ecobeetle.com", "cserc.org", "wetland.org", "earthhopenetwork.net", "savetherainforest.org", "wetlands.com", "karmavision.tv", "wildernesscommittee.org", "farmlandinfo.org", "scientific-alliance.com", "elpnet.org" ], + "text": "Get your free seed" + } + }, + "enabled": true + }, + "surfaces": [ "in_browser_sidebar" ], + "target": { + "url": "edge://etree/?sharedHeader=1" + }, + "version": "1.2.3" + }, { + "capabilities": { + "show_domain_in_header": true + }, + "default_locale": "en", + "description": "Take notes as you browse the web", + "icon": { + "raster_icon": { + "dark_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_onenote_dark.png/1.4.13/asset", + "high_contrast": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_onenote_hc.png/1.4.13/asset", + "light_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_onenote_light.png/1.4.13/asset" + } + }, + "id": "7b52ae05-ae84-4165-b083-98ba2031bc22", + "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzWyf6Wmn7Q9fEybaviyEhPJEAXSDsEjvVMs072jPC8+lF6uWJYOtB5rBujENF8fUpN7jloiZ9mpjeIpIYR7euf5zT/2wskXpVextOPp07DDXCAQNArY1NNZoRNMSLav09MMP2nbA02CZFe705DlZqi+PE7TmqDa80FCXO6rJVVD6sjxGSwWitQ8y5mRXl/HKtBfDpozQ3nNwk9dGkrYV2AJUItcx1lCEqPKBxfztK1Ba/buhWgjhUxMQcUBkmR2ItvfK80M24AKBd0g0Zc6NJZAvsIBWFEgkUhMFktpaS2e42v7TsL8RjrjNeCH3u+WBZuonmX0JHHOMww+5eLfUDQIDAQAB", + "locales": [ "af", "am", "ar", "as", "az", "bg", "bn_IN", "bs", "ca", "ca_Es_VALENCIA", "cs", "cy", "da", "de", "el", "en", "en_GB", "es", "es_MX", "et", "eu", "fa", "fi", "fil", "fil", "fr", "fr_CA", "ga", "gd", "gl", "gu", "he", "hi", "hr", "hu", "hy", "id", "is", "it", "ja", "ka", "kk", "km", "kn", "ko", "kok", "kok", "lb", "lo", "lt", "lv", "mi", "mk", "ml", "mr", "ms", "mt", "nb", "ne", "nl", "nn", "or", "pa", "pl", "pt_BR", "pt_PT", "quz", "ro", "ru", "sk", "sl", "sq", "sr_Cyrl_BA", "sr_Cyrl_RS", "sr_Latn_RS", "sv", "ta", "te", "th", "tr", "tt", "ug", "uk", "ur", "uz", "vi", "zh_CN", "zh_TW" ], + "manifest_version": 3, + "microfeedback": { + "area_path": "Features\\Sidebar\\OneNote", + "service_id": "c32581fb-3108-4833-88dc-b4ef6bbb805e" + }, + "name": "OneNote Feed", + "target": { + "url": "https://www.onenote.com/stickynotes?isEdgeHub=true", + "url|auth:aad": "https://www.onenote.com/stickynotes?isEdgeHub=true&auth=2", + "url|auth:aad|flight:msEdgeHubAppOneNoteInStaging": "https://www.onenote.com/stickynotesstaging?isEdgeHub=true&auth=2", + "url|auth:msa": "https://www.onenote.com/stickynotes?isEdgeHub=true&auth=1", + "url|auth:msa|flight:msEdgeHubAppOneNoteInStaging": "https://www.onenote.com/stickynotesstaging?isEdgeHub=true&auth=1", + "url|flight:msEdgeHubAppOneNoteInStaging": "https://www.onenote.com/stickynotesstaging?isEdgeHub=true" + }, + "version": "1.4.13" + }, { + "capabilities": { + "enable_force_dark_mode": true + }, + "default_locale": "en", + "description": "Create engaging visuals with ease", + "disabled": true, + "icon": { + "raster_icon": { + "dark_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_designer_color.png/1.0.27/asset", + "high_contrast": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_designer_hc.png/1.0.27/asset", + "light_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_designer_color.png/1.0.27/asset" + } + }, + "id": "2cb2db96-3bd0-403e-abe2-9269b3761041", + "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0H+KONj7Nio21XgjnUEbW6B56uz80HhbyIjp6oJEfjJphN+EMugW3rAoO3IDzdBvlsQuJid8TPqM/VlUz76np7R50/ydvgc+4NyOrEsc7pfvTASM1x0tFwSRpk2H+AnC3rINjE7+zIfOkwM/Cm/Zq2VCfYf40+/v3ckDLzLbBVeFhOjik3gf+GITJFm1diCj5hRnYrVniUgvK9yAtOPKcdChT/AQ+L4EVm9zF23ciKmfZb4jqPi2qvirnzKoJgDdfZvz/py9g6Mx+HCpqRbEzMzXUzjRXY1/46VXwXMdwap6J+Wwkjh66Tt3yKAE7MTH0Nz9nFck+MtN9IlJdkaMDwIDAQAB", + "locales": [ "en" ], + "manifest_version": 3, + "market_constraints": { + "markets": [ "AU", "IN", "NZ", "SA", "US" ], + "type": "enable" + }, + "name": "Designer (Preview)", + "notifications": { + "enabled": true + }, + "surfaces": [ "in_browser_sidebar" ], + "target": { + "url": "edge://designer/" + }, + "version": "1.0.27" + }, { + "capabilities": { + "show_domain_in_header": true + }, + "custom_actions": [ { + "action": { + "target": "new_tab", + "type": "url_action" + }, + "icon": { + "builtin_icon": "OpenInNew" + }, + "location": "header_button", + "name": "Open link in new tab" + } ], + "default_locale": "en", + "description": "Listen to music on Apple Music!", + "device_emulation": "touch", + "icon": { + "raster_icon": { + "light_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_apple_music.png/1.4.12/asset" + } + }, + "id": "d3ff4c56-a2b8-4673-ad13-35e7706cc9d1", + "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtugaIS/I5bk+GWrp2aCLbT/Oiw4aK3lhpkrN8xaal96N4WqQnswzn0S0jNr+K1fIARoFMU/LvipouZIPaSrkKETqvh4+3lGvhCxPWj/xm9m7rSLqHP57p6MLxJOzH0k4mpua1Y8YYPAYs5MvNP3qlHO1EsxIX4DcdYqBWfXV2eL990HMZ1zuDaK34h54HbI3K2DYtDK5BnSoX6qQ1VI43ThNFsLtYnhLzVKimMNWE+3CLvC3iWRAiKZ51cVX7kBMh55fBtGyxsI+LSyxUPn0BjW8zzjl03hQS0k3ebM3rZ4GDH4VTYvlCVLuiGW00xKe8D0umEKPnImHjHzPbdWGOwIDAQAB", + "lifetime": "background", + "locales": [ "af", "am", "ar", "as", "az", "bg", "bn_IN", "bs", "ca", "ca_Es_VALENCIA", "cs", "cy", "da", "de", "el", "en", "en_GB", "es", "es_MX", "et", "eu", "fa", "fi", "fil", "fil", "fr", "fr_CA", "ga", "gd", "gl", "gu", "he", "hi", "hr", "hu", "hy", "id", "is", "it", "ja", "ka", "kk", "km", "kn", "ko", "kok", "kok", "lb", "lo", "lt", "lv", "mi", "mk", "ml", "mr", "ms", "mt", "nb", "ne", "nl", "nn", "or", "pa", "pl", "pt_BR", "pt_PT", "quz", "ro", "ru", "sk", "sl", "sq", "sr_Cyrl_BA", "sr_Cyrl_RS", "sr_Latn_RS", "sv", "ta", "te", "th", "tr", "tt", "ug", "uk", "ur", "uz", "vi", "zh_CN", "zh_TW" ], + "manifest_version": 3, + "name": "Apple Music", + "notifications": { + "enabled": true + }, + "preferred_side_pane_width": 450, + "tags": [ "third_party" ], + "target": { + "url": "https://music.apple.com" + }, + "version": "1.4.12" + }, { + "capabilities": { + "show_domain_in_header": true + }, + "custom_actions": [ { + "action": { + "target": "new_tab", + "type": "url_action" + }, + "icon": { + "builtin_icon": "OpenInNew" + }, + "location": "header_button", + "name": "Open link in new tab" + } ], + "default_locale": "en", + "description": "Listen to music on Spotify!", + "icon": { + "raster_icon": { + "light_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_spotify.png/1.4.14/asset" + } + }, + "id": "e6723537-66ff-4f4e-ab56-a4cbaddf4e0f", + "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtXBqsDl9/joxKGtu1th+gU9jUKzP17iaFI9xeFSVcivcwPhIGVAv2BkQwidKdNMnbtKn8QLvcnp7RqhVpPtr+GgtSaZh/RGTvkqzvYBeIzISLPZ1mmePjMie0DWm4Hw94/0fCQZ7ABK/F5cjdyg5sQz8E01jGZLBTuMAKWRzQoFnSLFu54qFSDHtYNwW9iwwGe6xHecA9XP85WExA30wl9ZV9u0OVbvXncqoKihoc/bqYrghTPiGqQVaO/Xey3UKlB02Pm8Ls7nDaQ+4CedCeDEmAIHKCoiXoEmCeXMbGToVIPzebnepGqexg0tQRDdk5rbaf2/pBpQMa0leOIfF0wIDAQAB", + "lifetime": "background", + "locales": [ "af", "am", "ar", "as", "az", "bg", "bn_IN", "bs", "ca", "ca_Es_VALENCIA", "cs", "cy", "da", "de", "el", "en", "en_GB", "es", "es_MX", "et", "eu", "fa", "fi", "fil", "fil", "fr", "fr_CA", "ga", "gd", "gl", "gu", "he", "hi", "hr", "hu", "hy", "id", "is", "it", "ja", "ka", "kk", "km", "kn", "ko", "kok", "kok", "lb", "lo", "lt", "lv", "mi", "mk", "ml", "mr", "ms", "mt", "nb", "ne", "nl", "nn", "or", "pa", "pl", "pt_BR", "pt_PT", "quz", "ro", "ru", "sk", "sl", "sq", "sr_Cyrl_BA", "sr_Cyrl_RS", "sr_Latn_RS", "sv", "ta", "te", "th", "tr", "tt", "ug", "uk", "ur", "uz", "vi", "zh_CN", "zh_TW" ], + "manifest_version": 3, + "name": "Spotify", + "notifications": { + "enabled": true + }, + "preferred_side_pane_width": 800, + "tags": [ "third_party" ], + "target": { + "url": "https://open.spotify.com" + }, + "trusted_domains": [ "accounts.spotify.com" ], + "version": "1.4.14" + }, { + "capabilities": { + "show_domain_in_header": true + }, + "custom_actions": [ { + "action": { + "target": "new_tab", + "type": "url_action" + }, + "icon": { + "builtin_icon": "OpenInNew" + }, + "location": "header_button", + "name": "Open link in new tab" + } ], + "default_locale": "en", + "description": "Listen to music on Amazon Music!", + "icon": { + "raster_icon": { + "light_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_amazon_music_light.png/1.4.13/asset" + } + }, + "id": "380c71d3-10bf-4a5d-9a06-c932e4b7d1d8", + "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxeNPt0/LYjSyfJmP+x9XqD3KNy9LZE014CILYS8WAj3cqj65h7g+HFNiQ5dM1VvBAC/B8Zs8IHiv8rfpH1uMyikAFji1phHKtkTYClb7yvuyYEzO2t46TkpzD4R2nQTgmvMo3jVhgB90v3EV9EgydWOJlHc2DSiyFrflilGq2TBGxo6LDwgN+8l8nBTvwsebRbr3C9qLN/yx2Yc87Uba29joTHFRtV3FrmiGou+tvQ539nautxo89qr0C/qlM2NoyHkOWnWQdKexyhxbKanByE67+omcdE6iE5LFWrZfkVDmbdCJziP8AZJJgAVJui1qOFF86h/C/70T4PGB9uYZNQIDAQAB", + "lifetime": "background", + "locales": [ "af", "am", "ar", "as", "az", "bg", "bn_IN", "bs", "ca", "ca_Es_VALENCIA", "cs", "cy", "da", "de", "el", "en", "en_GB", "es", "es_MX", "et", "eu", "fa", "fi", "fil", "fil", "fr", "fr_CA", "ga", "gd", "gl", "gu", "he", "hi", "hr", "hu", "hy", "id", "is", "it", "ja", "ka", "kk", "km", "kn", "ko", "kok", "kok", "lb", "lo", "lt", "lv", "mi", "mk", "ml", "mr", "ms", "mt", "nb", "ne", "nl", "nn", "or", "pa", "pl", "pt_BR", "pt_PT", "quz", "ro", "ru", "sk", "sl", "sq", "sr_Cyrl_BA", "sr_Cyrl_RS", "sr_Latn_RS", "sv", "ta", "te", "th", "tr", "tt", "ug", "uk", "ur", "uz", "vi", "zh_CN", "zh_TW" ], + "manifest_version": 3, + "name": "Amazon Music", + "notifications": { + "enabled": true + }, + "preferred_side_pane_width": 520, + "tags": [ "third_party" ], + "target": { + "url": "https://music.amazon.com" + }, + "version": "1.4.13" + }, { + "capabilities": { + "show_domain_in_header": true + }, + "custom_actions": [ { + "action": { + "target": "new_tab", + "type": "url_action" + }, + "icon": { + "builtin_icon": "OpenInNew" + }, + "location": "header_button", + "name": "Open link in new tab" + } ], + "default_locale": "en", + "description": " Listen to music on Yandex Music!", + "icon": { + "raster_icon": { + "light_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_yandex_music.png/1.0.10/asset" + } + }, + "id": "c814ae4d-fa0a-4280-a444-cb8bd264828b", + "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuk5dl2sFMKi6Wjyhr+7wflrpdgUpiSKzN5EqFw790fCNieUgoFvl7J2pCyrRJ9/43U/eIYuGPxA2oJcpS4fOMCQHPu/OVIGjEGMp5dxLJJYgF1zyjeYkYOvKGw71cn66NpXOwTV0qI3wrNqUKw6fmYl6SbwMymN3FD4AcXtlLpFAuFU9NPMx7SGER8Akn34XXgyLkSHm0JLPT1HoMlZ0m9iSvQFpYDXvVpo0w86FUylslwj1p1SosGx06LX2kk+Pixb6+j56B9MLh1trMQGAXAT+777pYETzIMkLweXdtrPxMMjV92BeeCYTLHPc8gk/MRwKI9hzsT6L32NHtP5/LQIDAQAB", + "lifetime": "background", + "locales": [ "en" ], + "manifest_version": 3, + "name": "Yandex Music", + "notifications": { + "enabled": true + }, + "preferred_side_pane_width": 500, + "tags": [ "third_party" ], + "target": { + "url": "https://music.yandex.com" + }, + "version": "1.0.10" + }, { + "custom_actions": [ { + "action": { + "target": "new_tab", + "type": "url_action" + }, + "icon": { + "builtin_icon": "OpenInNew" + }, + "location": "header_button", + "name": "Open link in new tab" + } ], + "default_locale": "en", + "description": " Listen to music on Sound Cloud!", + "disabled": true, + "disabled|flight:msEdgeHubAppMusicSoundCloudGlobal": false, + "disabled|locale:en": false, + "icon": { + "raster_icon": { + "light_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_sound_cloud.png/1.0.3/asset" + } + }, + "id": "35a43603-bb38-4b53-ba20-932cb9117794", + "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxJeFE+ebDJXFBpUoqiLFBxb2mYDaNhdIY/LoGDerY0+RD40ytGhAHrSVjnOdNZusDJdREtJYEW7R2LIziLLvgT30eWugemRV7SMcmjXnyccciwAFAFPYwZVJL6HsA1+aYMgLjjhy5AmSTcFpHEX1bg7Jsu3ggyWX1b/jRqCMJVpg5ubfiKI8OPLbPn2ORCfi0O+zo/YFzVFLd58nFvgzB/lxrQ/ClL85OXggmXOh05nwjxOIx1K3Bj7968hG7WZyv7ljPfuZXyiFV6j9n/4WGQmOiKQiP2O9HivOkwBFQTmC2PaiwurxO6CelsfFzLOVXuwiegqZs36ytiBf8HVGtwIDAQAB", + "lifetime": "background", + "locales": [ "en" ], + "manifest_version": 3, + "name": "Sound Cloud", + "tags": [ "third_party" ], + "target": { + "url": "https://m.soundcloud.com/" + }, + "version": "1.0.3" + }, { + "capabilities": { + "show_domain_in_header": true + }, + "custom_actions": [ { + "action": { + "target": "new_tab", + "type": "url_action" + }, + "icon": { + "builtin_icon": "OpenInNew" + }, + "location": "header_button", + "name": "Open link in new tab" + } ], + "default_locale": "en", + "description": "Chat with people via Messenger", + "icon": { + "raster_icon": { + "light_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_facebook_messenger.png/1.5.15/asset" + } + }, + "id": "1ec8a5a9-971c-4c82-a104-5e1a259456b8", + "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4G0sdhopAGKeOHvc5Zvx14M7naK9O0qqyzJGGFq40V/tcjZi6AO3Aqma47cWX7IxaljJfAQgwc1Y5L9CjuLFGypdAa6gK0MI2MyImJ5kF7yXB4qcxicUCdlLmfm5OTaJa04pnZ6QvlSaCXmkOAUHaU4GGU3aOR19m9O2gp4SomAo5T8NHz+8AJ1AV/6yv997jjQfNQ1j0vLVm0Au6N46DDpqgFkF7uyHtlffS1x5G6WS5awzcHdXDnt6DMpH8n0pGAvh5/H3N3tbiMAu+EE2N8lFW7GHfybpMCG+RvXv1+UqgN5Uvup/OXFmky1cIX3AlMFEsYNuQZXM7T4AChXnmQIDAQAB", + "lifetime": "background", + "locales": [ "af", "am", "ar", "as", "az", "bg", "bn_IN", "bs", "ca", "ca_Es_VALENCIA", "cs", "cy", "da", "de", "el", "en", "en_GB", "es", "es_MX", "et", "eu", "fa", "fi", "fil", "fil", "fr", "fr_CA", "ga", "gd", "gl", "gu", "he", "hi", "hr", "hu", "hy", "id", "is", "it", "ja", "ka", "kk", "km", "kn", "ko", "kok", "kok", "lb", "lo", "lt", "lv", "mi", "mk", "ml", "mr", "ms", "mt", "nb", "ne", "nl", "nn", "or", "pa", "pl", "pt_BR", "pt_PT", "quz", "ro", "ru", "sk", "sl", "sq", "sr_Cyrl_BA", "sr_Cyrl_RS", "sr_Latn_RS", "sv", "ta", "te", "th", "tr", "tt", "ug", "uk", "ur", "uz", "vi", "zh_CN", "zh_TW" ], + "manifest_version": 3, + "name": "Messenger", + "notifications": { + "enabled": true, + "title_change_pattern": ".*messaged.*" + }, + "preferred_side_pane_width": 901, + "tags": [ "third_party" ], + "target": { + "url": "https://www.messenger.com" + }, + "version": "1.5.15", + "web_app_manifest_declared": true + }, { + "capabilities": { + "show_domain_in_header": true + }, + "custom_actions": [ { + "action": { + "target": "new_tab", + "type": "url_action" + }, + "icon": { + "builtin_icon": "OpenInNew" + }, + "location": "header_button", + "name": "Open link in new tab" + } ], + "default_locale": "en", + "description": "Chat with people via Instagram", + "icon": { + "raster_icon": { + "light_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_instagram.png/1.4.13/asset" + } + }, + "id": "168a2510-04d5-473e-b6a0-828815a7ca5f", + "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAra4lIU5IyGTfvw4Uh6kE9j8Sp3qlKYmr9fK+XgtPaOouKvn45rIVZ7CTw6yI6p36ZnD+nDqouXP1+7Y1oT8LEuqnFLCF2P7aOjJJqOG9x8GFO9DURL4tpV7OrIM3znbTBnIugSpkf+J4F1OGhK5YqP3SzCVZRf1sUyILpD+SJ75Z59D8grutHVXW5ymdAZCjdN6iYoDDNhiDbcnnalnKE7iaR+SH8fWfGnK8SxlJWCsj2w9FNqCrk1iFPFMMZxEIbbSraV8PquzlHcUhqWaNtBx2/+THuDd7G/ZMd/MxRFEgXpC2UuOHg/g1+jwdPDuuN0bdR3KDMkPep7v7j6iLpwIDAQAB", + "lifetime": "background", + "locales": [ "af", "am", "ar", "as", "az", "bg", "bn_IN", "bs", "ca", "ca_Es_VALENCIA", "cs", "cy", "da", "de", "el", "en", "en_GB", "es", "es_MX", "et", "eu", "fa", "fi", "fil", "fil", "fr", "fr_CA", "ga", "gd", "gl", "gu", "he", "hi", "hr", "hu", "hy", "id", "is", "it", "ja", "ka", "kk", "km", "kn", "ko", "kok", "kok", "lb", "lo", "lt", "lv", "mi", "mk", "ml", "mr", "ms", "mt", "nb", "ne", "nl", "nn", "or", "pa", "pl", "pt_BR", "pt_PT", "quz", "ro", "ru", "sk", "sl", "sq", "sr_Cyrl_BA", "sr_Cyrl_RS", "sr_Latn_RS", "sv", "ta", "te", "th", "tr", "tt", "ug", "uk", "ur", "uz", "vi", "zh_CN", "zh_TW" ], + "manifest_version": 3, + "name": "Instagram", + "notifications": { + "enabled": true + }, + "preferred_side_pane_width": 496, + "tags": [ "third_party" ], + "target": { + "url": "https://www.instagram.com" + }, + "version": "1.4.13", + "web_app_manifest_declared": true + }, { + "custom_actions": [ { + "action": { + "target": "new_tab", + "type": "url_action" + }, + "icon": { + "builtin_icon": "OpenInNew" + }, + "location": "header_button", + "name": "Open link in new tab" + } ], + "default_locale": "en", + "description": " Chat with people via Twitter!", + "disabled": true, + "disabled|flight:msEdgeHubAppTwitterGlobal": false, + "disabled|locale:en": false, + "icon": { + "raster_icon": { + "light_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_twitter_light.png/1.0.9/asset" + } + }, + "id": "06be1ebe-f23a-4bea-ae45-3120ad86cfea", + "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3wBJaDgLH5FSeN5Fws2Qxc375Zhvk1NU2S81AkytKmVWBm1v6vgm1iQ5YdZ4l5VbqiS2uia9tmickbixnZaH7iu62SV/5ybYXi5/WcEq+8i3Ho/Bqt2eUgBMnrfEhmkmhegiqWvSZLKxB0PdPTYog8QQjHPl1kcDCvOj7qGPM1VqMH2LABkeKA8GOe1GrdtlJxB+1sxNDG59QfM9SOiJCqwa8QD2TUu1cV0aIGWq4iLXbNqisHPVn+uEZS3Z7E+i3wYCZc3Q8lKFQBzOsOc6JQRbIsVpoA9Qr30OFETfdDcSDFKBITKQL0idCet7SznFKrR243ukYYhNgWPGLyiXBQIDAQAB", + "lifetime": "background", + "locales": [ "en" ], + "manifest_version": 3, + "name": "Twitter", + "tags": [ "third_party" ], + "target": { + "url": "https://twitter.com/" + }, + "version": "1.0.9" + }, { + "custom_actions": [ { + "action": { + "target": "new_tab", + "type": "url_action" + }, + "icon": { + "builtin_icon": "OpenInNew" + }, + "location": "header_button", + "name": "Open link in new tab" + } ], + "default_locale": "en", + "description": " Chat with people via Telegram!", + "disabled": true, + "disabled|flight:msEdgeHubAppTelegramGlobal": false, + "disabled|locale:en": false, + "icon": { + "raster_icon": { + "light_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_telegram.png/1.0.4/asset" + } + }, + "id": "25fe2d1d-e934-482a-a62f-ea1705db905d", + "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2I2P9IcUhRF7VAMMabL27nP12cxbl/fjzhSp5Quv/cuG/keI5CTpJy9zOyTg4pS/2fPdUMNUgmRpK9PmiyVWbF2FCoBO+VAgxGxzCZ2dplc8ogN13F0r+snlJ8eU/bw5z/PwxDbLYJtP8aKOCJDp5yj1s5hVt59SRHuy61XJwNjP05HaJ6Woi2csQ1VXwgaQafabPvJfgMST6Oa0IACDG5Ve/pmqwMwPX+Oevedsqkn2e0wSXrTv2iXoCM63ckxQaE3WnaDoJp1iTsoz8p8u5D+qnBxBAkXtw1nKjrWiJyv+wsUIhKt9GdVhNvctpVwOZQDbkvQDht4r6ydhEP7EWQIDAQAB", + "lifetime": "background", + "locales": [ "en" ], + "manifest_version": 3, + "name": "Telegram", + "tags": [ "third_party" ], + "target": { + "url": "https://web.telegram.org/" + }, + "version": "1.0.4" + }, { + "custom_actions": [ { + "action": { + "target": "new_tab", + "type": "url_action" + }, + "icon": { + "builtin_icon": "OpenInNew" + }, + "location": "header_button", + "name": "Open link in new tab" + } ], + "default_locale": "en", + "description": " Listen to music on Tidal Music!", + "disabled": true, + "disabled|flight:msEdgeHubAppMusicTidalGlobal": false, + "disabled|locale:en": false, + "icon": { + "raster_icon": { + "light_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_tidal.png/1.0.3/asset" + } + }, + "id": "a1a78183-6db3-4789-9e7c-84d157846d55", + "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0c6HJcgMPVY409ttl3jvBGQXhuXvv/8K+DQSsWEfTmmPmkH/Ggp5fCCu7uiUtAyyd16wFkypFu5j80tWRNQju/K67Mpnb3+20OUV5v3pV+zgRnYTZnPmb8/V3/q5M3DvXGwkILV25HNX7/oJ1BdJCvKXLkQjR/mSolWXwA7DsFIESyIJwTF6LpfW2T6kRYXYke85aKN2g9PH48EjN8R09pjonD6EjGBtFmS+nLWQ6taPp0ldS2mwMO+LvMr15q1oAz9/L8gym4QiHadXQB1j7W28xDqdnWLdlCFZdZReNLeUX9z/AYFs7ORoMnxdfNiIF2Xfc7QYXQ38wl0FKffybQIDAQAB", + "lifetime": "background", + "locales": [ "en" ], + "manifest_version": 3, + "name": "Tidal Music", + "tags": [ "third_party" ], + "target": { + "url": "https://tidal.com/" + }, + "version": "1.0.3" + }, { + "custom_actions": [ { + "action": { + "target": "new_tab", + "type": "url_action" + }, + "icon": { + "builtin_icon": "OpenInNew" + }, + "location": "header_button", + "name": "Open link in new tab" + } ], + "default_locale": "en", + "description": " Listen to music on iHeart Music!", + "disabled": true, + "disabled|flight:msEdgeHubAppMusiciHeartGlobal": false, + "disabled|locale:en": false, + "icon": { + "raster_icon": { + "light_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_iHeart.png/1.0.3/asset" + } + }, + "id": "bacc3c12-ebff-44b4-a0f8-ce8b69c9e047", + "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlY35LoRCEDLFSdj1Z4PNzG3YB5Kq5/wSmWO09bRMwT9ooDrncXMAkhFP4tY9gWCuRIL3YGYTp2ZrMCZAD0HJTeUbSSyS61MrkENaCQjRo1U/mUdAdsD275HDWNkRdUeqvgqTa8HuOnVeWZBkwvxnqL5Xpj/GxXiYf89GQKG2ct1Eci7y6CXyBugGRNKx8oO/vTrH3jw4qO0pOAUfwAXt2CMxzJnnZAg6SoexoFdIrSR047BvTD79+pjLAFiAnUmxrRncn45adX+PbX1R9S+BGohDIYypTFINNoxzR5mlHPbiz+i/3ItWjKAYQrQUzCDt+KBEM+BnhuYOlbK5N0lbnwIDAQAB", + "lifetime": "background", + "locales": [ "en" ], + "manifest_version": 3, + "name": "iHeart Music", + "tags": [ "third_party" ], + "target": { + "url": "https://www.iheart.com/podcast/" + }, + "version": "1.0.3" + }, { + "capabilities": { + "show_domain_in_header": true + }, + "custom_actions": [ { + "action": { + "target": "new_tab", + "type": "url_action" + }, + "icon": { + "builtin_icon": "OpenInNew" + }, + "location": "header_button", + "name": "Open link in new tab" + } ], + "default_locale": "en", + "description": "Chat with people via WhatsApp", + "icon": { + "raster_icon": { + "light_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_whatsapp_light.png/1.4.12/asset" + } + }, + "id": "da15ec1d-543d-41c9-94b8-eb2bd060f2c7", + "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAydwCg/JtNLL61l2xYPE/wcQk1o07+5iFAH/K54Sft6sAh/HWk/eOWVvnaQIooDffytfZJND/xuNm0ZUveUwzdUn5cXb1XGO2KsF2+9DPZklS8wOirjOAG3ANADSLtq6CuaDN5dNdVwvH0uBoKv7hAwjcpeueZ0+yehhojk4dslUgBdwDevGYhiUNROr2QbkG6BPBbkb843tVGr/a+P+j4eaCv1SV+3xTnHTW2m1uu1DGlBiV9SmJGnHsd00sphIp7AjPV8V4NqlJL89y97AJLwOI/jcVO4YaTA1/RZYtRhx7txv5g6odaHfOHIA+o9cr2LkgHR1PuwNrT2EoCrVQdwIDAQAB", + "lifetime": "background", + "locales": [ "af", "am", "ar", "as", "az", "bg", "bn_IN", "bs", "ca", "ca_Es_VALENCIA", "cs", "cy", "da", "de", "el", "en", "en_GB", "es", "es_MX", "et", "eu", "fa", "fi", "fil", "fil", "fr", "fr_CA", "ga", "gd", "gl", "gu", "he", "hi", "hr", "hu", "hy", "id", "is", "it", "ja", "ka", "kk", "km", "kn", "ko", "kok", "kok", "lb", "lo", "lt", "lv", "mi", "mk", "ml", "mr", "ms", "mt", "nb", "ne", "nl", "nn", "or", "pa", "pl", "pt_BR", "pt_PT", "quz", "ro", "ru", "sk", "sl", "sq", "sr_Cyrl_BA", "sr_Cyrl_RS", "sr_Latn_RS", "sv", "ta", "te", "th", "tr", "tt", "ug", "uk", "ur", "uz", "vi", "zh_CN", "zh_TW" ], + "manifest_version": 3, + "name": "WhatsApp", + "notifications": { + "enabled": true, + "title_change_pattern": ".*\\(.*\\).*WhatsApp.*" + }, + "preferred_side_pane_width": 748, + "tags": [ "third_party" ], + "target": { + "url": "https://web.whatsapp.com" + }, + "version": "1.4.12", + "web_app_manifest_declared": true + }, { + "auto_open_v2": [ { + "approved_channels": [ "canary", "dev", "beta", "stable" ], + "arbitration_settings": { + "force_auto_open": { + "edge_db_count": 0, + "edge_non_db_count": 4, + "enabled": true + } + }, + "enabled": true, + "fallback_notification": { + "show_count": 5, + "text": "View your Teams chat" + }, + "footer": { + "enabled": true, + "open_count": 10, + "text": "See your chat side-by-side with the link you opened" + }, + "force_auto_open": true, + "id": "68b8a884-6e08-46e6-8a3b-7e06ffe48ecf", + "lifetime": "tab", + "min_page_width_pixels": 1000, + "non_visible_user_friendly_name": "Win32 Teams Protocol launch", + "red_dot_notification_data": { + "footer": { + "description": "See your chat side-by-side with the link you opened", + "enabled": true + } + }, + "remember_context": { + "time_to_live_sec": 86400 + }, + "settings_toggle": { + "description": "When a web link is opened from a Teams chat, the side pane will show that chat for context.", + "learn_more_link": "https://go.microsoft.com/fwlink/?linkid=2213996", + "title": "Automatically open Teams chat context in the side pane" + }, + "supported_platforms": [ "win", "mac" ] + } ], + "auto_show": { + "enabled": false, + "fre_notification": { + "enabled": true, + "header": "We opened Teams to show your chat side-by-side with the link you opened", + "show_count": 3, + "text": "We opened Teams to show your chat side-by-side with the link you opened" + }, + "lifetime": "tab", + "lifetime|flight:msHubAppTeamsAutoShowWindowLifetime": "window", + "remember_context": { + "time_to_live_sec": 86400 + }, + "settings_description": "When a web link is opened from a Teams chat, the side pane will show that chat for context.", + "settings_learn_more_link": "https://go.microsoft.com/fwlink/?linkid=2213996", + "settings_title": "Automatically open Teams chat context in the side pane" + }, + "capabilities": { + "hide_navigation_buttons": true, + "show_domain_in_header": true + }, + "default_locale": "en", + "description": "Check your chat while staying in the flow", + "disabled": true, + "disabled|auth:aad": false, + "dormancy": { + "allow_sync": false, + "exit_triggers": { + "auto_show": true + }, + "initial_state": true + }, + "icon": { + "raster_icon": { + "dark_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_teams_dark.png/1.5.15/asset", + "high_contrast": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_teams_hc.png/1.5.15/asset", + "light_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_teams_light.png/1.5.15/asset" + } + }, + "id": "bc25fcef-8964-4e72-8287-23e2b496c128", + "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqKrfCDyDGoyRj0dv6BEWos6naCFxUoT9jFM1iKLb89cgtAQ8GI8RPHn96lHBNCwTv9OL9BnltI6i5oPXmzEJKHfdZtjylHSJgZ0O+kkstGbN3KomBxUnZ0/IXAnUywiJ9icJJPD8pYkwbF2e0taqrn+1t6zxKYy4K/KLUbDHdixBelt07pZ0TtAhRlCx/cmO3J8/AAU0izbjRCbTHMWjcbrZYuAW0CDywj/O279lwT1Do1KBbuoLrc844KECs6U0fTmdu7bl4FXbkZvOvx0Z5H/F+AeRQbF6aYJoGibDjkxGTmtg0UIENmxgwkwv5I07Lr2Po3JMai+hGHKYcHU9/wIDAQAB", + "lifetime": "background", + "locales": [ "af", "am", "ar", "as", "az", "bg", "bn_IN", "bs", "ca", "ca_Es_VALENCIA", "cs", "cy", "da", "de", "el", "en", "en_GB", "es", "es_MX", "et", "eu", "fa", "fi", "fil", "fr", "fr_CA", "ga", "gd", "gl", "gu", "he", "hi", "hr", "hu", "hy", "id", "is", "it", "ja", "ka", "kk", "km", "kn", "ko", "kok", "lb", "lo", "lt", "lv", "mi", "mk", "ml", "mr", "ms", "mt", "nb", "ne", "nl", "nn", "or", "pa", "pl", "pt_BR", "pt_PT", "quz", "ro", "ru", "sk", "sl", "sq", "sr_Cyrl_BA", "sr_Cyrl_RS", "sr_Latn_RS", "sv", "ta", "te", "th", "tr", "tt", "ug", "uk", "ur", "uz", "vi", "zh_CN", "zh_TW" ], + "manifest_version": 3, + "microfeedback": { + "area_path": "Features\\Sidebar\\Teams", + "service_id": "ef98a99f-f053-44be-939d-5875c41c09b3" + }, + "name": "Teams", + "notifications": { + "enabled": true + }, + "target": { + "url": "https://teams.microsoft.com/embed-client/chats/list?layout=singlePane&hostCtx=edge" + }, + "version": "1.5.15" + }, { + "capabilities": { + "show_domain_in_header": true + }, + "custom_actions": [ { + "action": { + "target": "new_tab", + "type": "url_action" + }, + "icon": { + "builtin_icon": "OpenInNew" + }, + "location": "header_button", + "name": "Open link in new tab" + } ], + "default_locale": "en", + "description": "Check email while staying in your flow.", + "icon": { + "raster_icon": { + "light_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_gmail.png/1.5.4/asset" + } + }, + "id": "dadd1f1c-380c-4871-9e09-7971b6b15069", + "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAw9d0E4K51jPwfhMySVbCfzD98qO36RipeZr1/gwe4KzzHRNfNda5SBTJjMU/t3+Q6SGvHVCu10fPw6TC8emLP2Tt64W76+YdpJlt7Nn4FXohZX8MhxeyI8Ms6PDpF/6VaRJZKDMxCQ60wjUnX9TP1bCzVwkQMtsDBRJnISpQod38T73O/+h/9g2KVHtj5J5vxr3NNj+P9KXTVCVGC5WCCTKM+3Plu885LAE1dwnG+zwoFK0dMjJeGZwywWB+EJvYoTaNp3dsQas8q1HjN+CcZplK9VuW6vrUOP9C4y+k2GFgPqzQE9snCF4Br/leTeIerv9NBXZMziqBTwURjj57eQIDAQAB", + "locales": [ "af", "am", "ar", "as", "az", "bg", "bn_IN", "bs", "ca", "ca_Es_VALENCIA", "cs", "cy", "da", "de", "el", "en", "en_GB", "es", "es_MX", "et", "eu", "fa", "fi", "fil", "fil", "fr", "fr_CA", "ga", "gd", "gl", "gu", "he", "hi", "hr", "hu", "hy", "id", "is", "it", "ja", "ka", "kk", "km", "kn", "ko", "kok", "kok", "lb", "lo", "lt", "lv", "mi", "mk", "ml", "mr", "ms", "mt", "nb", "ne", "nl", "nn", "or", "pa", "pl", "pt_BR", "pt_PT", "quz", "ro", "ru", "sk", "sl", "sq", "sr_Cyrl_BA", "sr_Cyrl_RS", "sr_Latn_RS", "sv", "ta", "te", "th", "tr", "tt", "ug", "uk", "ur", "uz", "vi", "zh_CN", "zh_TW" ], + "manifest_version": 3, + "name": "Gmail", + "notifications": { + "awareness_prompts": { + "bubble_notifications": { + "domains": [ "gmail.com" ], + "text": "Check your mail while staying in your browser flow" + } + }, + "enabled": true + }, + "tags": [ "third_party" ], + "target": { + "url": "https://mail.google.com/mail/mu/mp/266/#tl/Inbox" + }, + "trusted_domains": [ "accounts.google.com" ], + "version": "1.5.4" + }, { + "capabilities": { + "show_domain_in_header": true + }, + "custom_actions": [ { + "action": { + "target": "new_tab", + "type": "url_action" + }, + "icon": { + "builtin_icon": "OpenInNew" + }, + "location": "header_button", + "name": "Open link in new tab" + } ], + "default_locale": "en", + "description": "Browse videos while staying in your flow.", + "icon": { + "raster_icon": { + "light_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_youtube.png/1.4.14/asset" + } + }, + "id": "76b926d6-3738-46bf-82d7-2ab896ddf70b", + "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsrHqfVhOPmsWgVjiIegleif9CqXx3QBE/ctTbw2HL08qUB0sYn7np7UFroyKPppl2MARALazlRaRLQe6ClOrrxCocEpZV+Xjj1lUL5fi4SWWbs9fpPN65zBuj69yYHQAVEdf2wuzoHNGr1sPVFRWV/6gg04jGbiDk7DtFfyF7i1KnFPIqAB3txVMgxX1pmGmpjkVL0wHe2bKJZGyiMViohWKbinpBr3YVEyJ2LrYt4jeBMTfbXqMKkU8U0Yb8/UfAYnUaJxGy/0unOjlPb0s3sWoauBeBLy4kHLEHjQjtybeEGy5a+IHQizUjKWhf5Y/YSa2RT+1CGjGMCs+faZStQIDAQAB", + "locales": [ "af", "am", "ar", "as", "az", "bg", "bn_IN", "bs", "ca", "ca_Es_VALENCIA", "cs", "cy", "da", "de", "el", "en", "en_GB", "es", "es_MX", "et", "eu", "fa", "fi", "fil", "fil", "fr", "fr_CA", "ga", "gd", "gl", "gu", "he", "hi", "hr", "hu", "hy", "id", "is", "it", "ja", "ka", "kk", "km", "kn", "ko", "kok", "kok", "lb", "lo", "lt", "lv", "mi", "mk", "ml", "mr", "ms", "mt", "nb", "ne", "nl", "nn", "or", "pa", "pl", "pt_BR", "pt_PT", "quz", "ro", "ru", "sk", "sl", "sq", "sr_Cyrl_BA", "sr_Cyrl_RS", "sr_Latn_RS", "sv", "ta", "te", "th", "tr", "tt", "ug", "uk", "ur", "uz", "vi", "zh_CN", "zh_TW" ], + "manifest_version": 3, + "name": "YouTube", + "notifications": { + "enabled": true + }, + "pin_by_default": true, + "preferred_side_pane_width": 480, + "tags": [ "third_party" ], + "target": { + "url": "https://www.youtube.com" + }, + "trusted_domains": [ "accounts.google.com" ], + "version": "1.4.14" + }, { + "default_locale": "en", + "description": "Improve browser performance and save battery", + "flights": [ "msEdgeHubAppPerfCenter" ], + "icon": { + "raster_icon": { + "dark_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_performance_maximal_dark.png/1.1.3/asset", + "high_contrast": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_performance_hc.png/1.1.3/asset", + "light_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_performance_maximal_light.png/1.1.3/asset" + } + }, + "id": "451c5859-4e83-437b-9abd-f88ed97d11cb", + "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0aeqV8xT53eLHoQxKBR4ShUO6QV+U7wVTU/RKFcHXptQwqZP6DpAfcY7nZfReY+Jay11brCDRBRwrmQ9sJpA78ZchWISqSSs/Gx13l7GbpZVtSbtrGHufMlR7sN69u9wtm6LLkWXuDxyZo7cF5EFjHyBP1fAj2PQfYQ8jtVF7fsXMIyeiDBAK/fMrsC6eCbMmfNY6dCkOiJQ8v5otoA3F9q3Uh6QcAz9hkzmqwvBnkeLVYup1GxeAEu5N2F/dLYMIA7Xly9dNgzdCSlf3b4lSo6Hydbnrv8lph6VcBaFyGRfbXpwmzx29E0BFyN1V9QupuoQIGlGz0vFbkp1DA5scQIDAQAB", + "locales": [ "en" ], + "manifest_version": 3, + "name": "Performance", + "target": { + "url": "edge://perf-center/" + }, + "version": "1.1.3" + }, { + "default_locale": "en", + "description": "Follow creators on the web to get notified", + "disabled|auth:aad": true, + "flights": [ "msEdgeFollowableWeb", "msEdgeHubAppFollow" ], + "icon": { + "raster_icon": { + "dark_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_maximal_follow_dark.png/1.1.2/asset", + "high_contrast": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_maximal_follow_hc.png/1.1.2/asset", + "light_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_maximal_follow_light.png/1.1.2/asset" + } + }, + "id": "940dda49-036a-4ba7-b927-a016f2794766", + "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyea9WWp4+LsT2psYHCmbxoVQgyFxwb0VYFNmQdBHnkqM8sRedZoF91X+IbrvWQOWsp1EGU7PZpHKc3ijv3omkL0kNUm/8AqnoOcLos/tK8RwGwLjfyV0AbfxxmAKpXcWLG9v/4zPTuDnBT0ZhCrLDek5x2Z78OhBGhlUEpWJ/PokQisA6M3KOhHWd2FgRqLx1Tems7cFwLEuRuSJfaI0OClqP/DytivzJvL59J3YAEz676T5FQE/bz3xUjIflNiH/XwT7SPGhGsueAL6IWiLm+8HCscdVLFpaXZVtMVC5nKvxGD/5133Skm7A/X+IJCdnSWbwwP1mdDRfhwA+0ZClQIDAQAB", + "locales": [ "en" ], + "manifest_version": 3, + "name": "Following", + "target": { + "url": "edge://followable-web-hub/?shorelineRequest=1" + }, + "version": "1.1.2" + }, { + "capabilities": { + "resize_disabled": true + }, + "default_locale": "en", + "description": "Easily browse and find movies that fit your mood", + "icon": { + "raster_icon": { + "dark_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_theater_maximal_dark.png/1.0.9/asset", + "high_contrast": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_theater_hc.png/1.0.9/asset", + "light_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_theater_maximal_light.png/1.0.9/asset" + } + }, + "id": "3458dfd2-bf1b-4d00-a6dd-a74a59d523c7", + "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1GNijUy/yP0deh4a0zSno7UyNkxTzVUCYKgUD2NKh7jRbOjl3Mb5dOVkJtXOzUWLvyFKTFtCMjbFnrE3o392f8awVtOG7KlpZ6OdG56+PFr9PtYzxy1i5ybTWymCKkCNXqN/JzZFfpqJI/LO1TRALE7YCchHLCIHBoRZUK0zOlJ1Qv2LQDvn14nhuzXMl7I+G6uo4y5gczHM+ClSG9HI+YZUvn9cQXvooSRqyjnaP4qLmjiVy5+ZP8E9mRBRUzbNytBQ7CzQ+LEmIBzN/CBF8oBayHSri/6++8ljDTgIJnJKwl86ZB69Cmb6ctBHwyJLdknssbO9JZQwBZUq0uLdbwIDAQAB", + "locales": [ "ar", "de", "en", "es", "fr", "id", "it", "ja", "ko", "pt", "ru", "zh_CN" ], + "manifest_version": 3, + "market_constraints": { + "markets": [ "AU", "GB", "IE", "IN", "PH", "SG", "US", "ZA" ], + "type": "enable" + }, + "name": "Theater", + "target": { + "url": "https://www.bing.com/theater?features=theater", + "url|locale:zh_CN": "https://cn.bing.com/theater?features=theater" + }, + "version": "1.0.9" + }, { + "default_locale": "en", + "description": "Earn valuable Microsoft Rewards just by searching, shopping, and gaming with Microsoft", + "icon": { + "raster_icon": { + "dark_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_rewards_maximal_dark.png/1.2.1/asset", + "high_contrast": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_rewards_hc.png/1.2.1/asset", + "light_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_rewards_maximal_light.png/1.2.1/asset" + } + }, + "id": "698b01b4-557a-4a3b-9af7-a7e8138e8372", + "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuY4hsaORFypr4cSAhBHOkjLe8Biekn2iXH5grWnrI+EYIxPWuifPOvw7O9IAiUF7pUQZzaaCwCF5kvMoMDW4U+HdAoj1zn5+x/hsigntwFV+hg/uZh8gFsNyDpc2UrsPONTxQWQaagPvqoz+wE/LNFD00+/NYqjhi2HTUGr9ImfvHIFc340LN34KXMiVUWZNgo7vj2qW0LI4XvD1CIZA1Y0Bep87KCYirqxnMxzKVbAQnksFofdgzANV0XS1etztO9D4IyRNh/T56vSw6D9Jasci+8ePYMvKQ25DSVBbsCw1cuuY6lX3YXG1YNx0WkZIYFUx5qlmlldevJpR9JvROwIDAQAB", + "locales": [ "af", "am", "ar", "as", "az", "bg", "bn_IN", "bs", "ca", "ca_Es_VALENCIA", "cs", "cy", "da", "de", "el", "en", "en_GB", "es", "es_MX", "et", "eu", "fa", "fi", "fil", "fr", "fr_CA", "ga", "gd", "gl", "gu", "he", "hi", "hr", "hu", "hy", "id", "is", "it", "ja", "ka", "kk", "km", "kn", "ko", "kok", "lb", "lo", "lt", "lv", "mi", "mk", "ml", "mr", "ms", "mt", "nb", "ne", "nl", "nn", "or", "pa", "pl", "pt_BR", "pt_PT", "quz", "ro", "ru", "sk", "sl", "sq", "sr_Cyrl_BA", "sr_Cyrl_RS", "sr_Latn_RS", "sv", "ta", "te", "th", "tr", "tt", "ug", "uk", "ur", "uz", "vi", "zh_CN", "zh_TW" ], + "manifest_version": 3, + "name": "Microsoft Rewards", + "target": { + "url": "https://edgeservices.bing.com/rewards/panelflyout/engagement?channel=bingflyout&partnerId=RewardsHub&isDarkMode=0", + "url|theme:dark": "https://edgeservices.bing.com/rewards/panelflyout/engagement?channel=bingflyout&partnerId=RewardsHub&isDarkMode=1" + }, + "version": "1.2.1", + "wipe_rules": [ { + "enable|flight:msEdgeWipeRewardsApp": true, + "ignore_user_add": true, + "name": "remove app", + "rule_id": "remove_all", + "scope": [ "canary" ], + "start_time": "2023-10-22", + "stop_time": "2023-11-18", + "wipe_version": 0 + } ] + }, { + "default_locale": "en", + "description": "Recent Files App", + "flights": [ "msEdgeFreeOfficePPTOnlyBundle" ], + "icon": { + "raster_icon": { + "dark_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_whats_new.png/1.0.1/asset", + "high_contrast": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_whats_new.png/1.0.1/asset", + "light_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_whats_new.png/1.0.1/asset" + } + }, + "id": "15ed6860-f3e5-4d55-8fff-c2ef2d1e7ebd", + "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsFRF90OoZBB6zV8detuBVuwZ/I1khT8+R0+JjANESof5STH5sygsiMrnZ6d0zuDfOT7DL4Ot4GYuGLkCNzs1zTqE3H5h0SkTIUq5HWeNLBGQIdpV49xyZnVFnCA5OHkV6WLgYXwksYxjEf5RI3dREgOzOHVJf2A/03fRgbgRCYJUCDt97ptx3RrtyXkt8IUFMPw3FWyebOBm3EdOz0PCdFVw4PfqbUPuFG+vPmhkFuVLcdCRLg00/S2feHqI1uvGghufNXkKSkNtYo0c7fS3fOzWQIHMJs+z2AknHAoJ0aKBly6Xo/uzLD3n9Y1vd828qhrd9iF1l6Ol4ytVN5aanQIDAQAB", + "locales": [ "en" ], + "manifest_version": 3, + "name": "Recent Files", + "target": { + "url": "edge://free-office-ppt-only/?sharedHeader=1" + }, + "version": "1.0.1" + }, { + "default_locale": "en", + "description": "Help App", + "flights": [ "msEdgeHelpHubApp" ], + "icon": { + "raster_icon": { + "dark_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_help.png/1.0.1/asset", + "high_contrast": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_help.png/1.0.1/asset", + "light_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_help.png/1.0.1/asset" + } + }, + "id": "b04052f4-597e-4e9b-9380-a26658a23e52", + "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+hMWECnLJ8xmCKfxc8R7UaxExnweWZdndHuo+zZbmSobIsrNdqmmqYvr7xo97Yf8lIsjjc2rOihCQYgA/jt8nJJXQdM7cP96FAJTPwdnTzyJpSxypP6e/hFrqROv995k9Nki7v9S8SNBRFEoM3HzaaFz03BhYAU1aGOoZf3CtV07d6/dOJUEGHjgJG6DdKaf93uYbzdXkRrSc31e1Tt/qT6mQhkEAzU4EZS9cc+VcFpFRFAjrL8QYTtf/40//AYInU8es0nTuJ8F/Ly27t+XDzDr0FOG2FZ0U6yhXxEVQx1CVP2UZqDkaUBturK+xJFZqaJYpqEd+kYgoJq7NWveywIDAQAB", + "locales": [ "en" ], + "manifest_version": 3, + "name": "Help", + "target": { + "url": "https://support.microsoft.com/en-us/powerpoint" + }, + "version": "1.0.1" + }, { + "capabilities": { + "hide_navigation_buttons": true, + "resize_disabled": true + }, + "default_locale": "en", + "description": "Contextual game insights", + "flights": [ "msEdgeHubAppGameView" ], + "icon": { + "raster_icon": { + "dark_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_controller_maximal_dark.png/1.0.11/asset", + "high_contrast": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_controller_hc.png/1.0.11/asset", + "light_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_controller_maximal_light.png/1.0.11/asset" + } + }, + "id": "c8ebd871-9f47-4a0d-abd3-c1c02b4f8f53", + "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8ojYsEsvEJvJQbVeqNVzEzIH2/adztpJSmFjaXlJgIu/RL9EOPxUDL7ysfNpg2WTsSuC85GmXcSebJAWEprbZtaiYm8Ws3dhV4UDU2D6pkWXnzhYyYRBHfGXQhngoVvARzpxw9QGaD48II7xeMgq3G6HyPwP0vHVvzTTmYgm6RaGIUCBiOjos+vJBQtsT6XNkzDT4wU8PoL2hwzurj208iU4luC4Nf0M3YjcehEi2g14pcK6INKf2RIJVjiqGBlyCxE0OrEC7wWuPo6MzdhrKvuyYcXu5Ogwox3FLMCdOf83D0maN+dWqjusaL//dkdTSSTGQZNC+JXEgdwdbnLXhwIDAQAB", + "locales": [ "en" ], + "manifest_version": 3, + "market_constraints": { + "markets": [ "US" ], + "type": "enable" + }, + "market_constraints|flight:msEdgeHubAppGameViewEnableAllMarkets": { + "markets": [ ], + "type": "disable" + }, + "name": "Game view (Preview)", + "notifications": { + "enabled": true + }, + "target": { + "url": "https://www.msn.com/widgets/fullpage/gaming/widget?experiences=GamingChannel" + }, + "version": "1.0.11" + }, { + "auto_open_v2": [ { + "approved_channels": [ "canary", "dev", "beta", "stable" ], + "enabled": false, + "enabled|flight:msHubAppMsStartAutoOpenV2": true, + "footer": { + "open_count": 10, + "text": "We opened the news feed in this sidebar so you can continue browsing." + }, + "force_auto_open": false, + "id": "c8ebbf64-e3b8-41d9-925f-4e3754151ff7", + "lifetime": "tab", + "lifetime|flight:msHubAppMsStartPerWindowAutoOpen": "window", + "min_page_width_pixels": 1052, + "non_visible_user_friendly_name": "MS Start Protocol Launch", + "remember_context": { + "time_to_live_sec": 86400 + }, + "settings_toggle": { + "description": "Allows links from different Windows OS surfaces to open Microsoft Start in the sidebar when Microsoft Edge is launched.", + "title": "Automatically open Microsoft Start in the sidebar" + } + }, { + "approved_channels": [ "canary", "dev", "beta", "stable" ], + "enabled": false, + "enabled|locale:ja:ko:zh_TW|flight:msHubAppMsStartYJTop": true, + "footer": { + "no_button_text": "No, don’t open", + "open_count": 10, + "text": "Continue to explore your feed and related topics as you browse.", + "yes_button_text": "Got it" + }, + "force_auto_open": false, + "id": "75a774c2-6075-ae4f-09f9-e5f5d9bef6e1", + "lifetime": "tab", + "lifetime|flight:msHubAppMsStartPerWindowAutoOpen": "window", + "min_page_width_pixels": 1052, + "non_visible_user_friendly_name": "Yahoo Naver News", + "remember_context": { + "time_to_live_sec": 86400 + }, + "settings_toggle": { + "description": "Allow visits to news websites to automatically open Microsoft Start in a sidebar.", + "title": "Automatically open Microsoft Start in the sidebar (news)" + }, + "triggering_config|locale:ja": { + "hubappparams": "ocid=stpromoshoreline", + "hubappparams|flight:msHubAppMsStartYJDense": "experiences=ShorelineArticleFeed&ocid=stpromoshoreline", + "hubappsubpath": "/ja-jp/feed", + "hubappsubpath|flight:msHubAppMsStartYJDense": "/widgets/fullpage/sharedWidgets/shorelinearticle", + "signal_name": "IsYahooJapanNews", + "signal_threshold": 0.5 + }, + "triggering_config|locale:ko": { + "hubappparams": "ocid=stpromoshoreline", + "hubappparams|flight:msHubAppMsStartYJDense": "experiences=ShorelineArticleFeed&ocid=stpromoshoreline", + "hubappsubpath": "/ko-kr/feed", + "hubappsubpath|flight:msHubAppMsStartYJDense": "/widgets/fullpage/sharedWidgets/shorelinearticle", + "signal_name": "IsNaverNews", + "signal_threshold": 0.5 + }, + "triggering_config|locale:zh_TW": { + "hubappparams": "ocid=stpromoshoreline", + "hubappparams|flight:msHubAppMsStartYJDense": "experiences=ShorelineArticleFeed&ocid=stpromoshoreline", + "hubappsubpath": "/zh-tw/feed", + "hubappsubpath|flight:msHubAppMsStartYJDense": "/widgets/fullpage/sharedWidgets/shorelinearticle", + "signal_name": "IsYahooTaiwanNews", + "signal_threshold": 0.5 + } + }, { + "approved_channels": [ "canary", "dev", "beta", "stable" ], + "enabled": false, + "enabled|locale:ja|flight:msHubAppMsStartYJWeatherTop": true, + "footer": { + "no_button_text": "No, don’t open", + "open_count": 10, + "text": "Continue to explore your feed and related topics as you browse.", + "yes_button_text": "Got it" + }, + "force_auto_open": false, + "id": "a5e9f5e1-fcee-c07b-2c44-b707ded020a3", + "lifetime": "tab", + "lifetime|flight:msHubAppMsStartPerWindowAutoOpen": "window", + "min_page_width_pixels": 1052, + "non_visible_user_friendly_name": "Yahoo Japan Weather Top site", + "remember_context": { + "time_to_live_sec": 86400 + }, + "settings_toggle": { + "description": "Allow visits to weather websites to automatically open Microsoft Start in a sidebar.", + "title": "Automatically open Microsoft Start in the sidebar (weather)" + }, + "triggering_config": { + "hubappparams": "ocid=stpromoshoreline", + "hubappsubpath": "/ja-jp/weather", + "signal_name": "IsYahooJapanWeatherTop", + "signal_name|flight:msHubAppMsStartYJWeatherV3": "IsYahooJapanWeather", + "signal_threshold": 0.5 + } + } ], + "capabilities": { + "hide_navigation_buttons": true, + "resize_disabled": true + }, + "default_locale": "en", + "description": "Continue browsing your news feed on Microsoft Start", + "flights": [ "msEdgeHubAppStart", "msEdgeTransientAppAutoOpen" ], + "icon": { + "raster_icon": { + "dark_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_msstart_logo_dark.png/1.2.17/asset", + "light_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_msstart_logo_light.png/1.2.17/asset" + } + }, + "id": "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f", + "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1lmCC9ljvQph6LgOF/UCFLZjItgaIKAKYb3MHPUvyI7fj+r3v/T6Y2mrHMljC0NXXzpWYly7T1ZVdkrJ9NiLHnRFNa/QFFUG7mMkcrzHHEseFFxfLsWafEHioqZIhZbOdlHd/8jI0GKYWVBz79J/t3AYFM/iE3RDodr2+AqKm3RLEOcoXvaI9Y5YTLDrApHFxNsJby9qewwP2tDvEg/ojW6gwyvw2d3k1RdM5DhHp/9AESBo/hB9pfLuIzTBq2C2r6JXx3YsHKbGGpCb94JATbufY1JyF3qUl64V0IYKIoo4a58Lut67lqaMrQXiVXWLM5l7qmbwsmWWRKwL2mCIEQIDAQAB", + "locales": [ "af", "am", "ar", "as", "az", "bg", "bn_IN", "bs", "ca", "ca_Es_VALENCIA", "cs", "cy", "da", "de", "el", "en", "en_GB", "es", "es_MX", "et", "eu", "fa", "fi", "fil", "fr", "fr_CA", "ga", "gd", "gl", "gu", "he", "hi", "hr", "hu", "hy", "id", "is", "it", "ja", "ka", "kk", "km", "kn", "ko", "kok", "lb", "lo", "lt", "lv", "mi", "mk", "ml", "mr", "ms", "mt", "nb", "ne", "nl", "nn", "or", "pa", "pl", "pt_BR", "pt_PT", "quz", "ro", "ru", "sk", "sl", "sq", "sr_Cyrl_BA", "sr_Cyrl_RS", "sr_Latn_RS", "sv", "ta", "te", "th", "tr", "tt", "ug", "uk", "ur", "uz", "vi", "zh_CN", "zh_TW" ], + "manifest_version": 3, + "name": "Microsoft Start", + "notifications": { + "enabled": true + }, + "pin_by_default": true, + "target": { + "url": "https://www.msn.com/widgets/fullpage/winWidgets/sidebar?experiences=WindowsWidgetsHub", + "url|market:CN": "https://www.msn.cn/widgets/fullpage/winWidgets/sidebar?experiences=WindowsWidgetsHub" + }, + "version": "1.2.17" + }, { + "capabilities": { + "hide_navigation_buttons": true + }, + "custom_actions": [ { + "action": { + "target": "new_tab", + "type": "url_action" + }, + "icon": { + "builtin_icon": "OpenInNew" + }, + "location": "header_button", + "name": "Open in Stream" + } ], + "default_locale": "en", + "description": "Create a screen recording", + "disabled": true, + "disabled|auth:aad": false, + "flights": [ "msEdgeHubAppStreamScreenRecorder" ], + "icon": { + "raster_icon": { + "dark_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_StreamCameraIcon_Dark.png/0.0.8/asset", + "high_contrast": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_StreamCameraIcon_HC.png/0.0.8/asset", + "light_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_StreamCameraIcon_Light.png/0.0.8/asset" + } + }, + "id": "c0229319-1937-4de2-b256-eccdd010f0dc", + "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtdZ9cm5Xl4U8L/I/aZCJQtHj/wwFwgytqAYHtAHfwMsiuBK2rU6UJfhbE88+SpF/A/IqDbrds3mOtTHjbd8RdZMXzgStplUsdXIx8XeyA4iKIn5UtS+XBPD/ev+n67UfdMCg44MApTIqVZlVMKx1ijWyGIQSI9NxKBQHNZvpkORtHpmmTYZz23bPYovzqjwiBoQaXqtY69Hr6OqB4YvPzC3C3FdyTy9cplVJzbFI1pTZv2nGCFNRZFE/x3walZX1qCzKwFrxMZXKnNnPViSVrba31AW1sjZCnRkrDNkeQRbLFbfs1MobJYKCm/TF83HI3ggixcKbOlKKuuYYknMoowIDAQAB", + "locales": [ "en" ], + "manifest_version": 3, + "name": "Record with Stream", + "notifications": { + "enabled": false + }, + "pin_by_default": true, + "preferred_side_pane_width": 376, + "target": { + "url": "https://microsoft.sharepoint.com/_layouts/15/stream.aspx?action=create&captureMode=screenrecorder&referrer=Edge&referrerScenario=Shoreline-screenrecorder", + "url_resolver": { + "__global": "SharePointUrlResolver" + } + }, + "version": "0.0.8" + }, { + "default_locale": "en", + "description": "Your online travel companion", + "disabled": false, + "flights": [ "msEdgeTravelSidebarEnabled" ], + "icon": { + "raster_icon": { + "dark_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_mstravel_logo_dark.png/1.0.0/asset", + "high_contrast": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_mstravel_logo_hc.png/1.0.0/asset", + "light_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_mstravel_logo_light.png/1.0.0/asset" + } + }, + "id": "fa71aaef-6e75-4e2a-aada-635e8c5899f5", + "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAp8hXSTZHUd29mI/mKoZFj48uGDToHrVg5hRB2nHZZn9U7m8IdewA5Cnpe8Jps3pm1D/3Uy9VYFeYwpUczUaQKofG6KnnZQpjcCkLxzmsuVU5dSSkHacL7KY4qRehweM+MbtmQEu/WBnwEA5qY2Bv4fVR3D4RhOyMpyNOmtAydFi6OgGxjzm0wJ1GyNVmI/jibwUuTCBhVNmdOOZpDnqTQ0HVdDhH4hrTMPUH7ZOjoj+cuOpWQfIYankinfuRrK4g8R4iXb672Irgrc/H3SfqwZ1K9/4/cA8mLfJ+Kt2hCUj3Ptu18kUBcVQ2zH1Df8kYOvYKslbGtPH4h2o5FLMWLwIDAQAB", + "lifetime": "background", + "locales": [ "en" ], + "manifest_version": 3, + "microfeedback": { + "area_path": "Features\\Sidebar\\Travel", + "service_id": "e90c3ebe-36d8-4d05-9689-564773d48f49" + }, + "name": "Microsoft Travel", + "notifications|flight:msEdgeTravelSidebarNotif": { + "enabled": true, + "triggers": [ { + "config": { + "max_show_count": 3, + "min_sec_between_auto_show": 3600, + "show_count_basis": "signal", + "signal_name": "IsTravelSidebarDomain", + "signal_threshold": 0.5 + }, + "text": "__MSG_notification_text__", + "type": "triggering_config" + } ] + }, + "pin_by_default": false, + "pin_by_default|flight:msEdgeTravelSidebarPinned": true, + "preferred_side_pane_width": 376, + "target": { + "url": "https://www.bing.com/travelgrowthedge/sidebar.html" + }, + "version": "1.0.0" + }, { + "auto_open_v2": [ { + "approved_channels": [ "canary", "dev" ], + "enabled": false, + "enabled|flight:msEdgeHubAppsAutoOpenJSDisabledError": true, + "footer": { + "no_button_text": "Do not open", + "open_count": 3, + "text": "We opened Reommendations since we detected an issue. Would you like us to continue showing this when we detect this issue?", + "yes_button_text": "Yes, please" + }, + "force_auto_open": true, + "id": "c1c025d9-a620-4f6b-bebb-eff0cf19a671", + "lifetime": "tab", + "non_visible_user_friendly_name": "JavaScript Disabled Error Auto Open", + "remember_context": { + "time_to_live_sec": 86400 + }, + "settings_toggle": { + "description": "When we detect a JavaScript-related issue, we'll automatically open Recommendations to help you resolve it.", + "title": "Automatically open Recommendations when a JavaScript-related issue is detected" + }, + "supported_platforms": [ "win", "mac", "linux" ] + } ], + "default_locale": "en", + "description": "The Recommendations app provides fast and easy solutions for common browsing issues.", + "flights": [ "msEdgeEchoHubApp" ], + "icon": { + "raster_icon": { + "dark_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_wrench.png/1.0.1/asset", + "high_contrast": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_wrench.png/1.0.1/asset", + "light_mode": "https://edgeassetservice.azureedge.net/assets/edge_hub_apps_wrench.png/1.0.1/asset" + } + }, + "id": "694efa4f-a304-4214-aaf7-90444bc887f5", + "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAiQTsrg0nIYfSUcSPPF8GQ63N/SdVrDv10Uk/6CMpmOiRH2vq/iTubZpAMQpiia2DDeYPS2jSm3X2hlbXe3UQ/4eHgTSgJL9PDjLuB8fo1E7vcs/JC/h8hIRNpCVVp322A8+pH9fkSU/NnICrI39QZR8BqoE+p86laYkpegXNLPs+Q7WuXnc8l8mebL1Hd2X/BN7lz12TZDbVMnW02CJKFk55XPzGnZEicZQNCkIQrxs03MW01jTp7X45Skg01H0QAuPrDlWGRb3BGhL5VCD1Nz//4rjPw1lnySSnuryPKYp/U2cuRM0immPhA3NhzO5lHT1uJTv+XRkDFv/0yVMYuwIDAQAB", + "locales": [ "en" ], + "manifest_version": 3, + "name": "Recommendations", + "notifications": { + "enabled": true + }, + "target": { + "url": "edge://echo" + }, + "version": "1.0.1" + } ], + "manifest_version": "4.0.0" +} diff --git a/.edge-profile-render-1774484525680/Default/HubApps Icons b/.edge-profile-render-1774484525680/Default/HubApps Icons new file mode 100644 index 0000000..3c216b0 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/HubApps Icons differ diff --git a/.edge-profile-render-1774484525680/Default/HubApps Icons-journal b/.edge-profile-render-1774484525680/Default/HubApps Icons-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/LOCK b/.edge-profile-render-1774484525680/Default/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/LOG b/.edge-profile-render-1774484525680/Default/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/Local Extension Settings/jdiccldimpdaibmpdkjnbmckianbfold/CURRENT b/.edge-profile-render-1774484525680/Default/Local Extension Settings/jdiccldimpdaibmpdkjnbmckianbfold/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Local Extension Settings/jdiccldimpdaibmpdkjnbmckianbfold/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile-render-1774484525680/Default/Local Extension Settings/jdiccldimpdaibmpdkjnbmckianbfold/LOCK b/.edge-profile-render-1774484525680/Default/Local Extension Settings/jdiccldimpdaibmpdkjnbmckianbfold/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/Local Extension Settings/jdiccldimpdaibmpdkjnbmckianbfold/LOG b/.edge-profile-render-1774484525680/Default/Local Extension Settings/jdiccldimpdaibmpdkjnbmckianbfold/LOG new file mode 100644 index 0000000..39adb67 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Local Extension Settings/jdiccldimpdaibmpdkjnbmckianbfold/LOG @@ -0,0 +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 diff --git a/.edge-profile-render-1774484525680/Default/Local Extension Settings/jdiccldimpdaibmpdkjnbmckianbfold/MANIFEST-000001 b/.edge-profile-render-1774484525680/Default/Local Extension Settings/jdiccldimpdaibmpdkjnbmckianbfold/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Local Extension Settings/jdiccldimpdaibmpdkjnbmckianbfold/MANIFEST-000001 differ diff --git a/.edge-profile-render-1774484525680/Default/Local Storage/leveldb/CURRENT b/.edge-profile-render-1774484525680/Default/Local Storage/leveldb/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Local Storage/leveldb/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile-render-1774484525680/Default/Local Storage/leveldb/LOCK b/.edge-profile-render-1774484525680/Default/Local Storage/leveldb/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/Local Storage/leveldb/LOG b/.edge-profile-render-1774484525680/Default/Local Storage/leveldb/LOG new file mode 100644 index 0000000..dc2f342 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Local Storage/leveldb/LOG @@ -0,0 +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 diff --git a/.edge-profile-render-1774484525680/Default/Local Storage/leveldb/MANIFEST-000001 b/.edge-profile-render-1774484525680/Default/Local Storage/leveldb/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Local Storage/leveldb/MANIFEST-000001 differ diff --git a/.edge-profile-render-1774484525680/Default/Login Data b/.edge-profile-render-1774484525680/Default/Login Data new file mode 100644 index 0000000..0af13bc Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Login Data differ diff --git a/.edge-profile-render-1774484525680/Default/Login Data For Account b/.edge-profile-render-1774484525680/Default/Login Data For Account new file mode 100644 index 0000000..0af13bc Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Login Data For Account differ diff --git a/.edge-profile-render-1774484525680/Default/Login Data For Account-journal b/.edge-profile-render-1774484525680/Default/Login Data For Account-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/Login Data-journal b/.edge-profile-render-1774484525680/Default/Login Data-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/Network Action Predictor b/.edge-profile-render-1774484525680/Default/Network Action Predictor new file mode 100644 index 0000000..79744b2 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Network Action Predictor differ diff --git a/.edge-profile-render-1774484525680/Default/Network Action Predictor-journal b/.edge-profile-render-1774484525680/Default/Network Action Predictor-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/Network/Cookies b/.edge-profile-render-1774484525680/Default/Network/Cookies new file mode 100644 index 0000000..54a3739 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Network/Cookies differ diff --git a/.edge-profile-render-1774484525680/Default/Network/Cookies-journal b/.edge-profile-render-1774484525680/Default/Network/Cookies-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/Network/Network Persistent State b/.edge-profile-render-1774484525680/Default/Network/Network Persistent State new file mode 100644 index 0000000..dcde74c --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Network/Network Persistent State @@ -0,0 +1 @@ +{"net":{"http_server_properties":{"servers":[{"alternative_service":[{"advertised_alpns":["h3"],"expiration":"13421550127472309","port":443,"protocol_str":"quic"}],"anonymization":["GAAAABIAAABodHRwczovL2dvb2dsZS5jb20AAA==",false,0],"server":"https://clients2.google.com","supports_spdy":true},{"alternative_service":[{"advertised_alpns":["h3"],"expiration":"13421550127732926","port":443,"protocol_str":"quic"}],"anonymization":["JAAAAB0AAABodHRwczovL2dvb2dsZXVzZXJjb250ZW50LmNvbQAAAA==",false,0],"server":"https://clients2.googleusercontent.com","supports_spdy":true},{"anonymization":["HAAAABUAAABodHRwczovL21pY3Jvc29mdC5jb20AAAA=",false,0],"server":"https://edge.microsoft.com","supports_spdy":true},{"alternative_service":[{"advertised_alpns":["h3"],"expiration":"13421550141554653","port":443,"protocol_str":"quic"}],"anonymization":["IAAAABoAAABodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbQAA",false,0],"server":"https://www.googleapis.com","supports_spdy":true},{"anonymization":["LAAAACYAAABodHRwczovL2VkZ2Vhc3NldHNlcnZpY2UuYXp1cmVlZGdlLm5ldAAA",false,0],"server":"https://edgeassetservice.azureedge.net","supports_spdy":true},{"alternative_service":[{"advertised_alpns":["h3"],"expiration":"13419051730663581","port":443,"protocol_str":"quic"}],"anonymization":["FAAAABAAAABodHRwczovL2JpbmcuY29t",false,0],"network_stats":{"srtt":997261},"server":"https://www.bing.com","supports_spdy":true}],"supports_quic":{"address":"192.168.100.199","used_quic":true},"version":5},"network_qualities":{"CAASABiAgICA+P////8B":"4G","CAESABiAgICA+P////8B":"4G"}}} \ No newline at end of file diff --git a/.edge-profile-render-1774484525680/Default/Network/NetworkDataMigrated b/.edge-profile-render-1774484525680/Default/Network/NetworkDataMigrated new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/Network/Reporting and NEL b/.edge-profile-render-1774484525680/Default/Network/Reporting and NEL new file mode 100644 index 0000000..2cfb716 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Network/Reporting and NEL differ diff --git a/.edge-profile-render-1774484525680/Default/Network/Reporting and NEL-journal b/.edge-profile-render-1774484525680/Default/Network/Reporting and NEL-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/Network/SCT Auditing Pending Reports b/.edge-profile-render-1774484525680/Default/Network/SCT Auditing Pending Reports new file mode 100644 index 0000000..0637a08 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Network/SCT Auditing Pending Reports @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/.edge-profile-render-1774484525680/Default/Network/Sdch Dictionaries b/.edge-profile-render-1774484525680/Default/Network/Sdch Dictionaries new file mode 100644 index 0000000..8bca100 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Network/Sdch Dictionaries @@ -0,0 +1 @@ +{"SDCH":{"dictionaries":{},"version":2}} \ No newline at end of file diff --git a/.edge-profile-render-1774484525680/Default/Network/Trust Tokens b/.edge-profile-render-1774484525680/Default/Network/Trust Tokens new file mode 100644 index 0000000..4444dfd Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Network/Trust Tokens differ diff --git a/.edge-profile-render-1774484525680/Default/Network/Trust Tokens-journal b/.edge-profile-render-1774484525680/Default/Network/Trust Tokens-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/Nurturing/campaign_history b/.edge-profile-render-1774484525680/Default/Nurturing/campaign_history new file mode 100644 index 0000000..eab8517 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Nurturing/campaign_history differ diff --git a/.edge-profile-render-1774484525680/Default/Nurturing/campaign_history-journal b/.edge-profile-render-1774484525680/Default/Nurturing/campaign_history-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/PersistentOriginTrials/LOCK b/.edge-profile-render-1774484525680/Default/PersistentOriginTrials/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/PersistentOriginTrials/LOG b/.edge-profile-render-1774484525680/Default/PersistentOriginTrials/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/Preferences b/.edge-profile-render-1774484525680/Default/Preferences new file mode 100644 index 0000000..4efddd6 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Preferences @@ -0,0 +1 @@ +{"aadc_info":{"age_group":0},"accessibility":{"captions":{"headless_caption_enabled":false}},"account_tracker_service_last_update":"13418958127049072","apps":{"shortcuts_arch":"","shortcuts_version":1},"arbitration_experiences":{"cd4688a9-e888-48ea-ad81-76193d56b1be.IsTopNewsDomain.Bubble":{"ClickedCount":0,"Cohort":"DefaultCohort","DisableCount":0,"Disabled":false,"DismissedCount":0,"ExperienceEngagementHistory":0,"GlobalNSAT":0.0,"IgnoredCount":0,"IsGlobalExperience":false,"LastReservedTime":"11644473600000000","LastTriggeredTime":"13418958147313386","LastUndoShownTime":"11644473600000000","Loss":0,"ModelScore":1.0,"NSATTriggeredCount":0,"NSATUpperCI":1.0,"OverallNSAT":1.0,"QuickDismissedCount":0,"Reserved":0,"SnoozeCount":0,"Triggered":1,"UndoShown":0,"Win":0}},"arbitration_last_notification_shown":"13418958147313726","arbitration_using_experiment_config":false,"autocomplete":{"retention_policy_last_version":146},"autofill":{"edge_autofill_advanced_ml_enabled":true,"edge_autofill_purge_low_quality_profiles_by_timeline":false,"last_version_deduped":146},"bookmark":{"storage_computation_last_update":"13418958126965828"},"browser":{"available_dark_theme_options":"All","edge_sidebar_visibility":{"_game_assist_":{"order":{"8ac719c5-140b-4bf2-a0b7-c71617f1f377":2147483647}},"add_app_to_bottom":true,"order":{"8ac719c5-140b-4bf2-a0b7-c71617f1f377":2147483647}},"edge_sidebar_visibility_debug":{"order_list":["Search"],"order_raw_data":{"8ac719c5-140b-4bf2-a0b7-c71617f1f377":{"name":"Search","pos":"2147483647"}}},"enable_text_prediction_v2":true,"hub_app_non_synced_preferences":{"apps":{"06be1ebe-f23a-4bea-ae45-3120ad86cfea":{"last_path":""},"0c835d2d-9592-4c7a-8d0a-0e283c9ad3cd":{"last_path":""},"168a2510-04d5-473e-b6a0-828815a7ca5f":{"last_path":""},"1ec8a5a9-971c-4c82-a104-5e1a259456b8":{"last_path":""},"2354565a-f412-4654-b89c-f92eaa9dbd20":{"last_path":""},"25fe2d1d-e934-482a-a62f-ea1705db905d":{"last_path":""},"2caf0cf4-ea42-4083-b928-29b39da1182b":{"last_path":""},"3458dfd2-bf1b-4d00-a6dd-a74a59d523c7":{"last_path":""},"35a43603-bb38-4b53-ba20-932cb9117794":{"last_path":""},"380c71d3-10bf-4a5d-9a06-c932e4b7d1d8":{"last_path":""},"523b5ef3-0b10-4154-8b62-10b2ebd00921":{"last_path":""},"64be4f9b-3b81-4b6e-b354-0ba00d6ba485":{"last_path":""},"698b01b4-557a-4a3b-9af7-a7e8138e8372":{"last_path":""},"76b926d6-3738-46bf-82d7-2ab896ddf70b":{"last_path":""},"7b52ae05-ae84-4165-b083-98ba2031bc22":{"last_path":""},"8682d0fa-50b3-4ece-aa5b-e0b33f9919e2":{"last_path":""},"8ac719c5-140b-4bf2-a0b7-c71617f1f377":{"last_path":""},"92f1b743-e26b-433b-a1ec-912d1f0ad1fa":{"last_path":""},"96defd79-4015-4a32-bd09-794ff72183ef":{"last_path":""},"a1a78183-6db3-4789-9e7c-84d157846d55":{"last_path":""},"bacc3c12-ebff-44b4-a0f8-ce8b69c9e047":{"last_path":""},"c814ae4d-fa0a-4280-a444-cb8bd264828b":{"last_path":""},"cd4688a9-e888-48ea-ad81-76193d56b1be":{"last_path":""},"d3ff4c56-a2b8-4673-ad13-35e7706cc9d1":{"last_path":""},"da15ec1d-543d-41c9-94b8-eb2bd060f2c7":{"last_path":""},"dadd1f1c-380c-4871-9e09-7971b6b15069":{"last_path":""},"e6723537-66ff-4f4e-ab56-a4cbaddf4e0f":{"last_path":""}}},"hub_app_preferences":{},"hub_cleanup_candidate_list_for_debug":[{"cleanup_progress":"cleanup_start_v2"},{"cleanup_progress":"cleanup_done_v2"}],"hub_cleanup_context_v2":{"cleanup_debug_info_v2_adjusted_engaged_app_count":0,"cleanup_debug_info_v2_app_count_threshold":1,"cleanup_debug_info_v2_current_sidebar_visibility":0,"cleanup_debug_info_v2_discover_icon_enabled":true,"cleanup_debug_info_v2_dwell_time_in_secs":10,"cleanup_debug_info_v2_engaged_app_count":0,"cleanup_debug_info_v2_expected_sidebar_visibility":0,"cleanup_debug_info_v2_is_tower_off_by_user":false,"cleanup_debug_info_v2_skip_user_generated_apps_for_threshold":true,"cleanup_debug_info_v2_user_generated_app_count":0,"hub_app_cleanup_v2_done":true},"hub_notifications_count_before_disabling":{"bubble":1},"recent_theme_color_list":[4293914607.0,4293914607.0,4293914607.0,4293914607.0,4293914607.0],"show_hub_app_in_sidebar_buttons":{"8ac719c5-140b-4bf2-a0b7-c71617f1f377":0},"underside_chat_bing_signed_in_status":false,"user_level_features_context":{}},"browser_content_container_height":492,"browser_content_container_width":764,"browser_content_container_x":0,"browser_content_container_y":80,"commerce_daily_metrics_last_update_time":"13418958126967467","continuous_migration":{"equal_opt_out_users_data":{"backfilled":true}},"countryid_at_install":21843,"custom_links":{"list":[]},"default_apps_install_state":3,"dual_engine":{"consumer_site_list_with_ie_entries":false,"consumer_sitelist_location":"","consumer_sitelist_version":"","shared_cookie_data":{},"sitelist_has_consumer_data":false,"sitelist_has_enterprise_data":false,"sitelist_location":"","sitelist_source":0,"sitelist_version":""},"edge":{"bookmarks":{"last_dup_info_record_time":"13418958136980336"},"msa_sso_info":{"allow_for_non_msa_profile":true},"profile_sso_info":{"aad_sso_algo_state":1,"is_first_profile":true,"is_msa_first_profile":true,"msa_sso_algo_state":1},"services":{"signin_scoped_device_id":"70db8f4c-d679-43c0-bb4d-f1c96161babc"},"workspaces":{"migration":{"stampede_time":"13418974330840205"}}},"edge_journeys":{"latest_journeys_count":0},"edge_pinning_campaign":{"precomputed_campaign_data":{}},"edge_rewards":{"cache_data":"CAA=","hva_webui_action_status_dict":{},"refresh_status_muted_until":"13419562926433638"},"edge_triggering":{"config_version":"1.42.0"},"edge_ux_config":{"assignmentcontext":"WZ6Vnr01OAXRgQg8Xl3tNUktX7JxudFaUYsba/UfCzY=","dataversion":"254627776","experimentvariables":{"shopppdismisstreatment":{"edgeServerUX.shopping.msEdgeShoppingCashbackDismissTimeout2s":true}},"flights":{"aibrwsrt2":"31479039","shopppdismisstreatment":"31004791"},"latestcorrelationid":"Ref A: 5F108C84F2474057AC74A3A36411B3B0 Ref B: SN4AA2022304037 Ref C: 2026-03-26T00:22:07Z"},"edge_vpn":{"available":true},"edge_wallet":{"passwords":{"password_lost_report_date":"13418958156447748"},"trigger_funnel":{"records":[]}},"enterprise_profile_guid":"2afa7851-76f3-44fc-bb66-424b27232455","extension":{"installed_extension_count":9},"extensions":{"alerts":{"initialized":true},"chrome_url_overrides":{},"install_signature":{"expire_date":"2026-06-17","ids":["ghbmnnjooekpmoecnnnilnnbdlolhkhi"],"invalid_ids":[],"salt":"uzTTMVuZHCwcXkAtv1hcgVCbn0+EmWt59rDu+yvGV2o=","signature":"TctocOwQ0hbIenvFRSUSFge5NLzI1QVLL9y7k9gxjZJyK3EYQ7E8WjTmqHPnIafmvETnGuyxUWrGw+uv2MSE0FFIxwqdFRuz7W79LZUYqHueQtUeMRe0Zh0jyM3Dqv8oMuKz8djBqckubcR2syZHvPmr5wgYootEo0GT1nRmPKfmVKAERefYn0DFJvn7LEROq/W0vVInyCGbh/t4LfBEnNbP+lMP19nLHXKhm92dXKJ2/8pUbnJH1dEK+NAiBgg+CvG3XA9cFx5+x2jnh4TRzKgtxKjizPYXNMKCtrKMBQwF+c/2LU8Yt7kV+Y1pNBbp6N4WIqewFfn9TPooC7jp0w==","signature_format_version":2,"timestamp":"13418958141407392"},"last_chrome_version":"146.0.3856.72","microsoft_install_signature":{"expire_date":"2026-06-18","ids":["jmjflgjpcpepeafmmgdpfkogkghcpiha"],"invalid_ids":[],"salt":"2HrmJQyMb6mPp8CDoew73LLyrtmb2n2XDrrmgZrDrqg=","signature":"AqBl7WdrOrlzzcWhqhGXkNz/Er1Aw/SX4bl+rrFfiyilo92xw85r/09vo5NU7BR4wIs+e9b4MFCbTrPvyO7eh1UcOzTvjQgvhxbCRBMuZSPl4I8nSou9r5ER2RxmUtWGMIb2YCT4ZDHtM2/wMr9yXnxoZ2tflurz3BkGDasbCT3Y8ssBnDrQQYP9GMCIEjpOGfvtiS7bKnzgLfYD1e4eICRGySZlMoQuJZQ+liu1+eO3bwhMdkzHIc3rRwEBNPqONOGPngsgnudHkHLCKhzPBjv0iPzt8K642i/c39zmkL+JjdRymC9V4dpIhEDe+kOodJBORNquIofkpVgSzDwqkQ==","signature_format_version":2,"timestamp":"13418958139409364"},"pdf_upsell_triggered":false,"pinned_extension_migration":true,"pinned_extensions":[]},"family_safety":{"activity_reporting_enabled":false,"web_filtering_enabled":false},"fsd":{"retention_policy_last_version":146},"gaia_cookie":{"periodic_report_time_2":"13418958126433229"},"import_items_failure_state":{"reimport":{"ie_react":62432}},"intl":{"selected_languages":"en-US,en"},"local_browser_data_share":{"index_last_cleaned_time":"13418958189120221","pin_recommendations_eligible":false},"media":{"engagement":{"schema_version":5}},"media_router":{"receiver_id_hash_token":"gItf/8GAW6yPg9uIck4ps1pA2bQ2mjFxDaJR9l7OHymbluVAQCZ9Q1nWOouVXtJKDnoEw5dxP0FCCP0RO0XKhw=="},"migrated_user_scripts_toggle":true,"muid":{"last_sync":"13418958126965694","values_seen":[]},"ntp":{"next_site_suggestions_available":false,"num_personal_suggestions":1},"optimization_guide":{"hintsfetcher":{"hosts_successfully_fetched":{}},"previously_registered_optimization_types":{"ABOUT_THIS_SITE":true,"AUTOFILL_ACTOR_IFRAME_ORIGIN_ALLOWLIST":true,"GLIC_ACTION_PAGE_BLOCK":true,"HISTORY_CLUSTERS":true,"LOADING_PREDICTOR":true,"MERCHANT_TRUST_SIGNALS_V2":true,"PAGE_ENTITIES":true,"PRICE_INSIGHTS":true,"PRICE_TRACKING":true,"SALIENT_IMAGE":true,"SAVED_TAB_GROUP":true,"SHOPPING_DISCOUNTS":true,"SHOPPING_PAGE_TYPES":true,"V8_COMPILE_HINTS":true}},"password_manager":{"account_store_backup_password_cleaning_last_timestamp":"13418958186448777","account_store_migrated_to_os_crypt_async":true,"profile_store_backup_password_cleaning_last_timestamp":"13418958186450315","profile_store_migrated_to_os_crypt_async":true},"personalization_data_consent":{"personalization_in_context_consent_can_prompt":true,"personalization_in_context_count":0},"pinned_sites":{"last_launch_times":{}},"privacy_sandbox":{"first_party_sets_data_access_allowed_initialized":true},"profile":{"avatar_index":20,"background_password_check":{"check_fri_weight":9,"check_interval":"2592000000000","check_mon_weight":6,"check_sat_weight":6,"check_sun_weight":6,"check_thu_weight":9,"check_tue_weight":9,"check_wed_weight":9,"next_check_time":"13421522119773596"},"content_settings":{"exceptions":{"3pcd_heuristics_grants":{},"abusive_notification_permissions":{},"access_to_get_all_screens_media_in_session":{},"anti_abuse":{},"app_banner":{},"ar":{},"are_suspicious_notifications_allowlisted_by_user":{},"auto_picture_in_picture":{},"auto_select_certificate":{},"automatic_downloads":{},"automatic_fullscreen":{},"autoplay":{},"background_sync":{},"bluetooth_chooser_data":{},"bluetooth_guard":{},"bluetooth_scanning":{},"camera_pan_tilt_zoom":{},"captured_surface_control":{},"clear_browsing_data_cookies_exceptions":{},"client_hints":{},"clipboard":{},"controlled_frame":{},"cookie_controls_metadata":{"http://127.0.0.1,*":{"last_modified":"13418958144193360","setting":{}}},"cookies":{},"direct_sockets":{},"direct_sockets_private_network_access":{},"display_media_system_audio":{},"disruptive_notification_permissions":{},"durable_storage":{},"edge_ad_targeting":{},"edge_ad_targeting_data":{},"edge_all_file_read_access":{},"edge_browser_action":{},"edge_sdsm":{},"edge_split_screen":{},"edge_tech_scam_detection":{},"edge_u2f_api_request":{},"edge_user_agent_token":{},"fedcm_idp_registration":{},"fedcm_idp_signin":{},"fedcm_share":{},"file_system_access_chooser_data":{},"file_system_access_extended_permission":{},"file_system_access_restore_permission":{},"file_system_last_picked_directory":{},"file_system_read_guard":{},"file_system_write_guard":{},"formfill_metadata":{},"geolocation":{},"geolocation_with_options":{},"hand_tracking":{},"has_migrated_local_network_access":true,"hid_chooser_data":{},"hid_guard":{},"http_allowed":{},"https_enforced":{},"idle_detection":{},"images":{},"important_site_info":{},"initialized_translations":{},"intent_picker_auto_display":{},"javascript":{},"javascript_jit":{},"javascript_optimizer":{},"keyboard_lock":{},"legacy_cookie_access":{},"legacy_cookie_scope":{},"local_fonts":{},"local_network":{},"local_network_access":{},"loopback_network":{},"media_engagement":{},"media_stream_camera":{},"media_stream_mic":{},"midi_sysex":{},"mixed_script":{},"nfc_devices":{},"notification_interactions":{},"notification_permission_review":{},"notifications":{},"ondevice_languages_downloaded":{},"password_protection":{},"payment_handler":{},"permission_actions_history":{},"permission_autoblocking_data":{},"permission_autorevocation_data":{},"pointer_lock":{},"popups":{},"protected_media_identifier":{},"protocol_handler":{},"reduced_accept_language":{},"safe_browsing_url_check_data":{},"secure_network":{},"secure_network_sites":{},"sensors":{},"serial_chooser_data":{},"serial_guard":{},"site_engagement":{"http://127.0.0.1:56233,*":{"last_modified":"13418958144213407","setting":{"lastEngagementTime":1.3418958144213344e+16,"lastShortcutLaunchTime":0.0,"pointsAddedToday":3.0,"rawScore":3.0}}},"sleeping_tabs":{},"sound":{},"speaker_selection":{},"ssl_cert_decisions":{},"storage_access":{},"storage_access_header_origin_trial":{},"subresource_filter":{},"subresource_filter_data":{},"suspicious_notification_ids":{},"suspicious_notification_show_original":{},"top_level_storage_access":{},"trackers":{},"trackers_data":{},"tracking_org_exceptions":{},"tracking_org_relationships":{},"typosquatting":{},"unused_site_permissions":{},"usb_chooser_data":{},"usb_guard":{},"vr":{},"web_app_installation":{},"webid_api":{},"webid_auto_reauthn":{},"window_placement":{}},"pref_version":1},"created_by_version":"146.0.3856.72","creation_time":"13418958126254697","default_content_setting_values":{"has_migrated_local_network_access":true},"edge_password_is_using_new_login_db_path":false,"edge_password_login_db_path_flip_flop_count":0,"edge_profile_id":"55057814-2963-4d9a-a339-846f355d760e","edge_user_with_non_zero_passwords":false,"exit_type":"Crashed","has_seen_signin_fre":false,"is_relative_to_aad":false,"last_engagement_time":"13418958144213345","last_time_obsolete_http_credentials_removed":1774484586.449283,"last_time_password_store_metrics_reported":1774484556.443809,"managed_user_id":"","name":"Profile 1","network_pbs":{},"password_hash_data_list":[],"signin_fre_seen_time":"13418958126347502","were_old_google_logins_removed":true},"reset_prepopulated_engines":false,"safety_hub":{"unused_site_permissions_revocation":{"migration_completed":true}},"saved_tab_groups":{"did_enable_shared_tab_groups_in_last_session":false,"specifics_to_data_migration":true},"sessions":{"event_log":[{"crashed":false,"time":"13418958126458657","type":0}],"session_data_status":1},"shopping":{"contextual_features_enabled":true,"dma_telemetry_expiration_time":"13419044526686574","pcb_supported":true},"signin":{"accounts_metadata_dict":{},"allowed":true},"spellcheck":{"dictionaries":["en-US"],"dictionary":""},"sync":{"apps":true,"autofill":true,"bookmarks":true,"collections":true,"collections_edge_re_evaluated":true,"collections_edge_supported":true,"edge_account_type":0,"edge_wallet":true,"edge_wallet_edge_supported":true,"edge_workspaces":true,"edge_workspaces_edge_supported":true,"encryption_bootstrap_token_per_account_migration_done":true,"extensions":true,"extensions_edge_supported":true,"history_edge_supported":true,"keep_everything_synced":false,"passwords":true,"preferences":true,"tabs":true,"tabs_edge_supported":true,"typed_urls":true},"syncing_theme_prefs_migrated_to_non_syncing":true,"toolbar":{"pinned_cast_migration_complete":true,"pinned_chrome_labs_migration_complete":true},"toolbar_declutter":{"new_user_cleanup_triggered":true,"undo":{"last_time":"13418958141723453"}},"total_passwords_available_for_account":0,"total_passwords_available_for_profile":0,"translate_site_blacklist":[],"translate_site_blocklist_with_time":{},"typosquatting":{"allowlist_migration_done":true},"user_experience_metrics":{"personalization_data_consent_enabled_last_known_value":false},"web_apps":{"did_migrate_default_chrome_apps":["MigrateDefaultChromeAppToWebAppsGSuite","MigrateDefaultChromeAppToWebAppsNonGSuite"],"last_preinstall_synchronize_version":"146","link_handling_info":{"enabled_for_installed_apps":true}}} \ No newline at end of file diff --git a/.edge-profile-render-1774484525680/Default/PreferredApps b/.edge-profile-render-1774484525680/Default/PreferredApps new file mode 100644 index 0000000..7d3a425 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/PreferredApps @@ -0,0 +1 @@ +{"preferred_apps":[],"version":1} \ No newline at end of file diff --git a/.edge-profile-render-1774484525680/Default/README b/.edge-profile-render-1774484525680/Default/README new file mode 100644 index 0000000..4a34402 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/README @@ -0,0 +1 @@ +Microsoft Edge settings and storage represent user-selected preferences and information and MUST not be extracted, overwritten or modified except through Microsoft Edge defined APIs. \ No newline at end of file diff --git a/.edge-profile-render-1774484525680/Default/Safe Browsing Network/NetworkDataMigrated b/.edge-profile-render-1774484525680/Default/Safe Browsing Network/NetworkDataMigrated new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/Safe Browsing Network/Safe Browsing Cookies b/.edge-profile-render-1774484525680/Default/Safe Browsing Network/Safe Browsing Cookies new file mode 100644 index 0000000..54a3739 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Safe Browsing Network/Safe Browsing Cookies differ diff --git a/.edge-profile-render-1774484525680/Default/Safe Browsing Network/Safe Browsing Cookies-journal b/.edge-profile-render-1774484525680/Default/Safe Browsing Network/Safe Browsing Cookies-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/Secure Preferences b/.edge-profile-render-1774484525680/Default/Secure Preferences new file mode 100644 index 0000000..1c4ebf7 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Secure Preferences @@ -0,0 +1 @@ +{"edge_fundamentals_appdefaults":{"enclave_version":101},"ess_kv_states":{"restore_on_startup":{"closed_notification":false,"decrypt_success":true,"key":"restore_on_startup","notification_popup_count":0},"startup_urls":{"closed_notification":false,"decrypt_success":true,"key":"startup_urls","notification_popup_count":0},"template_url_data":{"closed_notification":false,"decrypt_success":true,"key":"template_url_data","notification_popup_count":0}},"extensions":{"settings":{"ahfgeienlihckogmohjhadlkjgocpleb":{"account_extension_type":0,"active_permissions":{"api":["management","system.display","system.storage","webstorePrivate","system.cpu","system.memory","system.network"],"explicit_host":[],"manifest_permissions":[],"scriptable_host":[]},"app_launcher_ordinal":"t","commands":{},"content_settings":[],"creation_flags":1,"disable_reasons":[],"events":[],"first_install_time":"13418958126495016","from_webstore":false,"incognito_content_settings":[],"incognito_preferences":{},"last_update_time":"13418958126495016","location":5,"manifest":{"app":{"launch":{"web_url":"https://chrome.google.com/webstore"},"urls":["https://chrome.google.com/webstore"]},"description":"Discover extensions for Microsoft Edge.","icons":{"128":"webstore_icon_128.png","16":"webstore_icon_16.png"},"key":"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCtl3tO0osjuzRsf6xtD2SKxPlTfuoy7AWoObysitBPvH5fE1NaAA1/2JkPWkVDhdLBWLaIBPYeXbzlHp3y4Vv/4XG+aN5qFE3z+1RU/NqkzVYHtIpVScf3DjTYtKVL66mzVGijSoAIwbFCC3LpGdaoe6Q1rSRDp76wR6jjFzsYwQIDAQAB","name":"Web Store","permissions":["webstorePrivate","management","system.cpu","system.display","system.memory","system.network","system.storage"],"version":"0.2"},"needs_sync":true,"page_ordinal":"n","path":"C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\146.0.3856.72\\resources\\web_store","preferences":{},"regular_only_preferences":{},"was_installed_by_default":false,"was_installed_by_oem":false},"cjneempfhkonkkbcmnfdibgobmhbagaj":{"active_permissions":{"api":[],"explicit_host":[],"manifest_permissions":[],"scriptable_host":[]},"disable_reasons":[8192],"granted_permissions":{"api":[],"explicit_host":[],"manifest_permissions":[],"scriptable_host":[]}},"dgiklkfkllikcanfonkcabmbdfmgleag":{"account_extension_type":0,"active_permissions":{"api":[],"explicit_host":[],"manifest_permissions":[],"scriptable_host":[]},"commands":{},"content_settings":[],"creation_flags":1,"disable_reasons":[],"events":[],"first_install_time":"13418958126500077","from_webstore":false,"incognito_content_settings":[],"incognito_preferences":{},"last_update_time":"13418958126500077","location":5,"manifest":{"content_capabilities":{"include_globs":["https://*excel.officeapps.live.com/*","https://*onenote.officeapps.live.com/*","https://*powerpoint.officeapps.live.com/*","https://*word-edit.officeapps.live.com/*","https://*excel.officeapps.live.com.mcas.ms/*","https://*onenote.officeapps.live.com.mcas.ms/*","https://*word-edit.officeapps.live.com.mcas.ms/*","https://*excel.partner.officewebapps.cn/*","https://*onenote.partner.officewebapps.cn/*","https://*powerpoint.partner.officewebapps.cn/*","https://*word-edit.partner.officewebapps.cn/*","https://*excel.gov.online.office365.us/*","https://*onenote.gov.online.office365.us/*","https://*powerpoint.gov.online.office365.us/*","https://*word-edit.gov.online.office365.us/*","https://*excel.dod.online.office365.us/*","https://*onenote.dod.online.office365.us/*","https://*powerpoint.dod.online.office365.us/*","https://*word-edit.dod.online.office365.us/*","https://*visio.partner.officewebapps.cn/*","https://*visio.gov.online.office365.us/*","https://*visio.dod.online.office365.us/*"],"matches":["https://*.officeapps.live.com/*","https://*.officeapps.live.com.mcas.ms/*","https://*.partner.officewebapps.cn/*","https://*.gov.online.office365.us/*","https://*.dod.online.office365.us/*","https://*.app.whiteboard.microsoft.com/*","https://*.whiteboard.office.com/*","https://*.app.int.whiteboard.microsoft.com/*","https://*.whiteboard.office365.us/*","https://*.dev.whiteboard.microsoft.com/*"],"permissions":["clipboardRead","clipboardWrite"]},"default_locale":"en","description":"This extension grants Microsoft web sites permission to read and write from the clipboard.","key":"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCz4t/X7GeuP6GBpjmxndrjtzF//4CWeHlC68rkoV7hP3h5Ka6eX7ZMNlYJkSjmB5iRmPHO5kR1y7rGY8JXnRPDQh/CQNLVA7OsKeV6w+UO+vx8KGI+TrTAhzH8YGcMIsxsUjxtC4cBmprja+xDr0zVp2EMgqHu+GBKgwSRHTkDuwIDAQAB","manifest_version":2,"minimum_chrome_version":"77","name":"Microsoft Clipboard Extension","version":"1.0"},"path":"C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\146.0.3856.72\\resources\\edge_clipboard","preferences":{},"regular_only_preferences":{},"was_installed_by_default":false,"was_installed_by_oem":false},"ehlmnljdoejdahfjdfobmpfancoibmig":{"active_permissions":{"api":[],"explicit_host":[],"manifest_permissions":[],"scriptable_host":[]},"disable_reasons":[8192],"granted_permissions":{"api":[],"explicit_host":[],"manifest_permissions":[],"scriptable_host":[]}},"fikbjbembnmfhppjfnmfkahdhfohhjmg":{"account_extension_type":0,"active_permissions":{"api":[],"explicit_host":[],"manifest_permissions":[],"scriptable_host":[]},"commands":{},"content_settings":[],"creation_flags":1,"disable_reasons":[],"events":[],"first_install_time":"13418958126503376","from_webstore":false,"incognito_content_settings":[],"incognito_preferences":{},"last_update_time":"13418958126503376","location":5,"manifest":{"background":{"persistent":false,"scripts":["background.js"]},"externally_connectable":{"matches":["https://*.microsoftstream.com/*"]},"incognito":"split","key":"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsAmDrYmQaYQlLxSAn/jTQTGNt1IffJGIJeKucE/B42d8QIyFD2RCarmHP1bmbY1YuTng2dL3J//qyvUNwXPt9cmxH9WKwi512tzOa5r2zYaCuOgP2vAIrah/bKnpO3XmUfFWj+LRcbZahOmMDMQxzPKxFKuIz2eOiakBXDE6Ok7azHJ13LLQTte1JgZIPmyFrAciPABLp/IKLfsfnebVW1YgaOyxBNyp/7bhSmoyZI3kBv8InKOpGE8pttrBg6l5zkvD67a7ViNAYkqZIpJJV5ZTQtVWCWSG0xU2y+3zXZtx8KbGbDiWUAcwNYDVPpsV+IQXVpgAplHvrZme+hAl6QIDAQAB","manifest_version":2,"name":"Media Internals Services Extension","permissions":["mediaInternalsPrivate"],"version":"2.0.0"},"path":"C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\146.0.3856.72\\resources\\media_internals_services","preferences":{},"regular_only_preferences":{},"was_installed_by_default":false,"was_installed_by_oem":false},"fjngpfnaikknjdhkckmncgicobbkcnle":{"active_permissions":{"api":[],"explicit_host":[],"manifest_permissions":[],"scriptable_host":[]},"disable_reasons":[8192],"granted_permissions":{"api":[],"explicit_host":[],"manifest_permissions":[],"scriptable_host":[]}},"gbihlnbpmfkodghomcinpblknjhneknc":{"active_permissions":{"api":[],"explicit_host":[],"manifest_permissions":[],"scriptable_host":[]},"disable_reasons":[8192],"granted_permissions":{"api":[],"explicit_host":[],"manifest_permissions":[],"scriptable_host":[]}},"gbmoeijgfngecijpcnbooedokgafmmji":{"active_permissions":{"api":[],"explicit_host":[],"manifest_permissions":[],"scriptable_host":[]},"disable_reasons":[8192],"granted_permissions":{"api":[],"explicit_host":[],"manifest_permissions":[],"scriptable_host":[]}},"gcinnojdebelpnodghnoicmcdmamjoch":{"active_permissions":{"api":[],"explicit_host":[],"manifest_permissions":[],"scriptable_host":[]},"disable_reasons":[8192],"granted_permissions":{"api":[],"explicit_host":[],"manifest_permissions":[],"scriptable_host":[]}},"gecfnmoodchdkebjjffmdcmeghkflpib":{"active_permissions":{"api":[],"explicit_host":[],"manifest_permissions":[],"scriptable_host":[]},"disable_reasons":[8192],"granted_permissions":{"api":[],"explicit_host":[],"manifest_permissions":[],"scriptable_host":[]}},"ghbmnnjooekpmoecnnnilnnbdlolhkhi":{"account_extension_type":0,"ack_external":true,"active_permissions":{"api":["alarms","storage","unlimitedStorage","offscreen"],"explicit_host":["https://docs.google.com/*","https://drive.google.com/*"],"manifest_permissions":[],"scriptable_host":[]},"commands":{},"content_settings":[],"creation_flags":1048713,"disable_reasons":[134217728],"edge_last_update_check_time":"13418958141409835","first_install_time":"13418958141406884","from_webstore":true,"granted_permissions":{"api":["alarms","storage","unlimitedStorage","offscreen"],"explicit_host":["https://docs.google.com/*","https://drive.google.com/*"],"manifest_permissions":[],"scriptable_host":[]},"incognito_content_settings":[],"incognito_preferences":{},"last_update_time":"13418958141406884","location":6,"manifest":{"author":{"email":"docs-hosted-app-own@google.com"},"background":{"service_worker":"service_worker_bin_prod.js"},"content_capabilities":{"matches":["https://docs.google.com/*","https://drive.google.com/*","https://drive-autopush.corp.google.com/*","https://drive-daily-0.corp.google.com/*","https://drive-daily-1.corp.google.com/*","https://drive-daily-2.corp.google.com/*","https://drive-daily-3.corp.google.com/*","https://drive-daily-4.corp.google.com/*","https://drive-daily-5.corp.google.com/*","https://drive-daily-6.corp.google.com/*","https://drive-preprod.corp.google.com/*","https://drive-staging.corp.google.com/*"],"permissions":["clipboardRead","clipboardWrite","unlimitedStorage"]},"content_security_policy":{"extension_pages":"script-src 'self'; object-src 'self'"},"current_locale":"en_US","default_locale":"en_US","description":"Edit, create, and view your documents, spreadsheets, and presentations — all without internet access.","externally_connectable":{"matches":["https://docs.google.com/*","https://drive.google.com/*","https://drive-autopush.corp.google.com/*","https://drive-daily-0.corp.google.com/*","https://drive-daily-1.corp.google.com/*","https://drive-daily-2.corp.google.com/*","https://drive-daily-3.corp.google.com/*","https://drive-daily-4.corp.google.com/*","https://drive-daily-5.corp.google.com/*","https://drive-daily-6.corp.google.com/*","https://drive-preprod.corp.google.com/*","https://drive-staging.corp.google.com/*"]},"host_permissions":["https://docs.google.com/*","https://drive.google.com/*"],"icons":{"128":"128.png"},"key":"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnF7RGLAxIon0/XeNZ4MLdP3DMkoORzEAKVg0sb89JpA/W2osTHr91Wqwdc9lW0mFcSpCYS9Y3e7cUMFo/M2ETASIuZncMiUzX2/0rrWtGQ3UuEj3KSe5PdaVZfisyJw/FebvHwirEWrhqcgzVUj9fL9YjE0G45d1zMKcc1umKvLqPyTznNuKBZ9GJREdGLRJCBmUgCkI8iwtwC+QZTUppmaD50/ksnEUXv+QkgGN07/KoNA5oAgo49Jf1XBoMv4QXtVZQlBYZl84zAsI82hb63a6Gu29U/4qMWDdI7+3Ne5TRvo6Zi3EI4M2NQNplJhik105qrz+eTLJJxvf4slrWwIDAQAB","manifest_version":3,"minimum_chrome_version":"88","name":"Google Docs Offline","permissions":["alarms","storage","unlimitedStorage","offscreen"],"storage":{"managed_schema":"dasherSettingSchema.json"},"update_url":"https://clients2.google.com/service/update2/crx","version":"1.102.1","web_accessible_resources":[{"matches":["\u003Call_urls>"],"resources":["page_embed_script.js"]}]},"path":"ghbmnnjooekpmoecnnnilnnbdlolhkhi\\1.102.1_0","pending_on_installed_event_dispatch_info":{"previous_version":""},"preferences":{},"regular_only_preferences":{},"was_installed_by_default":true,"was_installed_by_oem":false,"withholding_permissions":false},"hfmgbegjielnmfghmoohgmplnpeehike":{"active_permissions":{"api":[],"explicit_host":[],"manifest_permissions":[],"scriptable_host":[]},"disable_reasons":[8192],"granted_permissions":{"api":[],"explicit_host":[],"manifest_permissions":[],"scriptable_host":[]}},"iglcjdemknebjbklcgkfaebgojjphkec":{"account_extension_type":0,"active_permissions":{"api":["identity","management","metricsPrivate","webstorePrivate","hubPrivate"],"explicit_host":[],"manifest_permissions":[],"scriptable_host":[]},"app_launcher_ordinal":"w","commands":{},"content_settings":[],"creation_flags":1,"disable_reasons":[],"events":[],"first_install_time":"13418958126499119","from_webstore":false,"incognito_content_settings":[],"incognito_preferences":{},"last_update_time":"13418958126499119","location":5,"manifest":{"app":{"launch":{"web_url":"https://microsoftedge.microsoft.com"},"urls":["https://microsoftedge.microsoft.com"]},"description":"Discover extensions for Microsoft Edge.","icons":{"128":"webstore_icon_128.png","16":"webstore_icon_16.png"},"key":"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtMvN4+y6cd3el/A/NT5eUnrz1WiD1WJRaJfMBvaMtJHIuFGEmYdYL/YuE74J19+pwhjOHeFZ3XUSMTdOa5moOaXXvdMr5wWaaN2frHewtAnNDO64NGbbZvdsfGm/kRkHKVGNV6dacZsAkylcz5CkwTmq97wOZ7ETaShHvhZEGwRQIt4K1poxurOkDYQw9ERZNf3fgYJ9ZTrLZMAFDLJY+uSF03pClWrr8VGc8LUQ4Naktb8QSgVUlrS14AdF/ESdbhnTvvdB0e7peNWRyoNtCqLJsbtTtBL6sOnqfusnwPowuueOFI+XskOT9TvLo6PcgxhLX5+d0mM+Jtn6PFTU8QIDAQAB","name":"Microsoft Store","permissions":["webstorePrivate","management","metricsPrivate","identity","hubPrivate"],"version":"0.2"},"needs_sync":true,"page_ordinal":"n","path":"C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\146.0.3856.72\\resources\\microsoft_web_store","preferences":{},"regular_only_preferences":{},"was_installed_by_default":false,"was_installed_by_oem":false},"ihmafllikibpmigkcoadcmckbfhibefp":{"account_extension_type":0,"active_permissions":{"api":["debugger","feedbackPrivate","fileSystem","fileSystem.write","app.window.fullscreen","metricsPrivate","storage","tabs","fileSystem.readFullPath","edgeInternetConnectivityPrivate"],"explicit_host":["edge://resources/*"],"manifest_permissions":[],"scriptable_host":[]},"commands":{},"content_settings":[],"creation_flags":1,"disable_reasons":[],"events":["edgeFeedbackPrivate.onFeedbackRequested"],"first_install_time":"13418958126502145","from_webstore":false,"incognito_content_settings":[],"incognito_preferences":{},"last_update_time":"13418958126502145","location":5,"manifest":{"app":{"background":{"scripts":["js/event_handler.js"]},"content_security_policy":"default-src 'none'; script-src 'self' blob: filesystem: chrome://resources; style-src 'unsafe-inline' blob: chrome: file: filesystem: data: *; img-src * blob: chrome: file: filesystem: data:; media-src 'self' blob: filesystem:; connect-src data:"},"description":"User feedback extension","display_in_launcher":false,"display_in_new_tab_page":false,"icons":{"128":"images/icon128.png","16":"images/icon16.png","192":"images/icon192.png","32":"images/icon32.png","48":"images/icon48.png"},"incognito":"split","key":"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAl3vxWwvLjcMIFK4OfG6C8PmJkMhFYDKRnx+SqG23YlMG1A+bOkiNmAN1TWpFPPp1f2PpbiZGNq1y29u/QfkD+PC4bnO7GbNw/2X5tGoP0n2K+KGGAxhnr0ki/oyo2eiFGSTOXlQvTRo5q1vB+Lbg+9TbFsWKlHZyAkeZ/YGz/iijHTqw8Q4RWdl5Tp8SlUhS/92EsWhveNJLW22veaT/Up2iSeSSwfyoHVYy8LUPaD4fbyLvPQacVLJq1dac2bNDqjaNvSPgPWCnkZtDmawZrgxT53otLCES/e96xfAf8I24VHIc1pVP8LqdqKr1AV1Yxn93h3VJ2QejtEhIAWHU6QIDAQAB","manifest_version":2,"name":"Edge Feedback","permissions":["chrome://resources/","debugger","edgeInternetConnectivityPrivate","feedbackPrivate",{"fileSystem":["readFullPath","write"]},"fullscreen","metricsPrivate","storage","windows"],"version":"1.0.0.1"},"path":"C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\146.0.3856.72\\resources\\edge_feedback","preferences":{},"regular_only_preferences":{},"running":false,"was_installed_by_default":false,"was_installed_by_oem":false},"jbleckejnaboogigodiafflhkajdmpcl":{"active_permissions":{"api":[],"explicit_host":[],"manifest_permissions":[],"scriptable_host":[]},"disable_reasons":[8192],"granted_permissions":{"api":[],"explicit_host":[],"manifest_permissions":[],"scriptable_host":[]}},"jdiccldimpdaibmpdkjnbmckianbfold":{"account_extension_type":0,"active_permissions":{"api":["activeTab","metricsPrivate","storage","systemPrivate","ttsEngine","errorReporting"],"explicit_host":["https://*.bing.com/*"],"manifest_permissions":[],"scriptable_host":[]},"commands":{},"content_settings":[],"creation_flags":1,"disable_reasons":[],"events":["ttsEngine.onPause","ttsEngine.onResume","ttsEngine.onSpeak","ttsEngine.onStop"],"first_install_time":"13418958126505632","from_webstore":false,"incognito_content_settings":[],"incognito_preferences":{},"last_update_time":"13418958126505632","location":5,"manifest":{"background":{"persistent":false,"scripts":["lifetimeHelper.js","telemetryHelper.js","errorHelper.js","voiceList/voiceListRequester.js","voiceList/voiceListSingleton.js","voiceList/voiceModel.js","manifestHelper.js","config.js","ssml.js","uuid.js","wordBoundary.js","audioStreamer.js","wordBoundaryEventManager.js","audioViewModel.js","background.js"]},"description":"Provides access to Microsoft's online text-to-speech voices","key":"AAAAB3NzaC1yc2EAAAADAQABAAAAgQDjGOAV6/3fmEtQmFqlmqm5cZ+jlNhd6XikwMDp0I7BKh+AjG3aBIG/qqwlsF/7LAGatnSxBwUwZC0qMnGXtcOPVl26Q8OvMx0gt5Va5gxca+ae0Skluj9WN9TNxPFVhw21WbCt4D9q3kb+XXDlx/7v1ktYus4Fwr/skkjADG9cIQ==","manifest_version":2,"name":"Microsoft Voices","permissions":["activeTab","errorReporting","metricsPrivate","storage","systemPrivate","ttsEngine","https://*.bing.com/"],"tts_engine":{"voices":[{"codec":"audio-24khz-48kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"en-US","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (en-US, AriaNeural)","voice_name":"Microsoft Aria Online (Natural) - English (United States)"},{"codec":"audio-24khz-48kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"en-US","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (en-US, GuyNeural)","voice_name":"Microsoft Guy Online (Natural) - English (United States)"},{"codec":"audio-24khz-48kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"zh-CN","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (zh-CN, XiaoxiaoNeural)","voice_name":"Microsoft Xiaoxiao Online (Natural) - Chinese (Mainland)"},{"codec":"audio-24khz-48kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"zh-CN","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (zh-CN, YunyangNeural)","voice_name":"Microsoft Yunyang Online (Natural) - Chinese (Mainland)"},{"codec":"audio-16khz-32kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"zh-TW","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (zh-TW, HanHanRUS)","voice_name":"Microsoft HanHan Online - Chinese (Taiwan)"},{"codec":"audio-16khz-32kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"zh-HK","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (zh-HK, TracyRUS)","voice_name":"Microsoft Tracy Online - Chinese (Hong Kong)"},{"codec":"audio-24khz-48kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"ja-JP","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (ja-JP, NanamiNeural)","voice_name":"Microsoft Nanami Online (Natural) - Japanese (Japan)"},{"codec":"audio-24khz-48kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"en-GB","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (en-GB, LibbyNeural)","voice_name":"Microsoft Libby Online (Natural) - English (United Kingdom)"},{"codec":"audio-24khz-48kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"pt-BR","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (pt-BR, FranciscaNeural)","voice_name":"Microsoft Francisca Online (Natural) - Portuguese (Brazil)"},{"codec":"audio-24khz-48kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"es-MX","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (es-MX, DaliaNeural)","voice_name":"Microsoft Dalia Online (Natural) - Spanish (Mexico)"},{"codec":"audio-16khz-32kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"en-IN","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (en-IN, PriyaRUS)","voice_name":"Microsoft Priya Online - English (India)"},{"codec":"audio-16khz-32kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"en-CA","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (en-CA, HeatherRUS)","voice_name":"Microsoft Heather Online - English (Canada)"},{"codec":"audio-24khz-48kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"fr-CA","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (fr-CA, SylvieNeural)","voice_name":"Microsoft Sylvie Online (Natural) - French (Canada)"},{"codec":"audio-24khz-48kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"fr-FR","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (fr-FR, DeniseNeural)","voice_name":"Microsoft Denise Online (Natural) - French (France)"},{"codec":"audio-24khz-48kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"de-DE","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (de-DE, KatjaNeural)","voice_name":"Microsoft Katja Online (Natural) - German (Germany)"},{"codec":"audio-16khz-32kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"ru-RU","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (ru-RU, EkaterinaRUS)","voice_name":"Microsoft Ekaterina Online - Russian (Russia)"},{"codec":"audio-16khz-32kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"en-AU","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (en-AU, HayleyRUS)","voice_name":"Microsoft Hayley Online - English (Australia)"},{"codec":"audio-24khz-48kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"it-IT","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (it-IT, ElsaNeural)","voice_name":"Microsoft Elsa Online (Natural) - Italian (Italy)"},{"codec":"audio-24khz-48kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"ko-KR","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (ko-KR, SunHiNeural)","voice_name":"Microsoft SunHi Online (Natural) - Korean (Korea)"},{"codec":"audio-16khz-32kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"nl-NL","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (nl-NL, HannaRUS)","voice_name":"Microsoft Hanna Online - Dutch (Netherlands)"},{"codec":"audio-24khz-48kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"es-ES","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (es-ES, ElviraNeural)","voice_name":"Microsoft Elvira Online (Natural) - Spanish (Spain)"},{"codec":"audio-24khz-48kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"tr-TR","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (tr-TR, EmelNeural)","voice_name":"Microsoft Emel Online (Natural) - Turkish (Turkey)"},{"codec":"audio-16khz-32kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"pl-PL","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (pl-PL, PaulinaRUS)","voice_name":"Microsoft Paulina Online - Polish (Poland)"}]},"version":"1.0"},"path":"C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\146.0.3856.72\\resources\\microsoft_voices","preferences":{},"regular_only_preferences":{},"was_installed_by_default":false,"was_installed_by_oem":false},"jmjflgjpcpepeafmmgdpfkogkghcpiha":{"account_extension_type":0,"ack_external":true,"active_permissions":{"api":[],"explicit_host":[],"manifest_permissions":[],"scriptable_host":["https://chrome.google.com/webstore/*","https://chromewebstore.google.com/*"]},"commands":{},"content_settings":[],"creation_flags":8321,"disable_reasons":[],"edge_last_update_check_time":"13418958139422388","events":[],"first_install_time":"13418958139408543","from_webstore":false,"granted_permissions":{"api":[],"explicit_host":[],"manifest_permissions":[],"scriptable_host":["https://chrome.google.com/webstore/*","https://chromewebstore.google.com/*"]},"incognito_content_settings":[],"incognito_preferences":{},"last_update_time":"13418958139408543","lastpingday":"13418956800834878","location":10,"manifest":{"content_scripts":[{"js":["content.js"],"matches":["https://chrome.google.com/webstore/*"]},{"js":["content_new.js"],"matches":["https://chromewebstore.google.com/*"]}],"description":"Edge relevant text changes on select websites to improve user experience and precisely surfaces the action they want to take.","key":"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu06p2Mjoy6yJDUUjCe8Hnqvtmjll73XqcbylxFZZWe+MCEAEK+1D0Nxrp0+IuWJL02CU3jbuR5KrJYoezA36M1oSGY5lIF/9NhXWEx5GrosxcBjxqEsdWv/eDoOOEbIvIO0ziMv7T1SUnmAA07wwq8DXWYuwlkZU/PA0Mxx0aNZ5+QyMfYqRmMpwxkwPG8gyU7kmacxgCY1v7PmmZo1vSIEOBYrxl064w5Q6s/dpalSJM9qeRnvRMLsszGY/J2bjQ1F0O2JfIlBjCOUg/89+U8ZJ1mObOFrKO4um8QnenXtH0WGmsvb5qBNrvbWNPuFgr2+w5JYlpSQ+O8zUCb8QZwIDAQAB","manifest_version":3,"name":"Edge relevant text changes","update_url":"https://edge.microsoft.com/extensionwebstorebase/v1/crx","version":"1.2.1"},"path":"jmjflgjpcpepeafmmgdpfkogkghcpiha\\1.2.1_0","preferences":{},"regular_only_preferences":{},"was_installed_by_default":true,"was_installed_by_oem":false},"kfihiegbjaloebkmglnjnljoljgkkchm":{"active_permissions":{"api":[],"explicit_host":[],"manifest_permissions":[],"scriptable_host":[]},"disable_reasons":[8192],"granted_permissions":{"api":[],"explicit_host":[],"manifest_permissions":[],"scriptable_host":[]}},"kieiaeokhmlbffedbdfgbdcnhgpcckkn":{"active_permissions":{"api":[],"explicit_host":[],"manifest_permissions":[],"scriptable_host":[]},"disable_reasons":[8192],"granted_permissions":{"api":[],"explicit_host":[],"manifest_permissions":[],"scriptable_host":[]}},"mhjfbmdgcfjbbpaeojofohoefgiehjai":{"account_extension_type":0,"active_permissions":{"api":["contentSettings","fileSystem","fileSystem.write","metricsPrivate","tabs","resourcesPrivate","pdfViewerPrivate","fileSystem.readFullPath","errorReporting","edgeLearningToolsPrivate","fileSystem.getCurrentEntry","edgePdfPrivate","edgeCertVerifierPrivate"],"explicit_host":["edge://resources/*","edge://webui-test/*"],"manifest_permissions":[],"scriptable_host":[]},"commands":{},"content_settings":[],"creation_flags":1,"disable_reasons":[],"events":[],"first_install_time":"13418958126496660","from_webstore":false,"incognito_content_settings":[],"incognito_preferences":{},"last_update_time":"13418958126496660","location":5,"manifest":{"content_security_policy":"script-src 'self' 'wasm-eval' blob: filesystem: chrome://resources chrome://webui-test; object-src * blob: externalfile: file: filesystem: data:; trusted-types edge-internal fast-html pdf-url edge-pdf-static-policy;","description":"","incognito":"split","key":"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDN6hM0rsDYGbzQPQfOygqlRtQgKUXMfnSjhIBL7LnReAVBEd7ZmKtyN2qmSasMl4HZpMhVe2rPWVVwBDl6iyNE/Kok6E6v6V3vCLGsOpQAuuNVye/3QxzIldzG/jQAdWZiyXReRVapOhZtLjGfywCvlWq7Sl/e3sbc0vWybSDI2QIDAQAB","manifest_version":2,"mime_types":["application/pdf"],"mime_types_handler":"edge_pdf/index.html","name":"Microsoft Edge PDF Viewer","offline_enabled":true,"permissions":["errorReporting","chrome://resources/","chrome://webui-test/","contentSettings","metricsPrivate","edgeCertVerifierPrivate","edgeLearningToolsPrivate","edgePdfPrivate","pdfViewerPrivate","resourcesPrivate","tabs",{"fileSystem":["write","readFullPath","getCurrentEntry"]}],"version":"1"},"path":"C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\146.0.3856.72\\resources\\edge_pdf","preferences":{},"regular_only_preferences":{},"was_installed_by_default":false,"was_installed_by_oem":false},"ncbjelpjchkpbikbpkcchkhkblodoama":{"account_extension_type":0,"active_permissions":{"api":[],"explicit_host":[],"manifest_permissions":[],"scriptable_host":[]},"commands":{},"content_settings":[],"creation_flags":1,"disable_reasons":[],"events":[],"first_install_time":"13418958126504241","from_webstore":false,"incognito_content_settings":[],"incognito_preferences":{},"last_update_time":"13418958126504241","location":5,"manifest":{"background":{"persistent":false,"scripts":["background.js"]},"externally_connectable":{"matches":["https://*.teams.cloud.microsoft/*","https://*.teams.cloud.microsoft.com/*","https://*.teams.microsoft.com/*","https://*.skype.com/*","https://*.teams.live.com/*"]},"incognito":"split","key":"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtAdFAR3ckd5c7G8VSzUj4Ltt/QRInUOD00StG95LweksGcLBlFlYL46cHFVgHHj1gmzcpBtgsURdcrAC3V8yiE7GY4wtpOP+9l+adUGR+cyOG0mw9fLjyH+2Il0QqktsNXzkNiE1ogW4l0h4+PJc262j0vtm4hBzMvR0QScFWcAIcAErlUiWTt4jefXCAYqubV99ed5MvVMWBxe97wOa9hYwAhbCminOepA4RRTg9eyi0TiuHpq/bNI8C5qZgKIQNBAjgiFBaIx9hiMBFlK4NHUbFdgY6Qp/hSCMNurctwz1jpsXEnT4eHg1YWXfquoH8s4swIjkFCMBF6Ejc3cUkQIDAQAB","manifest_version":2,"name":"WebRTC Internals Extension","permissions":["webrtcInternalsPrivate"],"version":"2.0.4"},"path":"C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\146.0.3856.72\\resources\\webrtc_internals","preferences":{},"regular_only_preferences":{},"was_installed_by_default":false,"was_installed_by_oem":false},"nkbndigcebkoaejohleckhekfmcecfja":{"active_permissions":{"api":[],"explicit_host":[],"manifest_permissions":[],"scriptable_host":[]},"disable_reasons":[8192],"granted_permissions":{"api":[],"explicit_host":[],"manifest_permissions":[],"scriptable_host":[]}},"nkeimhogjdpnpccoofpliimaahmaaome":{"account_extension_type":0,"active_permissions":{"api":["processes","webrtcLoggingPrivate","system.cpu","enterprise.hardwarePlatform"],"explicit_host":[],"manifest_permissions":[],"scriptable_host":[]},"commands":{},"content_settings":[],"creation_flags":1,"disable_reasons":[],"events":["runtime.onConnectExternal"],"first_install_time":"13418958126500995","from_webstore":false,"incognito_content_settings":[],"incognito_preferences":{},"last_update_time":"13418958126500995","location":5,"manifest":{"background":{"page":"background.html","persistent":false},"externally_connectable":{"matches":["https://*.teams.cloud.microsoft/*","https://*.teams.cloud.microsoft.com/*","https://*.teams.microsoft.com/*","https://*.teams.live.com/*","https://*.skype.com/*"]},"incognito":"split","key":"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDAQt2ZDdPfoSe/JI6ID5bgLHRCnCu9T36aYczmhw/tnv6QZB2I6WnOCMZXJZlRdqWc7w9jo4BWhYS50Vb4weMfh/I0On7VcRwJUgfAxW2cHB+EkmtI1v4v/OU24OqIa1Nmv9uRVeX0GjhQukdLNhAE6ACWooaf5kqKlCeK+1GOkQIDAQAB","manifest_version":2,"name":"WebRTC Extension","permissions":["enterprise.hardwarePlatform","processes","system.cpu","webrtcLoggingPrivate"],"version":"4.3.26"},"path":"C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\146.0.3856.72\\resources\\hangout_services","preferences":{},"regular_only_preferences":{},"was_installed_by_default":false,"was_installed_by_oem":false},"ofefcgjbeghpigppfmkologfjadafddi":{"active_permissions":{"api":[],"explicit_host":[],"manifest_permissions":[],"scriptable_host":[]},"disable_reasons":[8192],"granted_permissions":{"api":[],"explicit_host":[],"manifest_permissions":[],"scriptable_host":[]}}}},"protection":{"macs":{"browser":{"show_home_button":"31FF5D80FE6A795FE2CB19889367FD90F977BC3792C5CC4B7F2C871F9EC65B51","show_home_button_encrypted_hash":"djEw/EaiU6lf4K5bx/etLq4X3rKyePz0SJpaiYEqAonYAffQaa+GYkf6hxFoiY9zDiEHY3zuYr1jJ6XMHyyu"},"default_search_provider_data":{"template_url_data":"C29C79C4E396626377D93F0CFE362AE38EB2CF777B47270A973AB0832BE2C44A","template_url_data_encrypted_hash":"djEwPw8nATM9O4cZ+gSQik6dvqRUFZrYVWJl6YekNnDVa6+T5sP0iqdoskWe6TfZ8AzGW8Hg2TOT0CEMH3S7"},"edge":{"services":{"account_id":"F2F1D19FB2E3FD8E78B68415325EA250902A6D7D62358524F0149F48D60C5283","account_id_encrypted_hash":"djEwpp7QDzuTHUjIereMB43xrenQ0b6UMNHx5vmZpU48FhlkYhEJhShjGwiHcPkC1Zf38HHC5/sq6Dny/ND/","last_username":"FB026645C5CB39FB3C6A7DC05C3F440DAEF903369418370ABD00B5A8FC6FCDD6","last_username_encrypted_hash":"djEwZAR/m3IHQrpCB9drdudFq71pz3qBqyG95g42IWfO+zjxsvkHQMI2Sib3ZiRXkjmpRdBjSOZPryB3R+eP"}},"enterprise_signin":{"policy_recovery_token":"6830661AD96A6D2C8A4FFEEC044717FD0B40D619B1F7D796AC98415846694E66","policy_recovery_token_encrypted_hash":"djEwH5Ex6SWt2afCesSAHJpObNHCDkYBtHbIZ/MBnSa7zyNU247Xz8h3mhNYfWi6zIcH7tWa+FfcstEJAxmt"},"extensions":{"install":{"initiallist":"0E4D11D8EA5F952E24A14420326E68E050F617EA12021912C6698B74F7D96CC0","initiallist_encrypted_hash":"djEwBywnhZEKFN1zNZqcDSyKsH5WC0vzP2m5ihSAQWEwwjPsBf7tGc014fR/gq4RTzSnPVCjnvBLvpDSv4Sa","initialprovidername":"EA3F27681ED6AE05BE9BACE91C7A3736C7F214783B2C8898C6EA51C4B998428C","initialprovidername_encrypted_hash":"djEwUzmV9aecxBciMvccOulyIW3furWBIdZnyNVI4lIWGCTfGUbGcC6luFsUb8YySTza75FzYiZvgLtx2LDx"},"settings":{"ahfgeienlihckogmohjhadlkjgocpleb":"955D1CB39EED493D0FF097DF82C28B811A647F0E68DBD6D2D2904F2023EA130F","cjneempfhkonkkbcmnfdibgobmhbagaj":"DC9AF38222CB83198740249CF01E96A386E67D0DFF27BF4F00F6C334F6E99ED0","dgiklkfkllikcanfonkcabmbdfmgleag":"7195D29D8CCE690552EFA0281374AD2809E84BFBCB67A265E12A881B08AE5B44","ehlmnljdoejdahfjdfobmpfancoibmig":"2DEFABFC9B3B7FDDA5C3CBF8B75569FD4AA83A2108FF1A93AF8D6D17F2B0AF2C","fikbjbembnmfhppjfnmfkahdhfohhjmg":"B11030BB0FCF755A1644FAEDC4B48B8CECB35D9028A5A9102D4E10EF3299C709","fjngpfnaikknjdhkckmncgicobbkcnle":"073766A849236D1F22B73B2F972B9BD7ADC210ED7DFE5DC7E1A1E0DCD30B69C0","gbihlnbpmfkodghomcinpblknjhneknc":"77E4DFD7C26CF1730231F88F7F1EA03F2C736469920D956E9A2C163FDC245D7C","gbmoeijgfngecijpcnbooedokgafmmji":"9D787E72CE436D9B7C0F2B56E28818939B69A914EF95DE4D3E0AD8D606B68BE3","gcinnojdebelpnodghnoicmcdmamjoch":"693D49D45072C7681EED36972AE6F5DE536BBD606B7F4267C50E06072DE62D57","gecfnmoodchdkebjjffmdcmeghkflpib":"6E3F72652D907406A8E256F0E57045229290E2E90C043A398689513B12FAA44F","ghbmnnjooekpmoecnnnilnnbdlolhkhi":"E1E031D69B19887B20004F2F21694DFF40D135E4B0CA1CFB34D5FDA2C82C8E1F","hfmgbegjielnmfghmoohgmplnpeehike":"56C5D9BBB4E2DC35F5DA8A09147BB50F87D616330D2ED2B87E0856C674187A8A","iglcjdemknebjbklcgkfaebgojjphkec":"3D7125ECE3D94E90D2A51BC8AC9839BBD5FFAB8FAE3846C5AD24B4E965161932","ihmafllikibpmigkcoadcmckbfhibefp":"B5BDB480189BF535CF720D450A051FAD3DCDFAEDF237B48EC6AE7ACD0E10B890","jbleckejnaboogigodiafflhkajdmpcl":"8EACCCD8D8AC800CC2D3670792AECB3E6F0FF72811DAADF26B7B19A776A1CBED","jdiccldimpdaibmpdkjnbmckianbfold":"81F66F7304AAB439BD6AA0990058A72F6121C0E81F40330EDD3BC072677BDCE5","jmjflgjpcpepeafmmgdpfkogkghcpiha":"9733E1F7A0CB074606E47FE28861F5A4215D2936DB11B796C26E3138FF98A00D","kfihiegbjaloebkmglnjnljoljgkkchm":"FA72B14D9FD28AC0A2A4DCAF4ED1E8A86A5BC0FD84FEC2C784A5DA33E365D6D9","kieiaeokhmlbffedbdfgbdcnhgpcckkn":"CA83D2C7A9708E4BE517ACDBED479A3FD139262717BBF81C7B678547C40D2E88","mhjfbmdgcfjbbpaeojofohoefgiehjai":"A3901EE8CAFE0E8BE2A3EE837FEB7473803E4F313FED721F07F6E9882C88A5A0","ncbjelpjchkpbikbpkcchkhkblodoama":"DD50DB252FC3293975183C659C3E4AA4D2C770FF5FBC484C3522A626DB6A09DE","nkbndigcebkoaejohleckhekfmcecfja":"BC34FF5106DD18F2E9ABDDAD3C0BFA628272BDCDAEFE1E76BD66C45762BCA9B8","nkeimhogjdpnpccoofpliimaahmaaome":"3EEDE6C3B5CAC3629A4D3AC1EC9E1270E9EE52DBDF259CBE48072709CB9FD663","ofefcgjbeghpigppfmkologfjadafddi":"84EBAEA6D2A99AAA4ECEF58E561D2C30CB652E072D8CB0E6A4B576988F6A69A5"},"settings_encrypted_hash":{"ahfgeienlihckogmohjhadlkjgocpleb":"djEwwCeBah9kGkJ0jgqjK4+QbRzcTGGk4ezg+VfLRN/17TiPrGbWisqOQLTKWYuqlwvxrAz3xo9pcs4XKiFc","cjneempfhkonkkbcmnfdibgobmhbagaj":"djEwsiswjR8pgtltNbkZirnTfvsQ6TT/dXg6B8Uf+a3VefReJRRBROR2cwlWYLQMGoYCjb0aOj7nhYkRBrG1","dgiklkfkllikcanfonkcabmbdfmgleag":"djEws9PMXoKBqbBT/sEAITXDxekRCupsn4cj1Ir0NrmAU2JXXyKet5y/eFQdRIL6XFOuio1WYKQO9YxxnGvm","ehlmnljdoejdahfjdfobmpfancoibmig":"djEwaJCPq9UDvPzwkT0ePsuxoF342cxkFykNSOB0kK/YFTJgZovZ/rVOiswzscpEIzuMHqhLMbX2Yx+mJhoz","fikbjbembnmfhppjfnmfkahdhfohhjmg":"djEwb8CrpwVlx1/PLHlHgyp3FlxoWf3o7uq3iqX78uo00BUIyalZhmE96Sc7mjab0Ly+fFq6o0qMU40cy6Ei","fjngpfnaikknjdhkckmncgicobbkcnle":"djEw1GjqqrMiB/ON6Qa1fQwwhPY0nM6ui+gPCN4L4r3TjCdpr1tdKWKWtVuUNeqd+Jxvr/uYoBkxixCEOaHH","gbihlnbpmfkodghomcinpblknjhneknc":"djEwE2K22G80EONfqVkuPpqwFNncpWh/aUhU5mfMOyMUYLBJAN8oq7PAdOdDCwNZYTrS/KELvLdqhEfvTOc6","gbmoeijgfngecijpcnbooedokgafmmji":"djEwN71iS86059B7YAL/sa2+1PownPQn5bo2C/FmxvozyV3+cvgcIVYzGIoTA2NSvVFdWxSo1Sf/xK18xEK1","gcinnojdebelpnodghnoicmcdmamjoch":"djEwyJPxdlqrNcZqX7rDF8chYcIJsy4QX/Qej97Lr11NY8o/qMPb49gZwEpc9kjZwm3xHJxbwtBYYtf8xp/n","gecfnmoodchdkebjjffmdcmeghkflpib":"djEwpxVe+55S5IrXgv+vogBhbwZN62YY+NxVbmqB3cazw6+BHyYyl6W9IlMqHSDsWivpbnOsktg56j2MwQqB","ghbmnnjooekpmoecnnnilnnbdlolhkhi":"djEwAPf4iTqVT99qEmxJYdt6G7iPC0AgbE3FUOKAPIzUvyajZDJKmu+l47ZTNMynGnkvYz4QFEoCOfGty21R","hfmgbegjielnmfghmoohgmplnpeehike":"djEwzK7Pvw2R7fnc1G3TWidjQmS3aePKpGDtNj2PUzVwlraRJEh9hSUdE99/pkCqK+e7+JwC2mwcN+DQxtGN","iglcjdemknebjbklcgkfaebgojjphkec":"djEwGJCszNEVfdA3qYyIkb3yu+G5Qc7+IZB+xTtHlSDAumzRWrryfuSqgGLWWktdJRMLojmXVxDVsDe6mmEU","ihmafllikibpmigkcoadcmckbfhibefp":"djEwK/HJKbxaB3xjy6tcHzgg4ibHG17O0SBlgFvLIyPi/4Jh18nNVZ2yYY8hIU0kn2ZfE/02GLeIqFLvUWlk","jbleckejnaboogigodiafflhkajdmpcl":"djEwM0cN1k82s2QuMZaWkvkndiHaVyXUgjWCcQjzJk+F2/4snXLXISFUKySug3Z4JuwLZmi8cQSySMhkqPDH","jdiccldimpdaibmpdkjnbmckianbfold":"djEwpRXaMiVLxHB3hS1T4HzfseOGX0uxGf4ZqtJ0WlGCnoHK+UNTCFdQCLsh58wWmLQnyUFpnjzibejX0dFL","jmjflgjpcpepeafmmgdpfkogkghcpiha":"djEwz/O5f9mOnkOQ/9HtXmQv2TeoFiMXFyb0IV7tfRHBCbrqzfHp3AMOf/UYxXODjJzV9yBQXiyV86qTPHiM","kfihiegbjaloebkmglnjnljoljgkkchm":"djEwXCy8gulo8/2bZAyXs7i+/15EQF/VzNt0Fi5GPrB/kS3Y7crJkOuYFNlpfCeGMWf+WLJVXe/E+D6zIajT","kieiaeokhmlbffedbdfgbdcnhgpcckkn":"djEwSkDM8efIRGGhdjrYhGEWakr3A/53vp3HBfhLWCO0PdLG1naTAhFRuX74Sg2M/YgDm/tlOV+vbs1r538S","mhjfbmdgcfjbbpaeojofohoefgiehjai":"djEw8yM14iWRFNmpOLt8kFmHHCWlOJkCMr7VefFkFTRwKwQt33MZUy8pjhGNZfekljZAFfitW/2H7s28FdP8","ncbjelpjchkpbikbpkcchkhkblodoama":"djEwTzkcP3bvlXPGQ1p0E7Spp0HbnXdRnU5fOmWjjvxARDRx6OpxHH9W05dPV4pr/ylXqfDXIBkx5VS+X74B","nkbndigcebkoaejohleckhekfmcecfja":"djEwfXe3IfTz+75g8HUiiZPQMbLwCx6DnQYGNbWwDG2K389dzthU5L3G60O7Tm0p46C8ATN0HpjBJV8NgWfp","nkeimhogjdpnpccoofpliimaahmaaome":"djEwsysj3TvGJqXIj0HqUmbtZh8oX2+dS+z65AXfy6qiS72+7n7dt3ZRu+tgZYDPvxQUluolA5wBK4QmGEs+","ofefcgjbeghpigppfmkologfjadafddi":"djEwen5iXYABlbxWxj5T4JqKgAJVpH4zFF6ZvkMYGveH0Nwb8TduYu8jc8UaEzGXbCTogxytt+7DpSdyFnnU"},"ui":{"developer_mode":"C56CAEDE4F773F33F6AA11ED3B55DB5AD6A79944D966D3FAC1E9453157EF4B18","developer_mode_encrypted_hash":"djEw1gs2t1JcTeAx46LlagYrweCXJcKfB59cH0SabKsl1ZYvR/+sQqoZrbZ3rGYsJFtF8/h1Wo4xwRMfDwpm"}},"google":{"services":{"last_signed_in_username":"2EE81834DB0B6D8AB9FD660F0A7C98EBD4A8B40A74118150DD2893194EB8A60C","last_signed_in_username_encrypted_hash":"djEw1evtRKoxPo6lYT1hONO+k3qLSPV7asgnHMNK6sNv5KxNmYeWOR2oAwL0Eb22jFPz7H6FoQUIFNGatD3H"}},"homepage":"2C46CB79C277992F901435D45CCDA37D9176019676D60FCE7C7939C59063EDEE","homepage_encrypted_hash":"djEwuJP+LSnXBeRGunVhP13uBKF3rOL+rNeI6aslzMRBV5tfuYYMZc+qlfLKflCl1OoWqM2C3zp+3JykSeGw","homepage_is_newtabpage":"30436771E0E4D9590DD1363343DD7F37A3E00DAA38D260FA94A455B233AEB744","homepage_is_newtabpage_encrypted_hash":"djEwAtvZsLSe4UuLgUh4iOTwKaokIX+Bcr/PF0War/IIs0FGYveEcnp7RZi1ZnRnY/aqkNJMyHSABUsPFsYl","media":{"cdm":{"origin_data":"DC74BF09FCACFE9E058BC4A62275D82145C4F64C0BB55FBCC13287C1856D2085","origin_data_encrypted_hash":"djEw8/i1vwKPOL5VhSA5j03LioT2Sb0lzg6gP2dvIL3Q+j4Dt+XvePB319YW8twlwPZ2s9sMrWfVtqW4PHMs"},"storage_id_salt":"838B681888FC88C8EA74E985DE45075E76611EC1BD17C92C675A24F41A103D20","storage_id_salt_encrypted_hash":"djEw4QxpFJR3/yR1+jz1dB0+f7tnHsVSn6qb/c2MNNQmT+TOGWc2q457YAMpNNOVFWt6td4tZycI88rjVkr1"},"pinned_tabs":"D9B2ADF8FE923DA216C09DA91C85011B0807A3BDC4D17D1B900481B183B2023C","pinned_tabs_encrypted_hash":"djEwb1PcBCeLanG2rpJcRZjeLBdQKI2WhMZfHQ/R+zykAaOA12sLgxDOv51s7N9y3VV4W6IZQJoq/o8rAZic","prefs":{"preference_reset_time":"C755211BE9000AE8E8418A0B43B236E11E395162C56317F814A7C1C1F5FA37DB","preference_reset_time_encrypted_hash":"djEwKPVmADFLE/M0rx65FAvyQBcqJFlk7HFM+GC2JCEss09ubZjxbvQmn4tkSPC95UMjlOxWVlHsnOlqU0y1"},"safebrowsing":{"incidents_sent":"C27E7B6414757EC7B69237008F3609C63D8B3E0D3022C6F8AC1BB28D821F9680","incidents_sent_encrypted_hash":"djEwDwgF2WNgai1t7gdUzJ85qiL15VCa88VVc74Owcw6eOsCbCOzbEY/+bbkGnAIFVSRQzK0XOyNd1t4/R5L"},"schedule_to_flush_to_disk":"B0E7C7583594E61ED9C4DA324060495608CD91ACDE1EBBCDF28049C109221748","schedule_to_flush_to_disk_encrypted_hash":"djEwg3/Ol8oy8daCOjo0GNEciLz3BIh9DM33ewe/PfCu3ErKsy2rk1jqH697+OvQhMjvJuCn2L1+OLfpjUmH","search_provider_overrides":"2C79C4955D5E2C0AC3644E8A29357FD7DB1C6DCFDB7556E1B5641E31FB0F57DB","search_provider_overrides_encrypted_hash":"djEwhvX3++aO9xFZ3BghFhBIwFvgSJXfPBvdDT0IxSv1gbvzSkY5rJF0eBGvnRkal6UVCgH+EOqYxopaqm3f","session":{"restore_on_startup":"BF14AE9EDA027778E3C2047056BE1B321AE63B933A29FA05B30E76FE780AD0CE","restore_on_startup_encrypted_hash":"djEwj9g0CuyEiazQp34MUGQnXUuGh01hRUm8bYlEuzDdTJhUdQQEzGAvQS813hFk865zXwl7P1iLkFZlZEc7","startup_urls":"4266BB085D3346F8626C812970D202685455DEC0CBBB807690923BAE5510C65E","startup_urls_encrypted_hash":"djEweQbiGgL7TmcvR8y1TrfqQ5RndPVIdr1K7yCNe1kCkAtn4oPRfD9gkUD23ProI6e9gI0KQs8R9cQKCmjb"}},"super_mac":"C38C44FDB0F594B8AB1A0F3F24E48E961623459782874F272206FD5A2A98B4F7"},"schedule_to_flush_to_disk":"13418958126965377"} \ No newline at end of file diff --git a/.edge-profile-render-1774484525680/Default/Segmentation Platform/SegmentInfoDB/LOCK b/.edge-profile-render-1774484525680/Default/Segmentation Platform/SegmentInfoDB/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/Segmentation Platform/SegmentInfoDB/LOG b/.edge-profile-render-1774484525680/Default/Segmentation Platform/SegmentInfoDB/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/Segmentation Platform/SignalDB/LOCK b/.edge-profile-render-1774484525680/Default/Segmentation Platform/SignalDB/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/Segmentation Platform/SignalDB/LOG b/.edge-profile-render-1774484525680/Default/Segmentation Platform/SignalDB/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/Segmentation Platform/SignalStorageConfigDB/LOCK b/.edge-profile-render-1774484525680/Default/Segmentation Platform/SignalStorageConfigDB/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/Segmentation Platform/SignalStorageConfigDB/LOG b/.edge-profile-render-1774484525680/Default/Segmentation Platform/SignalStorageConfigDB/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/ServerCertificate b/.edge-profile-render-1774484525680/Default/ServerCertificate new file mode 100644 index 0000000..9587f64 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/ServerCertificate differ diff --git a/.edge-profile-render-1774484525680/Default/ServerCertificate-journal b/.edge-profile-render-1774484525680/Default/ServerCertificate-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/Session Storage/CURRENT b/.edge-profile-render-1774484525680/Default/Session Storage/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Session Storage/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile-render-1774484525680/Default/Session Storage/LOCK b/.edge-profile-render-1774484525680/Default/Session Storage/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/Session Storage/LOG b/.edge-profile-render-1774484525680/Default/Session Storage/LOG new file mode 100644 index 0000000..2f8baeb --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Session Storage/LOG @@ -0,0 +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 diff --git a/.edge-profile-render-1774484525680/Default/Session Storage/MANIFEST-000001 b/.edge-profile-render-1774484525680/Default/Session Storage/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Session Storage/MANIFEST-000001 differ diff --git a/.edge-profile-render-1774484525680/Default/Sessions/Session_13418958128974947 b/.edge-profile-render-1774484525680/Default/Sessions/Session_13418958128974947 new file mode 100644 index 0000000..de56d0d Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Sessions/Session_13418958128974947 differ diff --git a/.edge-profile-render-1774484525680/Default/Shared Dictionary/cache/index b/.edge-profile-render-1774484525680/Default/Shared Dictionary/cache/index new file mode 100644 index 0000000..79bd403 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Shared Dictionary/cache/index differ diff --git a/.edge-profile-render-1774484525680/Default/Shared Dictionary/cache/index-dir/the-real-index b/.edge-profile-render-1774484525680/Default/Shared Dictionary/cache/index-dir/the-real-index new file mode 100644 index 0000000..1bfbf40 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Shared Dictionary/cache/index-dir/the-real-index differ diff --git a/.edge-profile-render-1774484525680/Default/Shared Dictionary/db b/.edge-profile-render-1774484525680/Default/Shared Dictionary/db new file mode 100644 index 0000000..625714a Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Shared Dictionary/db differ diff --git a/.edge-profile-render-1774484525680/Default/Shared Dictionary/db-journal b/.edge-profile-render-1774484525680/Default/Shared Dictionary/db-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/SharedStorage b/.edge-profile-render-1774484525680/Default/SharedStorage new file mode 100644 index 0000000..4410bda Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/SharedStorage differ diff --git a/.edge-profile-render-1774484525680/Default/SharedStorage-wal b/.edge-profile-render-1774484525680/Default/SharedStorage-wal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/Shortcuts b/.edge-profile-render-1774484525680/Default/Shortcuts new file mode 100644 index 0000000..6dbc636 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Shortcuts differ diff --git a/.edge-profile-render-1774484525680/Default/Shortcuts-journal b/.edge-profile-render-1774484525680/Default/Shortcuts-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/Site Characteristics Database/CURRENT b/.edge-profile-render-1774484525680/Default/Site Characteristics Database/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Site Characteristics Database/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile-render-1774484525680/Default/Site Characteristics Database/LOCK b/.edge-profile-render-1774484525680/Default/Site Characteristics Database/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/Site Characteristics Database/LOG b/.edge-profile-render-1774484525680/Default/Site Characteristics Database/LOG new file mode 100644 index 0000000..a246b22 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Site Characteristics Database/LOG @@ -0,0 +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 diff --git a/.edge-profile-render-1774484525680/Default/Site Characteristics Database/MANIFEST-000001 b/.edge-profile-render-1774484525680/Default/Site Characteristics Database/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Site Characteristics Database/MANIFEST-000001 differ diff --git a/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/js/6f3a0dc5e6916f1e_0 b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/js/6f3a0dc5e6916f1e_0 new file mode 100644 index 0000000..efcf514 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/js/6f3a0dc5e6916f1e_0 differ diff --git a/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/js/index b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/js/index new file mode 100644 index 0000000..79bd403 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/js/index differ diff --git a/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/js/index-dir/the-real-index b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/js/index-dir/the-real-index new file mode 100644 index 0000000..509f33c Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/js/index-dir/the-real-index differ diff --git a/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/wasm/index b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/wasm/index new file mode 100644 index 0000000..79bd403 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/wasm/index differ diff --git a/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/wasm/index-dir/the-real-index b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/wasm/index-dir/the-real-index new file mode 100644 index 0000000..603d7d4 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/wasm/index-dir/the-real-index differ diff --git a/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_0 b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_0 new file mode 100644 index 0000000..d76fb77 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_0 differ diff --git a/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_1 b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_1 new file mode 100644 index 0000000..dcaafa9 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_1 differ diff --git a/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_2 b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_2 new file mode 100644 index 0000000..c7e2eb9 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_2 differ diff --git a/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_3 b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_3 new file mode 100644 index 0000000..5eec973 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_3 differ diff --git a/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/index b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/index new file mode 100644 index 0000000..49d43e4 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/index differ diff --git a/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_0 b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_0 new file mode 100644 index 0000000..d76fb77 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_0 differ diff --git a/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_1 b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_1 new file mode 100644 index 0000000..dcaafa9 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_1 differ diff --git a/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_2 b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_2 new file mode 100644 index 0000000..c7e2eb9 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_2 differ diff --git a/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_3 b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_3 new file mode 100644 index 0000000..5eec973 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_3 differ diff --git a/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/index b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/index new file mode 100644 index 0000000..b622d65 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/index differ diff --git a/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_0 b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_0 new file mode 100644 index 0000000..d76fb77 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_0 differ diff --git a/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_1 b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_1 new file mode 100644 index 0000000..dcaafa9 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_1 differ diff --git a/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_2 b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_2 new file mode 100644 index 0000000..c7e2eb9 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_2 differ diff --git a/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_3 b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_3 new file mode 100644 index 0000000..5eec973 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_3 differ diff --git a/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/index b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/index new file mode 100644 index 0000000..073e1c0 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/index differ 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 new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Local Storage/leveldb/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Local Storage/leveldb/LOCK b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Local Storage/leveldb/LOCK new file mode 100644 index 0000000..e69de29 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 new file mode 100644 index 0000000..a6a3b68 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Local Storage/leveldb/LOG @@ -0,0 +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 diff --git a/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Local Storage/leveldb/MANIFEST-000001 b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Local Storage/leveldb/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Local Storage/leveldb/MANIFEST-000001 differ diff --git a/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Network/Network Persistent State b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Network/Network Persistent State new file mode 100644 index 0000000..10ad7f3 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Network/Network Persistent State @@ -0,0 +1 @@ +{"net":{"network_qualities":{"CAASABiAgICA+P////8B":"4G","CAESABiAgICA+P////8B":"4G"}}} \ No newline at end of file diff --git a/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Network/NetworkDataMigrated b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Network/NetworkDataMigrated new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Network/SCT Auditing Pending Reports b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Network/SCT Auditing Pending Reports new file mode 100644 index 0000000..0637a08 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Network/SCT Auditing Pending Reports @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Network/Sdch Dictionaries b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Network/Sdch Dictionaries new file mode 100644 index 0000000..8bca100 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Network/Sdch Dictionaries @@ -0,0 +1 @@ +{"SDCH":{"dictionaries":{},"version":2}} \ No newline at end of file diff --git a/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Network/Trust Tokens b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Network/Trust Tokens new file mode 100644 index 0000000..4444dfd Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Network/Trust Tokens differ diff --git a/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Network/Trust Tokens-journal b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Network/Trust Tokens-journal new file mode 100644 index 0000000..e69de29 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 new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Session Storage/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Session Storage/LOCK b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Session Storage/LOCK new file mode 100644 index 0000000..e69de29 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 new file mode 100644 index 0000000..2f6feaa --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Session Storage/LOG @@ -0,0 +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 diff --git a/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Session Storage/MANIFEST-000001 b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Session Storage/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Session Storage/MANIFEST-000001 differ diff --git a/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Shared Dictionary/cache/index b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Shared Dictionary/cache/index new file mode 100644 index 0000000..79bd403 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Shared Dictionary/cache/index differ diff --git a/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Shared Dictionary/cache/index-dir/the-real-index b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Shared Dictionary/cache/index-dir/the-real-index new file mode 100644 index 0000000..391bac9 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Shared Dictionary/cache/index-dir/the-real-index differ diff --git a/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Shared Dictionary/db b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Shared Dictionary/db new file mode 100644 index 0000000..625714a Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Shared Dictionary/db differ diff --git a/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Shared Dictionary/db-journal b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Shared Dictionary/db-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/Sync Data/LevelDB/CURRENT b/.edge-profile-render-1774484525680/Default/Sync Data/LevelDB/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Sync Data/LevelDB/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile-render-1774484525680/Default/Sync Data/LevelDB/LOCK b/.edge-profile-render-1774484525680/Default/Sync Data/LevelDB/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/Sync Data/LevelDB/LOG b/.edge-profile-render-1774484525680/Default/Sync Data/LevelDB/LOG new file mode 100644 index 0000000..cf19fd1 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/Sync Data/LevelDB/LOG @@ -0,0 +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 diff --git a/.edge-profile-render-1774484525680/Default/Sync Data/LevelDB/MANIFEST-000001 b/.edge-profile-render-1774484525680/Default/Sync Data/LevelDB/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Sync Data/LevelDB/MANIFEST-000001 differ diff --git a/.edge-profile-render-1774484525680/Default/Top Sites b/.edge-profile-render-1774484525680/Default/Top Sites new file mode 100644 index 0000000..e700bd4 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Top Sites differ diff --git a/.edge-profile-render-1774484525680/Default/Top Sites-journal b/.edge-profile-render-1774484525680/Default/Top Sites-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/Vpn Tokens b/.edge-profile-render-1774484525680/Default/Vpn Tokens new file mode 100644 index 0000000..2ba3b69 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Vpn Tokens differ diff --git a/.edge-profile-render-1774484525680/Default/Vpn Tokens-journal b/.edge-profile-render-1774484525680/Default/Vpn Tokens-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/Web Data b/.edge-profile-render-1774484525680/Default/Web Data new file mode 100644 index 0000000..67d4e65 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/Web Data differ diff --git a/.edge-profile-render-1774484525680/Default/Web Data-journal b/.edge-profile-render-1774484525680/Default/Web Data-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/WebStorage/QuotaManager b/.edge-profile-render-1774484525680/Default/WebStorage/QuotaManager new file mode 100644 index 0000000..56ba3da Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/WebStorage/QuotaManager differ diff --git a/.edge-profile-render-1774484525680/Default/WebStorage/QuotaManager-journal b/.edge-profile-render-1774484525680/Default/WebStorage/QuotaManager-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/arbitration_service_config.json b/.edge-profile-render-1774484525680/Default/arbitration_service_config.json new file mode 100644 index 0000000..87fcde5 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/arbitration_service_config.json @@ -0,0 +1,201 @@ +{ + "ArbitrationSignal": "notification_nsat_upper_ci-0.7", + "CopilotModeBypass": [ "cd4688a9-e888-48ea-ad81-76193d56b1be.IsVideoPage.Bubble", "cd4688a9-e888-48ea-ad81-76193d56b1be.IsKnowledgeCardQuery.Bubble", "PerformanceDetectorFeatureNotification", "AUTOFILL_PASSWORD_NON_FUNCTIONAL_FLYOUTS", "SHOPPING_AUTO_SHOW_LOWER_PRICE_FOUND", "SHOPPING_AUTO_SHOW_REBATES", "SHOPPING_AUTO_SHOW_REBATES_CONFIRMATION", "SHOPPING_AUTO_SHOW_REBATES_ORGANIC", "SHOPPING_AUTO_SHOW_REBATES_ORGANIC_NEW" ], + "CustomSuppressionPolicies": { + "8682d0fa-50b3-4ece-aa5b-e0b33f9919e2.f5b8c725-cb2e-4c12-accd-73e500d88d47.AutoOpen": { + "notification_max_quick_dismiss_count": 3 + }, + "bc25fcef-8964-4e72-8287-23e2b496c128.68b8a884-6e08-46e6-8a3b-7e06ffe48ecf.AutoOpen": { + "notification_max_quick_dismiss_count": 3 + }, + "cd4688a9-e888-48ea-ad81-76193d56b1be.a7c3d8e2-5f19-4b6a-8e91-2c4f7d0a3b5e.AutoOpen": { + "notification_max_quick_dismiss_count": 3 + }, + "cd4688a9-e888-48ea-ad81-76193d56b1be.e06e75c1-a59a-4ab6-8361-e8b038e00a8c.AutoOpen": { + "notification_max_quick_dismiss_count": 1 + } + }, + "DynamicSuppressionBypass": { + "ExperienceIDs": [ "Nurturing.Global.OnRamp_RetriggerFREOnEdgeVersionUpgradeViaExplicitLaunch", "Nurturing.Global.OnRamp_RetriggerFREOnExplicitProtocolPDFLaunchForEdgePostDMA", "Nurturing.Global.Bing_DefaultBrowserBannerCloseBtn", "Nurturing.Global.Bing_DefaultBrowserBannerCloseBtnUpdate", "Nurturing.Global.Bing_MSStartYJCompete", "Nurturing.Global.Bing_NtpHomeStartpageUpsellFlyout", "Nurturing.Global.Fundamentals_DefaultBrowserMonitor", "Nurturing.Global.Fundamentals_DefaultBrowserMonitorOnStart", "Nurturing.Global.Fundamentals_DefaultBrowserMonitorVariant2", "Nurturing.Global.RecommendedSettingsChina", "Nurturing.Global.ContinuousImport_PasswordZeroStateV2", "Nurturing.Global.OnRamp_CIExplicitLaunchBannerUpsell", "Nurturing.Global.OnRamp_CIUpsell_ProtocolLaunch_Banner", "Nurturing.Global.EdgeGrowth_SitePinningCITopSites", "Nurturing.Global.EdgeGrowth_SitePinningWithWindowsConsent", "Nurturing.Global.EdgeGrowth_GlobalSitePinningOnCloseModal" ], + "TeamIDs": [ "NTP" ] + }, + "ExperienceCohorts": { + "DefaultCohort": { + "21f3388b-c2a5-4791-8f6e-a4cad6d17f4f.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.BingHomePage.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Covid.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Finance.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Jobs.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.KnowledgeCard.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Local.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.NTP3PCLICK.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.NotifySearchPage.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Recipe.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.SearchPage.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Sports.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Travel.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Weather.Bubble": 1, + "2cb2db96-3bd0-403e-abe2-9269b3761041.AutoOpen": 1, + "2cb2db96-3bd0-403e-abe2-9269b3761041.Bubble": 1, + "439642fc-998d-4a64-8bb6-940ecaf6b60b.AutoOpen": 1, + "439642fc-998d-4a64-8bb6-940ecaf6b60b.Bubble": 1, + "523b5ef3-0b10-4154-8b62-10b2ebd00921.Bubble": 1, + "64be4f9b-3b81-4b6e-b354-0ba00d6ba485.AutoOpen": 1, + "64be4f9b-3b81-4b6e-b354-0ba00d6ba485.Bubble": 1, + "76b926d6-3738-46bf-82d7-2ab896ddf70b.MM2UpSellPopup.Bubble": 1, + "8682d0fa-50b3-4ece-aa5b-e0b33f9919e2.Bubble": 1, + "8682d0fa-50b3-4ece-aa5b-e0b33f9919e2.f5b8c725-cb2e-4c12-accd-73e500d88d47.AutoOpen": 1, + "8ac719c5-140b-4bf2-a0b7-c71617f1f377.3662f1e2-66ae-464f-b690-e7e3dc4fc662.AutoOpen": 1, + "8ac719c5-140b-4bf2-a0b7-c71617f1f377.93e5b5cd-15fc-4253-9728-d80685da304e.AutoOpen": 1, + "8ac719c5-140b-4bf2-a0b7-c71617f1f377.AutoOpen": 1, + "8ac719c5-140b-4bf2-a0b7-c71617f1f377.gaokao.Bubble": 1, + "92f1b743-e26b-433b-a1ec-912d1f0ad1fa.Bubble": 1, + "96defd79-4015-4a32-bd09-794ff72183ef.0bdde3c3-7be8-49f1-971b-e6e2cfd62643.AutoOpen": 1, + "96defd79-4015-4a32-bd09-794ff72183ef.128c39c6-6f70-4ce5-9d01-78978e60d666.AutoOpen": 1, + "96defd79-4015-4a32-bd09-794ff72183ef.5ac63306-e962-42e6-8313-7e5a5b707d65.AutoOpen": 1, + "96defd79-4015-4a32-bd09-794ff72183ef.AutoOpen": 1, + "96defd79-4015-4a32-bd09-794ff72183ef.Bubble": 1, + "96defd79-4015-4a32-bd09-794ff72183ef.Is1PGameDomain.Bubble": 1, + "96defd79-4015-4a32-bd09-794ff72183ef.Is3PGameDomain.Bubble": 1, + "9ce3c9c2-462f-4cc9-bbd7-57d656445be0.Bubble": 1, + "AUTOFILL_PASSWORD_NON_FUNCTIONAL_FLYOUTS": 1, + "DefaultExperience": 1, + "EdgeDownloadChromeInterceptDialog": 2, + "PerformanceDetectorFeatureNotification": 1, + "RewardsPromotionNotifications": 1, + "RewardsReminderNotifications": 1, + "SAN.Personalization.ConsentPrompt": 1, + "SHOPPING_AA_CONSENT": 1, + "SHOPPING_AUTO_PRODUCT_TRACKING_EXP_PRICE_DROP": 1, + "SHOPPING_AUTO_PRODUCT_TRACKING_IMP_PRICE_DROP": 1, + "SHOPPING_AUTO_PRODUCT_TRACKING_OUT_OF_STOCK": 1, + "SHOPPING_AUTO_SHOW_ABANDONED_CART": 1, + "SHOPPING_AUTO_SHOW_ADD_SPB_TO_CART_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_AMAZON_SEARCH_PC": 1, + "SHOPPING_AUTO_SHOW_ATTAINABLE_COUPONS": 1, + "SHOPPING_AUTO_SHOW_AUTOS_MARKETPLACE": 1, + "SHOPPING_AUTO_SHOW_AWARENESSEXP": 1, + "SHOPPING_AUTO_SHOW_AWARENESS_EXPANSION": 1, + "SHOPPING_AUTO_SHOW_CAMPAIGN_AWARENESS_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_CAMPAIGN_PDP_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_CASHBACK_PDP_PLUS_COUPONS": 1, + "SHOPPING_AUTO_SHOW_CJK_COUPON_FOUND": 1, + "SHOPPING_AUTO_SHOW_CJK_PRICE_DROP": 1, + "SHOPPING_AUTO_SHOW_CODEX_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_CONFIRMATION_SCRIPT": 1, + "SHOPPING_AUTO_SHOW_CONTROLLER": 1, + "SHOPPING_AUTO_SHOW_COUPONS_BACKGROUND_AUTO_APPLY": 1, + "SHOPPING_AUTO_SHOW_COUPONS_CHECKOUT": 1, + "SHOPPING_AUTO_SHOW_COUPONS_CHECKOUT_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_COUPONS_CLIPPING": 1, + "SHOPPING_AUTO_SHOW_DISCOVER_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_DISCOVER_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_EXPRESS_CHECKOUT": 1, + "SHOPPING_AUTO_SHOW_GIFT_CARD": 1, + "SHOPPING_AUTO_SHOW_GOODRX": 1, + "SHOPPING_AUTO_SHOW_GROCERY_ITEMIZED_CASHBACK": 1, + "SHOPPING_AUTO_SHOW_GROCERY_ITEMIZED_CASHBACK_LANDING": 1, + "SHOPPING_AUTO_SHOW_GUEST_DOMAIN_COUPONS": 1, + "SHOPPING_AUTO_SHOW_IBC_UPSELL": 1, + "SHOPPING_AUTO_SHOW_LOWER_PRICE_FOUND": 1, + "SHOPPING_AUTO_SHOW_LOWER_PRICE_PLUS_CASHBACK_PLUS_COUPONS": 1, + "SHOPPING_AUTO_SHOW_MOMENT_IN_TIME": 1, + "SHOPPING_AUTO_SHOW_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_ORGANIC_CASHBACK_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_OTHER_SELLER": 1, + "SHOPPING_AUTO_SHOW_OUT_OF_STOCK": 1, + "SHOPPING_AUTO_SHOW_PACKAGE_TRACKING": 1, + "SHOPPING_AUTO_SHOW_PACKAGE_TRACKING_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_PERSONALIZED_CASHBACK_ADDRESSBAR": 1, + "SHOPPING_AUTO_SHOW_PERSONALIZED_CASHBACK_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_POST_PURCHASE_TRACKING": 1, + "SHOPPING_AUTO_SHOW_PRICE_DROP_PLUS_CASHBACK": 1, + "SHOPPING_AUTO_SHOW_PRICE_DROP_PLUS_COUPONS": 1, + "SHOPPING_AUTO_SHOW_PRICE_HISTORY": 1, + "SHOPPING_AUTO_SHOW_PRICE_HISTORY_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_PRINT_GROCERY": 1, + "SHOPPING_AUTO_SHOW_PRODUCT_BEST_COUPON_CONSENT": 1, + "SHOPPING_AUTO_SHOW_PRODUCT_TRACKING_BACK_IN_STOCK": 1, + "SHOPPING_AUTO_SHOW_PRODUCT_TRACKING_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_PROFESSIONAL_REVIEWS": 1, + "SHOPPING_AUTO_SHOW_REBATES": 1, + "SHOPPING_AUTO_SHOW_REBATES_CHECKOUT": 1, + "SHOPPING_AUTO_SHOW_REBATES_ORGANIC": 1, + "SHOPPING_AUTO_SHOW_REBATES_ORGANIC_NEW": 1, + "SHOPPING_AUTO_SHOW_REBATES_PDP": 1, + "SHOPPING_AUTO_SHOW_RECOMMENDATIONS_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_SAN_CONSENT_CONFIRMATION": 1, + "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_ALL_PAGES": 1, + "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_CHECKOUT": 1, + "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_CONFIRMATION_PAGE": 1, + "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_HOME_PAGE": 1, + "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_REWARDS": 1, + "SHOPPING_AUTO_SHOW_SHOPRUNNER": 1, + "SHOPPING_AUTO_SHOW_SIDEPANE_CASHBACK_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_SPB_CASHBACK_LANDING": 1, + "SHOPPING_AUTO_SHOW_SPB_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_SPB_NUDGE_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_SURFACE_UPSELL": 1, + "SHOPPING_AUTO_SHOW_SUSTAINABILITY_LANDING": 1, + "SHOPPING_AUTO_SHOW_TRAVEL_NOTIFICATION_CHEAPER_FLIGHTS": 1, + "SHOPPING_AUTO_SHOW_TRAVEL_NOTIFICATION_CHEAPER_HOTEL_ROOM": 1, + "SHOPPING_AUTO_SHOW_TRENDING_COUPONS": 1, + "ShorelinePrivilegedExperienceID": 1, + "TabActionsMenuVerticalTabsPromotion": 1, + "VPNFeatureNotification": 1, + "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.75a774c2-6075-ae4f-09f9-e5f5d9bef6e1.AutoOpen": 1, + "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.AutoOpen": 1, + "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.a5e9f5e1-fcee-c07b-2c44-b707ded020a3.AutoOpen": 1, + "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.c8ebbf64-e3b8-41d9-925f-4e3754151ff7.AutoOpen": 1, + "bc25fcef-8964-4e72-8287-23e2b496c128.68b8a884-6e08-46e6-8a3b-7e06ffe48ecf.AutoOpen": 1, + "bc25fcef-8964-4e72-8287-23e2b496c128.Bubble": 1, + "c8ebd871-9f47-4a0d-abd3-c1c02b4f8f53.2cfab14c-ebd6-4548-9401-30ab5afe5061.AutoOpen": 1, + "c8ebd871-9f47-4a0d-abd3-c1c02b4f8f53.AutoOpen": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.5b853177-a0be-4237-bda0-4fce5cd165c2.AutoOpen": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.8d3a928d-e911-40f0-9852-f63f6434dc7e.AutoOpen": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.AutoOpen": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.AutoOpen.PDF": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.AutoOpen.PersistentChat": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsCompeteAISite.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsCopilotJitEduAcademicAI.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsCopilotJitEduArticleAI.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsCopilotJitEduStudyAI.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsKnowledgeCardQuery.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsMsnArticleUrlFromNtpP1P2.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsShoppingNotificationNudge.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsTextPage.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsTopNewsDomain.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsTwitchNonStreamPage.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsTwitchSubPage.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsVideoPage.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.a7c3d8e2-5f19-4b6a-8e91-2c4f7d0a3b5e.AutoOpen": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.e06e75c1-a59a-4ab6-8361-e8b038e00a8c.AutoOpen": 1, + "e6723537-66ff-4f4e-ab56-a4cbaddf4e0f.MM2UpSellPopup.Bubble": 1 + } + }, + "FunctionalCohort": [ "EdgeDownloadChromeInterceptFunctionalDialog", "8682d0fa-50b3-4ece-aa5b-e0b33f9919e2.AutoOpen.Functional", "8682d0fa-50b3-4ece-aa5b-e0b33f9919e2.f5b8c725-cb2e-4c12-accd-73e500d88d47.AutoOpen.Functional", "bc25fcef-8964-4e72-8287-23e2b496c128.AutoOpen.Functional", "bc25fcef-8964-4e72-8287-23e2b496c128.68b8a884-6e08-46e6-8a3b-7e06ffe48ecf.AutoOpen.Functional", "WPOFunctionalEvent.AutofillAccountChooser.Bubble", "WPOFunctionalEvent.AutofillAutoSignin.Bubble", "WPOFunctionalEvent.AutofillPassword.Bubble", "SHOPPING_AUTO_SHOW_BING_SEARCH", "SHOPPING_AUTO_SHOW_REBATES_CONFIRMATION", "SHOPPING_AUTO_SHOW_REBATES_DEACTIVATED", "SHOPPING_AUTO_SHOW_REBATES_BING", "SHOPPING_AUTO_SHOW_PERSONALIZED_CASHBACK", "SHOPPING_AUTO_SHOW_PERSONALIZED_CASHBACK_CONFIRMATION", "SHOPPING_AUTO_SHOW_URL_PARAM_REBATES", "SHOPPING_AUTO_SHOW_URL_PARAM_PRICE_COMPARISON", "SHOPPING_AUTO_SHOW_URL_PARAM_PRICE_HISTORY", "SHOPPING_AUTO_SHOW_REBATES_ACTIVATION_FAILED", "SHOPPING_AUTO_SHOW_REBATES_SWITCHED_TO_MSA", "SHOPPING_AUTO_SHOW_ITEM_ADDED_TO_CART_FROM_OTHER_SELLER", "SHOPPING_AUTO_SHOW_VIRTUAL_CARD", "SHOPPING_AUTO_SHOW_BING_CAMPAIGN", "SHOPPING_OPEN_FLYOUT_FROM_EDGE_DRIVER", "SHOPPING_AUTO_SHOW_SUSTAINABILITY_PURCHASE", "SHOPPING_AUTO_SHOW_REWARDS_ACTIVATION_FAILED", "SHOPPING_AUTO_SHOW_REWARDS_SWITCHED_TO_MSA", "SHOPPING_AUTO_SHOW_SHOPRUNNER_CONFIRMATION", "SHOPPING_AUTO_SHOW_ENROLL_TO_CASHBACK_CONFIRMATION_NOTIFICATION", "SHOPPING_AUTO_SHOW_POST_PURCHASE_REWARDS_NOTIFICATION", "694efa4f-a304-4214-aaf7-90444bc887f5.c1c025d9-a620-4f6b-bebb-eff0cf19a671.AutoOpen.Functional" ], + "GlobalSuppressedExperiences": [ "Teams.Bubble", "Nurturing.Global.EdgeVpn_VpnFre", "Nurturing.Global.Rewards_RedemptionCoachmark_2", "Nurturing.Global.Rewards_RedemptionCoachmark_25", "Nurturing.Global.EdgeCBUD_SanPersonalizationConsentWave1Variant0", "Nurturing.Global.Bing_NewBingChatFlyout", "Copilot.AutoOpen.PDF.v2", "Nurturing.Global.PWA_SidebarSearchPromotion", "Nurturing.Global.FC_NetworkWarningFlyout", "Nurturing.Global.EdgeMobile_MobileUpsell_ChatGpt_Flyout", "E-tree.Bubble", "Nurturing.Global.EdgeEDU_BrowserFocusedTranslateNudge", "Games.Bubble", "Nurturing.Global.OnRamp_RetriggerFRECodexCoPilotAutoAprd", "Nurturing.Global.OnRamp_NurturingViaProng_Experiment", "Nurturing.Global.OnRamp_ReTriggerOnWinUpgrade", "Nurturing.Global.EdgeGrowth_CIShoppingUpsell", "Nurturing.Global.Shopping_EnableShoppingAssistance_Optin_Generic", "Nurturing.Global.Shopping_EnableShoppingAssistance", "Nurturing.Global.BrowserExperiences_TryVerticalTabs" ], + "IgnoredFunctionalNotifications": [ "Nurturing.Functional.NTP_CourtesyEngineCampaign", "Nurturing.Functional.NTP_FunctionalCampaign", "Nurturing.Functional.NTP_SettingsCampaign", "Nurturing.Functional.NTP_UpsellCampaign", "Nurturing.Functional.FN_SmartSwitchFeatureInfoView" ], + "ModelInfo": { + "segment_id": 515, + "signals": [ "notification_triggered_count", "notification_click_rate", "notification_click_rate_lower_ci", "notification_click_rate_upper_ci", "notification_dismiss_rate", "notification_dismiss_rate_lower_ci", "notification_dismiss_rate_upper_ci", "notification_ignored_rate", "notification_ignored_rate_lower_ci", "notification_ignored_rate_upper_ci", "notification_quick_dismiss_rate", "notification_quick_dismiss_rate_lower_ci", "notification_quick_dismiss_rate_upper_ci", "notification_disable_rate", "notification_disable_rate_lower_ci", "notification_disable_rate_upper_ci", "notification_snooze_rate", "notification_snooze_rate_lower_ci", "notification_snooze_rate_upper_ci" ], + "threshold_value": 0.5 + }, + "ModelSuppressionBypass": [ "Nurturing.Local.SHOPPING_AUTO_SHOW_LOWER_PRICE_FOUND", "Nurturing.Local.SHOPPING_AUTO_SHOW_REBATES_ORGANIC", "Nurturing.Local.SHOPPING_AUTO_SHOW_REBATES_CHECKOUT", "Nurturing.Local.SHOPPING_AUTO_SHOW_SPB_CASHBACK_LANDING" ], + "NotificationsAllowLists": { + }, + "PrivilegedExperiences": [ "ShorelinePrivilegedExperienceID", "SHOPPING_AUTO_SHOW_COUPONS_CHECKOUT", "SHOPPING_AUTO_SHOW_LOWER_PRICE_FOUND", "SHOPPING_AUTO_SHOW_REBATES", "SHOPPING_AUTO_SHOW_REBATES_ORGANIC", "SHOPPING_AUTO_SHOW_PRICE_HISTORY", "SHOPPING_AUTO_SHOW_REBATES_ORGANIC_NEW", "SHOPPING_AUTO_SHOW_REBATES_CHECKOUT", "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_CHECKOUT", "SHOPPING_AUTO_SHOW_EXPRESS_CHECKOUT", "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_ALL_PAGES", "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_CONFIRMATION_PAGE", "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_HOME_PAGE", "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_REWARDS", "SHOPPING_AUTO_SHOW_COUPONS_CLIPPING", "SHOPPING_AUTO_SHOW_NOTIFICATION", "SHOPPING_AUTO_SHOW_OTHER_SELLER", "SHOPPING_AUTO_SHOW_PROFESSIONAL_REVIEWS", "SHOPPING_AUTO_SHOW_PACKAGE_TRACKING", "SHOPPING_AUTO_SHOW_GUEST_DOMAIN_COUPONS", "SHOPPING_AUTO_SHOW_SUSTAINABILITY_LANDING", "SHOPPING_AUTO_SHOW_ATTAINABLE_COUPONS", "SHOPPING_AUTO_SHOW_GIFT_CARD", "SHOPPING_AUTO_SHOW_PRINT_GROCERY", "SHOPPING_AUTO_SHOW_GROCERY_ITEMIZED_CASHBACK", "SHOPPING_AUTO_SHOW_CONTROLLER", "SHOPPING_AUTO_SHOW_AUTOS_MARKETPLACE", "SHOPPING_AUTO_SHOW_SHOPRUNNER", "SHOPPING_AUTO_SHOW_ABANDONED_CART", "SHOPPING_AUTO_SHOW_OUT_OF_STOCK", "SHOPPING_AUTO_SHOW_GROCERY_ITEMIZED_CASHBACK_LANDING", "SHOPPING_AUTO_SHOW_SPB_CASHBACK_LANDING", "SHOPPING_AUTO_SHOW_AWARENESSEXP", "SHOPPING_AA_CONSENT", "SHOPPING_AUTO_SHOW_SAN_CONSENT_CONFIRMATION", "SHOPPING_AUTO_SHOW_CONFIRMATION_SCRIPT", "SHOPPING_AUTO_SHOW_MOMENT_IN_TIME", "SHOPPING_AUTO_SHOW_COUPONS_CHECKOUT_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_TRENDING_COUPONS", "SHOPPING_AUTO_SHOW_RECOMMENDATIONS_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_PRODUCT_TRACKING_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_SURFACE_UPSELL", "SHOPPING_AUTO_SHOW_PRODUCT_TRACKING_BACK_IN_STOCK", "SHOPPING_AUTO_PRODUCT_TRACKING_EXP_PRICE_DROP", "SHOPPING_AUTO_PRODUCT_TRACKING_IMP_PRICE_DROP", "SHOPPING_AUTO_PRODUCT_TRACKING_OUT_OF_STOCK", "SHOPPING_AUTO_SHOW_CODEX_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_PERSONALIZED_CASHBACK_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_PRICE_HISTORY_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_ORGANIC_CASHBACK_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_GOODRX", "SHOPPING_AUTO_SHOW_SIDEPANE_CASHBACK_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_DISCOVER_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_REBATES_PDP", "SHOPPING_AUTO_SHOW_PRODUCT_BEST_COUPON_CONSENT", "SHOPPING_AUTO_SHOW_CAMPAIGN_PDP_NOTIFICATION", "SHOPPING_AUTO_SHOW_CAMPAIGN_AWARENESS_NOTIFICATION", "SHOPPING_AUTO_SHOW_SPB_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_PRICE_DROP_PLUS_COUPONS", "SHOPPING_AUTO_SHOW_SPB_NUDGE_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_ADD_SPB_TO_CART_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_CASHBACK_PDP_PLUS_COUPONS", "SHOPPING_AUTO_SHOW_PRICE_DROP_PLUS_CASHBACK", "SHOPPING_AUTO_SHOW_DISCOVER_NOTIFICATION", "SHOPPING_AUTO_SHOW_AMAZON_SEARCH_PC", "SHOPPING_AUTO_SHOW_COUPONS_BACKGROUND_AUTO_APPLY", "SHOPPING_AUTO_SHOW_PERSONALIZED_CASHBACK_ADDRESSBAR", "SHOPPING_AUTO_SHOW_TRAVEL_NOTIFICATION_CHEAPER_FLIGHTS", "SHOPPING_AUTO_SHOW_TRAVEL_NOTIFICATION_CHEAPER_HOTEL_ROOM", "SHOPPING_AUTO_SHOW_CJK_PRICE_DROP", "SHOPPING_AUTO_SHOW_CJK_COUPON_FOUND", "AUTOFILL_PASSWORD_NON_FUNCTIONAL_FLYOUTS", "76b926d6-3738-46bf-82d7-2ab896ddf70b.MM2UpSellPopup.Bubble", "e6723537-66ff-4f4e-ab56-a4cbaddf4e0f.MM2UpSellPopup.Bubble", "8ac719c5-140b-4bf2-a0b7-c71617f1f377.3662f1e2-66ae-464f-b690-e7e3dc4fc662.AutoOpen", "8ac719c5-140b-4bf2-a0b7-c71617f1f377.gaokao.Bubble", "c8ebd871-9f47-4a0d-abd3-c1c02b4f8f53.AutoOpen", "c8ebd871-9f47-4a0d-abd3-c1c02b4f8f53.2cfab14c-ebd6-4548-9401-30ab5afe5061.AutoOpen", "cd4688a9-e888-48ea-ad81-76193d56b1be.AutoOpen.PersistentChat", "cd4688a9-e888-48ea-ad81-76193d56b1be.AutoOpen.PDF", "cd4688a9-e888-48ea-ad81-76193d56b1be.8d3a928d-e911-40f0-9852-f63f6434dc7e.AutoOpen", "cd4688a9-e888-48ea-ad81-76193d56b1be.e06e75c1-a59a-4ab6-8361-e8b038e00a8c.AutoOpen", "cd4688a9-e888-48ea-ad81-76193d56b1be.5b853177-a0be-4237-bda0-4fce5cd165c2.AutoOpen", "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.AutoOpen", "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.c8ebbf64-e3b8-41d9-925f-4e3754151ff7.AutoOpen", "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.75a774c2-6075-ae4f-09f9-e5f5d9bef6e1.AutoOpen", "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.a5e9f5e1-fcee-c07b-2c44-b707ded020a3.AutoOpen", "8682d0fa-50b3-4ece-aa5b-e0b33f9919e2.f5b8c725-cb2e-4c12-accd-73e500d88d47.AutoOpen", "bc25fcef-8964-4e72-8287-23e2b496c128.68b8a884-6e08-46e6-8a3b-7e06ffe48ecf.AutoOpen", "EdgeDownloadChromeInterceptDialog", "439642fc-998d-4a64-8bb6-940ecaf6b60b.AutoOpen", "694efa4f-a304-4214-aaf7-90444bc887f5.c1c025d9-a620-4f6b-bebb-eff0cf19a671.AutoOpen" ], + "ReserveApproved": { + "ExperienceIDs": [ "Nurturing.Global.Edge_SpawnNtpOptIn", "Nurturing.Global.Edge_SpawnNtpOptOut" ], + "SourceIDs": [ 3 ], + "TeamIDs": [ "Edge Consumer Content and Verticals" ] + }, + "ScenarioSuppressLists": { + }, + "SuppressedExperiences": [ ], + "TimeDelta": 5000000, + "baseConfigVersion": "40.0.2", + "configVersion": "40.0.2" +} diff --git a/.edge-profile-render-1774484525680/Default/commerce_subscription_db/LOCK b/.edge-profile-render-1774484525680/Default/commerce_subscription_db/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/commerce_subscription_db/LOG b/.edge-profile-render-1774484525680/Default/commerce_subscription_db/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/discount_infos_db/LOCK b/.edge-profile-render-1774484525680/Default/discount_infos_db/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/discount_infos_db/LOG b/.edge-profile-render-1774484525680/Default/discount_infos_db/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/discounts_db/LOCK b/.edge-profile-render-1774484525680/Default/discounts_db/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/discounts_db/LOG b/.edge-profile-render-1774484525680/Default/discounts_db/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/heavy_ad_intervention_opt_out.db b/.edge-profile-render-1774484525680/Default/heavy_ad_intervention_opt_out.db new file mode 100644 index 0000000..ac64349 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/heavy_ad_intervention_opt_out.db differ diff --git a/.edge-profile-render-1774484525680/Default/heavy_ad_intervention_opt_out.db-journal b/.edge-profile-render-1774484525680/Default/heavy_ad_intervention_opt_out.db-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/load_statistics.db b/.edge-profile-render-1774484525680/Default/load_statistics.db new file mode 100644 index 0000000..4410bda Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/load_statistics.db differ diff --git a/.edge-profile-render-1774484525680/Default/load_statistics.db-shm b/.edge-profile-render-1774484525680/Default/load_statistics.db-shm new file mode 100644 index 0000000..3c44d8e Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/load_statistics.db-shm differ diff --git a/.edge-profile-render-1774484525680/Default/load_statistics.db-wal b/.edge-profile-render-1774484525680/Default/load_statistics.db-wal new file mode 100644 index 0000000..92c57a5 Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/load_statistics.db-wal differ diff --git a/.edge-profile-render-1774484525680/Default/optimization_guide_hint_cache_store/LOCK b/.edge-profile-render-1774484525680/Default/optimization_guide_hint_cache_store/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/optimization_guide_hint_cache_store/LOG b/.edge-profile-render-1774484525680/Default/optimization_guide_hint_cache_store/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/parcel_tracking_db/LOCK b/.edge-profile-render-1774484525680/Default/parcel_tracking_db/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/parcel_tracking_db/LOG b/.edge-profile-render-1774484525680/Default/parcel_tracking_db/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/shared_proto_db/CURRENT b/.edge-profile-render-1774484525680/Default/shared_proto_db/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/shared_proto_db/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile-render-1774484525680/Default/shared_proto_db/LOCK b/.edge-profile-render-1774484525680/Default/shared_proto_db/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/shared_proto_db/LOG b/.edge-profile-render-1774484525680/Default/shared_proto_db/LOG new file mode 100644 index 0000000..86e12d0 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/shared_proto_db/LOG @@ -0,0 +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 diff --git a/.edge-profile-render-1774484525680/Default/shared_proto_db/MANIFEST-000001 b/.edge-profile-render-1774484525680/Default/shared_proto_db/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/shared_proto_db/MANIFEST-000001 differ diff --git a/.edge-profile-render-1774484525680/Default/shared_proto_db/metadata/CURRENT b/.edge-profile-render-1774484525680/Default/shared_proto_db/metadata/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/shared_proto_db/metadata/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile-render-1774484525680/Default/shared_proto_db/metadata/LOCK b/.edge-profile-render-1774484525680/Default/shared_proto_db/metadata/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/Default/shared_proto_db/metadata/LOG b/.edge-profile-render-1774484525680/Default/shared_proto_db/metadata/LOG new file mode 100644 index 0000000..22db708 --- /dev/null +++ b/.edge-profile-render-1774484525680/Default/shared_proto_db/metadata/LOG @@ -0,0 +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 diff --git a/.edge-profile-render-1774484525680/Default/shared_proto_db/metadata/MANIFEST-000001 b/.edge-profile-render-1774484525680/Default/shared_proto_db/metadata/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile-render-1774484525680/Default/shared_proto_db/metadata/MANIFEST-000001 differ diff --git a/.edge-profile-render-1774484525680/FirstLaunchAfterInstallation b/.edge-profile-render-1774484525680/FirstLaunchAfterInstallation new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/GrShaderCache/data_0 b/.edge-profile-render-1774484525680/GrShaderCache/data_0 new file mode 100644 index 0000000..d76fb77 Binary files /dev/null and b/.edge-profile-render-1774484525680/GrShaderCache/data_0 differ diff --git a/.edge-profile-render-1774484525680/GrShaderCache/data_1 b/.edge-profile-render-1774484525680/GrShaderCache/data_1 new file mode 100644 index 0000000..035d06d Binary files /dev/null and b/.edge-profile-render-1774484525680/GrShaderCache/data_1 differ diff --git a/.edge-profile-render-1774484525680/GrShaderCache/data_2 b/.edge-profile-render-1774484525680/GrShaderCache/data_2 new file mode 100644 index 0000000..c7e2eb9 Binary files /dev/null and b/.edge-profile-render-1774484525680/GrShaderCache/data_2 differ diff --git a/.edge-profile-render-1774484525680/GrShaderCache/data_3 b/.edge-profile-render-1774484525680/GrShaderCache/data_3 new file mode 100644 index 0000000..5eec973 Binary files /dev/null and b/.edge-profile-render-1774484525680/GrShaderCache/data_3 differ diff --git a/.edge-profile-render-1774484525680/GrShaderCache/index b/.edge-profile-render-1774484525680/GrShaderCache/index new file mode 100644 index 0000000..87228b1 Binary files /dev/null and b/.edge-profile-render-1774484525680/GrShaderCache/index differ diff --git a/.edge-profile-render-1774484525680/GraphiteDawnCache/data_0 b/.edge-profile-render-1774484525680/GraphiteDawnCache/data_0 new file mode 100644 index 0000000..d76fb77 Binary files /dev/null and b/.edge-profile-render-1774484525680/GraphiteDawnCache/data_0 differ diff --git a/.edge-profile-render-1774484525680/GraphiteDawnCache/data_1 b/.edge-profile-render-1774484525680/GraphiteDawnCache/data_1 new file mode 100644 index 0000000..035d06d Binary files /dev/null and b/.edge-profile-render-1774484525680/GraphiteDawnCache/data_1 differ diff --git a/.edge-profile-render-1774484525680/GraphiteDawnCache/data_2 b/.edge-profile-render-1774484525680/GraphiteDawnCache/data_2 new file mode 100644 index 0000000..c7e2eb9 Binary files /dev/null and b/.edge-profile-render-1774484525680/GraphiteDawnCache/data_2 differ diff --git a/.edge-profile-render-1774484525680/GraphiteDawnCache/data_3 b/.edge-profile-render-1774484525680/GraphiteDawnCache/data_3 new file mode 100644 index 0000000..5eec973 Binary files /dev/null and b/.edge-profile-render-1774484525680/GraphiteDawnCache/data_3 differ diff --git a/.edge-profile-render-1774484525680/GraphiteDawnCache/index b/.edge-profile-render-1774484525680/GraphiteDawnCache/index new file mode 100644 index 0000000..2d92f29 Binary files /dev/null and b/.edge-profile-render-1774484525680/GraphiteDawnCache/index differ diff --git a/.edge-profile-render-1774484525680/Last Browser b/.edge-profile-render-1774484525680/Last Browser new file mode 100644 index 0000000..28a4fac Binary files /dev/null and b/.edge-profile-render-1774484525680/Last Browser differ diff --git a/.edge-profile-render-1774484525680/Last Version b/.edge-profile-render-1774484525680/Last Version new file mode 100644 index 0000000..a887bff --- /dev/null +++ b/.edge-profile-render-1774484525680/Last Version @@ -0,0 +1 @@ +146.0.3856.72 \ No newline at end of file diff --git a/.edge-profile-render-1774484525680/Local State b/.edge-profile-render-1774484525680/Local State new file mode 100644 index 0000000..af94a14 --- /dev/null +++ b/.edge-profile-render-1774484525680/Local State @@ -0,0 +1 @@ +{"abusive_adblocker_etag":"\"5E25271B8190D943537AD3FDB50874FC133E8B4A00380E2A6A888D63386F728B\"","accessibility":{"captions":{"common_models_path":"","soda_translation_binary_path":""}},"app_defaults":{"os_activation_state":true,"patch_status":[]},"apps_count_check_time":"13418958157237201","autofill":{"ablation_seed":"M21P7VMebOU="},"breadcrumbs":{"enabled":true,"enabled_time":"13418958126245264"},"default_browser":{"browser_name_enum":1},"domain_actions_config":"H4sIAAAAAAAAAK2abY/bNhKA/8rCuA9JEWudpE3ucgiCIJdDCzRokEvRA7o9Y0SOpYlJDpekLGmb/PcDbXljx5LW1PZDNmsunxm+DIczQ/85E1IveYPOkcTZiz9nYK0iAYHY+NmL37sGlEvLikQ7ezH7xaj2bWPZ43sF7QcE2c4ezSRrIDN7MfOKTJEJ1rMvj0bp30jihgwewoGrLGymkBoayRoziVNoyMXkIW+ySOBUXsHzjMIUslmRodBOVVxDEGXYZIKbqSKoMBQwbDLHBTo/VUyuKhSV20RJvoQ6EzBFTImKmmxDEjk4NlNHIxwFdMRGlGAMqqlyTIBQRpOcuj9cW4ceTfBWVZMXd1M2E49UWalqqlawNruuSKxLVHaqkH+RL1+bti7Rdav4x6PZliXcOScDGgddUmht/GNsctumOIQT4kBxB9y2RHUbdJ7YzF48/vJoJliiSHSXP5LEd6sfcSPeRDrNdYzAhkxAI3l0YU75bo6HjT3T1HFllmQUGUy9Hmz4pQrf2kLhQGtwasxbnYC+BIeWyYRp1FyuUkDDcVqZ53MBRZux033Sn1crEhOIp89+mAxlWoDPtD8bNijdtHkZHLrG+lcuoX9A0D7TJBx7Xk00h6w6exUEa80mGi674lyoxjyrSwg+cgkjFGxJcdKkQHKetEXgRAZ09ojAbCBpCmBFlTQDUYIDEdClDKuEUNg0NQoqiSk6+Ottcx4hES1QiqFEYiys6AU84jrTQ9HtMJKihiBtIqhwg0ZB7jM622sWqMlQVjAXo1HzCTgWpp501uDWgm2bsPUaQ5LR68qtUsS3hswnSCDM303CunJIO00WnVXYxAwiAeKkLesC2F28kKLGkdcpS3VdkVJ5mhO9rtEkqHCoeYNZfvbpcJWpodVJJ91XhhPG5FsTSvQECXYSsAmCXcCk81Rvs6IUouWx7OGk+w1YSlOwvzcnhQWB1oHX41nFDuoJj2PkHZYrUgHdks2SV6ulrymI8rwY+c1Owr+3Ao58xPFUBgZ2jJ+MD4VNjNnfKyDzEZvw64effUyNjtJAMAVXwd/psUelxLv7fhK8AjFynY2yKxCYM0/Fa9wOfypMDY1UI0bh6+vJWvOxAz7OspPRc4/UHEb5UFMYdRajtCQv2MnRE9AnoMts3755Hxu2PULX4/SMkFSJZ6SrLzhcUYPy7bu3Rzc1hlUsPg3O+Bzah0oSjyz6qBBdeRIZaLjZlr6yT/YvEFKt7y/k3pMZKumeLwEHEr/zJazcfSWQubeEgXQ5YTMG6qpJ25nlU9bijmeBUZYtGpKCjUERYpYNN5XDGnNPAf2ujjDgKPrk7uuC+0bdU+kjDQUuNRSGVu3SYYFNor9QXKM/qnnEhuy7/vljDi3p4ii52jUNEcIBFV6RP46JbluHuKBvjny1vhnsCa7A46Bp2zLUP899jPSPqpT7tiHGkgkOj+dAmSUTZz5oLdEgAuTqqFrs0NMNuoxDp3IQB3K5yb+xcQGiHAlNNBpw8mhDhTTZrlmMXlZ7S9iAquLnq6tXcaQvH2j5uVEPL3afmkYdFqi/GsQe83P14OpKfvfwws/V42eLxWH3I2vYE8uni0XzdLG4usoulo+fLBbNPxaL7BDbGcNtfy23XRt13GlvB/t+//vbxaua5Mso8rDjgQHsu/5TQ/MjUlGGl7vBx4bfSIay+3xxKODAGvYCLp88fdZcXlw+j/8d9j20gX3nBxolVfqziiP+3HgNSj28vCirAo/YWwO41fKK9LJ++fzJ4qL79fH33x/N7ev+3yp7t1P2n6jl889R5cPLi/9uf7k89SjblHaJjVXsYtZwz6L6Ey1NSgWVdDH3c+3NPLpwWIMGukGZIqLH654H5mSKOTZ2yAn0E0nZaR0fDcl7nKMFVxgcvLH78kiJFlNKLcIhBJyWeEpcoZHoHNxwUror0VNh0E1Uy6YAJ01aii0rsY7/Ck6h7s62ehiHOI8/BCo196woAKUVYrvs8mwj2/X3rZHd4UtRRgXPa3Q5ggu0RnW+2khy/gmDt1WehFnHK0rTZB1rTiCMDxDf6lKWQpFZoyRzvprUhzMN9rrC4Zimp3TaJWRnA1Pf5sBanyU/BFo0DkjF8iAkvTFxFXIHd4RHfbXeBtXYVwhOK4sITpSZgU2ax+i4FkpO8hkT33rXvKEkPxPtO15H2zspajvbQnxgBwUmb7bfiIT3V98Ww9FyXzFXlPGxstp+E+jeldAzibvqO3/d22gLWieXnUOV9jjaFXQzhWn3nAUX4oWayvmSbZY/yaeAtWPWyaDCAkRbIqhQpribHJTCELwoK4VzRqdoHe/J8ux9JwXGr9sUpRoKEnMVk4a76vM/mcN8nrx+28XXH1uLu78fxPC3qkaI3op/5dEtoYhF/7S4/U3pWOOvr4/CDsd1VwmfPZpZCOVSw/bp4PfZpQCH6ObSIWh0l/H7Y5ezP3oXrk+2J1VyhSHgPJ64QQvpY3Wb1e3N+BetDrhuDVEW+JHXaD6gVSBQozlM307XssZ8Gb9ps+pWLvWpwrG2J7G/QylprEDfSwVUWDiwJRlJI0+/p3QgjZ5XO277c9uSIsJWvkRTxBslddhRleHaYJ2kcZskcWXZODCUStYlK/Sssa1GosN+FvxaAamkJY6cB605p9Eno14QRQUb8kkKq5vM2yoYWm8X1lUpCo3cfpM2bZCKtAUnCEaeiPtRyxtwaHidOEz0ASTwaBn3lGTVWFiTD2Ay9lkQZx+T+AWR1G1glTi8rYU15HMwYw98J5yuQgVqVRmZgaTQQk5OgQBLIX1Hznhh7OXOyLj6QY3eoynGgqOfjGBNpngDSh1vS8+36YZe2vbKO39vd58PbtVvtHT9qGtdith80H0n8LWR/dxO/hKMXH4j4vgi+fJ/9taiTbswAAA=","dual_engine":{"consumer_mode":{"ie_usage_checked":"13418958187081622","ie_usage_times":[]}},"edge":{"app_user_model_id":"MSEdge","perf_center":{"efficiency_mode_v2_is_active":false,"perf_game_mode":true,"performance_mode":3,"performance_mode_is_on":false},"retrigger_features":[],"tab_stabs":{"closed_without_unfreeze_never_unfrozen":0,"closed_without_unfreeze_previously_unfrozen":0,"discard_without_unfreeze_never_unfrozen":0,"discard_without_unfreeze_previously_unfrozen":0},"tab_stats":{"frozen_daily":0,"unfrozen_daily":0}},"edge_copilot_mode_enabled_state":{"Default":{"enabled":false,"last_set":"13418958126439667"}},"fre":{"has_first_visible_browser_session_completed":true,"oem_bookmarks_set":true},"hardware_acceleration_mode_previous":true,"host_package_checked_on_browser_version":"146.0.7680.154","ie_react":{"has_done_one_time_ie_import":true},"legacy":{"profile":{"name":{"migrated":true}}},"local":{"password_hash_data_list":[]},"metrics":{"client_id_hash_key_created":true},"migration":{"Default":{"migration_attempt":0,"migration_version":5}},"network_time":{"network_time_mapping":{"local":1.774484529545872e+12,"network":1.774484529e+12,"ticks":174825066405.0,"uncertainty":1321422.0}},"optimization_guide":{"model_execution":{"last_usage_by_feature":{}},"model_store_metadata":{},"on_device":{"last_version":"146.0.3856.72","model_crash_count":0}},"os_crypt":{"audit_enabled":true,"encrypted_key":"RFBBUEkBAAAA0Iyd3wEV0RGMegDAT8KX6wEAAABKpeCuql/aQbyOV9DF2vd2EAAAAB4AAABNAGkAYwByAG8AcwBvAGYAdAAgAEUAZABnAGUAAAAQZgAAAAEAACAAAAATd4JouGq9rna7O/IQNJDB+QtAND2m/AanoPvOs6weGwAAAAAOgAAAAAIAACAAAADRJ9Ax1C3oWPMhvrVj3RUyS5eB/0ZhGdkiKHjNTQN2yjAAAADVKYprxbvajYsrjdYTKdLTPPl6clXrzffBITwI89pAbImAYRaidkGlAOcIQvBiMtZAAAAAqEL36t48iT7QqOQZc7gKWXyAuDDyGsBoarEY4nGUUgxz1lItjP+V7i365kFsfnAUXBdY31p4kuVi/mHDWRdRig=="},"performance_intervention":{"last_daily_sample":"13418958126949771"},"phoenix":{"user_laf_toggle_state_static":2},"policy":{"last_statistics_update":"13418958126242201"},"profile":{"info_cache":{"Default":{"active_time":1774484526.909532,"avatar_icon":"chrome://theme/IDR_PROFILE_AVATAR_20","background_apps":false,"edge_account_cid":"","edge_account_environment":0,"edge_account_environment_string":"","edge_account_first_name":"","edge_account_last_name":"","edge_account_oid":"","edge_account_sovereignty":0,"edge_account_tenant_id":"","edge_account_type":0,"edge_create_profile_shortcut":false,"edge_profile_can_be_deleted":true,"edge_profile_can_be_edited":true,"edge_test_on_premises":false,"edge_wam_aad_for_app_account_type":0,"force_signin_profile_locked":false,"gaia_id":"","is_consented_primary_account":false,"is_ephemeral":false,"is_using_default_avatar":true,"is_using_default_name":true,"managed_user_id":"","metrics_bucket_index":1,"name":"Profile 1","signin.with_credential_provider":false,"user_name":""}},"last_active_profiles":["Default"],"metrics":{"next_bucket_index":2},"profile_counts_reported":"13418958126116501","profiles_order":["Default"]},"profile_network_context_service":{"http_cache_finch_experiment_groups":"None None None None"},"profiles":{"collect_potential_implicit_signin_data_started":true,"edge":{"guided_switch_pref":[],"implicit_signin":{"primary_error":14,"secondary_error":24,"telemetry_result":18,"uir_error_hit_times":1},"multiple_profiles_with_same_account":false},"edge_sso_info":{"aad_sso_algo_state":1,"first_profile_key":"Default","msa_first_profile_key":"Default","msa_sso_algo_state":1},"signin_last_seen_version":"146.0.3856.72","signin_last_updated_time":1774484526.508999},"sentinel_creation_time":"0","session_id_generator_last_value":"1435143929","signin":{"active_accounts_last_emitted":"13418958126111838"},"site_pinning":{"is_user_with_zero_pinned_sites_list":[],"was_any_pinning_experience_shown_to_user":1},"smartscreen":{"enabled":true,"pua_protection_enabled":false},"startup_boost":{"last_browser_open_time":"13418958126750988"},"subresource_filter":{"ruleset_version":{"checksum":0,"content":"","format":0}},"tab_stats":{"discards_expired":0,"discards_external":0,"discards_proactive":0,"discards_urgent":0,"last_daily_sample":"13418958126223883","max_tabs_per_window":2,"reloads_expired":0,"reloads_external":0,"reloads_urgent":0,"total_tab_count_max":2,"window_count_max":1},"telemetry_client":{"cloned_install":{"user_data_dir_id":15842369},"governance":{"last_dma_change_date":"13418958126964385","last_known_cps":2048},"host_telclient_path":"QzpcUHJvZ3JhbSBGaWxlcyAoeDg2KVxNaWNyb3NvZnRcRWRnZVxBcHBsaWNhdGlvblwxNDYuMC4zODU2LjcyXHRlbGNsaWVudC5kbGw=","install_source_name":"windows","os_integration_level":5,"sample_id":46909325,"updater_version":"1.3.225.7","windows_update_applied":false},"ukm":{"persisted_logs":[]},"uninstall_metrics":{"installation_date2":"1774484526"},"updateclientdata":{"apps":{"ahmaebgpfccdhgidjaidaoojjcijckba":{"cohort":"","cohortname":"","installdate":-1},"cllppcmmlnkggcmljjfigkcigaajjmid":{"cohort":"","cohortname":"","installdate":-1},"eeobbhfgfagbclfofmgbdfoicabjdbkn":{"cohort":"","cohortname":"","installdate":-1},"efniojlnjndmcbiieegkicadnoecjjef":{"cohort":"","cohortname":"","installdate":-1},"fgbafbciocncjfbbonhocjaohoknlaco":{"cohort":"","cohortname":"","installdate":-1},"fmbfidpnnknmblionmcahabilfoageoe":{"cohort":"","cohortname":"","installdate":-1},"fppmbhmldokgmleojlplaaodlkibgikh":{"cohort":"","cohortname":"","installdate":-1},"gllimckfbolmioaaihpppacjccghejen":{"cohort":"","cohortname":"","installdate":-1},"hjaimielcgmceiphgjjfddlgjklfpdei":{"cohort":"","cohortname":"","installdate":-1},"jbfaflocpnkhbgcijpkiafdpbjkedane":{"cohort":"","cohortname":"","installdate":-1},"jcmcegpcehdchljeldgmmfbgcpnmgedo":{"cohort":"","cohortname":"","installdate":-1},"jpinkpebmplndiafioikiciobeafamld":{"cohort":"","cohortname":"","installdate":-1},"kieecehchjjaaepgajdhcehijkehdenm":{"cohort":"","cohortname":"","installdate":-1},"kmkacjgmmfchkbeglfbjjeidfckbnkca":{"cohort":"","cohortname":"","installdate":-1},"kpfehajjjbbcifeehjgfgnabifknmdad":{"cohort":"","cohortname":"","installdate":-1},"laoigpblnllgcgjnjnllmfolckpjlhki":{"cohort":"","cohortname":"","installdate":-1},"lfmeghnikdkbonehgjihjebgioakijgn":{"cohort":"","cohortname":"","installdate":-1},"lkkdlcloifjinapabfonaibjijloebfb":{"cohort":"","cohortname":"","installdate":-1},"llmidpclgepbgbgoecnhcmgfhmfplfao":{"cohort":"","cohortname":"","installdate":-1},"mkcgfaeepibomfapiapjaceihcojnphg":{"cohort":"rrf@1.00","cohortname":"","installdate":-1},"mpicjakjneaggahlnmbojhjpnileolnb":{"cohort":"","cohortname":"","installdate":-1},"ndikpojcjlepofdkaaldkinkjbeeebkl":{"cohort":"","cohortname":"","installdate":-1},"oankkpibpaokgecfckkdkgaoafllipag":{"cohort":"","cohortname":"","installdate":-1},"ohckeflnhegojcjlcpbfpciadgikcohk":{"cohort":"","cohortname":"","installdate":-1},"ojblfafjmiikbkepnnolpgbbhejhlcim":{"cohort":"","cohortname":"","installdate":-1},"pbdgbpmpeenomngainidcjmopnklimmf":{"cohort":"rrf@1.00","cohortname":"","installdate":-1},"pdfjdcjjjegpclfiilihfkmdfndkneei":{"cohort":"","cohortname":"","installdate":-1},"pghocgajpebopihickglahgebcmkcekh":{"cohort":"","cohortname":"","installdate":-1},"plbmmhnabegcabfbcejohgjpkamkddhn":{"cohort":"","cohortname":"","installdate":-1}}},"updateclientlastupdatecheckerror":0,"updateclientlastupdatecheckerrorcategory":0,"updateclientlastupdatecheckerrorextracode1":0,"user_experience_metrics":{"client_id2":"8f7ccca4-223f-4127-ad28-9c94e5069765","diagnostics":{"last_data_collection_level_on_launch":1},"last_seen":{"CrashpadMetrics":"0"},"limited_entropy_randomization_source":"4BBC7217B7CE8E61B161DC481DCB8508","log_record_id":1,"low_entropy_source3":988,"machine_id":5216996,"payload_counter":1,"pseudo_low_entropy_source":2353,"reporting_enabled":false,"session_id":0,"stability":{"browser_last_live_timestamp":"13418958126076811","saved_system_profile":"CJ2l8s0GEhAxNDYuMC4zODU2LjcyLTY0GAAiBWVuLVVTKhgKCldpbmRvd3MgTlQSCjEwLjAuMjYyMDAybQoGeDg2XzY0EIdfGICAjNGN/x8iE0hQIExhcHRvcCAxNy1ieTB4eHgoATCgBjjYBEIKCAAQABoAMgA6AGUAAIA/ahgKDEdlbnVpbmVJbnRlbBDqjSAYCCABKACCAQCKAQCqAQZ4ODZfNjSwAQFKCg3ZeE7NFV5v0thKCg1sO7s6FV5v0thKCg1Ak3CxFV5v0thKCg0T5AAxFV5v0thKCg1ZIj2uFV5v0thKCg0XBxSpFV5v0thKCg0T2ptcFV5v0thKCg2Q6as/FV5v0thKCg1DO2FuFV5v0thQBGIESU5CWGoICAAQADgAQACAAYDukc4GmAEA+AHcB4AC////////////AYgCAagCsRKyAjDRJfNWC4+9L/K351oQADyTN0RE6rqF3y+rE8bwOQvdoidEg0lfDgvA6BJXNkzzDV3xAr+9F2JBP5ghyj7nAgoECAAQABIIIgQIAhACKAEiAggCMgYIACIAKgA6Cwjz///v9/////8BQigSCTEuMy4yMjUuNxgFIAAqDlJlZ0tleU5vdEZvdW5kMgd3aW5kb3dzUgIIAFr8AQnP91PjpYtKQBGmm8QgsKpXQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAADwPxkAAAAAAADwPxkAAAAAAAAAABkAAAAAAADwPxkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAAAAABkAAAAAAABZQBkAAAAAAADwPxkAAAAAAABZQBkAAAAAAADwPxkAAAAAAADwPxkAAAAAAAA0QBkAAAAAAADwPxkAAAAAAABZQBkAAAAAAABZQHoCCAGCAQIYAKoBAgoAsAEA","saved_system_profile_hash":"2892626873476DB25FCA83D56E6174A490C993DD","stats_buildtime":"1773965981","stats_version":"146.0.3856.72-64","system_crash_count":0}},"variations_compressed_seed":"H4sIAAAAAAAAAK1aW2/juJL+Kw2/rtQgKVESdbAPjhN3GxMnPnacnMU5g4CWyhI7MqmhKCeZwfz3BXXxpdt2p7H7EoRU1cdisVg3+q/BzWgxiP8ajAoB0oyUXIus1twIJZdlyg3cbEEaS3ENheG3KruRfFVAOojXvKjAGYzroliAOf9lrOGPGmTyPogxQn87g5u3pKhTuHkzoCUv2kUnaTWRtyobxEbX4Aza2VuVPXCdgRnEA0gzeK6MXWNgUdIMrFxXWr1WoDcqbYbQCDEGbmoN1SD+92BTWdKHHDawAL0VCVxz/TK19L//7Qyur6aX+BZguhWG1TWseV2YKci6YV0A10m+4npYnYPYkcy02ooUdDVwDqfv1LXQkJg7vm0g58DTYaHqdJIoeS+Haaqhqq64vlWZSK54ZfV7eqmPsDrf09kBaKuMm0Jkwur2B5prUfGiUK+3ojKD351ByTXfgLF7if/910DyDQziQaKkAWmeK/GnxdjyorbTIUJo8Lfd2ixdP4gCRjzJ4YFXL41Ek01ZnNvQeQYLN1yvRSEaSz2rfXuAB3RXPHkB2Wrh8BOkM15Vr0qnizrLoGoxmxN+EWV36mMBRfpod7XgWyGzi0azZ1vKF6le5cN7CYfMvzf3wICs7Fpz2Kr2zlVCZu3F62z17DI9s+VNGuZHwe83POcteJrBl5vRI7n6iaz2+xeQtZDQ3BP1AnKmlVGJKh5B2yXOH3rZET5vO8r9wZP21O/Ug+ayKriBmSrrcizeLl7Tntga3p3asVioL3wjZPb1cWgBUlGdugKvXKdVR7jlT7BaTh5UuRAGqpmQUsidl/rdOXNhsw1I0yh0VnCzVnrT4nXgX7d8JkySd/f4g9S3vJZJfqeMWIv2tLp7dixwQ9tIfV7nm+rkChMpjODFzRsktcW/hoK/LyBRMq0OjsWz19H5GdgOZcRTkAn8iEMoIx+Cmgp5zd+rhZAJjPWRa/gAdzt5V29WoO/XFugAAPsfQOi897LiGYzBJPl1F98m8ju4j8gz1lDlEqpqIqdC1gaO5Ik+qJBRrtUGGpFmoBNrQdmhZuiv40yvDgUh9GMAc7Uq1NsdmFelXxqcq/fv9vQxoFt1+/+Acr8F/cpNkv9fsYby/YpbR5yrV3n2wNlH1DzKIXmZNM7JehBIH5QNRiuuD5CajKd1eCNVikKZW76Cs5FtpGRVb0Af0l7VxlxytYUlcg28GXfLteDSHOvErt3Z+qiujNqIP1s/c8n3n6K3QKZ3w7wsNzbd+ZDLlsOy3CVHiapLJas7Ja8KlbwImVm1zWspQV+MnbkqSyGzhVGaZzBS0ghZw71c5LVJ1as8Tr0eRVXzoh2eg72G6sWo0mY5R+RNfILX1lLqzYZr8Sd0Z2LXhTdzNq/ryZ+EyTuWHqqNvw/jr7zKm5xlyguRCFVX9+t1ZZSGXfC2gRaSi8f0qzh28akX0FshX4a1UfclyEkmlYaFSGHF9cJwczat+DnnLn7aHCxVK5il60cBr6C/iiwfKQ3VxEB747wLqd0i5xrSW7HSXL/vWBvY+2pZZpqn9sJNZApvFyymmTvF0FrJhksjkjainoFoTWIOa+vaf6s3qmHdZYRGg8zMWdtq/EJHO+X6RW13HBbmCVbDsqwaAchUZPqnd3JP3mQId/Daz37lMi2sVzhwM1aRvSne1V1JdEbjHct39I2UvCjAXN3NbpeTnwp5mngP02SQnTP5MNw5pv4oXuB9rhr3fEl3Vtu1ycGeecN/I5OCb+FgUuld+r8AY4TMqv74rNprQXbfu3VHOZeN71/UZam0aWRqyslqWUFvYs0GLpSBLdVIFUp3pHuNtbXuh6zjkKGzg6NQMpEzLbYXLrgFWUpbiIoUhrasG+XcjJXece4q4w5ymFyssWyVplSx4vo7+uMSZ2ZXrGyF+LVeDWU6VRqmlyLLjvMh1wDXylSLemU5hjI9AmsW0vXqfVyILLcn2mzrQqF8ivbQXdwpuT+oEUijeSH+PA/4U77GYlR5B69VHysu3dX7jRQr9ba/qPBa/VA69EB8K7Jm9kGLLANtr0hTmuRKQyEkHHJOZIe9M3J7GmW5rFpvMJRi0xAujOYGsvcTbv5WvR57ef+jXr7nbBa3HxOtikLI7F5OuZD2oHm6q15vQVZnoXuC8/kST7dcJpA+r2vZWeQP+VJTJBdqxYsppILbmK9VccbUTxH+7pwqRE9QtjV9auu6xtBaz9MnXpC2GUnT2zprZBd4LGhHPi54Noc1T4zSN28laLHpOninUO9qbWprMye4O1GTWkOXj38Zng2ipbR+o9rZ1WNp+0aJ2oLmK1EI895+2qwgTSF9LOWlGncv+OMPjYWjMq1V9UzDus9L9oS2kXhI+yTGorskF6iWsmq2bHsGw6I4x9Dei6ov+v9l9wxv5cXInvbUy8m+B7WbtI2YGTd59eid+Nq0ZFb1eh8lfqRZVjBJbZwz9t529t3FivivwW+iKBavtqa55oYvdTEVG7CNqVl/BjMNFejtLgqdsO0PsVrl2NWqZrWuoMLTEd+UXGTnoDdVN5pu3pZlBUWx47xVxoB+3/mGeznnm9JWd519POXc2Fzpkv73TDvqswbYVUaffjQ/7Aef0WeEkP1zVPK197Gt4/a6PrvZzhMfMd9Io99LJaTZbXXx1HQtJlVVwxmsrlX4pPQLaJu5zzQUqnOls1pvBbwu5YZLnkE6LMuxKGBZNhQn1dU412LTpxbXRdmDtEzO4OTXa7Xhx1nSTCtem3ys9HR0tstuS45OCV/r1UJkctJaUOfB7UL2baIALutyrHQC6/psaT08YuqpO+a9Ursicyh5DmIzud7fkp/VpT1LlzKk9tAu+e2GN+2qzUOgGc/gViW8gAexAVWbj8vwA+t5QzYtwfNGFIWoTrUD0T4W9vg3XBfvczBcFKDtjW+aiR+X7zT/eSHT5vNeqhMijTXA/XoNuvoFNWlhLWFTci2qtv2/FkWxh/rhTBaiZbrWqpzDRthE+WxA7jf7Vvro/N4qw7W5thn5YX/OJYFLECGHkQdk+h0dwi4iHd1O1MOAfFkXj6XsXxHOijflb0sJMrOu4auqdXWnjru0J85iVHAtzC/YQ8fQhei2ZaJeRFfu/3M5GVmUM+9KOZcSigOJxkdKK1XTiz80aISOO9Mamn7WRpjm9fBZyedXoeH5J3eD9FfDtiW1SGH52/RsGbR82XyxyY603ufyS1lD3GM2pPs1pyLRqlJr83ksdGVmXJv37qzn9hm1MnOo6sI42MH0H8fiNU+159/Cmq/Dnz/kdaQ/FfAJVl2U/NwnJ5+Xv00/L94rAzZfWYsCHGTl/ACT4ab6fKuyhb0uDnL8X2Gyd7wAAw1fq5QHKGADRr/PVLng9nPz90IDoYkVO7YdtU2z7DM0VGYphU2zrkVltFg17yNfRWVUpvnmvD4zreqS7MQ4MrBDK03bB8MvlvwU9RFx/bI5C7lL/RoTmtdNvnVr613ZuiveFNbj+c05VXxJxSLRALKNxveyeB/zoljx5KWL69A+aI3nN7/Q2rrE9oPQe+9ysynN++lPP64EsNZJi3b4OGeJx9r2km2GlAr7qDWIB3dKWu1Nh5NhUez6+M7g6enmeKJKynVtZ1Dzf1ZznfaDrY0RqO262vr2mHPUvot3jrj6bh1Y/evheOqqbUoczDRJ/tHM7mosK7t2//zgDL42z/mND7h54NkgHvxnkN2N37frP8xvrxWZz/+HFMsnRs0fBRKzxbwMvGCxfrxNb/65/K/kv/8zsOu9laLR5uAhr51PJPg05foTQST4hHBMSIyiT1+mD83eapuwjprfXgyWi4EzsHeyrrqZ9oWw+y3H5LqVy/7gZDBz5y4OKaYBcrGLnWaMIkLDZmwnrl2feFHkEjcY9D/3GMzcf7k4JAyFyCUuddox9SMaHYwxoRF1sRu2Y+KzKKIu6cc0iCLq9etYBi8IAsvQA3g0QswlLmvHAUHMPwAIPeqjYL9gwDzse3v+gFCfhK634w8iFIYudgnpJcTt1sIeIAj96EAAhBlFB4ARDkPkei4muxV9hA8IwtCn0X7LQchQAxi0Y9/3gtA7/O4FXnAgQIjD0HOJ6/cSs5AGLna9bowCHFi83Y7CEKOD7wHyo0N66rEoPMDzI+wxu4EdQYiYf7AB6rcqD3oGj/negYp9QgPs0j2Ah3wWHACgMAwaFXWHGmAaUXpwypQFCNsldhMBQz7Zb4r6iETY9XqhfYKph9zAJR0D9hELqEt35+j7CDPf9XcUhCBK0F7PCEWUBi7xXIxIY+VRaBVFXBw537ifMxyFMWOBj5GTrja+iSlCKCTMiTzGPIZozCIaBoETCBHmjOCYUWtgDiFr7IU+sr+q8mjkOR5dhWuCI4tAMIucYJ0BptiLMcIYUeKsgYqIoMBSBIHvO7BCeRhGfswi5vvEQYR6qRfSmAWMYeJIZVRZ2V9PuFLZH2CVzRNozDwSBNjxUQA5pV7MSBSi0KHrbyAChGPGKI58h4c+yynyYkZRGDKnexN8lko+r7pXwWfDq5dn3bwLWkVgFDihRzLBArrFMYtCFiKH8ShZ+xjFzKrcc2iWY+IRErMQ4QA7aeoR8FgYszD0A+qseAWu0cCNDQEujjhZk8iPozAKke/kecBSYtkZxlHkiIz6K0yCmFEWUuzoujLvm+Y5J2ZRQFDkUJKhbxizmOEgwMwJBPK8KPTjZquBQwl8Y35EYoYpi5iD8kisPBTGzGM4CpxGe+2Lwk6u9tdsMfM8H1GHrr1v4LMgZoyFIXL4auXlvjUAyjDznASvMh8HXmw/h56Twbc894lvJQoZdrwoEgIzFDNKQoIc2xPnbXs7jjANPepEvr8KqIdj5kc+ChyjSgmvlbS938riEBY4VhGriLI4Cij2Q2evxldhcrdqurbuWry5JFmnESVeowMSOQHPv33zKVNFGkch9Sl2csypR2gUhyz0EHZotg58z49aIX2HEbEmxA9jGvmRFzoiEiljNIp9nyFCB8dNrC5uMMyC3nfYccRCFnXOx45DTFjY+RI7DghlzHqCnsGLCA67W9qMsb2UnXOxEwjZiGE9XEdCfIw90jnUuYsxYRGmexkw9qiHXb/xJTaW2TttHYHfjyPaOOywHyMfsz0/osRjuPNFduwxhj2Xta6mmQgCj3YOce4GkR/6LmsDwtwNMLEByXdJuwPrr0M3av3S3PWpF3pu5EZ9KN2nhn1IpSHFexUGhLEgdAMXI4dHLEuYT62jCWiAB6cTtfZsUEijJpRGg+8zsO7wbKyx7rDfqW/twjryqNMkZSw61izD1CW09dutLj3P351FEKBwf/p2FO64AxRF9tRaLfkeiojrdd98EvoWhQz+/vt/AYjvAPoJKwAA","variations_country":"US","variations_crash_streak":0,"variations_failed_to_fetch_seed_streak":0,"variations_google_groups":{"Default":[]},"variations_last_fetch_time":"13418958135697619","variations_last_runtime_fetch_time":"13418958135853602","variations_permanent_consistency_country":["146.0.3856.72","US"],"variations_runtime_compressed_seed":"H4sIAAAAAAAAAHWQzW7bMBCE32XPXoBLUhQpoAdHitH25NhWi7TJgba2qmr9pBIN1A307oGs+FA0Oc7O4NvBPEPatT+q8lM2QAJr3CAJp6SOkFDSYj5YIzQSqviiY6uEQUKys1RGXuTsGkUmQo3SXGSkpFYocTa1EE6huprKxlpjjG52FVnnUDrUzi3WmCFRZA1plKjnJtKRsYRkrt8oJhNRjPT6gISysRFTHQELuC1K3pzaUDUMyTPky7Rrnnyo9lVdhfOq+jNdufX7mlfsw6nnAZLv0AxvJB/H8R/gvNsEuG2ewvlN5380c3+Ax3EBK+Zi7w/HfPDllsuG2zC812ZiL4tiivJrNvPB77orZC73kX3B/YWSdqc29Oe0KxgSyLfTFjtfQgIPcKx/H5Z+/+t42uY5r+6/3dXZ+mt/CPeb4vPuS11kP0Wf2ru/N+WHB4BxfAFcgkuMJAIAAA==","variations_runtime_config_ids":"P-R-1093245-1-21,P-R-108604-1-37,P-R-78306-1-18,P-R-73626-1-17,P-R-63165-4-26,P-R-53243-2-7,P-R-40093-3-26,P-R-38744-7-97,P-R-31899-29-499,P-D-1158614-2-4,P-R-1291681-16-17,P-R-1716517-1-7,P-R-1038760-1-10","variations_seed_client_version_at_store":"146.0.3856.72","variations_seed_date":"13418958129000000","variations_seed_milestone":146,"variations_seed_runtime_etag":"\"klqcAabjkuSUUeFYZQlDPWrctYRdJTVldDh0rC8QzBg=\"","variations_seed_runtime_serial_number":"\"klqcAabjkuSUUeFYZQlDPWrctYRdJTVldDh0rC8QzBg=\"","variations_seed_serial_number":"\"gNFyvfqtKws2RRY2lUW95tql0iPSRp636SfVLdEQU+c=\"","variations_seed_signature":"","was":{"restarted":false}} \ No newline at end of file diff --git a/.edge-profile-render-1774484525680/Nurturing/campaign_history b/.edge-profile-render-1774484525680/Nurturing/campaign_history new file mode 100644 index 0000000..a3bccc4 Binary files /dev/null and b/.edge-profile-render-1774484525680/Nurturing/campaign_history differ diff --git a/.edge-profile-render-1774484525680/Nurturing/campaign_history-journal b/.edge-profile-render-1774484525680/Nurturing/campaign_history-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render-1774484525680/OriginTrials/0.0.1.7/manifest.json b/.edge-profile-render-1774484525680/OriginTrials/0.0.1.7/manifest.json new file mode 100644 index 0000000..297204e --- /dev/null +++ b/.edge-profile-render-1774484525680/OriginTrials/0.0.1.7/manifest.json @@ -0,0 +1 @@ +{"version": "0.0.1.7", "origin-trials": {}} \ No newline at end of file diff --git a/.edge-profile-render-1774484525680/ShaderCache/data_0 b/.edge-profile-render-1774484525680/ShaderCache/data_0 new file mode 100644 index 0000000..d76fb77 Binary files /dev/null and b/.edge-profile-render-1774484525680/ShaderCache/data_0 differ diff --git a/.edge-profile-render-1774484525680/ShaderCache/data_1 b/.edge-profile-render-1774484525680/ShaderCache/data_1 new file mode 100644 index 0000000..035d06d Binary files /dev/null and b/.edge-profile-render-1774484525680/ShaderCache/data_1 differ diff --git a/.edge-profile-render-1774484525680/ShaderCache/data_2 b/.edge-profile-render-1774484525680/ShaderCache/data_2 new file mode 100644 index 0000000..c7e2eb9 Binary files /dev/null and b/.edge-profile-render-1774484525680/ShaderCache/data_2 differ diff --git a/.edge-profile-render-1774484525680/ShaderCache/data_3 b/.edge-profile-render-1774484525680/ShaderCache/data_3 new file mode 100644 index 0000000..5eec973 Binary files /dev/null and b/.edge-profile-render-1774484525680/ShaderCache/data_3 differ diff --git a/.edge-profile-render-1774484525680/ShaderCache/index b/.edge-profile-render-1774484525680/ShaderCache/index new file mode 100644 index 0000000..f9e2a21 Binary files /dev/null and b/.edge-profile-render-1774484525680/ShaderCache/index differ diff --git a/.edge-profile-render-1774484525680/SmartScreen/RemoteData/customSettings b/.edge-profile-render-1774484525680/SmartScreen/RemoteData/customSettings new file mode 100644 index 0000000..997f02d --- /dev/null +++ b/.edge-profile-render-1774484525680/SmartScreen/RemoteData/customSettings @@ -0,0 +1 @@ +customSettings_F95BA787499AB4FA9EFFF472CE383A14 \ No newline at end of file diff --git a/.edge-profile-render-1774484525680/SmartScreen/RemoteData/customSettings_F95BA787499AB4FA9EFFF472CE383A14 b/.edge-profile-render-1774484525680/SmartScreen/RemoteData/customSettings_F95BA787499AB4FA9EFFF472CE383A14 new file mode 100644 index 0000000..ae2fefa --- /dev/null +++ b/.edge-profile-render-1774484525680/SmartScreen/RemoteData/customSettings_F95BA787499AB4FA9EFFF472CE383A14 @@ -0,0 +1 @@ +{"forceServiceDetermination":false} \ No newline at end of file diff --git a/.edge-profile-render-1774484525680/SmartScreen/RemoteData/edgeSettings b/.edge-profile-render-1774484525680/SmartScreen/RemoteData/edgeSettings new file mode 100644 index 0000000..a89ca1f --- /dev/null +++ b/.edge-profile-render-1774484525680/SmartScreen/RemoteData/edgeSettings @@ -0,0 +1 @@ +edgeSettings_2.0-0 \ No newline at end of file diff --git a/.edge-profile-render-1774484525680/SmartScreen/RemoteData/edgeSettings_2.0-0 b/.edge-profile-render-1774484525680/SmartScreen/RemoteData/edgeSettings_2.0-0 new file mode 100644 index 0000000..3db8ccb --- /dev/null +++ b/.edge-profile-render-1774484525680/SmartScreen/RemoteData/edgeSettings_2.0-0 @@ -0,0 +1 @@ +{"models":[],"geoidMaps":{"gw_my":"https://malaysia.smartscreen.microsoft.com/","gw_tw":"https://taiwan.smartscreen.microsoft.com/","gw_at":"https://austria.smartscreen.microsoft.com/","gw_es":"https://spain.smartscreen.microsoft.com/","gw_pl":"https://poland.smartscreen.microsoft.com/","gw_se":"https://sweden.smartscreen.microsoft.com/","gw_kr":"https://southkorea.smartscreen.microsoft.com/","gw_br":"https://brazil.smartscreen.microsoft.com/","au":"https://australia.smartscreen.microsoft.com/","dk":"https://denmark.smartscreen.microsoft.com/","gw_sg":"https://singapore.smartscreen.microsoft.com/","gw_fr":"https://france.smartscreen.microsoft.com/","gw_ca":"https://canada.smartscreen.microsoft.com/","gw_il":"https://israel.smartscreen.microsoft.com/","gw_au":"https://australia.smartscreen.microsoft.com/","gw_ffl4mod":"https://unitedstates4.ss.wd.microsoft.us/","gw_ffl4":"https://unitedstates1.ss.wd.microsoft.us/","gw_eu":"https://europe.smartscreen.microsoft.com/","gw_gr":"https://greece.smartscreen.microsoft.com/","gw_de":"https://germany.smartscreen.microsoft.com/","br":"https://brazil.smartscreen.microsoft.com/","gw_uk":"https://unitedkingdom.smartscreen.microsoft.com/","gw_it":"https://italy.smartscreen.microsoft.com/","gw_us":"https://unitedstates.smartscreen.microsoft.com/","il":"https://israel.smartscreen.microsoft.com/","es":"https://spain.smartscreen.microsoft.com/","ch":"https://switzerland.smartscreen.microsoft.com/","at":"https://austria.smartscreen.microsoft.com/","jp":"https://japan.smartscreen.microsoft.com/","kr":"https://southkorea.smartscreen.microsoft.com/","nz":"https://newzealand.smartscreen.microsoft.com/","gw_cl":"https://chile.smartscreen.microsoft.com/","pl":"https://poland.smartscreen.microsoft.com/","eu":"https://europe.smartscreen.microsoft.com/","de":"https://germany.smartscreen.microsoft.com/","gw_no":"https://norway.smartscreen.microsoft.com/","ffl4mod":"https://unitedstates4.ss.wd.microsoft.us/","gw_jp":"https://japan.smartscreen.microsoft.com/","mx":"https://mexico.smartscreen.microsoft.com/","gw_ffl5":"https://unitedstates2.ss.wd.microsoft.us/","se":"https://sweden.smartscreen.microsoft.com/","gw_ch":"https://switzerland.smartscreen.microsoft.com/","gw_ae":"https://uae.smartscreen.microsoft.com/","my":"https://malaysia.smartscreen.microsoft.com/","gw_nz":"https://newzealand.smartscreen.microsoft.com/","ca":"https://canada.smartscreen.microsoft.com/","fr":"https://france.smartscreen.microsoft.com/","gw_mx":"https://mexico.smartscreen.microsoft.com/","no":"https://norway.smartscreen.microsoft.com/","gr":"https://greece.smartscreen.microsoft.com/","gw_qa":"https://qatar.smartscreen.microsoft.com/","gw_in":"https://india.smartscreen.microsoft.com/","in":"https://india.smartscreen.microsoft.com/","tw":"https://taiwan.smartscreen.microsoft.com/","sg":"https://singapore.smartscreen.microsoft.com/","ffl5":"https://unitedstates2.ss.wd.microsoft.us/","ae":"https://uae.smartscreen.microsoft.com/","gw_dk":"https://denmark.smartscreen.microsoft.com/","gw_za":"https://southafrica.smartscreen.microsoft.com/","uk":"https://unitedkingdom.smartscreen.microsoft.com/","cl":"https://chile.smartscreen.microsoft.com/","us":"https://unitedstates.smartscreen.microsoft.com/","qa":"https://qatar.smartscreen.microsoft.com/","za":"https://southafrica.smartscreen.microsoft.com/","ffl4":"https://unitedstates1.ss.wd.microsoft.us/","it":"https://italy.smartscreen.microsoft.com/"},"sampleBuckets":{"evaluateModel":1.0,"error":1.0,"uriLookup":0.01,"userAction":1.0,"topTrafficHit":0.00007}} \ No newline at end of file diff --git a/.edge-profile-render-1774484525680/Variations b/.edge-profile-render-1774484525680/Variations new file mode 100644 index 0000000..a157215 --- /dev/null +++ b/.edge-profile-render-1774484525680/Variations @@ -0,0 +1 @@ +{"user_experience_metrics.stability.exited_cleanly":false,"variations_crash_streak":0} \ No newline at end of file diff --git a/.edge-profile-render-1774484525680/component_crx_cache/95fd9d48e4fc245a3f3a99a3a16ecd1355050ba3f4afc555f19a97c7f9b49677 b/.edge-profile-render-1774484525680/component_crx_cache/95fd9d48e4fc245a3f3a99a3a16ecd1355050ba3f4afc555f19a97c7f9b49677 new file mode 100644 index 0000000..87ac989 Binary files /dev/null and b/.edge-profile-render-1774484525680/component_crx_cache/95fd9d48e4fc245a3f3a99a3a16ecd1355050ba3f4afc555f19a97c7f9b49677 differ diff --git a/.edge-profile-render-1774484525680/component_crx_cache/metadata.json b/.edge-profile-render-1774484525680/component_crx_cache/metadata.json new file mode 100644 index 0000000..4d15610 --- /dev/null +++ b/.edge-profile-render-1774484525680/component_crx_cache/metadata.json @@ -0,0 +1 @@ +{"hashes":{}} \ No newline at end of file diff --git a/.edge-profile-render-1774484525680/extensions_crx_cache/metadata.json b/.edge-profile-render-1774484525680/extensions_crx_cache/metadata.json new file mode 100644 index 0000000..4d15610 --- /dev/null +++ b/.edge-profile-render-1774484525680/extensions_crx_cache/metadata.json @@ -0,0 +1 @@ +{"hashes":{}} \ No newline at end of file diff --git a/.edge-profile-render-1774484525680/first_party_sets.db b/.edge-profile-render-1774484525680/first_party_sets.db new file mode 100644 index 0000000..2e4b19b Binary files /dev/null and b/.edge-profile-render-1774484525680/first_party_sets.db differ diff --git a/.edge-profile-render-1774484525680/first_party_sets.db-journal b/.edge-profile-render-1774484525680/first_party_sets.db-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Crashpad/metadata b/.edge-profile-render/Crashpad/metadata new file mode 100644 index 0000000..7c17fea Binary files /dev/null and b/.edge-profile-render/Crashpad/metadata differ diff --git a/.edge-profile-render/Crashpad/reports/08793756-d55c-40e1-907f-48f34637e3db.dmp b/.edge-profile-render/Crashpad/reports/08793756-d55c-40e1-907f-48f34637e3db.dmp new file mode 100644 index 0000000..cfe22e0 Binary files /dev/null and b/.edge-profile-render/Crashpad/reports/08793756-d55c-40e1-907f-48f34637e3db.dmp differ diff --git a/.edge-profile-render/Crashpad/reports/0a728f88-cece-4109-bb4c-d5ddd23d37cd.dmp b/.edge-profile-render/Crashpad/reports/0a728f88-cece-4109-bb4c-d5ddd23d37cd.dmp new file mode 100644 index 0000000..408619b Binary files /dev/null and b/.edge-profile-render/Crashpad/reports/0a728f88-cece-4109-bb4c-d5ddd23d37cd.dmp differ diff --git a/.edge-profile-render/Crashpad/reports/3683c183-161c-4482-8c93-96daed9978b7.dmp b/.edge-profile-render/Crashpad/reports/3683c183-161c-4482-8c93-96daed9978b7.dmp new file mode 100644 index 0000000..1d75279 Binary files /dev/null and b/.edge-profile-render/Crashpad/reports/3683c183-161c-4482-8c93-96daed9978b7.dmp differ diff --git a/.edge-profile-render/Crashpad/reports/a91b688a-7d44-4655-8136-47e5e27b0173.dmp b/.edge-profile-render/Crashpad/reports/a91b688a-7d44-4655-8136-47e5e27b0173.dmp new file mode 100644 index 0000000..b98889b Binary files /dev/null and b/.edge-profile-render/Crashpad/reports/a91b688a-7d44-4655-8136-47e5e27b0173.dmp differ diff --git a/.edge-profile-render/Crashpad/reports/a99bbb1d-c530-4101-be50-a29bac45a27e.dmp b/.edge-profile-render/Crashpad/reports/a99bbb1d-c530-4101-be50-a29bac45a27e.dmp new file mode 100644 index 0000000..df60a16 Binary files /dev/null and b/.edge-profile-render/Crashpad/reports/a99bbb1d-c530-4101-be50-a29bac45a27e.dmp differ diff --git a/.edge-profile-render/Crashpad/settings.dat b/.edge-profile-render/Crashpad/settings.dat new file mode 100644 index 0000000..8065d9a Binary files /dev/null and b/.edge-profile-render/Crashpad/settings.dat differ diff --git a/.edge-profile-render/Crashpad/throttle_store.dat b/.edge-profile-render/Crashpad/throttle_store.dat new file mode 100644 index 0000000..9639e1b --- /dev/null +++ b/.edge-profile-render/Crashpad/throttle_store.dat @@ -0,0 +1 @@ +level=none expiry=0 diff --git a/.edge-profile-render/Default/AutofillAiModelCache/LOCK b/.edge-profile-render/Default/AutofillAiModelCache/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/AutofillAiModelCache/LOG b/.edge-profile-render/Default/AutofillAiModelCache/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/AutofillAiModelCache/LOG.old b/.edge-profile-render/Default/AutofillAiModelCache/LOG.old new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/AutofillStrikeDatabase/LOCK b/.edge-profile-render/Default/AutofillStrikeDatabase/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/AutofillStrikeDatabase/LOG b/.edge-profile-render/Default/AutofillStrikeDatabase/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/AutofillStrikeDatabase/LOG.old b/.edge-profile-render/Default/AutofillStrikeDatabase/LOG.old new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/BookmarkMergedSurfaceOrdering b/.edge-profile-render/Default/BookmarkMergedSurfaceOrdering new file mode 100644 index 0000000..f3ee419 --- /dev/null +++ b/.edge-profile-render/Default/BookmarkMergedSurfaceOrdering @@ -0,0 +1,2 @@ +{ +} diff --git a/.edge-profile-render/Default/BrowsingTopicsSiteData b/.edge-profile-render/Default/BrowsingTopicsSiteData new file mode 100644 index 0000000..c41f9b3 Binary files /dev/null and b/.edge-profile-render/Default/BrowsingTopicsSiteData differ diff --git a/.edge-profile-render/Default/BrowsingTopicsSiteData-journal b/.edge-profile-render/Default/BrowsingTopicsSiteData-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/BrowsingTopicsState b/.edge-profile-render/Default/BrowsingTopicsState new file mode 100644 index 0000000..04e8ba5 --- /dev/null +++ b/.edge-profile-render/Default/BrowsingTopicsState @@ -0,0 +1,12 @@ +{ + "epochs": [ { + "calculation_time": "13418947896825214", + "config_version": 0, + "model_version": "0", + "padded_top_topics_start_index": 0, + "taxonomy_version": 0, + "top_topics_and_observing_domains": [ ] + } ], + "hex_encoded_hmac_key": "7D91FB82A5FE96F9F8EB72DC5402BADAFB65EF75C4BC6830A3384EBFB9E2626C", + "next_scheduled_calculation_time": "13419552696825341" +} diff --git a/.edge-profile-render/Default/BudgetDatabase/LOCK b/.edge-profile-render/Default/BudgetDatabase/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/BudgetDatabase/LOG b/.edge-profile-render/Default/BudgetDatabase/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/BudgetDatabase/LOG.old b/.edge-profile-render/Default/BudgetDatabase/LOG.old new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/ClientCertificates/LOCK b/.edge-profile-render/Default/ClientCertificates/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/ClientCertificates/LOG b/.edge-profile-render/Default/ClientCertificates/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/ClientCertificates/LOG.old b/.edge-profile-render/Default/ClientCertificates/LOG.old new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/Code Cache/js/index b/.edge-profile-render/Default/Code Cache/js/index new file mode 100644 index 0000000..79bd403 Binary files /dev/null and b/.edge-profile-render/Default/Code Cache/js/index differ diff --git a/.edge-profile-render/Default/Code Cache/js/index-dir/the-real-index b/.edge-profile-render/Default/Code Cache/js/index-dir/the-real-index new file mode 100644 index 0000000..c6d06ad Binary files /dev/null and b/.edge-profile-render/Default/Code Cache/js/index-dir/the-real-index differ diff --git a/.edge-profile-render/Default/Code Cache/wasm/index b/.edge-profile-render/Default/Code Cache/wasm/index new file mode 100644 index 0000000..79bd403 Binary files /dev/null and b/.edge-profile-render/Default/Code Cache/wasm/index differ diff --git a/.edge-profile-render/Default/Code Cache/wasm/index-dir/the-real-index b/.edge-profile-render/Default/Code Cache/wasm/index-dir/the-real-index new file mode 100644 index 0000000..8ec7ab9 Binary files /dev/null and b/.edge-profile-render/Default/Code Cache/wasm/index-dir/the-real-index differ diff --git a/.edge-profile-render/Default/DIPS b/.edge-profile-render/Default/DIPS new file mode 100644 index 0000000..4410bda Binary files /dev/null and b/.edge-profile-render/Default/DIPS differ diff --git a/.edge-profile-render/Default/DIPS-wal b/.edge-profile-render/Default/DIPS-wal new file mode 100644 index 0000000..4fde403 Binary files /dev/null and b/.edge-profile-render/Default/DIPS-wal differ diff --git a/.edge-profile-render/Default/DawnGraphiteCache/data_0 b/.edge-profile-render/Default/DawnGraphiteCache/data_0 new file mode 100644 index 0000000..d76fb77 Binary files /dev/null and b/.edge-profile-render/Default/DawnGraphiteCache/data_0 differ diff --git a/.edge-profile-render/Default/DawnGraphiteCache/data_1 b/.edge-profile-render/Default/DawnGraphiteCache/data_1 new file mode 100644 index 0000000..035d06d Binary files /dev/null and b/.edge-profile-render/Default/DawnGraphiteCache/data_1 differ diff --git a/.edge-profile-render/Default/DawnGraphiteCache/data_2 b/.edge-profile-render/Default/DawnGraphiteCache/data_2 new file mode 100644 index 0000000..c7e2eb9 Binary files /dev/null and b/.edge-profile-render/Default/DawnGraphiteCache/data_2 differ diff --git a/.edge-profile-render/Default/DawnGraphiteCache/data_3 b/.edge-profile-render/Default/DawnGraphiteCache/data_3 new file mode 100644 index 0000000..5eec973 Binary files /dev/null and b/.edge-profile-render/Default/DawnGraphiteCache/data_3 differ diff --git a/.edge-profile-render/Default/DawnGraphiteCache/index b/.edge-profile-render/Default/DawnGraphiteCache/index new file mode 100644 index 0000000..33aa467 Binary files /dev/null and b/.edge-profile-render/Default/DawnGraphiteCache/index differ diff --git a/.edge-profile-render/Default/DawnWebGPUCache/data_0 b/.edge-profile-render/Default/DawnWebGPUCache/data_0 new file mode 100644 index 0000000..d76fb77 Binary files /dev/null and b/.edge-profile-render/Default/DawnWebGPUCache/data_0 differ diff --git a/.edge-profile-render/Default/DawnWebGPUCache/data_1 b/.edge-profile-render/Default/DawnWebGPUCache/data_1 new file mode 100644 index 0000000..035d06d Binary files /dev/null and b/.edge-profile-render/Default/DawnWebGPUCache/data_1 differ diff --git a/.edge-profile-render/Default/DawnWebGPUCache/data_2 b/.edge-profile-render/Default/DawnWebGPUCache/data_2 new file mode 100644 index 0000000..c7e2eb9 Binary files /dev/null and b/.edge-profile-render/Default/DawnWebGPUCache/data_2 differ diff --git a/.edge-profile-render/Default/DawnWebGPUCache/data_3 b/.edge-profile-render/Default/DawnWebGPUCache/data_3 new file mode 100644 index 0000000..5eec973 Binary files /dev/null and b/.edge-profile-render/Default/DawnWebGPUCache/data_3 differ diff --git a/.edge-profile-render/Default/DawnWebGPUCache/index b/.edge-profile-render/Default/DawnWebGPUCache/index new file mode 100644 index 0000000..879caa8 Binary files /dev/null and b/.edge-profile-render/Default/DawnWebGPUCache/index differ diff --git a/.edge-profile-render/Default/DualEngine/SiteList-Consumer.json b/.edge-profile-render/Default/DualEngine/SiteList-Consumer.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/.edge-profile-render/Default/DualEngine/SiteList-Consumer.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/.edge-profile-render/Default/DualEngine/SiteList-Enterprise.json b/.edge-profile-render/Default/DualEngine/SiteList-Enterprise.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/.edge-profile-render/Default/DualEngine/SiteList-Enterprise.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/.edge-profile-render/Default/EdgeCoupons/coupons_data.db/CURRENT b/.edge-profile-render/Default/EdgeCoupons/coupons_data.db/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile-render/Default/EdgeCoupons/coupons_data.db/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile-render/Default/EdgeCoupons/coupons_data.db/LOCK b/.edge-profile-render/Default/EdgeCoupons/coupons_data.db/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/EdgeCoupons/coupons_data.db/LOG b/.edge-profile-render/Default/EdgeCoupons/coupons_data.db/LOG new file mode 100644 index 0000000..c0b2813 --- /dev/null +++ b/.edge-profile-render/Default/EdgeCoupons/coupons_data.db/LOG @@ -0,0 +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 diff --git a/.edge-profile-render/Default/EdgeCoupons/coupons_data.db/LOG.old b/.edge-profile-render/Default/EdgeCoupons/coupons_data.db/LOG.old new file mode 100644 index 0000000..c21b242 --- /dev/null +++ b/.edge-profile-render/Default/EdgeCoupons/coupons_data.db/LOG.old @@ -0,0 +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 diff --git a/.edge-profile-render/Default/EdgeCoupons/coupons_data.db/MANIFEST-000001 b/.edge-profile-render/Default/EdgeCoupons/coupons_data.db/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile-render/Default/EdgeCoupons/coupons_data.db/MANIFEST-000001 differ diff --git a/.edge-profile-render/Default/EdgeEDrop/EdgeEDropSQLite.db b/.edge-profile-render/Default/EdgeEDrop/EdgeEDropSQLite.db new file mode 100644 index 0000000..65a59e0 Binary files /dev/null and b/.edge-profile-render/Default/EdgeEDrop/EdgeEDropSQLite.db differ diff --git a/.edge-profile-render/Default/EdgeEDrop/EdgeEDropSQLite.db-journal b/.edge-profile-render/Default/EdgeEDrop/EdgeEDropSQLite.db-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/EdgeHubAppUsage/EdgeHubAppUsageSQLite.db b/.edge-profile-render/Default/EdgeHubAppUsage/EdgeHubAppUsageSQLite.db new file mode 100644 index 0000000..ef7db5b Binary files /dev/null and b/.edge-profile-render/Default/EdgeHubAppUsage/EdgeHubAppUsageSQLite.db differ diff --git a/.edge-profile-render/Default/EdgeHubAppUsage/EdgeHubAppUsageSQLite.db-journal b/.edge-profile-render/Default/EdgeHubAppUsage/EdgeHubAppUsageSQLite.db-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/EdgeJourneys/EdgeJourneys.db b/.edge-profile-render/Default/EdgeJourneys/EdgeJourneys.db new file mode 100644 index 0000000..8ad0e11 Binary files /dev/null and b/.edge-profile-render/Default/EdgeJourneys/EdgeJourneys.db differ diff --git a/.edge-profile-render/Default/EdgeJourneys/EdgeJourneys.db-wal b/.edge-profile-render/Default/EdgeJourneys/EdgeJourneys.db-wal new file mode 100644 index 0000000..3ae0de8 Binary files /dev/null and b/.edge-profile-render/Default/EdgeJourneys/EdgeJourneys.db-wal differ diff --git a/.edge-profile-render/Default/EdgePushStorageWithConnectTokenAndKey/LOCK b/.edge-profile-render/Default/EdgePushStorageWithConnectTokenAndKey/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/EdgePushStorageWithConnectTokenAndKey/LOG b/.edge-profile-render/Default/EdgePushStorageWithConnectTokenAndKey/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/EdgePushStorageWithConnectTokenAndKey/LOG.old b/.edge-profile-render/Default/EdgePushStorageWithConnectTokenAndKey/LOG.old new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/Extension Rules/CURRENT b/.edge-profile-render/Default/Extension Rules/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile-render/Default/Extension Rules/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile-render/Default/Extension Rules/LOCK b/.edge-profile-render/Default/Extension Rules/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/Extension Rules/LOG b/.edge-profile-render/Default/Extension Rules/LOG new file mode 100644 index 0000000..a9de9ed --- /dev/null +++ b/.edge-profile-render/Default/Extension Rules/LOG @@ -0,0 +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 diff --git a/.edge-profile-render/Default/Extension Rules/LOG.old b/.edge-profile-render/Default/Extension Rules/LOG.old new file mode 100644 index 0000000..d1bddbf --- /dev/null +++ b/.edge-profile-render/Default/Extension Rules/LOG.old @@ -0,0 +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 diff --git a/.edge-profile-render/Default/Extension Rules/MANIFEST-000001 b/.edge-profile-render/Default/Extension Rules/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile-render/Default/Extension Rules/MANIFEST-000001 differ diff --git a/.edge-profile-render/Default/Extension Scripts/CURRENT b/.edge-profile-render/Default/Extension Scripts/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile-render/Default/Extension Scripts/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile-render/Default/Extension Scripts/LOCK b/.edge-profile-render/Default/Extension Scripts/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/Extension Scripts/LOG b/.edge-profile-render/Default/Extension Scripts/LOG new file mode 100644 index 0000000..ea1d3de --- /dev/null +++ b/.edge-profile-render/Default/Extension Scripts/LOG @@ -0,0 +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 diff --git a/.edge-profile-render/Default/Extension Scripts/LOG.old b/.edge-profile-render/Default/Extension Scripts/LOG.old new file mode 100644 index 0000000..92fedf0 --- /dev/null +++ b/.edge-profile-render/Default/Extension Scripts/LOG.old @@ -0,0 +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 diff --git a/.edge-profile-render/Default/Extension Scripts/MANIFEST-000001 b/.edge-profile-render/Default/Extension Scripts/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile-render/Default/Extension Scripts/MANIFEST-000001 differ diff --git a/.edge-profile-render/Default/Extension State/CURRENT b/.edge-profile-render/Default/Extension State/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile-render/Default/Extension State/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile-render/Default/Extension State/LOCK b/.edge-profile-render/Default/Extension State/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/Extension State/LOG b/.edge-profile-render/Default/Extension State/LOG new file mode 100644 index 0000000..e613e62 --- /dev/null +++ b/.edge-profile-render/Default/Extension State/LOG @@ -0,0 +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 diff --git a/.edge-profile-render/Default/Extension State/LOG.old b/.edge-profile-render/Default/Extension State/LOG.old new file mode 100644 index 0000000..772af4d --- /dev/null +++ b/.edge-profile-render/Default/Extension State/LOG.old @@ -0,0 +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 diff --git a/.edge-profile-render/Default/Extension State/MANIFEST-000001 b/.edge-profile-render/Default/Extension State/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile-render/Default/Extension State/MANIFEST-000001 differ diff --git a/.edge-profile-render/Default/ExtensionActivityComp b/.edge-profile-render/Default/ExtensionActivityComp new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/ExtensionActivityEdge b/.edge-profile-render/Default/ExtensionActivityEdge new file mode 100644 index 0000000..8ac5d91 Binary files /dev/null and b/.edge-profile-render/Default/ExtensionActivityEdge differ diff --git a/.edge-profile-render/Default/ExtensionActivityEdge-journal b/.edge-profile-render/Default/ExtensionActivityEdge-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/Favicons b/.edge-profile-render/Default/Favicons new file mode 100644 index 0000000..e589db8 Binary files /dev/null and b/.edge-profile-render/Default/Favicons differ diff --git a/.edge-profile-render/Default/Favicons-journal b/.edge-profile-render/Default/Favicons-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/Feature Engagement Tracker/AvailabilityDB/LOCK b/.edge-profile-render/Default/Feature Engagement Tracker/AvailabilityDB/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/Feature Engagement Tracker/AvailabilityDB/LOG b/.edge-profile-render/Default/Feature Engagement Tracker/AvailabilityDB/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/Feature Engagement Tracker/AvailabilityDB/LOG.old b/.edge-profile-render/Default/Feature Engagement Tracker/AvailabilityDB/LOG.old new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/Feature Engagement Tracker/EventDB/LOCK b/.edge-profile-render/Default/Feature Engagement Tracker/EventDB/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/Feature Engagement Tracker/EventDB/LOG b/.edge-profile-render/Default/Feature Engagement Tracker/EventDB/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/Feature Engagement Tracker/EventDB/LOG.old b/.edge-profile-render/Default/Feature Engagement Tracker/EventDB/LOG.old new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/GPUCache/data_0 b/.edge-profile-render/Default/GPUCache/data_0 new file mode 100644 index 0000000..d76fb77 Binary files /dev/null and b/.edge-profile-render/Default/GPUCache/data_0 differ diff --git a/.edge-profile-render/Default/GPUCache/data_1 b/.edge-profile-render/Default/GPUCache/data_1 new file mode 100644 index 0000000..035d06d Binary files /dev/null and b/.edge-profile-render/Default/GPUCache/data_1 differ diff --git a/.edge-profile-render/Default/GPUCache/data_2 b/.edge-profile-render/Default/GPUCache/data_2 new file mode 100644 index 0000000..c7e2eb9 Binary files /dev/null and b/.edge-profile-render/Default/GPUCache/data_2 differ diff --git a/.edge-profile-render/Default/GPUCache/data_3 b/.edge-profile-render/Default/GPUCache/data_3 new file mode 100644 index 0000000..5eec973 Binary files /dev/null and b/.edge-profile-render/Default/GPUCache/data_3 differ diff --git a/.edge-profile-render/Default/GPUCache/index b/.edge-profile-render/Default/GPUCache/index new file mode 100644 index 0000000..d7e0afd Binary files /dev/null and b/.edge-profile-render/Default/GPUCache/index differ diff --git a/.edge-profile-render/Default/History b/.edge-profile-render/Default/History new file mode 100644 index 0000000..c02d277 Binary files /dev/null and b/.edge-profile-render/Default/History differ diff --git a/.edge-profile-render/Default/History-journal b/.edge-profile-render/Default/History-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/HubApps Icons b/.edge-profile-render/Default/HubApps Icons new file mode 100644 index 0000000..a838bbc Binary files /dev/null and b/.edge-profile-render/Default/HubApps Icons differ diff --git a/.edge-profile-render/Default/HubApps Icons-journal b/.edge-profile-render/Default/HubApps Icons-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/LOCK b/.edge-profile-render/Default/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/LOG b/.edge-profile-render/Default/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/LOG.old b/.edge-profile-render/Default/LOG.old new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/Login Data b/.edge-profile-render/Default/Login Data new file mode 100644 index 0000000..0af13bc Binary files /dev/null and b/.edge-profile-render/Default/Login Data differ diff --git a/.edge-profile-render/Default/Login Data For Account b/.edge-profile-render/Default/Login Data For Account new file mode 100644 index 0000000..0af13bc Binary files /dev/null and b/.edge-profile-render/Default/Login Data For Account differ diff --git a/.edge-profile-render/Default/Login Data For Account-journal b/.edge-profile-render/Default/Login Data For Account-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/Login Data-journal b/.edge-profile-render/Default/Login Data-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/Network Action Predictor b/.edge-profile-render/Default/Network Action Predictor new file mode 100644 index 0000000..79744b2 Binary files /dev/null and b/.edge-profile-render/Default/Network Action Predictor differ diff --git a/.edge-profile-render/Default/Network Action Predictor-journal b/.edge-profile-render/Default/Network Action Predictor-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/Nurturing/campaign_history b/.edge-profile-render/Default/Nurturing/campaign_history new file mode 100644 index 0000000..eab8517 Binary files /dev/null and b/.edge-profile-render/Default/Nurturing/campaign_history differ diff --git a/.edge-profile-render/Default/Nurturing/campaign_history-journal b/.edge-profile-render/Default/Nurturing/campaign_history-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/PersistentOriginTrials/LOCK b/.edge-profile-render/Default/PersistentOriginTrials/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/PersistentOriginTrials/LOG b/.edge-profile-render/Default/PersistentOriginTrials/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/PersistentOriginTrials/LOG.old b/.edge-profile-render/Default/PersistentOriginTrials/LOG.old new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/Preferences b/.edge-profile-render/Default/Preferences new file mode 100644 index 0000000..061d9a4 --- /dev/null +++ b/.edge-profile-render/Default/Preferences @@ -0,0 +1 @@ +{"aadc_info":{"age_group":0},"accessibility":{"captions":{"headless_caption_enabled":false}},"account_tracker_service_last_update":"13418947891730249","apps":{"shortcuts_arch":"","shortcuts_version":1},"autocomplete":{"retention_policy_last_version":146},"autofill":{"edge_autofill_advanced_ml_enabled":true,"edge_autofill_purge_low_quality_profiles_by_timeline":false,"last_version_deduped":146},"bookmark":{"storage_computation_last_update":"13418947891727147"},"browser":{"available_dark_theme_options":"All","edge_sidebar_visibility":{"add_app_to_bottom":true},"enable_text_prediction_v2":true,"recent_theme_color_list":[4293914607.0,4293914607.0,4293914607.0,4293914607.0,4293914607.0]},"browser_content_container_height":492,"browser_content_container_width":764,"browser_content_container_x":0,"browser_content_container_y":80,"commerce_daily_metrics_last_update_time":"13418947891742345","continuous_migration":{"equal_opt_out_users_data":{"backfilled":true}},"countryid_at_install":21843,"custom_links":{"list":[]},"default_apps_install_state":3,"dual_engine":{"consumer_site_list_with_ie_entries":false,"consumer_sitelist_location":"","consumer_sitelist_version":"","shared_cookie_data":{},"sitelist_has_consumer_data":false,"sitelist_has_enterprise_data":false,"sitelist_location":"","sitelist_source":0,"sitelist_version":""},"edge":{"services":{"signin_scoped_device_id":"cfbd373c-d574-456b-805d-514cbf30c2c7"},"workspaces":{"migration":{"stampede_time":"13418966687635292"}}},"edge_journeys":{"latest_journeys_count":0},"edge_pinning_campaign":{"precomputed_campaign_data":{}},"edge_rewards":{"cache_data":"CAA=","hva_webui_action_status_dict":{},"refresh_status_muted_until":"13419552690061415"},"edge_triggering":{"config_version":"1.42.0"},"edge_vpn":{"available":true},"edge_wallet":{"trigger_funnel":{"records":[]}},"enterprise_profile_guid":"a2264242-74c5-4a96-9316-322cb07915bc","extension":{"installed_extension_count":9},"extensions":{"alerts":{"initialized":true},"chrome_url_overrides":{},"last_chrome_version":"146.0.3856.72","pdf_upsell_triggered":false,"pinned_extension_migration":true,"pinned_extensions":[]},"family_safety":{"activity_reporting_enabled":false,"web_filtering_enabled":false},"gaia_cookie":{"periodic_report_time_2":"13418947890060128"},"intl":{"selected_languages":"en-US,en"},"media":{"engagement":{"schema_version":5}},"media_router":{"receiver_id_hash_token":"ZDHOpMfUVdmodB4YnAASD1uGjxV1GM7/EgswrCLEe/A8FE5eAbWkDMfttjJ8eacC2/4a32elKFM8LzqEbuuMbQ=="},"migrated_user_scripts_toggle":true,"muid":{"last_sync":"13418947891728555"},"ntp":{"next_site_suggestions_available":false,"num_personal_suggestions":1},"optimization_guide":{"hintsfetcher":{"hosts_successfully_fetched":{}},"previously_registered_optimization_types":{"ABOUT_THIS_SITE":true,"AUTOFILL_ACTOR_IFRAME_ORIGIN_ALLOWLIST":true,"GLIC_ACTION_PAGE_BLOCK":true,"HISTORY_CLUSTERS":true,"LOADING_PREDICTOR":true,"MERCHANT_TRUST_SIGNALS_V2":true,"PAGE_ENTITIES":true,"PRICE_INSIGHTS":true,"PRICE_TRACKING":true,"SALIENT_IMAGE":true,"SAVED_TAB_GROUP":true,"SHOPPING_DISCOUNTS":true,"SHOPPING_PAGE_TYPES":true,"V8_COMPILE_HINTS":true}},"personalization_data_consent":{"personalization_in_context_consent_can_prompt":true,"personalization_in_context_count":0},"privacy_sandbox":{"first_party_sets_data_access_allowed_initialized":true},"profile":{"avatar_index":20,"background_password_check":{"check_fri_weight":9,"check_interval":"2592000000000","check_mon_weight":6,"check_sat_weight":6,"check_sun_weight":6,"check_thu_weight":9,"check_tue_weight":9,"check_wed_weight":9,"next_check_time":"13419070109303900"},"content_settings":{"exceptions":{"3pcd_heuristics_grants":{},"abusive_notification_permissions":{},"access_to_get_all_screens_media_in_session":{},"anti_abuse":{},"app_banner":{},"ar":{},"are_suspicious_notifications_allowlisted_by_user":{},"auto_picture_in_picture":{},"auto_select_certificate":{},"automatic_downloads":{},"automatic_fullscreen":{},"autoplay":{},"background_sync":{},"bluetooth_chooser_data":{},"bluetooth_guard":{},"bluetooth_scanning":{},"camera_pan_tilt_zoom":{},"captured_surface_control":{},"clear_browsing_data_cookies_exceptions":{},"client_hints":{},"clipboard":{},"controlled_frame":{},"cookie_controls_metadata":{},"cookies":{},"direct_sockets":{},"direct_sockets_private_network_access":{},"display_media_system_audio":{},"disruptive_notification_permissions":{},"durable_storage":{},"edge_ad_targeting":{},"edge_ad_targeting_data":{},"edge_all_file_read_access":{},"edge_browser_action":{},"edge_sdsm":{},"edge_split_screen":{},"edge_tech_scam_detection":{},"edge_u2f_api_request":{},"edge_user_agent_token":{},"fedcm_idp_registration":{},"fedcm_idp_signin":{},"fedcm_share":{},"file_system_access_chooser_data":{},"file_system_access_extended_permission":{},"file_system_access_restore_permission":{},"file_system_last_picked_directory":{},"file_system_read_guard":{},"file_system_write_guard":{},"formfill_metadata":{},"geolocation":{},"geolocation_with_options":{},"hand_tracking":{},"has_migrated_local_network_access":true,"hid_chooser_data":{},"hid_guard":{},"http_allowed":{},"https_enforced":{},"idle_detection":{},"images":{},"important_site_info":{},"initialized_translations":{},"intent_picker_auto_display":{},"javascript":{},"javascript_jit":{},"javascript_optimizer":{},"keyboard_lock":{},"legacy_cookie_access":{},"legacy_cookie_scope":{},"local_fonts":{},"local_network":{},"local_network_access":{},"loopback_network":{},"media_engagement":{},"media_stream_camera":{},"media_stream_mic":{},"midi_sysex":{},"mixed_script":{},"nfc_devices":{},"notification_interactions":{},"notification_permission_review":{},"notifications":{},"ondevice_languages_downloaded":{},"password_protection":{},"payment_handler":{},"permission_actions_history":{},"permission_autoblocking_data":{},"permission_autorevocation_data":{},"pointer_lock":{},"popups":{},"protected_media_identifier":{},"protocol_handler":{},"reduced_accept_language":{},"safe_browsing_url_check_data":{},"secure_network":{},"secure_network_sites":{},"sensors":{},"serial_chooser_data":{},"serial_guard":{},"site_engagement":{},"sleeping_tabs":{},"sound":{},"speaker_selection":{},"ssl_cert_decisions":{},"storage_access":{},"storage_access_header_origin_trial":{},"subresource_filter":{},"subresource_filter_data":{},"suspicious_notification_ids":{},"suspicious_notification_show_original":{},"top_level_storage_access":{},"trackers":{},"trackers_data":{},"tracking_org_exceptions":{},"tracking_org_relationships":{},"typosquatting":{},"unused_site_permissions":{},"usb_chooser_data":{},"usb_guard":{},"vr":{},"web_app_installation":{},"webid_api":{},"webid_auto_reauthn":{},"window_placement":{}},"pref_version":1},"created_by_version":"146.0.3856.72","creation_time":"13418947466216619","default_content_setting_values":{"has_migrated_local_network_access":true},"edge_password_is_using_new_login_db_path":false,"edge_password_login_db_path_flip_flop_count":0,"edge_profile_id":"4a3d61d6-30f7-4264-9fb1-71e04c0db11a","edge_user_with_non_zero_passwords":false,"has_seen_signin_fre":false,"is_relative_to_aad":false,"managed_user_id":"","name":"Profile 1","network_pbs":{},"password_hash_data_list":[],"signin_fre_seen_time":"13418947890017280"},"reset_prepopulated_engines":false,"safety_hub":{"unused_site_permissions_revocation":{"migration_completed":true}},"saved_tab_groups":{"did_enable_shared_tab_groups_in_last_session":false,"specifics_to_data_migration":true},"sessions":{"event_log":[{"crashed":false,"time":"13418947890148683","type":0}],"session_data_status":1},"shopping":{"contextual_features_enabled":true,"dma_telemetry_expiration_time":"13419034290881221"},"signin":{"accounts_metadata_dict":{},"allowed":true},"spellcheck":{"dictionaries":["en-US"],"dictionary":""},"sync":{"apps":true,"autofill":true,"bookmarks":true,"collections":true,"collections_edge_re_evaluated":true,"collections_edge_supported":true,"edge_account_type":0,"edge_wallet":true,"edge_wallet_edge_supported":true,"edge_workspaces":true,"edge_workspaces_edge_supported":true,"encryption_bootstrap_token_per_account_migration_done":true,"extensions":true,"extensions_edge_supported":true,"history_edge_supported":true,"keep_everything_synced":false,"passwords":true,"preferences":true,"tabs":true,"tabs_edge_supported":true,"typed_urls":true},"syncing_theme_prefs_migrated_to_non_syncing":true,"toolbar":{"pinned_cast_migration_complete":true,"pinned_chrome_labs_migration_complete":true},"translate_site_blacklist":[],"translate_site_blocklist_with_time":{},"typosquatting":{"allowlist_migration_done":true},"user_experience_metrics":{"personalization_data_consent_enabled_last_known_value":false},"web_apps":{"did_migrate_default_chrome_apps":["MigrateDefaultChromeAppToWebAppsGSuite","MigrateDefaultChromeAppToWebAppsNonGSuite"],"last_preinstall_synchronize_version":"146","link_handling_info":{"enabled_for_installed_apps":true}}} \ No newline at end of file diff --git a/.edge-profile-render/Default/PreferredApps b/.edge-profile-render/Default/PreferredApps new file mode 100644 index 0000000..7d3a425 --- /dev/null +++ b/.edge-profile-render/Default/PreferredApps @@ -0,0 +1 @@ +{"preferred_apps":[],"version":1} \ No newline at end of file diff --git a/.edge-profile-render/Default/README b/.edge-profile-render/Default/README new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/Secure Preferences b/.edge-profile-render/Default/Secure Preferences new file mode 100644 index 0000000..04a2b1d --- /dev/null +++ b/.edge-profile-render/Default/Secure Preferences @@ -0,0 +1 @@ +{"edge_fundamentals_appdefaults":{"enclave_version":101},"ess_kv_states":{"restore_on_startup":{"closed_notification":false,"decrypt_success":true,"key":"restore_on_startup","notification_popup_count":0},"startup_urls":{"closed_notification":false,"decrypt_success":true,"key":"startup_urls","notification_popup_count":0},"template_url_data":{"closed_notification":false,"decrypt_success":true,"key":"template_url_data","notification_popup_count":0}},"extensions":{"settings":{"ahfgeienlihckogmohjhadlkjgocpleb":{"account_extension_type":0,"active_permissions":{"api":["management","system.display","system.storage","webstorePrivate","system.cpu","system.memory","system.network"],"explicit_host":[],"manifest_permissions":[],"scriptable_host":[]},"app_launcher_ordinal":"t","commands":{},"content_settings":[],"creation_flags":1,"disable_reasons":[],"events":[],"first_install_time":"13418947890302008","from_webstore":false,"incognito_content_settings":[],"incognito_preferences":{},"last_update_time":"13418947890302008","location":5,"manifest":{"app":{"launch":{"web_url":"https://chrome.google.com/webstore"},"urls":["https://chrome.google.com/webstore"]},"description":"Discover extensions for Microsoft Edge.","icons":{"128":"webstore_icon_128.png","16":"webstore_icon_16.png"},"key":"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCtl3tO0osjuzRsf6xtD2SKxPlTfuoy7AWoObysitBPvH5fE1NaAA1/2JkPWkVDhdLBWLaIBPYeXbzlHp3y4Vv/4XG+aN5qFE3z+1RU/NqkzVYHtIpVScf3DjTYtKVL66mzVGijSoAIwbFCC3LpGdaoe6Q1rSRDp76wR6jjFzsYwQIDAQAB","name":"Web Store","permissions":["webstorePrivate","management","system.cpu","system.display","system.memory","system.network","system.storage"],"version":"0.2"},"needs_sync":true,"page_ordinal":"n","path":"C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\146.0.3856.72\\resources\\web_store","preferences":{},"regular_only_preferences":{},"was_installed_by_default":false,"was_installed_by_oem":false},"dgiklkfkllikcanfonkcabmbdfmgleag":{"account_extension_type":0,"active_permissions":{"api":[],"explicit_host":[],"manifest_permissions":[],"scriptable_host":[]},"commands":{},"content_settings":[],"creation_flags":1,"disable_reasons":[],"events":[],"first_install_time":"13418947890317846","from_webstore":false,"incognito_content_settings":[],"incognito_preferences":{},"last_update_time":"13418947890317846","location":5,"manifest":{"content_capabilities":{"include_globs":["https://*excel.officeapps.live.com/*","https://*onenote.officeapps.live.com/*","https://*powerpoint.officeapps.live.com/*","https://*word-edit.officeapps.live.com/*","https://*excel.officeapps.live.com.mcas.ms/*","https://*onenote.officeapps.live.com.mcas.ms/*","https://*word-edit.officeapps.live.com.mcas.ms/*","https://*excel.partner.officewebapps.cn/*","https://*onenote.partner.officewebapps.cn/*","https://*powerpoint.partner.officewebapps.cn/*","https://*word-edit.partner.officewebapps.cn/*","https://*excel.gov.online.office365.us/*","https://*onenote.gov.online.office365.us/*","https://*powerpoint.gov.online.office365.us/*","https://*word-edit.gov.online.office365.us/*","https://*excel.dod.online.office365.us/*","https://*onenote.dod.online.office365.us/*","https://*powerpoint.dod.online.office365.us/*","https://*word-edit.dod.online.office365.us/*","https://*visio.partner.officewebapps.cn/*","https://*visio.gov.online.office365.us/*","https://*visio.dod.online.office365.us/*"],"matches":["https://*.officeapps.live.com/*","https://*.officeapps.live.com.mcas.ms/*","https://*.partner.officewebapps.cn/*","https://*.gov.online.office365.us/*","https://*.dod.online.office365.us/*","https://*.app.whiteboard.microsoft.com/*","https://*.whiteboard.office.com/*","https://*.app.int.whiteboard.microsoft.com/*","https://*.whiteboard.office365.us/*","https://*.dev.whiteboard.microsoft.com/*"],"permissions":["clipboardRead","clipboardWrite"]},"default_locale":"en","description":"This extension grants Microsoft web sites permission to read and write from the clipboard.","key":"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCz4t/X7GeuP6GBpjmxndrjtzF//4CWeHlC68rkoV7hP3h5Ka6eX7ZMNlYJkSjmB5iRmPHO5kR1y7rGY8JXnRPDQh/CQNLVA7OsKeV6w+UO+vx8KGI+TrTAhzH8YGcMIsxsUjxtC4cBmprja+xDr0zVp2EMgqHu+GBKgwSRHTkDuwIDAQAB","manifest_version":2,"minimum_chrome_version":"77","name":"Microsoft Clipboard Extension","version":"1.0"},"path":"C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\146.0.3856.72\\resources\\edge_clipboard","preferences":{},"regular_only_preferences":{},"was_installed_by_default":false,"was_installed_by_oem":false},"fikbjbembnmfhppjfnmfkahdhfohhjmg":{"account_extension_type":0,"active_permissions":{"api":[],"explicit_host":[],"manifest_permissions":[],"scriptable_host":[]},"commands":{},"content_settings":[],"creation_flags":1,"disable_reasons":[],"events":[],"first_install_time":"13418947890335130","from_webstore":false,"incognito_content_settings":[],"incognito_preferences":{},"last_update_time":"13418947890335130","location":5,"manifest":{"background":{"persistent":false,"scripts":["background.js"]},"externally_connectable":{"matches":["https://*.microsoftstream.com/*"]},"incognito":"split","key":"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsAmDrYmQaYQlLxSAn/jTQTGNt1IffJGIJeKucE/B42d8QIyFD2RCarmHP1bmbY1YuTng2dL3J//qyvUNwXPt9cmxH9WKwi512tzOa5r2zYaCuOgP2vAIrah/bKnpO3XmUfFWj+LRcbZahOmMDMQxzPKxFKuIz2eOiakBXDE6Ok7azHJ13LLQTte1JgZIPmyFrAciPABLp/IKLfsfnebVW1YgaOyxBNyp/7bhSmoyZI3kBv8InKOpGE8pttrBg6l5zkvD67a7ViNAYkqZIpJJV5ZTQtVWCWSG0xU2y+3zXZtx8KbGbDiWUAcwNYDVPpsV+IQXVpgAplHvrZme+hAl6QIDAQAB","manifest_version":2,"name":"Media Internals Services Extension","permissions":["mediaInternalsPrivate"],"version":"2.0.0"},"path":"C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\146.0.3856.72\\resources\\media_internals_services","preferences":{},"regular_only_preferences":{},"was_installed_by_default":false,"was_installed_by_oem":false},"iglcjdemknebjbklcgkfaebgojjphkec":{"account_extension_type":0,"active_permissions":{"api":["identity","management","metricsPrivate","webstorePrivate","hubPrivate"],"explicit_host":[],"manifest_permissions":[],"scriptable_host":[]},"app_launcher_ordinal":"w","commands":{},"content_settings":[],"creation_flags":1,"disable_reasons":[],"events":[],"first_install_time":"13418947890313218","from_webstore":false,"incognito_content_settings":[],"incognito_preferences":{},"last_update_time":"13418947890313218","location":5,"manifest":{"app":{"launch":{"web_url":"https://microsoftedge.microsoft.com"},"urls":["https://microsoftedge.microsoft.com"]},"description":"Discover extensions for Microsoft Edge.","icons":{"128":"webstore_icon_128.png","16":"webstore_icon_16.png"},"key":"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtMvN4+y6cd3el/A/NT5eUnrz1WiD1WJRaJfMBvaMtJHIuFGEmYdYL/YuE74J19+pwhjOHeFZ3XUSMTdOa5moOaXXvdMr5wWaaN2frHewtAnNDO64NGbbZvdsfGm/kRkHKVGNV6dacZsAkylcz5CkwTmq97wOZ7ETaShHvhZEGwRQIt4K1poxurOkDYQw9ERZNf3fgYJ9ZTrLZMAFDLJY+uSF03pClWrr8VGc8LUQ4Naktb8QSgVUlrS14AdF/ESdbhnTvvdB0e7peNWRyoNtCqLJsbtTtBL6sOnqfusnwPowuueOFI+XskOT9TvLo6PcgxhLX5+d0mM+Jtn6PFTU8QIDAQAB","name":"Microsoft Store","permissions":["webstorePrivate","management","metricsPrivate","identity","hubPrivate"],"version":"0.2"},"needs_sync":true,"page_ordinal":"n","path":"C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\146.0.3856.72\\resources\\microsoft_web_store","preferences":{},"regular_only_preferences":{},"was_installed_by_default":false,"was_installed_by_oem":false},"ihmafllikibpmigkcoadcmckbfhibefp":{"account_extension_type":0,"active_permissions":{"api":["debugger","feedbackPrivate","fileSystem","fileSystem.write","app.window.fullscreen","metricsPrivate","storage","tabs","fileSystem.readFullPath","edgeInternetConnectivityPrivate"],"explicit_host":["edge://resources/*"],"manifest_permissions":[],"scriptable_host":[]},"commands":{},"content_settings":[],"creation_flags":1,"disable_reasons":[],"events":[],"first_install_time":"13418947890327670","from_webstore":false,"incognito_content_settings":[],"incognito_preferences":{},"last_update_time":"13418947890327670","location":5,"manifest":{"app":{"background":{"scripts":["js/event_handler.js"]},"content_security_policy":"default-src 'none'; script-src 'self' blob: filesystem: chrome://resources; style-src 'unsafe-inline' blob: chrome: file: filesystem: data: *; img-src * blob: chrome: file: filesystem: data:; media-src 'self' blob: filesystem:; connect-src data:"},"description":"User feedback extension","display_in_launcher":false,"display_in_new_tab_page":false,"icons":{"128":"images/icon128.png","16":"images/icon16.png","192":"images/icon192.png","32":"images/icon32.png","48":"images/icon48.png"},"incognito":"split","key":"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAl3vxWwvLjcMIFK4OfG6C8PmJkMhFYDKRnx+SqG23YlMG1A+bOkiNmAN1TWpFPPp1f2PpbiZGNq1y29u/QfkD+PC4bnO7GbNw/2X5tGoP0n2K+KGGAxhnr0ki/oyo2eiFGSTOXlQvTRo5q1vB+Lbg+9TbFsWKlHZyAkeZ/YGz/iijHTqw8Q4RWdl5Tp8SlUhS/92EsWhveNJLW22veaT/Up2iSeSSwfyoHVYy8LUPaD4fbyLvPQacVLJq1dac2bNDqjaNvSPgPWCnkZtDmawZrgxT53otLCES/e96xfAf8I24VHIc1pVP8LqdqKr1AV1Yxn93h3VJ2QejtEhIAWHU6QIDAQAB","manifest_version":2,"name":"Edge Feedback","permissions":["chrome://resources/","debugger","edgeInternetConnectivityPrivate","feedbackPrivate",{"fileSystem":["readFullPath","write"]},"fullscreen","metricsPrivate","storage","windows"],"version":"1.0.0.1"},"path":"C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\146.0.3856.72\\resources\\edge_feedback","preferences":{},"regular_only_preferences":{},"was_installed_by_default":false,"was_installed_by_oem":false},"jdiccldimpdaibmpdkjnbmckianbfold":{"account_extension_type":0,"active_permissions":{"api":["activeTab","metricsPrivate","storage","systemPrivate","ttsEngine","errorReporting"],"explicit_host":["https://*.bing.com/*"],"manifest_permissions":[],"scriptable_host":[]},"commands":{},"content_settings":[],"creation_flags":1,"disable_reasons":[],"events":[],"first_install_time":"13418947890344453","from_webstore":false,"incognito_content_settings":[],"incognito_preferences":{},"last_update_time":"13418947890344453","location":5,"manifest":{"background":{"persistent":false,"scripts":["lifetimeHelper.js","telemetryHelper.js","errorHelper.js","voiceList/voiceListRequester.js","voiceList/voiceListSingleton.js","voiceList/voiceModel.js","manifestHelper.js","config.js","ssml.js","uuid.js","wordBoundary.js","audioStreamer.js","wordBoundaryEventManager.js","audioViewModel.js","background.js"]},"description":"Provides access to Microsoft's online text-to-speech voices","key":"AAAAB3NzaC1yc2EAAAADAQABAAAAgQDjGOAV6/3fmEtQmFqlmqm5cZ+jlNhd6XikwMDp0I7BKh+AjG3aBIG/qqwlsF/7LAGatnSxBwUwZC0qMnGXtcOPVl26Q8OvMx0gt5Va5gxca+ae0Skluj9WN9TNxPFVhw21WbCt4D9q3kb+XXDlx/7v1ktYus4Fwr/skkjADG9cIQ==","manifest_version":2,"name":"Microsoft Voices","permissions":["activeTab","errorReporting","metricsPrivate","storage","systemPrivate","ttsEngine","https://*.bing.com/"],"tts_engine":{"voices":[{"codec":"audio-24khz-48kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"en-US","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (en-US, AriaNeural)","voice_name":"Microsoft Aria Online (Natural) - English (United States)"},{"codec":"audio-24khz-48kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"en-US","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (en-US, GuyNeural)","voice_name":"Microsoft Guy Online (Natural) - English (United States)"},{"codec":"audio-24khz-48kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"zh-CN","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (zh-CN, XiaoxiaoNeural)","voice_name":"Microsoft Xiaoxiao Online (Natural) - Chinese (Mainland)"},{"codec":"audio-24khz-48kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"zh-CN","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (zh-CN, YunyangNeural)","voice_name":"Microsoft Yunyang Online (Natural) - Chinese (Mainland)"},{"codec":"audio-16khz-32kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"zh-TW","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (zh-TW, HanHanRUS)","voice_name":"Microsoft HanHan Online - Chinese (Taiwan)"},{"codec":"audio-16khz-32kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"zh-HK","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (zh-HK, TracyRUS)","voice_name":"Microsoft Tracy Online - Chinese (Hong Kong)"},{"codec":"audio-24khz-48kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"ja-JP","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (ja-JP, NanamiNeural)","voice_name":"Microsoft Nanami Online (Natural) - Japanese (Japan)"},{"codec":"audio-24khz-48kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"en-GB","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (en-GB, LibbyNeural)","voice_name":"Microsoft Libby Online (Natural) - English (United Kingdom)"},{"codec":"audio-24khz-48kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"pt-BR","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (pt-BR, FranciscaNeural)","voice_name":"Microsoft Francisca Online (Natural) - Portuguese (Brazil)"},{"codec":"audio-24khz-48kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"es-MX","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (es-MX, DaliaNeural)","voice_name":"Microsoft Dalia Online (Natural) - Spanish (Mexico)"},{"codec":"audio-16khz-32kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"en-IN","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (en-IN, PriyaRUS)","voice_name":"Microsoft Priya Online - English (India)"},{"codec":"audio-16khz-32kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"en-CA","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (en-CA, HeatherRUS)","voice_name":"Microsoft Heather Online - English (Canada)"},{"codec":"audio-24khz-48kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"fr-CA","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (fr-CA, SylvieNeural)","voice_name":"Microsoft Sylvie Online (Natural) - French (Canada)"},{"codec":"audio-24khz-48kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"fr-FR","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (fr-FR, DeniseNeural)","voice_name":"Microsoft Denise Online (Natural) - French (France)"},{"codec":"audio-24khz-48kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"de-DE","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (de-DE, KatjaNeural)","voice_name":"Microsoft Katja Online (Natural) - German (Germany)"},{"codec":"audio-16khz-32kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"ru-RU","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (ru-RU, EkaterinaRUS)","voice_name":"Microsoft Ekaterina Online - Russian (Russia)"},{"codec":"audio-16khz-32kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"en-AU","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (en-AU, HayleyRUS)","voice_name":"Microsoft Hayley Online - English (Australia)"},{"codec":"audio-24khz-48kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"it-IT","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (it-IT, ElsaNeural)","voice_name":"Microsoft Elsa Online (Natural) - Italian (Italy)"},{"codec":"audio-24khz-48kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"ko-KR","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (ko-KR, SunHiNeural)","voice_name":"Microsoft SunHi Online (Natural) - Korean (Korea)"},{"codec":"audio-16khz-32kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"nl-NL","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (nl-NL, HannaRUS)","voice_name":"Microsoft Hanna Online - Dutch (Netherlands)"},{"codec":"audio-24khz-48kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"es-ES","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (es-ES, ElviraNeural)","voice_name":"Microsoft Elvira Online (Natural) - Spanish (Spain)"},{"codec":"audio-24khz-48kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"tr-TR","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (tr-TR, EmelNeural)","voice_name":"Microsoft Emel Online (Natural) - Turkish (Turkey)"},{"codec":"audio-16khz-32kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"pl-PL","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (pl-PL, PaulinaRUS)","voice_name":"Microsoft Paulina Online - Polish (Poland)"}]},"version":"1.0"},"path":"C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\146.0.3856.72\\resources\\microsoft_voices","preferences":{},"regular_only_preferences":{},"was_installed_by_default":false,"was_installed_by_oem":false},"mhjfbmdgcfjbbpaeojofohoefgiehjai":{"account_extension_type":0,"active_permissions":{"api":["contentSettings","fileSystem","fileSystem.write","metricsPrivate","tabs","resourcesPrivate","pdfViewerPrivate","fileSystem.readFullPath","errorReporting","edgeLearningToolsPrivate","fileSystem.getCurrentEntry","edgePdfPrivate","edgeCertVerifierPrivate"],"explicit_host":["edge://resources/*","edge://webui-test/*"],"manifest_permissions":[],"scriptable_host":[]},"commands":{},"content_settings":[],"creation_flags":1,"disable_reasons":[],"events":[],"first_install_time":"13418947890308136","from_webstore":false,"incognito_content_settings":[],"incognito_preferences":{},"last_update_time":"13418947890308136","location":5,"manifest":{"content_security_policy":"script-src 'self' 'wasm-eval' blob: filesystem: chrome://resources chrome://webui-test; object-src * blob: externalfile: file: filesystem: data:; trusted-types edge-internal fast-html pdf-url edge-pdf-static-policy;","description":"","incognito":"split","key":"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDN6hM0rsDYGbzQPQfOygqlRtQgKUXMfnSjhIBL7LnReAVBEd7ZmKtyN2qmSasMl4HZpMhVe2rPWVVwBDl6iyNE/Kok6E6v6V3vCLGsOpQAuuNVye/3QxzIldzG/jQAdWZiyXReRVapOhZtLjGfywCvlWq7Sl/e3sbc0vWybSDI2QIDAQAB","manifest_version":2,"mime_types":["application/pdf"],"mime_types_handler":"edge_pdf/index.html","name":"Microsoft Edge PDF Viewer","offline_enabled":true,"permissions":["errorReporting","chrome://resources/","chrome://webui-test/","contentSettings","metricsPrivate","edgeCertVerifierPrivate","edgeLearningToolsPrivate","edgePdfPrivate","pdfViewerPrivate","resourcesPrivate","tabs",{"fileSystem":["write","readFullPath","getCurrentEntry"]}],"version":"1"},"path":"C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\146.0.3856.72\\resources\\edge_pdf","preferences":{},"regular_only_preferences":{},"was_installed_by_default":false,"was_installed_by_oem":false},"ncbjelpjchkpbikbpkcchkhkblodoama":{"account_extension_type":0,"active_permissions":{"api":[],"explicit_host":[],"manifest_permissions":[],"scriptable_host":[]},"commands":{},"content_settings":[],"creation_flags":1,"disable_reasons":[],"events":[],"first_install_time":"13418947890338949","from_webstore":false,"incognito_content_settings":[],"incognito_preferences":{},"last_update_time":"13418947890338949","location":5,"manifest":{"background":{"persistent":false,"scripts":["background.js"]},"externally_connectable":{"matches":["https://*.teams.cloud.microsoft/*","https://*.teams.cloud.microsoft.com/*","https://*.teams.microsoft.com/*","https://*.skype.com/*","https://*.teams.live.com/*"]},"incognito":"split","key":"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtAdFAR3ckd5c7G8VSzUj4Ltt/QRInUOD00StG95LweksGcLBlFlYL46cHFVgHHj1gmzcpBtgsURdcrAC3V8yiE7GY4wtpOP+9l+adUGR+cyOG0mw9fLjyH+2Il0QqktsNXzkNiE1ogW4l0h4+PJc262j0vtm4hBzMvR0QScFWcAIcAErlUiWTt4jefXCAYqubV99ed5MvVMWBxe97wOa9hYwAhbCminOepA4RRTg9eyi0TiuHpq/bNI8C5qZgKIQNBAjgiFBaIx9hiMBFlK4NHUbFdgY6Qp/hSCMNurctwz1jpsXEnT4eHg1YWXfquoH8s4swIjkFCMBF6Ejc3cUkQIDAQAB","manifest_version":2,"name":"WebRTC Internals Extension","permissions":["webrtcInternalsPrivate"],"version":"2.0.4"},"path":"C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\146.0.3856.72\\resources\\webrtc_internals","preferences":{},"regular_only_preferences":{},"was_installed_by_default":false,"was_installed_by_oem":false},"nkeimhogjdpnpccoofpliimaahmaaome":{"account_extension_type":0,"active_permissions":{"api":["processes","webrtcLoggingPrivate","system.cpu","enterprise.hardwarePlatform"],"explicit_host":[],"manifest_permissions":[],"scriptable_host":[]},"commands":{},"content_settings":[],"creation_flags":1,"disable_reasons":[],"events":[],"first_install_time":"13418947890322452","from_webstore":false,"incognito_content_settings":[],"incognito_preferences":{},"last_update_time":"13418947890322452","location":5,"manifest":{"background":{"page":"background.html","persistent":false},"externally_connectable":{"matches":["https://*.teams.cloud.microsoft/*","https://*.teams.cloud.microsoft.com/*","https://*.teams.microsoft.com/*","https://*.teams.live.com/*","https://*.skype.com/*"]},"incognito":"split","key":"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDAQt2ZDdPfoSe/JI6ID5bgLHRCnCu9T36aYczmhw/tnv6QZB2I6WnOCMZXJZlRdqWc7w9jo4BWhYS50Vb4weMfh/I0On7VcRwJUgfAxW2cHB+EkmtI1v4v/OU24OqIa1Nmv9uRVeX0GjhQukdLNhAE6ACWooaf5kqKlCeK+1GOkQIDAQAB","manifest_version":2,"name":"WebRTC Extension","permissions":["enterprise.hardwarePlatform","processes","system.cpu","webrtcLoggingPrivate"],"version":"4.3.26"},"path":"C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\146.0.3856.72\\resources\\hangout_services","preferences":{},"regular_only_preferences":{},"was_installed_by_default":false,"was_installed_by_oem":false}}},"protection":{"macs":{"browser":{"show_home_button":"31FF5D80FE6A795FE2CB19889367FD90F977BC3792C5CC4B7F2C871F9EC65B51","show_home_button_encrypted_hash":"djEwD9WYNgnYqMUikWLKcyOtY8XtajIJSt2a/WBk2SenEMZ+khc+H+sPRieEbGprkRRUFQP29dljNiZXqUQL"},"default_search_provider_data":{"template_url_data":"C29C79C4E396626377D93F0CFE362AE38EB2CF777B47270A973AB0832BE2C44A","template_url_data_encrypted_hash":"djEwtQIiiLfBEpYGqjgXbCldy6zEVAov0n1pg5wqVtxLGerTf1f0Ga5MKWlF4rlwSKYfUtMCfIyCgF6s7T5T"},"edge":{"services":{"account_id":"F2F1D19FB2E3FD8E78B68415325EA250902A6D7D62358524F0149F48D60C5283","account_id_encrypted_hash":"djEwQum7FMFClJvbArXLpvDm3hOeEEpnIv/0wtZDHWBNwz5x/fsbWTCchfCLdjHxFEjD4Vg1GySu5X1X5Y7N","last_username":"FB026645C5CB39FB3C6A7DC05C3F440DAEF903369418370ABD00B5A8FC6FCDD6","last_username_encrypted_hash":"djEwdcQj6qMG6tXMe8QvWdu/eGYnJKLq3G5MWibFxK0ZEIj0aSXxyUDPWD82x/L4rf3BLhOTJMVS8el6aeFN"}},"enterprise_signin":{"policy_recovery_token":"6830661AD96A6D2C8A4FFEEC044717FD0B40D619B1F7D796AC98415846694E66","policy_recovery_token_encrypted_hash":"djEwlU0R5Jru0bN1b+8bIUuHaROF3bFSBjhkT+o0duvxqn5uA8VDPxHnzgjOyaRwwhUh1A27ZPf3Vbl6DEf7"},"extensions":{"install":{"initiallist":"0E4D11D8EA5F952E24A14420326E68E050F617EA12021912C6698B74F7D96CC0","initiallist_encrypted_hash":"djEwqUExC297/d77z1I8uhcyuGoFxVtNdi9Ie4D1tZCVnhtzFH323OxToxTK12MvGJlYS3Bp8MpAEHdNvpWf","initialprovidername":"EA3F27681ED6AE05BE9BACE91C7A3736C7F214783B2C8898C6EA51C4B998428C","initialprovidername_encrypted_hash":"djEw7FVqiOBc8+VmAqJ4yc37Vp2bpi3nLvb4NlOWSaQx1MQ3pu2ou5WWqfr2TtwCQpjbf3Hu9uap+bgXB1Fc"},"settings":{"ahfgeienlihckogmohjhadlkjgocpleb":"1FFAFB1C30A5F43D4CC9F38E876E654A81AFEB0888E1B6CCC292B18122EF31B6","dgiklkfkllikcanfonkcabmbdfmgleag":"68C973B52F10F83505C8E42DC9CEBB8257DDDDA997367AE4FCE87E11FBD70655","fikbjbembnmfhppjfnmfkahdhfohhjmg":"D9B4BB088B50D8CB984BDB2D870304E43F20BFA2F4EC749C834100DAFA93D799","iglcjdemknebjbklcgkfaebgojjphkec":"6D616AA5DF351E3BE27D3EF9676D392E4E4600BF284EC48B0013E7903333DCE8","ihmafllikibpmigkcoadcmckbfhibefp":"201B4F738354415A4935C498A4B02081A98ED4614209DD67D0D78E869CF1FFCA","jdiccldimpdaibmpdkjnbmckianbfold":"4518FCFBE0656C2D6427599AECD72A91165AE600318E673B6570FF9AC6E82581","mhjfbmdgcfjbbpaeojofohoefgiehjai":"58B750D4A7503E9BBE9C9A4E1AB444DFA19EAD882CAB2551337B4CE08CAFFD6D","ncbjelpjchkpbikbpkcchkhkblodoama":"6F15D3C3746E0037C9D34F8EEE01FFC58DC6CDCCF5DCD47F8B9C3BA9675E7FDA","nkeimhogjdpnpccoofpliimaahmaaome":"2A527D18B81DB57DBDC91E563C00B0F6319FB404D0362866DED9A1AAD2472178"},"settings_encrypted_hash":{"ahfgeienlihckogmohjhadlkjgocpleb":"djEwUH0qH/bWsLsGJWvJdkyQ88mvfk65WYzfponO78RyUlrqlVSlIYQbkbPr1oJKVeyq9ri1c7fd3WjKVTOI","dgiklkfkllikcanfonkcabmbdfmgleag":"djEwK6goml5YkCMA/PGUHE9CgcNH8IcqzJu+69j34/QOGVeomVuHEkiiM/pLq0VIGv3kTCKoKUokgQWvRwHW","fikbjbembnmfhppjfnmfkahdhfohhjmg":"djEw2HkRfKEH7sS1SaEu9GRzVpjQDfFchPZTP00xLmEkGONyrcRjcgjWQVZip4ISvv2FbCWr9CZS/x/J6Moj","iglcjdemknebjbklcgkfaebgojjphkec":"djEwRIqbIwx6atNrntqT7ZWEwq7ZxXI1pUm00SeQeYigKANpdoG9O5Z9RNrH6X4HDxJeD+7x2X4RInl3lSFv","ihmafllikibpmigkcoadcmckbfhibefp":"djEwqbmAOdrXlwQgoavN3B6ikAcZbuX42TNT8EEXp+NuN/NJawdwgTUWG9LRSRhYwB7dkfNgIHGnW1e5hrfS","jdiccldimpdaibmpdkjnbmckianbfold":"djEwCW9LOuk46TXk1TMU59glc6ssIwHwcGslsuiNUWHSRpNaBEF3/Zdqk5QHknlNIBYhJKBJ89leGPdGoK6m","mhjfbmdgcfjbbpaeojofohoefgiehjai":"djEwkawTCNpGeUzBO2F62/H6kupdyVTRP2yg+d2jWs2fIIMAT19rFDX9NpsA2uYXcpFW+YuXK4CMCzDpB2+R","ncbjelpjchkpbikbpkcchkhkblodoama":"djEwBFIUW334fhdBqvHYHHZlCsMO7UY91SHRMbJWbQ37XAJhsxiDlk0tEeAYapKWbITboe89mo//tgvqiaPy","nkeimhogjdpnpccoofpliimaahmaaome":"djEwaQEWrGte8e+ZxUM2PL0Jp951ZKl7a3M0KEBQlxXRWTdcSWQnzdoD5yNMdJb60obhuRe7cT1pqOsSmJt2"},"ui":{"developer_mode":"C56CAEDE4F773F33F6AA11ED3B55DB5AD6A79944D966D3FAC1E9453157EF4B18","developer_mode_encrypted_hash":"djEw53DKLUQ5hf+1X23CMteSrZ2Tvjh+PhefFr3sdPjZ578QJilN1bi8F5+LUHu2i/JckNQG+opfECyjy/iw"}},"google":{"services":{"last_signed_in_username":"2EE81834DB0B6D8AB9FD660F0A7C98EBD4A8B40A74118150DD2893194EB8A60C","last_signed_in_username_encrypted_hash":"djEwxTfsPbG20XrLW3WGItIwflwhIbEh+g0DlFkuYsNE48GZHOim416DuBqWYoAwUB+o5QxSRjv/O+xNiqWV"}},"homepage":"2C46CB79C277992F901435D45CCDA37D9176019676D60FCE7C7939C59063EDEE","homepage_encrypted_hash":"djEwpZ9h4NP4sNlAsyxDZT3MBJV0BY6D6qggJIxSl9/6+BMM8UkDGT7WcA17k1kKQxf2+t2IOjWQvl6IHP6r","homepage_is_newtabpage":"30436771E0E4D9590DD1363343DD7F37A3E00DAA38D260FA94A455B233AEB744","homepage_is_newtabpage_encrypted_hash":"djEwjwURYz3nJ7PEYWZowwo/6YRNdXdxyKItQwKxo2D295cXi1FnC4Hfz/3+ImUSBYK9H928oVGWCjaePX+d","media":{"cdm":{"origin_data":"DC74BF09FCACFE9E058BC4A62275D82145C4F64C0BB55FBCC13287C1856D2085","origin_data_encrypted_hash":"djEwLnTiDFr6CymA26bnKTs3+CnuW7habH0PBnjBMck+iRkt6st6JpX10rv+Lq0zZryEYvRmJTLU5UWRgQ9d"},"storage_id_salt":"838B681888FC88C8EA74E985DE45075E76611EC1BD17C92C675A24F41A103D20","storage_id_salt_encrypted_hash":"djEwrhNKeuOHYFVlNccRxqgEq9Z6+VL0xAZ6V+97O9Q3A87XlcMIYl1A9tXh3mlF6iMBNQ/zrMsKwnSXQoDt"},"pinned_tabs":"D9B2ADF8FE923DA216C09DA91C85011B0807A3BDC4D17D1B900481B183B2023C","pinned_tabs_encrypted_hash":"djEwDaKFHgF2xmxiCenK2Gl302P+KnYIJht4nggm21L+b6mykHeMr/yDgb1w7m6a50xGKqvZbP6QntW/OkiD","prefs":{"preference_reset_time":"C755211BE9000AE8E8418A0B43B236E11E395162C56317F814A7C1C1F5FA37DB","preference_reset_time_encrypted_hash":"djEwAE3zAMfyjfH0XX6QS+pnXXKBDKd9RW3l4GMXhXfxGfKQFZz3Cj5f9hRky07vUNsxiHzW90Xx1H4zDMpE"},"safebrowsing":{"incidents_sent":"C27E7B6414757EC7B69237008F3609C63D8B3E0D3022C6F8AC1BB28D821F9680","incidents_sent_encrypted_hash":"djEwdIYpJTXjmRP9U/OnF9K4d2QtWRRbfLQYWyr4puy7ZnkZbivcDrWytsIlOmv1160jn4xS5uNyX10UQOln"},"schedule_to_flush_to_disk":"4C8EFF030118CDF93F562A9F515146457FFF641A8BC3E273C00F02B19457706C","schedule_to_flush_to_disk_encrypted_hash":"djEwQ9E0nuxsWjN7PawCGx/iDqcO3tOAm2kI5SS6qQs5PInoRv+27ifhJ5BTn7rwdlmGANFfg1QyTHzrM1Do","search_provider_overrides":"2C79C4955D5E2C0AC3644E8A29357FD7DB1C6DCFDB7556E1B5641E31FB0F57DB","search_provider_overrides_encrypted_hash":"djEw+abR+Ftar7FTqvHvpM0Ik37NdTzYY5IH44j1EgjnP/1bH61vEDozp1ItsF471WdDIckZ9WhpYCMrYOyM","session":{"restore_on_startup":"BF14AE9EDA027778E3C2047056BE1B321AE63B933A29FA05B30E76FE780AD0CE","restore_on_startup_encrypted_hash":"djEwAJiaJnKdBA6A2eZN9OjPtXfGE2iqw0h51cvbDFFnjFhSn2G5/xdgyu7W/la4aM7WKH5YGJxduBh629yF","startup_urls":"4266BB085D3346F8626C812970D202685455DEC0CBBB807690923BAE5510C65E","startup_urls_encrypted_hash":"djEwOEsifG8PufNsCyuUHBaJqdj8TUYheK1ZiEY/JM2bawrWk5WMrEjHUeqsusX1HBsYN4EoTBQpGuQoIcOk"}},"super_mac":"BD976C1691B41D10E3DDB3B10862D64B0CA9F6ABB53892F41D87A3B082F6CC0C"},"schedule_to_flush_to_disk":"13418947891725996"} \ No newline at end of file diff --git a/.edge-profile-render/Default/Segmentation Platform/SegmentInfoDB/LOCK b/.edge-profile-render/Default/Segmentation Platform/SegmentInfoDB/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/Segmentation Platform/SegmentInfoDB/LOG b/.edge-profile-render/Default/Segmentation Platform/SegmentInfoDB/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/Segmentation Platform/SegmentInfoDB/LOG.old b/.edge-profile-render/Default/Segmentation Platform/SegmentInfoDB/LOG.old new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/Segmentation Platform/SignalDB/LOCK b/.edge-profile-render/Default/Segmentation Platform/SignalDB/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/Segmentation Platform/SignalDB/LOG b/.edge-profile-render/Default/Segmentation Platform/SignalDB/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/Segmentation Platform/SignalDB/LOG.old b/.edge-profile-render/Default/Segmentation Platform/SignalDB/LOG.old new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/Segmentation Platform/SignalStorageConfigDB/LOCK b/.edge-profile-render/Default/Segmentation Platform/SignalStorageConfigDB/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/Segmentation Platform/SignalStorageConfigDB/LOG b/.edge-profile-render/Default/Segmentation Platform/SignalStorageConfigDB/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/Segmentation Platform/SignalStorageConfigDB/LOG.old b/.edge-profile-render/Default/Segmentation Platform/SignalStorageConfigDB/LOG.old new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/ServerCertificate b/.edge-profile-render/Default/ServerCertificate new file mode 100644 index 0000000..9587f64 Binary files /dev/null and b/.edge-profile-render/Default/ServerCertificate differ diff --git a/.edge-profile-render/Default/ServerCertificate-journal b/.edge-profile-render/Default/ServerCertificate-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/Sessions/Session_13418947892666060 b/.edge-profile-render/Default/Sessions/Session_13418947892666060 new file mode 100644 index 0000000..ffa1f24 Binary files /dev/null and b/.edge-profile-render/Default/Sessions/Session_13418947892666060 differ diff --git a/.edge-profile-render/Default/Sessions/Session_13418947929542887 b/.edge-profile-render/Default/Sessions/Session_13418947929542887 new file mode 100644 index 0000000..e3aab38 Binary files /dev/null and b/.edge-profile-render/Default/Sessions/Session_13418947929542887 differ diff --git a/.edge-profile-render/Default/SharedStorage b/.edge-profile-render/Default/SharedStorage new file mode 100644 index 0000000..4410bda Binary files /dev/null and b/.edge-profile-render/Default/SharedStorage differ diff --git a/.edge-profile-render/Default/SharedStorage-wal b/.edge-profile-render/Default/SharedStorage-wal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/Shortcuts b/.edge-profile-render/Default/Shortcuts new file mode 100644 index 0000000..6dbc636 Binary files /dev/null and b/.edge-profile-render/Default/Shortcuts differ diff --git a/.edge-profile-render/Default/Shortcuts-journal b/.edge-profile-render/Default/Shortcuts-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/Site Characteristics Database/CURRENT b/.edge-profile-render/Default/Site Characteristics Database/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile-render/Default/Site Characteristics Database/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile-render/Default/Site Characteristics Database/LOCK b/.edge-profile-render/Default/Site Characteristics Database/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/Site Characteristics Database/LOG b/.edge-profile-render/Default/Site Characteristics Database/LOG new file mode 100644 index 0000000..fd1b0ed --- /dev/null +++ b/.edge-profile-render/Default/Site Characteristics Database/LOG @@ -0,0 +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 diff --git a/.edge-profile-render/Default/Site Characteristics Database/LOG.old b/.edge-profile-render/Default/Site Characteristics Database/LOG.old new file mode 100644 index 0000000..1d8cc17 --- /dev/null +++ b/.edge-profile-render/Default/Site Characteristics Database/LOG.old @@ -0,0 +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 diff --git a/.edge-profile-render/Default/Site Characteristics Database/MANIFEST-000001 b/.edge-profile-render/Default/Site Characteristics Database/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile-render/Default/Site Characteristics Database/MANIFEST-000001 differ diff --git a/.edge-profile-render/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/js/index b/.edge-profile-render/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/js/index new file mode 100644 index 0000000..79bd403 Binary files /dev/null and b/.edge-profile-render/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/js/index differ diff --git a/.edge-profile-render/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/js/index-dir/the-real-index b/.edge-profile-render/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/js/index-dir/the-real-index new file mode 100644 index 0000000..e56fecb Binary files /dev/null and b/.edge-profile-render/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/js/index-dir/the-real-index differ diff --git a/.edge-profile-render/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/wasm/index b/.edge-profile-render/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/wasm/index new file mode 100644 index 0000000..79bd403 Binary files /dev/null and b/.edge-profile-render/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/wasm/index differ diff --git a/.edge-profile-render/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/wasm/index-dir/the-real-index b/.edge-profile-render/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/wasm/index-dir/the-real-index new file mode 100644 index 0000000..10d3295 Binary files /dev/null and b/.edge-profile-render/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/wasm/index-dir/the-real-index differ diff --git a/.edge-profile-render/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_0 b/.edge-profile-render/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_0 new file mode 100644 index 0000000..d76fb77 Binary files /dev/null and b/.edge-profile-render/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_0 differ diff --git a/.edge-profile-render/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_1 b/.edge-profile-render/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_1 new file mode 100644 index 0000000..035d06d Binary files /dev/null and b/.edge-profile-render/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_1 differ diff --git a/.edge-profile-render/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_2 b/.edge-profile-render/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_2 new file mode 100644 index 0000000..c7e2eb9 Binary files /dev/null and b/.edge-profile-render/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_2 differ diff --git a/.edge-profile-render/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_3 b/.edge-profile-render/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_3 new file mode 100644 index 0000000..5eec973 Binary files /dev/null and b/.edge-profile-render/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_3 differ diff --git a/.edge-profile-render/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/index b/.edge-profile-render/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/index new file mode 100644 index 0000000..5b229f0 Binary files /dev/null and b/.edge-profile-render/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/index differ diff --git a/.edge-profile-render/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_0 b/.edge-profile-render/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_0 new file mode 100644 index 0000000..d76fb77 Binary files /dev/null and b/.edge-profile-render/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_0 differ diff --git a/.edge-profile-render/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_1 b/.edge-profile-render/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_1 new file mode 100644 index 0000000..035d06d Binary files /dev/null and b/.edge-profile-render/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_1 differ diff --git a/.edge-profile-render/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_2 b/.edge-profile-render/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_2 new file mode 100644 index 0000000..c7e2eb9 Binary files /dev/null and b/.edge-profile-render/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_2 differ diff --git a/.edge-profile-render/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_3 b/.edge-profile-render/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_3 new file mode 100644 index 0000000..5eec973 Binary files /dev/null and b/.edge-profile-render/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_3 differ diff --git a/.edge-profile-render/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/index b/.edge-profile-render/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/index new file mode 100644 index 0000000..3d1cbf9 Binary files /dev/null and b/.edge-profile-render/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/index differ diff --git a/.edge-profile-render/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_0 b/.edge-profile-render/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_0 new file mode 100644 index 0000000..d76fb77 Binary files /dev/null and b/.edge-profile-render/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_0 differ diff --git a/.edge-profile-render/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_1 b/.edge-profile-render/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_1 new file mode 100644 index 0000000..035d06d Binary files /dev/null and b/.edge-profile-render/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_1 differ diff --git a/.edge-profile-render/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_2 b/.edge-profile-render/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_2 new file mode 100644 index 0000000..c7e2eb9 Binary files /dev/null and b/.edge-profile-render/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_2 differ diff --git a/.edge-profile-render/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_3 b/.edge-profile-render/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_3 new file mode 100644 index 0000000..5eec973 Binary files /dev/null and b/.edge-profile-render/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_3 differ diff --git a/.edge-profile-render/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/index b/.edge-profile-render/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/index new file mode 100644 index 0000000..07e72f3 Binary files /dev/null and b/.edge-profile-render/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/index differ diff --git a/.edge-profile-render/Default/Sync Data/LevelDB/CURRENT b/.edge-profile-render/Default/Sync Data/LevelDB/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile-render/Default/Sync Data/LevelDB/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile-render/Default/Sync Data/LevelDB/LOCK b/.edge-profile-render/Default/Sync Data/LevelDB/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/Sync Data/LevelDB/LOG b/.edge-profile-render/Default/Sync Data/LevelDB/LOG new file mode 100644 index 0000000..158effd --- /dev/null +++ b/.edge-profile-render/Default/Sync Data/LevelDB/LOG @@ -0,0 +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 diff --git a/.edge-profile-render/Default/Sync Data/LevelDB/LOG.old b/.edge-profile-render/Default/Sync Data/LevelDB/LOG.old new file mode 100644 index 0000000..6ddc82b --- /dev/null +++ b/.edge-profile-render/Default/Sync Data/LevelDB/LOG.old @@ -0,0 +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 diff --git a/.edge-profile-render/Default/Sync Data/LevelDB/MANIFEST-000001 b/.edge-profile-render/Default/Sync Data/LevelDB/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile-render/Default/Sync Data/LevelDB/MANIFEST-000001 differ diff --git a/.edge-profile-render/Default/Top Sites b/.edge-profile-render/Default/Top Sites new file mode 100644 index 0000000..e700bd4 Binary files /dev/null and b/.edge-profile-render/Default/Top Sites differ diff --git a/.edge-profile-render/Default/Top Sites-journal b/.edge-profile-render/Default/Top Sites-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/Vpn Tokens b/.edge-profile-render/Default/Vpn Tokens new file mode 100644 index 0000000..2ba3b69 Binary files /dev/null and b/.edge-profile-render/Default/Vpn Tokens differ diff --git a/.edge-profile-render/Default/Vpn Tokens-journal b/.edge-profile-render/Default/Vpn Tokens-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/Web Data b/.edge-profile-render/Default/Web Data new file mode 100644 index 0000000..282055a Binary files /dev/null and b/.edge-profile-render/Default/Web Data differ diff --git a/.edge-profile-render/Default/Web Data-journal b/.edge-profile-render/Default/Web Data-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/arbitration_service_config.json b/.edge-profile-render/Default/arbitration_service_config.json new file mode 100644 index 0000000..fd7d0be --- /dev/null +++ b/.edge-profile-render/Default/arbitration_service_config.json @@ -0,0 +1,197 @@ +{ + "ArbitrationSignal": "notification_nsat_upper_ci-0.7", + "CopilotModeBypass": [ "cd4688a9-e888-48ea-ad81-76193d56b1be.IsVideoPage.Bubble", "cd4688a9-e888-48ea-ad81-76193d56b1be.IsKnowledgeCardQuery.Bubble", "PerformanceDetectorFeatureNotification", "AUTOFILL_PASSWORD_NON_FUNCTIONAL_FLYOUTS", "SHOPPING_AUTO_SHOW_LOWER_PRICE_FOUND", "SHOPPING_AUTO_SHOW_REBATES", "SHOPPING_AUTO_SHOW_REBATES_CONFIRMATION", "SHOPPING_AUTO_SHOW_REBATES_ORGANIC", "SHOPPING_AUTO_SHOW_REBATES_ORGANIC_NEW" ], + "CustomSuppressionPolicies": { + "8682d0fa-50b3-4ece-aa5b-e0b33f9919e2.f5b8c725-cb2e-4c12-accd-73e500d88d47.AutoOpen": { + "notification_max_quick_dismiss_count": 3 + }, + "bc25fcef-8964-4e72-8287-23e2b496c128.68b8a884-6e08-46e6-8a3b-7e06ffe48ecf.AutoOpen": { + "notification_max_quick_dismiss_count": 3 + }, + "cd4688a9-e888-48ea-ad81-76193d56b1be.e06e75c1-a59a-4ab6-8361-e8b038e00a8c.AutoOpen": { + "notification_max_quick_dismiss_count": 1 + } + }, + "DynamicSuppressionBypass": { + "ExperienceIDs": [ "Nurturing.Global.OnRamp_RetriggerFREOnEdgeVersionUpgradeViaExplicitLaunch", "Nurturing.Global.OnRamp_RetriggerFREOnExplicitProtocolPDFLaunchForEdgePostDMA", "Nurturing.Global.Bing_DefaultBrowserBannerCloseBtn", "Nurturing.Global.Bing_DefaultBrowserBannerCloseBtnUpdate", "Nurturing.Global.Bing_MSStartYJCompete", "Nurturing.Global.Bing_NtpHomeStartpageUpsellFlyout", "Nurturing.Global.Fundamentals_DefaultBrowserMonitor", "Nurturing.Global.Fundamentals_DefaultBrowserMonitorOnStart", "Nurturing.Global.Fundamentals_DefaultBrowserMonitorVariant2", "Nurturing.Global.RecommendedSettingsChina", "Nurturing.Global.ContinuousImport_PasswordZeroStateV2", "Nurturing.Global.OnRamp_CIExplicitLaunchBannerUpsell", "Nurturing.Global.OnRamp_CIUpsell_ProtocolLaunch_Banner", "Nurturing.Global.EdgeGrowth_SitePinningCITopSites", "Nurturing.Global.EdgeGrowth_SitePinningWithWindowsConsent", "Nurturing.Global.EdgeGrowth_GlobalSitePinningOnCloseModal" ], + "TeamIDs": [ "NTP" ] + }, + "ExperienceCohorts": { + "DefaultCohort": { + "21f3388b-c2a5-4791-8f6e-a4cad6d17f4f.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.BingHomePage.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Covid.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Finance.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Jobs.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.KnowledgeCard.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Local.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.NTP3PCLICK.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.NotifySearchPage.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Recipe.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.SearchPage.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Sports.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Travel.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Weather.Bubble": 1, + "2cb2db96-3bd0-403e-abe2-9269b3761041.AutoOpen": 1, + "2cb2db96-3bd0-403e-abe2-9269b3761041.Bubble": 1, + "439642fc-998d-4a64-8bb6-940ecaf6b60b.AutoOpen": 1, + "439642fc-998d-4a64-8bb6-940ecaf6b60b.Bubble": 1, + "523b5ef3-0b10-4154-8b62-10b2ebd00921.Bubble": 1, + "64be4f9b-3b81-4b6e-b354-0ba00d6ba485.AutoOpen": 1, + "64be4f9b-3b81-4b6e-b354-0ba00d6ba485.Bubble": 1, + "76b926d6-3738-46bf-82d7-2ab896ddf70b.MM2UpSellPopup.Bubble": 1, + "8682d0fa-50b3-4ece-aa5b-e0b33f9919e2.Bubble": 1, + "8682d0fa-50b3-4ece-aa5b-e0b33f9919e2.f5b8c725-cb2e-4c12-accd-73e500d88d47.AutoOpen": 1, + "8ac719c5-140b-4bf2-a0b7-c71617f1f377.3662f1e2-66ae-464f-b690-e7e3dc4fc662.AutoOpen": 1, + "8ac719c5-140b-4bf2-a0b7-c71617f1f377.93e5b5cd-15fc-4253-9728-d80685da304e.AutoOpen": 1, + "8ac719c5-140b-4bf2-a0b7-c71617f1f377.AutoOpen": 1, + "8ac719c5-140b-4bf2-a0b7-c71617f1f377.gaokao.Bubble": 1, + "92f1b743-e26b-433b-a1ec-912d1f0ad1fa.Bubble": 1, + "96defd79-4015-4a32-bd09-794ff72183ef.0bdde3c3-7be8-49f1-971b-e6e2cfd62643.AutoOpen": 1, + "96defd79-4015-4a32-bd09-794ff72183ef.128c39c6-6f70-4ce5-9d01-78978e60d666.AutoOpen": 1, + "96defd79-4015-4a32-bd09-794ff72183ef.5ac63306-e962-42e6-8313-7e5a5b707d65.AutoOpen": 1, + "96defd79-4015-4a32-bd09-794ff72183ef.AutoOpen": 1, + "96defd79-4015-4a32-bd09-794ff72183ef.Bubble": 1, + "96defd79-4015-4a32-bd09-794ff72183ef.Is1PGameDomain.Bubble": 1, + "96defd79-4015-4a32-bd09-794ff72183ef.Is3PGameDomain.Bubble": 1, + "9ce3c9c2-462f-4cc9-bbd7-57d656445be0.Bubble": 1, + "AUTOFILL_PASSWORD_NON_FUNCTIONAL_FLYOUTS": 1, + "DefaultExperience": 1, + "EdgeDownloadChromeInterceptDialog": 2, + "PerformanceDetectorFeatureNotification": 1, + "RewardsPromotionNotifications": 1, + "RewardsReminderNotifications": 1, + "SAN.Personalization.ConsentPrompt": 1, + "SHOPPING_AA_CONSENT": 1, + "SHOPPING_AUTO_PRODUCT_TRACKING_EXP_PRICE_DROP": 1, + "SHOPPING_AUTO_PRODUCT_TRACKING_IMP_PRICE_DROP": 1, + "SHOPPING_AUTO_PRODUCT_TRACKING_OUT_OF_STOCK": 1, + "SHOPPING_AUTO_SHOW_ABANDONED_CART": 1, + "SHOPPING_AUTO_SHOW_ADD_SPB_TO_CART_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_AMAZON_SEARCH_PC": 1, + "SHOPPING_AUTO_SHOW_ATTAINABLE_COUPONS": 1, + "SHOPPING_AUTO_SHOW_AUTOS_MARKETPLACE": 1, + "SHOPPING_AUTO_SHOW_AWARENESSEXP": 1, + "SHOPPING_AUTO_SHOW_AWARENESS_EXPANSION": 1, + "SHOPPING_AUTO_SHOW_CAMPAIGN_AWARENESS_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_CAMPAIGN_PDP_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_CASHBACK_PDP_PLUS_COUPONS": 1, + "SHOPPING_AUTO_SHOW_CJK_COUPON_FOUND": 1, + "SHOPPING_AUTO_SHOW_CJK_PRICE_DROP": 1, + "SHOPPING_AUTO_SHOW_CODEX_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_CONFIRMATION_SCRIPT": 1, + "SHOPPING_AUTO_SHOW_CONTROLLER": 1, + "SHOPPING_AUTO_SHOW_COUPONS_BACKGROUND_AUTO_APPLY": 1, + "SHOPPING_AUTO_SHOW_COUPONS_CHECKOUT": 1, + "SHOPPING_AUTO_SHOW_COUPONS_CHECKOUT_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_COUPONS_CLIPPING": 1, + "SHOPPING_AUTO_SHOW_DISCOVER_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_DISCOVER_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_EXPRESS_CHECKOUT": 1, + "SHOPPING_AUTO_SHOW_GIFT_CARD": 1, + "SHOPPING_AUTO_SHOW_GOODRX": 1, + "SHOPPING_AUTO_SHOW_GROCERY_ITEMIZED_CASHBACK": 1, + "SHOPPING_AUTO_SHOW_GROCERY_ITEMIZED_CASHBACK_LANDING": 1, + "SHOPPING_AUTO_SHOW_GUEST_DOMAIN_COUPONS": 1, + "SHOPPING_AUTO_SHOW_IBC_UPSELL": 1, + "SHOPPING_AUTO_SHOW_LOWER_PRICE_FOUND": 1, + "SHOPPING_AUTO_SHOW_LOWER_PRICE_PLUS_CASHBACK_PLUS_COUPONS": 1, + "SHOPPING_AUTO_SHOW_MOMENT_IN_TIME": 1, + "SHOPPING_AUTO_SHOW_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_ORGANIC_CASHBACK_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_OTHER_SELLER": 1, + "SHOPPING_AUTO_SHOW_OUT_OF_STOCK": 1, + "SHOPPING_AUTO_SHOW_PACKAGE_TRACKING": 1, + "SHOPPING_AUTO_SHOW_PACKAGE_TRACKING_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_PERSONALIZED_CASHBACK_ADDRESSBAR": 1, + "SHOPPING_AUTO_SHOW_PERSONALIZED_CASHBACK_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_POST_PURCHASE_TRACKING": 1, + "SHOPPING_AUTO_SHOW_PRICE_DROP_PLUS_CASHBACK": 1, + "SHOPPING_AUTO_SHOW_PRICE_DROP_PLUS_COUPONS": 1, + "SHOPPING_AUTO_SHOW_PRICE_HISTORY": 1, + "SHOPPING_AUTO_SHOW_PRICE_HISTORY_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_PRINT_GROCERY": 1, + "SHOPPING_AUTO_SHOW_PRODUCT_BEST_COUPON_CONSENT": 1, + "SHOPPING_AUTO_SHOW_PRODUCT_TRACKING_BACK_IN_STOCK": 1, + "SHOPPING_AUTO_SHOW_PRODUCT_TRACKING_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_PROFESSIONAL_REVIEWS": 1, + "SHOPPING_AUTO_SHOW_REBATES": 1, + "SHOPPING_AUTO_SHOW_REBATES_CHECKOUT": 1, + "SHOPPING_AUTO_SHOW_REBATES_ORGANIC": 1, + "SHOPPING_AUTO_SHOW_REBATES_ORGANIC_NEW": 1, + "SHOPPING_AUTO_SHOW_REBATES_PDP": 1, + "SHOPPING_AUTO_SHOW_RECOMMENDATIONS_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_SAN_CONSENT_CONFIRMATION": 1, + "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_ALL_PAGES": 1, + "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_CHECKOUT": 1, + "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_CONFIRMATION_PAGE": 1, + "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_HOME_PAGE": 1, + "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_REWARDS": 1, + "SHOPPING_AUTO_SHOW_SHOPRUNNER": 1, + "SHOPPING_AUTO_SHOW_SIDEPANE_CASHBACK_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_SPB_CASHBACK_LANDING": 1, + "SHOPPING_AUTO_SHOW_SPB_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_SPB_NUDGE_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_SURFACE_UPSELL": 1, + "SHOPPING_AUTO_SHOW_SUSTAINABILITY_LANDING": 1, + "SHOPPING_AUTO_SHOW_TRAVEL_NOTIFICATION_CHEAPER_FLIGHTS": 1, + "SHOPPING_AUTO_SHOW_TRAVEL_NOTIFICATION_CHEAPER_HOTEL_ROOM": 1, + "SHOPPING_AUTO_SHOW_TRENDING_COUPONS": 1, + "ShorelinePrivilegedExperienceID": 1, + "TabActionsMenuVerticalTabsPromotion": 1, + "VPNFeatureNotification": 1, + "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.75a774c2-6075-ae4f-09f9-e5f5d9bef6e1.AutoOpen": 1, + "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.AutoOpen": 1, + "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.a5e9f5e1-fcee-c07b-2c44-b707ded020a3.AutoOpen": 1, + "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.c8ebbf64-e3b8-41d9-925f-4e3754151ff7.AutoOpen": 1, + "bc25fcef-8964-4e72-8287-23e2b496c128.68b8a884-6e08-46e6-8a3b-7e06ffe48ecf.AutoOpen": 1, + "bc25fcef-8964-4e72-8287-23e2b496c128.Bubble": 1, + "c8ebd871-9f47-4a0d-abd3-c1c02b4f8f53.2cfab14c-ebd6-4548-9401-30ab5afe5061.AutoOpen": 1, + "c8ebd871-9f47-4a0d-abd3-c1c02b4f8f53.AutoOpen": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.5b853177-a0be-4237-bda0-4fce5cd165c2.AutoOpen": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.8d3a928d-e911-40f0-9852-f63f6434dc7e.AutoOpen": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.AutoOpen": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.AutoOpen.PDF": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.AutoOpen.PersistentChat": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsCompeteAISite.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsCopilotJitEduAcademicAI.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsCopilotJitEduArticleAI.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsCopilotJitEduStudyAI.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsKnowledgeCardQuery.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsMsnArticleUrlFromNtpP1P2.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsShoppingNotificationNudge.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsTextPage.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsTopNewsDomain.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsTwitchNonStreamPage.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsTwitchSubPage.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsVideoPage.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.e06e75c1-a59a-4ab6-8361-e8b038e00a8c.AutoOpen": 1, + "e6723537-66ff-4f4e-ab56-a4cbaddf4e0f.MM2UpSellPopup.Bubble": 1 + } + }, + "FunctionalCohort": [ "EdgeDownloadChromeInterceptFunctionalDialog", "8682d0fa-50b3-4ece-aa5b-e0b33f9919e2.AutoOpen.Functional", "8682d0fa-50b3-4ece-aa5b-e0b33f9919e2.f5b8c725-cb2e-4c12-accd-73e500d88d47.AutoOpen.Functional", "bc25fcef-8964-4e72-8287-23e2b496c128.AutoOpen.Functional", "bc25fcef-8964-4e72-8287-23e2b496c128.68b8a884-6e08-46e6-8a3b-7e06ffe48ecf.AutoOpen.Functional", "WPOFunctionalEvent.AutofillAccountChooser.Bubble", "WPOFunctionalEvent.AutofillAutoSignin.Bubble", "WPOFunctionalEvent.AutofillPassword.Bubble", "SHOPPING_AUTO_SHOW_BING_SEARCH", "SHOPPING_AUTO_SHOW_REBATES_CONFIRMATION", "SHOPPING_AUTO_SHOW_REBATES_DEACTIVATED", "SHOPPING_AUTO_SHOW_REBATES_BING", "SHOPPING_AUTO_SHOW_PERSONALIZED_CASHBACK", "SHOPPING_AUTO_SHOW_PERSONALIZED_CASHBACK_CONFIRMATION", "SHOPPING_AUTO_SHOW_URL_PARAM_REBATES", "SHOPPING_AUTO_SHOW_URL_PARAM_PRICE_COMPARISON", "SHOPPING_AUTO_SHOW_URL_PARAM_PRICE_HISTORY", "SHOPPING_AUTO_SHOW_REBATES_ACTIVATION_FAILED", "SHOPPING_AUTO_SHOW_REBATES_SWITCHED_TO_MSA", "SHOPPING_AUTO_SHOW_ITEM_ADDED_TO_CART_FROM_OTHER_SELLER", "SHOPPING_AUTO_SHOW_VIRTUAL_CARD", "SHOPPING_AUTO_SHOW_BING_CAMPAIGN", "SHOPPING_OPEN_FLYOUT_FROM_EDGE_DRIVER", "SHOPPING_AUTO_SHOW_SUSTAINABILITY_PURCHASE", "SHOPPING_AUTO_SHOW_REWARDS_ACTIVATION_FAILED", "SHOPPING_AUTO_SHOW_REWARDS_SWITCHED_TO_MSA", "SHOPPING_AUTO_SHOW_SHOPRUNNER_CONFIRMATION", "SHOPPING_AUTO_SHOW_ENROLL_TO_CASHBACK_CONFIRMATION_NOTIFICATION", "SHOPPING_AUTO_SHOW_POST_PURCHASE_REWARDS_NOTIFICATION", "694efa4f-a304-4214-aaf7-90444bc887f5.c1c025d9-a620-4f6b-bebb-eff0cf19a671.AutoOpen.Functional" ], + "GlobalSuppressedExperiences": [ "Teams.Bubble", "Nurturing.Global.EdgeVpn_VpnFre", "Nurturing.Global.Rewards_RedemptionCoachmark_2", "Nurturing.Global.Rewards_RedemptionCoachmark_25", "Nurturing.Global.EdgeCBUD_SanPersonalizationConsentWave1Variant0", "Nurturing.Global.Bing_NewBingChatFlyout", "Copilot.AutoOpen.PDF.v2", "Nurturing.Global.PWA_SidebarSearchPromotion", "Nurturing.Global.FC_NetworkWarningFlyout", "Nurturing.Global.EdgeMobile_MobileUpsell_ChatGpt_Flyout", "E-tree.Bubble", "Nurturing.Global.EdgeEDU_BrowserFocusedTranslateNudge", "Games.Bubble", "Nurturing.Global.OnRamp_RetriggerFRECodexCoPilotAutoAprd", "Nurturing.Global.OnRamp_NurturingViaProng_Experiment", "Nurturing.Global.OnRamp_ReTriggerOnWinUpgrade", "Nurturing.Global.EdgeGrowth_CIShoppingUpsell", "Nurturing.Global.Shopping_EnableShoppingAssistance_Optin_Generic", "Nurturing.Global.Shopping_EnableShoppingAssistance", "Nurturing.Global.BrowserExperiences_TryVerticalTabs" ], + "IgnoredFunctionalNotifications": [ "Nurturing.Functional.NTP_CourtesyEngineCampaign", "Nurturing.Functional.NTP_FunctionalCampaign", "Nurturing.Functional.NTP_SettingsCampaign", "Nurturing.Functional.NTP_UpsellCampaign", "Nurturing.Functional.FN_SmartSwitchFeatureInfoView" ], + "ModelInfo": { + "segment_id": 515, + "signals": [ "notification_triggered_count", "notification_click_rate", "notification_click_rate_lower_ci", "notification_click_rate_upper_ci", "notification_dismiss_rate", "notification_dismiss_rate_lower_ci", "notification_dismiss_rate_upper_ci", "notification_ignored_rate", "notification_ignored_rate_lower_ci", "notification_ignored_rate_upper_ci", "notification_quick_dismiss_rate", "notification_quick_dismiss_rate_lower_ci", "notification_quick_dismiss_rate_upper_ci", "notification_disable_rate", "notification_disable_rate_lower_ci", "notification_disable_rate_upper_ci", "notification_snooze_rate", "notification_snooze_rate_lower_ci", "notification_snooze_rate_upper_ci" ], + "threshold_value": 0.5 + }, + "ModelSuppressionBypass": [ "Nurturing.Local.SHOPPING_AUTO_SHOW_LOWER_PRICE_FOUND", "Nurturing.Local.SHOPPING_AUTO_SHOW_REBATES_ORGANIC", "Nurturing.Local.SHOPPING_AUTO_SHOW_REBATES_CHECKOUT", "Nurturing.Local.SHOPPING_AUTO_SHOW_SPB_CASHBACK_LANDING" ], + "NotificationsAllowLists": { + }, + "PrivilegedExperiences": [ "ShorelinePrivilegedExperienceID", "SHOPPING_AUTO_SHOW_COUPONS_CHECKOUT", "SHOPPING_AUTO_SHOW_LOWER_PRICE_FOUND", "SHOPPING_AUTO_SHOW_REBATES", "SHOPPING_AUTO_SHOW_REBATES_ORGANIC", "SHOPPING_AUTO_SHOW_PRICE_HISTORY", "SHOPPING_AUTO_SHOW_REBATES_ORGANIC_NEW", "SHOPPING_AUTO_SHOW_REBATES_CHECKOUT", "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_CHECKOUT", "SHOPPING_AUTO_SHOW_EXPRESS_CHECKOUT", "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_ALL_PAGES", "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_CONFIRMATION_PAGE", "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_HOME_PAGE", "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_REWARDS", "SHOPPING_AUTO_SHOW_COUPONS_CLIPPING", "SHOPPING_AUTO_SHOW_NOTIFICATION", "SHOPPING_AUTO_SHOW_OTHER_SELLER", "SHOPPING_AUTO_SHOW_PROFESSIONAL_REVIEWS", "SHOPPING_AUTO_SHOW_PACKAGE_TRACKING", "SHOPPING_AUTO_SHOW_GUEST_DOMAIN_COUPONS", "SHOPPING_AUTO_SHOW_SUSTAINABILITY_LANDING", "SHOPPING_AUTO_SHOW_ATTAINABLE_COUPONS", "SHOPPING_AUTO_SHOW_GIFT_CARD", "SHOPPING_AUTO_SHOW_PRINT_GROCERY", "SHOPPING_AUTO_SHOW_GROCERY_ITEMIZED_CASHBACK", "SHOPPING_AUTO_SHOW_CONTROLLER", "SHOPPING_AUTO_SHOW_AUTOS_MARKETPLACE", "SHOPPING_AUTO_SHOW_SHOPRUNNER", "SHOPPING_AUTO_SHOW_ABANDONED_CART", "SHOPPING_AUTO_SHOW_OUT_OF_STOCK", "SHOPPING_AUTO_SHOW_GROCERY_ITEMIZED_CASHBACK_LANDING", "SHOPPING_AUTO_SHOW_SPB_CASHBACK_LANDING", "SHOPPING_AUTO_SHOW_AWARENESSEXP", "SHOPPING_AA_CONSENT", "SHOPPING_AUTO_SHOW_SAN_CONSENT_CONFIRMATION", "SHOPPING_AUTO_SHOW_CONFIRMATION_SCRIPT", "SHOPPING_AUTO_SHOW_MOMENT_IN_TIME", "SHOPPING_AUTO_SHOW_COUPONS_CHECKOUT_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_TRENDING_COUPONS", "SHOPPING_AUTO_SHOW_RECOMMENDATIONS_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_PRODUCT_TRACKING_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_SURFACE_UPSELL", "SHOPPING_AUTO_SHOW_PRODUCT_TRACKING_BACK_IN_STOCK", "SHOPPING_AUTO_PRODUCT_TRACKING_EXP_PRICE_DROP", "SHOPPING_AUTO_PRODUCT_TRACKING_IMP_PRICE_DROP", "SHOPPING_AUTO_PRODUCT_TRACKING_OUT_OF_STOCK", "SHOPPING_AUTO_SHOW_CODEX_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_PERSONALIZED_CASHBACK_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_PRICE_HISTORY_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_ORGANIC_CASHBACK_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_GOODRX", "SHOPPING_AUTO_SHOW_SIDEPANE_CASHBACK_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_DISCOVER_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_REBATES_PDP", "SHOPPING_AUTO_SHOW_PRODUCT_BEST_COUPON_CONSENT", "SHOPPING_AUTO_SHOW_CAMPAIGN_PDP_NOTIFICATION", "SHOPPING_AUTO_SHOW_CAMPAIGN_AWARENESS_NOTIFICATION", "SHOPPING_AUTO_SHOW_SPB_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_PRICE_DROP_PLUS_COUPONS", "SHOPPING_AUTO_SHOW_SPB_NUDGE_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_ADD_SPB_TO_CART_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_CASHBACK_PDP_PLUS_COUPONS", "SHOPPING_AUTO_SHOW_PRICE_DROP_PLUS_CASHBACK", "SHOPPING_AUTO_SHOW_DISCOVER_NOTIFICATION", "SHOPPING_AUTO_SHOW_AMAZON_SEARCH_PC", "SHOPPING_AUTO_SHOW_COUPONS_BACKGROUND_AUTO_APPLY", "SHOPPING_AUTO_SHOW_PERSONALIZED_CASHBACK_ADDRESSBAR", "SHOPPING_AUTO_SHOW_TRAVEL_NOTIFICATION_CHEAPER_FLIGHTS", "SHOPPING_AUTO_SHOW_TRAVEL_NOTIFICATION_CHEAPER_HOTEL_ROOM", "SHOPPING_AUTO_SHOW_CJK_PRICE_DROP", "SHOPPING_AUTO_SHOW_CJK_COUPON_FOUND", "AUTOFILL_PASSWORD_NON_FUNCTIONAL_FLYOUTS", "76b926d6-3738-46bf-82d7-2ab896ddf70b.MM2UpSellPopup.Bubble", "e6723537-66ff-4f4e-ab56-a4cbaddf4e0f.MM2UpSellPopup.Bubble", "8ac719c5-140b-4bf2-a0b7-c71617f1f377.3662f1e2-66ae-464f-b690-e7e3dc4fc662.AutoOpen", "8ac719c5-140b-4bf2-a0b7-c71617f1f377.gaokao.Bubble", "c8ebd871-9f47-4a0d-abd3-c1c02b4f8f53.AutoOpen", "c8ebd871-9f47-4a0d-abd3-c1c02b4f8f53.2cfab14c-ebd6-4548-9401-30ab5afe5061.AutoOpen", "cd4688a9-e888-48ea-ad81-76193d56b1be.AutoOpen.PersistentChat", "cd4688a9-e888-48ea-ad81-76193d56b1be.AutoOpen.PDF", "cd4688a9-e888-48ea-ad81-76193d56b1be.8d3a928d-e911-40f0-9852-f63f6434dc7e.AutoOpen", "cd4688a9-e888-48ea-ad81-76193d56b1be.e06e75c1-a59a-4ab6-8361-e8b038e00a8c.AutoOpen", "cd4688a9-e888-48ea-ad81-76193d56b1be.5b853177-a0be-4237-bda0-4fce5cd165c2.AutoOpen", "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.AutoOpen", "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.c8ebbf64-e3b8-41d9-925f-4e3754151ff7.AutoOpen", "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.75a774c2-6075-ae4f-09f9-e5f5d9bef6e1.AutoOpen", "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.a5e9f5e1-fcee-c07b-2c44-b707ded020a3.AutoOpen", "8682d0fa-50b3-4ece-aa5b-e0b33f9919e2.f5b8c725-cb2e-4c12-accd-73e500d88d47.AutoOpen", "bc25fcef-8964-4e72-8287-23e2b496c128.68b8a884-6e08-46e6-8a3b-7e06ffe48ecf.AutoOpen", "EdgeDownloadChromeInterceptDialog", "439642fc-998d-4a64-8bb6-940ecaf6b60b.AutoOpen", "694efa4f-a304-4214-aaf7-90444bc887f5.c1c025d9-a620-4f6b-bebb-eff0cf19a671.AutoOpen" ], + "ReserveApproved": { + "ExperienceIDs": [ "Nurturing.Global.Edge_SpawnNtpOptIn", "Nurturing.Global.Edge_SpawnNtpOptOut" ], + "SourceIDs": [ 3 ], + "TeamIDs": [ "Edge Consumer Content and Verticals" ] + }, + "ScenarioSuppressLists": { + }, + "SuppressedExperiences": [ ], + "TimeDelta": 5000000, + "baseConfigVersion": "40.0.1", + "configVersion": "40.0.1" +} diff --git a/.edge-profile-render/Default/commerce_subscription_db/LOCK b/.edge-profile-render/Default/commerce_subscription_db/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/commerce_subscription_db/LOG b/.edge-profile-render/Default/commerce_subscription_db/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/commerce_subscription_db/LOG.old b/.edge-profile-render/Default/commerce_subscription_db/LOG.old new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/discount_infos_db/LOCK b/.edge-profile-render/Default/discount_infos_db/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/discount_infos_db/LOG b/.edge-profile-render/Default/discount_infos_db/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/discount_infos_db/LOG.old b/.edge-profile-render/Default/discount_infos_db/LOG.old new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/discounts_db/LOCK b/.edge-profile-render/Default/discounts_db/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/discounts_db/LOG b/.edge-profile-render/Default/discounts_db/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/discounts_db/LOG.old b/.edge-profile-render/Default/discounts_db/LOG.old new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/heavy_ad_intervention_opt_out.db b/.edge-profile-render/Default/heavy_ad_intervention_opt_out.db new file mode 100644 index 0000000..ac64349 Binary files /dev/null and b/.edge-profile-render/Default/heavy_ad_intervention_opt_out.db differ diff --git a/.edge-profile-render/Default/heavy_ad_intervention_opt_out.db-journal b/.edge-profile-render/Default/heavy_ad_intervention_opt_out.db-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/load_statistics.db b/.edge-profile-render/Default/load_statistics.db new file mode 100644 index 0000000..4410bda Binary files /dev/null and b/.edge-profile-render/Default/load_statistics.db differ diff --git a/.edge-profile-render/Default/load_statistics.db-shm b/.edge-profile-render/Default/load_statistics.db-shm new file mode 100644 index 0000000..106add7 Binary files /dev/null and b/.edge-profile-render/Default/load_statistics.db-shm differ diff --git a/.edge-profile-render/Default/load_statistics.db-wal b/.edge-profile-render/Default/load_statistics.db-wal new file mode 100644 index 0000000..52e68ae Binary files /dev/null and b/.edge-profile-render/Default/load_statistics.db-wal differ diff --git a/.edge-profile-render/Default/optimization_guide_hint_cache_store/LOCK b/.edge-profile-render/Default/optimization_guide_hint_cache_store/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/optimization_guide_hint_cache_store/LOG b/.edge-profile-render/Default/optimization_guide_hint_cache_store/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/optimization_guide_hint_cache_store/LOG.old b/.edge-profile-render/Default/optimization_guide_hint_cache_store/LOG.old new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/parcel_tracking_db/LOCK b/.edge-profile-render/Default/parcel_tracking_db/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/parcel_tracking_db/LOG b/.edge-profile-render/Default/parcel_tracking_db/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/parcel_tracking_db/LOG.old b/.edge-profile-render/Default/parcel_tracking_db/LOG.old new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/shared_proto_db/CURRENT b/.edge-profile-render/Default/shared_proto_db/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile-render/Default/shared_proto_db/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile-render/Default/shared_proto_db/LOCK b/.edge-profile-render/Default/shared_proto_db/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/shared_proto_db/LOG b/.edge-profile-render/Default/shared_proto_db/LOG new file mode 100644 index 0000000..ac8146e --- /dev/null +++ b/.edge-profile-render/Default/shared_proto_db/LOG @@ -0,0 +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 diff --git a/.edge-profile-render/Default/shared_proto_db/LOG.old b/.edge-profile-render/Default/shared_proto_db/LOG.old new file mode 100644 index 0000000..a87dca6 --- /dev/null +++ b/.edge-profile-render/Default/shared_proto_db/LOG.old @@ -0,0 +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 diff --git a/.edge-profile-render/Default/shared_proto_db/MANIFEST-000001 b/.edge-profile-render/Default/shared_proto_db/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile-render/Default/shared_proto_db/MANIFEST-000001 differ diff --git a/.edge-profile-render/Default/shared_proto_db/metadata/CURRENT b/.edge-profile-render/Default/shared_proto_db/metadata/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile-render/Default/shared_proto_db/metadata/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile-render/Default/shared_proto_db/metadata/LOCK b/.edge-profile-render/Default/shared_proto_db/metadata/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Default/shared_proto_db/metadata/LOG b/.edge-profile-render/Default/shared_proto_db/metadata/LOG new file mode 100644 index 0000000..5565380 --- /dev/null +++ b/.edge-profile-render/Default/shared_proto_db/metadata/LOG @@ -0,0 +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 diff --git a/.edge-profile-render/Default/shared_proto_db/metadata/LOG.old b/.edge-profile-render/Default/shared_proto_db/metadata/LOG.old new file mode 100644 index 0000000..ca4e84c --- /dev/null +++ b/.edge-profile-render/Default/shared_proto_db/metadata/LOG.old @@ -0,0 +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 diff --git a/.edge-profile-render/Default/shared_proto_db/metadata/MANIFEST-000001 b/.edge-profile-render/Default/shared_proto_db/metadata/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile-render/Default/shared_proto_db/metadata/MANIFEST-000001 differ diff --git a/.edge-profile-render/Edge-Local-State-Tmp-21130c6c-0794-4f55-ab6e-d5e87b60903b.tmp b/.edge-profile-render/Edge-Local-State-Tmp-21130c6c-0794-4f55-ab6e-d5e87b60903b.tmp new file mode 100644 index 0000000..7ffa95c --- /dev/null +++ b/.edge-profile-render/Edge-Local-State-Tmp-21130c6c-0794-4f55-ab6e-d5e87b60903b.tmp @@ -0,0 +1 @@ +{"accessibility":{"captions":{"common_models_path":"","soda_translation_binary_path":""}},"autofill":{"ablation_seed":"0NoI+MzROMg="},"breadcrumbs":{"enabled":true,"enabled_time":"13418947853498846"},"default_browser":{"browser_name_enum":0},"edge":{"app_user_model_id":"MSEdge","perf_center":{"efficiency_mode_v2_is_active":false,"perf_game_mode":true,"performance_mode":3,"performance_mode_is_on":false},"retrigger_features":[],"tab_stabs":{"closed_without_unfreeze_never_unfrozen":0,"closed_without_unfreeze_previously_unfrozen":0,"discard_without_unfreeze_never_unfrozen":0,"discard_without_unfreeze_previously_unfrozen":0},"tab_stats":{"frozen_daily":0,"unfrozen_daily":0}},"edge_copilot_mode_enabled_state":{"Default":{"enabled":false,"last_set":"13418947927002659"}},"fre":{"has_first_visible_browser_session_completed":true,"oem_bookmarks_set":true},"hardware_acceleration_mode_previous":true,"host_package_checked_on_browser_version":"146.0.7680.154","ie_react":{"has_done_one_time_ie_import":true},"legacy":{"profile":{"name":{"migrated":true}}},"local":{"password_hash_data_list":[]},"metrics":{"client_id_hash_key_created":true},"optimization_guide":{"model_execution":{"last_usage_by_feature":{}},"model_store_metadata":{},"on_device":{"last_version":"146.0.3856.72","model_crash_count":0}},"os_crypt":{"audit_enabled":true,"encrypted_key":"RFBBUEkBAAAA0Iyd3wEV0RGMegDAT8KX6wEAAAAn89AMc7fOSbvGLGpOq+9IEAAAAB4AAABNAGkAYwByAG8AcwBvAGYAdAAgAEUAZABnAGUAAAAQZgAAAAEAACAAAAC07ynLXTte9TJTpnEkVvXXxPEHJa/fcEdwE33jYlq83gAAAAAOgAAAAAIAACAAAACXoL5bMkxke/zaDF4PD63atzbIBpNgcgsg1FUvOIgf7TAAAABzKrBTpcAU7DupVRkOohuHODek/Buswfa2zVoZXjsQ1aG+d1fdANN8E3uLl7shxX9AAAAAHczmqZFDSJGa1rEAlT4NFaydKRX3ghH1L6tJoKzbIFv0odtB3IKoxvB5liKDnnCnwdZUfyO2OJGSNFnLai56xQ=="},"performance_intervention":{"last_daily_sample":"13418947891696610"},"phoenix":{"user_laf_toggle_state_static":2},"policy":{"last_statistics_update":"13418947853491754"},"profile":{"info_cache":{"Default":{"active_time":1774474291.587255,"avatar_icon":"chrome://theme/IDR_PROFILE_AVATAR_20","background_apps":false,"edge_account_cid":"","edge_account_environment":0,"edge_account_environment_string":"","edge_account_first_name":"","edge_account_last_name":"","edge_account_oid":"","edge_account_sovereignty":0,"edge_account_tenant_id":"","edge_account_type":0,"edge_create_profile_shortcut":false,"edge_non_signin_profile_type":1,"edge_profile_can_be_deleted":true,"edge_profile_can_be_edited":true,"edge_test_on_premises":false,"edge_wam_aad_for_app_account_type":0,"enterprise_label":"","force_signin_profile_locked":false,"gaia_given_name":"","gaia_id":"","gaia_name":"","hosted_domain":"","is_consented_primary_account":false,"is_ephemeral":false,"is_glic_eligible":false,"is_managed":0,"is_using_default_avatar":true,"is_using_default_name":true,"managed_user_id":"","metrics_bucket_index":1,"name":"Profile 1","signin.with_credential_provider":false,"user_name":""}},"last_active_profiles":["Default"],"metrics":{"next_bucket_index":2},"profile_counts_reported":"13418947465719264","profiles_order":["Default"]},"profile_network_context_service":{"http_cache_finch_experiment_groups":"None None None None"},"profiles":{"collect_potential_implicit_signin_data_started":true,"edge":{"guided_switch_pref":[],"implicit_signin":{"platform_error":1001,"primary_error":15,"secondary_error":22,"telemetry_result":0},"multiple_profiles_with_same_account":false},"edge_sso_info":{"aad_sso_algo_state":1,"first_profile_key":"Default","msa_first_profile_key":"Default","msa_sso_algo_state":1},"signin_last_seen_version":"146.0.3856.72","signin_last_updated_time":1774474254.14309},"sentinel_creation_time":"0","session_id_generator_last_value":"1075834138","signin":{"active_accounts_last_emitted":"13418947465697241"},"startup_boost":{"last_browser_open_time":"13418947891110604"},"subresource_filter":{"ruleset_version":{"checksum":0,"content":"","format":0}},"tab_stats":{"discards_expired":0,"discards_external":0,"discards_proactive":0,"discards_urgent":0,"last_daily_sample":"13418947853450673","max_tabs_per_window":2,"reloads_expired":0,"reloads_external":0,"reloads_urgent":0,"total_tab_count_max":2,"window_count_max":1},"telemetry_client":{"cloned_install":{"user_data_dir_id":13505400},"governance":{"last_dma_change_date":"13418947466108681","last_known_cps":2048},"host_telclient_path":"QzpcUHJvZ3JhbSBGaWxlcyAoeDg2KVxNaWNyb3NvZnRcRWRnZVxBcHBsaWNhdGlvblwxNDYuMC4zODU2LjcyXHRlbGNsaWVudC5kbGw=","install_source_name":"windows","os_integration_level":5,"sample_id":67247511,"updater_version":"1.3.225.7","windows_update_applied":false},"ukm":{"persisted_logs":[]},"uninstall_metrics":{"installation_date2":"1774473863"},"user_experience_metrics":{"client_id2":"d4b88c3c-d45e-4268-a8c6-4548216e3826","diagnostics":{"last_data_collection_level_on_launch":1},"initial_logs2":[{"count_id":"","data":"H4sIAAAAAAAAAOOawsZ59TnLo+bMt38FGKS+sXLMXfrpLJuQgKGJmZ6BnrGFqZmeuZGumYkEgxJrap5uaLCWBBdXeGZeSn55sYJfiBCXoYGegZ6RmZGBgVEuF1uFhVm8mYlAe7xEQ0PPxd7/8krCHgEKPokFJfkFCobmukmVBhUVFRqMBgvYLG6wOHFxMAgwSDEYMVgxpDIwNNhnSXDxuKfmlWbmpXrmlaTmCLzqVZDgUGDUYGhiZOhiZFjFCLVhAyOjFxfvzQq/s6Jx+ZdueHHx5ljvtoKxHSYXbISxhZ8wGMLYkUq262BscXaRlXA1t2bHwNgTXq62h7GdrRPzwOwAliQWTz+niCwOkIMtGBwYGhgvzJx4jm0GI8MPxo/CDUz/YYCxg4lxBdNq5k1MBhdVP4dx9+/V/7T9eZQAg81kcxeXV7ta7+uvFj72wZL77iJ1l2bPeD7uAy+Ews18PvPGfmQy+Lvsu/L/y2Wn7N4wcbGA7BLiUGLhYBJg0mBUYuJgMmLjYFBi0GKw4ub4/P//++9gC500hDgN9Yz1jIxM9cwlWBUYtPiCUtO9Uyv98kvc8kvzUozYyyERFsTEwRD1h5HzuLd5p2OCg4PgstlHFDasCneQZACDSNyMD/boDAYGdBE82sljwK3AdAYeh5ngVhzpUMXEwdjEyCTB0MXIxMG4ipGJi2EDI8MDRuYXjIwn7Rih1mrtZuNaOpozRnPGiM8ZRvyck/yydEs+dG0QEJBiEhBEzyoCS9kkGJR4OBgFGCQYFBg0GCwYrOaPZp3RrDOaddCzDiLTZI3mkNEcMppD8OQQAPbFRD2ZDAAA","hash":"p2RQ+DoavnMh4NBf04GOx/sX3ls=","signature":"qE/Znj7jDoxPxsJoznFVOufft7YKOdr1DlnSUhY2w4I=","timestamp":"1774474289"},{"count_id":"","data":"H4sIAAAAAAAAAOOawsZ59TnLo+bMt38FGKW+sXLMXfrpLJuQgKGJmZ6BnrGFqZmeuZGumYkEgxJrap5uaLCWBBdXeGZeSn55sYJfiBCXoYGegZ6RmZGBgVEuF1uFhVm8mYlAe7xEQ0PPxd7/8krCHgEKPokFJfkFCobmukmVBhUVFRqMBgvYLG6wOHFxMAgwSDEYMVgxpDIwNNhnSXDxuKfmlWbmpXrmlaTmCLzqVZDgUGDUYGhiZOhiZFjFCLVhAyOjFxfvzQq/s6Jx+ZdueHHx5ljvtoKxHSYXbISxhZ8wGMLYkUq262BscXaRlXA1t2bHwNgTXq62h7GdrRPzwOwAliQWTz+niCwOkIMtGBwYGhgvzJx4jm0GI8MPxo/CDUz/YYCxg4lxBdNq5k1MBhdVP4dx9+/V/7T9eZQAg81kcxeXV7ta7+uvFj72wZL77iJ1l2bPeD7uAy+Ews18PvPGfmRaH6X/8pXGtsmn7N4wcbGA7BLiUGLhYBJg0mBUYuJgMmLjYFBi0GKw4ub4/P//++9gC500hDgN9Yz1jIxM9cwlWBUYtPiCUtO9Uyv98kvc8kvzUozYyyERFsTEwRD1h5HzuLd5p2OCg4PgstlHFDasCneQZACDSNyMD/boDAYGdBE82sljwK3AdAYeh5ngVhzpUMXEwdjEyCTB0MXIxMG4ipGJi2EDI8MDRtYXjEwn7RgZGBhAWGs3G9fS0ZwxmjNGfM4w4uec5JelW/Kha4OAgBSTgCB6VhFYyibBoMTDwSjAIMGgwKDBYMFgNX8064xmndGsg551EJkmazSHjOaQ0RyCJ4cAAIz76kyZDAAA","hash":"pT8KPWLUOEF4Jr21KKzyo+2IHU0=","signature":"dXt57xbGCu2iU6/cKxMf9kpzCu/Cwr5byTcVgUPW8Ls=","timestamp":"1774474326"}],"last_seen":{"CrashpadMetrics":"0"},"limited_entropy_randomization_source":"DC55D85A7EA7FEC042366FECC8990533","log_finalized_record_id":2,"log_record_id":7,"low_entropy_source3":2545,"machine_id":5216996,"ongoing_logs2":[],"payload_counter":1,"pseudo_low_entropy_source":427,"reporting_enabled":false,"session_id":2,"stability":{"browser_last_live_timestamp":"13418947969457899","saved_system_profile":"CJ2l8s0GEhAxNDYuMC4zODU2LjcyLTY0GAAiBWVuLVVTKhgKCldpbmRvd3MgTlQSCjEwLjAuMjYyMDAybQoGeDg2XzY0EIdfGICAjNGN/x8iE0hQIExhcHRvcCAxNy1ieTB4eHgoATCgBjjYBEIKCAAQABoAMgA6AGUAAIA/ahgKDEdlbnVpbmVJbnRlbBDqjSAYCCABKACCAQCKAQCqAQZ4ODZfNjSwAQFKCg3ZeE7NFV5v0thKCg1sO7s6FV5v0thKCg1Ak3CxFV5v0thKCg0T5AAxFV5v0thKCg1ZIj2uFV5v0thKCg0XBxSpFV5v0thKCg0T2ptcFV5v0thKCg2Q6as/FV5v0thKCg1DO2FuFV5v0thQBGIESU5CWGoICAAQADgAQACAAdCZkc4GmAEA+AHxE4AC////////////AYgCAagCqwOyAjDRJfNWC4+9L/K351oQADyTN0RE6rqF3y+rE8bwOQvdoidEg0lfDgvA6BJXNkzzDV3xAhzul1PM1EH4yj7nAgoECAAQABIIIgQIAhACKAEiAggCMgYIACIAKgA6Cwjz///v9/////8BQigSCTEuMy4yMjUuNxgFIAAqDlJlZ0tleU5vdEZvdW5kMgd3aW5kb3dzUgIIAFr8AQnHSzeJQWBAQBGmm8QgsKpXQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAADwPxkAAAAAAADwPxkAAAAAAAAAABkAAAAAAADwPxkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAAAAABkAAAAAAABZQBkAAAAAAADwPxkAAAAAAABZQBkAAAAAAADwPxkAAAAAAADwPxkAAAAAAAA0QBkAAAAAAADwPxkAAAAAAABZQBkAAAAAAABZQHoCCAGCAQIYAKoBAgoAsAEA","saved_system_profile_hash":"C804FA862AF0C8D0B542ECFE5358FEEE725DC947","stats_buildtime":"1773965981","stats_version":"146.0.3856.72-64","system_crash_count":0},"unsent_log_metadata":{"initial_logs":{"sent_samples_count":0,"unsent_persisted_size_in_kb":2,"unsent_samples_count":1},"ongoing_logs":{"sent_samples_count":0,"unsent_persisted_size_in_kb":0,"unsent_samples_count":0}}},"variations_crash_streak":4,"variations_google_groups":{"Default":[]},"was":{"restarted":false}} \ No newline at end of file diff --git a/.edge-profile-render/FirstLaunchAfterInstallation b/.edge-profile-render/FirstLaunchAfterInstallation new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/Last Browser b/.edge-profile-render/Last Browser new file mode 100644 index 0000000..28a4fac Binary files /dev/null and b/.edge-profile-render/Last Browser differ diff --git a/.edge-profile-render/Last Version b/.edge-profile-render/Last Version new file mode 100644 index 0000000..a887bff --- /dev/null +++ b/.edge-profile-render/Last Version @@ -0,0 +1 @@ +146.0.3856.72 \ No newline at end of file diff --git a/.edge-profile-render/Local State b/.edge-profile-render/Local State new file mode 100644 index 0000000..74df240 --- /dev/null +++ b/.edge-profile-render/Local State @@ -0,0 +1 @@ +{"accessibility":{"captions":{"common_models_path":"","soda_translation_binary_path":""}},"autofill":{"ablation_seed":"0NoI+MzROMg="},"breadcrumbs":{"enabled":true,"enabled_time":"13418947853498846"},"default_browser":{"browser_name_enum":0},"edge":{"app_user_model_id":"MSEdge","perf_center":{"efficiency_mode_v2_is_active":false,"perf_game_mode":true,"performance_mode":3,"performance_mode_is_on":false},"retrigger_features":[],"tab_stabs":{"closed_without_unfreeze_never_unfrozen":0,"closed_without_unfreeze_previously_unfrozen":0,"discard_without_unfreeze_never_unfrozen":0,"discard_without_unfreeze_previously_unfrozen":0},"tab_stats":{"frozen_daily":0,"unfrozen_daily":0}},"edge_copilot_mode_enabled_state":{"Default":{"enabled":false,"last_set":"13418947927002659"}},"fre":{"has_first_visible_browser_session_completed":true,"oem_bookmarks_set":true},"hardware_acceleration_mode_previous":true,"host_package_checked_on_browser_version":"146.0.7680.154","ie_react":{"has_done_one_time_ie_import":true},"legacy":{"profile":{"name":{"migrated":true}}},"local":{"password_hash_data_list":[]},"metrics":{"client_id_hash_key_created":true},"optimization_guide":{"model_execution":{"last_usage_by_feature":{}},"model_store_metadata":{},"on_device":{"last_version":"146.0.3856.72","model_crash_count":0}},"os_crypt":{"audit_enabled":true,"encrypted_key":"RFBBUEkBAAAA0Iyd3wEV0RGMegDAT8KX6wEAAAAn89AMc7fOSbvGLGpOq+9IEAAAAB4AAABNAGkAYwByAG8AcwBvAGYAdAAgAEUAZABnAGUAAAAQZgAAAAEAACAAAAC07ynLXTte9TJTpnEkVvXXxPEHJa/fcEdwE33jYlq83gAAAAAOgAAAAAIAACAAAACXoL5bMkxke/zaDF4PD63atzbIBpNgcgsg1FUvOIgf7TAAAABzKrBTpcAU7DupVRkOohuHODek/Buswfa2zVoZXjsQ1aG+d1fdANN8E3uLl7shxX9AAAAAHczmqZFDSJGa1rEAlT4NFaydKRX3ghH1L6tJoKzbIFv0odtB3IKoxvB5liKDnnCnwdZUfyO2OJGSNFnLai56xQ=="},"performance_intervention":{"last_daily_sample":"13418947891696610"},"phoenix":{"user_laf_toggle_state_static":2},"policy":{"last_statistics_update":"13418947853491754"},"profile":{"info_cache":{"Default":{"active_time":1774474291.587255,"avatar_icon":"chrome://theme/IDR_PROFILE_AVATAR_20","background_apps":false,"edge_account_cid":"","edge_account_environment":0,"edge_account_environment_string":"","edge_account_first_name":"","edge_account_last_name":"","edge_account_oid":"","edge_account_sovereignty":0,"edge_account_tenant_id":"","edge_account_type":0,"edge_create_profile_shortcut":false,"edge_non_signin_profile_type":1,"edge_profile_can_be_deleted":true,"edge_profile_can_be_edited":true,"edge_test_on_premises":false,"edge_wam_aad_for_app_account_type":0,"enterprise_label":"","force_signin_profile_locked":false,"gaia_given_name":"","gaia_id":"","gaia_name":"","hosted_domain":"","is_consented_primary_account":false,"is_ephemeral":false,"is_glic_eligible":false,"is_managed":0,"is_using_default_avatar":true,"is_using_default_name":true,"managed_user_id":"","metrics_bucket_index":1,"name":"Profile 1","signin.with_credential_provider":false,"user_name":""}},"last_active_profiles":["Default"],"metrics":{"next_bucket_index":2},"profile_counts_reported":"13418947465719264","profiles_order":["Default"]},"profile_network_context_service":{"http_cache_finch_experiment_groups":"None None None None"},"profiles":{"collect_potential_implicit_signin_data_started":true,"edge":{"guided_switch_pref":[],"implicit_signin":{"platform_error":1001,"primary_error":15,"secondary_error":22,"telemetry_result":0},"multiple_profiles_with_same_account":false},"edge_sso_info":{"aad_sso_algo_state":1,"first_profile_key":"Default","msa_first_profile_key":"Default","msa_sso_algo_state":1},"signin_last_seen_version":"146.0.3856.72","signin_last_updated_time":1774474254.14309},"sentinel_creation_time":"0","session_id_generator_last_value":"1075834138","signin":{"active_accounts_last_emitted":"13418947465697241"},"startup_boost":{"last_browser_open_time":"13418947891110604"},"subresource_filter":{"ruleset_version":{"checksum":0,"content":"","format":0}},"tab_stats":{"discards_expired":0,"discards_external":0,"discards_proactive":0,"discards_urgent":0,"last_daily_sample":"13418947853450673","max_tabs_per_window":2,"reloads_expired":0,"reloads_external":0,"reloads_urgent":0,"total_tab_count_max":2,"window_count_max":1},"telemetry_client":{"cloned_install":{"user_data_dir_id":13505400},"governance":{"last_dma_change_date":"13418947466108681","last_known_cps":2048},"host_telclient_path":"QzpcUHJvZ3JhbSBGaWxlcyAoeDg2KVxNaWNyb3NvZnRcRWRnZVxBcHBsaWNhdGlvblwxNDYuMC4zODU2LjcyXHRlbGNsaWVudC5kbGw=","install_source_name":"windows","os_integration_level":5,"sample_id":67247511,"updater_version":"1.3.225.7","windows_update_applied":false},"ukm":{"persisted_logs":[]},"uninstall_metrics":{"installation_date2":"1774473863"},"user_experience_metrics":{"client_id2":"d4b88c3c-d45e-4268-a8c6-4548216e3826","diagnostics":{"last_data_collection_level_on_launch":1},"initial_logs2":[{"count_id":"","data":"H4sIAAAAAAAAAOOawsZ59TnLo+bMt38FGKS+sXLMXfrpLJuQgKGJmZ6BnrGFqZmeuZGumYkEgxJrap5uaLCWBBdXeGZeSn55sYJfiBCXoYGegZ6RmZGBgVEuF1uFhVm8mYlAe7xEQ0PPxd7/8krCHgEKPokFJfkFCobmukmVBhUVFRqMBgvYLG6wOHFxMAgwSDEYMVgxpDIwNNhnSXDxuKfmlWbmpXrmlaTmCLzqVZDgUGDUYGhiZOhiZFjFCLVhAyOjFxfvzQq/s6Jx+ZdueHHx5ljvtoKxHSYXbISxhZ8wGMLYkUq262BscXaRlXA1t2bHwNgTXq62h7GdrRPzwOwAliQWTz+niCwOkIMtGBwYGhgvzJx4jm0GI8MPxo/CDUz/YYCxg4lxBdNq5k1MBhdVP4dx9+/V/7T9eZQAg81kcxeXV7ta7+uvFj72wZL77iJ1l2bPeD7uAy+Ews18PvPGfmQy+Lvsu/L/y2Wn7N4wcbGA7BLiUGLhYBJg0mBUYuJgMmLjYFBi0GKw4ub4/P//++9gC500hDgN9Yz1jIxM9cwlWBUYtPiCUtO9Uyv98kvc8kvzUozYyyERFsTEwRD1h5HzuLd5p2OCg4PgstlHFDasCneQZACDSNyMD/boDAYGdBE82sljwK3AdAYeh5ngVhzpUMXEwdjEyCTB0MXIxMG4ipGJi2EDI8MDRuYXjIwn7Rih1mrtZuNaOpozRnPGiM8ZRvyck/yydEs+dG0QEJBiEhBEzyoCS9kkGJR4OBgFGCQYFBg0GCwYrOaPZp3RrDOaddCzDiLTZI3mkNEcMppD8OQQAPbFRD2ZDAAA","hash":"p2RQ+DoavnMh4NBf04GOx/sX3ls=","signature":"qE/Znj7jDoxPxsJoznFVOufft7YKOdr1DlnSUhY2w4I=","timestamp":"1774474289"},{"count_id":"","data":"H4sIAAAAAAAAAOOawsZ59TnLo+bMt38FGKW+sXLMXfrpLJuQgKGJmZ6BnrGFqZmeuZGumYkEgxJrap5uaLCWBBdXeGZeSn55sYJfiBCXoYGegZ6RmZGBgVEuF1uFhVm8mYlAe7xEQ0PPxd7/8krCHgEKPokFJfkFCobmukmVBhUVFRqMBgvYLG6wOHFxMAgwSDEYMVgxpDIwNNhnSXDxuKfmlWbmpXrmlaTmCLzqVZDgUGDUYGhiZOhiZFjFCLVhAyOjFxfvzQq/s6Jx+ZdueHHx5ljvtoKxHSYXbISxhZ8wGMLYkUq262BscXaRlXA1t2bHwNgTXq62h7GdrRPzwOwAliQWTz+niCwOkIMtGBwYGhgvzJx4jm0GI8MPxo/CDUz/YYCxg4lxBdNq5k1MBhdVP4dx9+/V/7T9eZQAg81kcxeXV7ta7+uvFj72wZL77iJ1l2bPeD7uAy+Ews18PvPGfmRaH6X/8pXGtsmn7N4wcbGA7BLiUGLhYBJg0mBUYuJgMmLjYFBi0GKw4ub4/P//++9gC500hDgN9Yz1jIxM9cwlWBUYtPiCUtO9Uyv98kvc8kvzUozYyyERFsTEwRD1h5HzuLd5p2OCg4PgstlHFDasCneQZACDSNyMD/boDAYGdBE82sljwK3AdAYeh5ngVhzpUMXEwdjEyCTB0MXIxMG4ipGJi2EDI8MDRtYXjEwn7RgZGBhAWGs3G9fS0ZwxmjNGfM4w4uec5JelW/Kha4OAgBSTgCB6VhFYyibBoMTDwSjAIMGgwKDBYMFgNX8064xmndGsg551EJkmazSHjOaQ0RyCJ4cAAIz76kyZDAAA","hash":"pT8KPWLUOEF4Jr21KKzyo+2IHU0=","signature":"dXt57xbGCu2iU6/cKxMf9kpzCu/Cwr5byTcVgUPW8Ls=","timestamp":"1774474326"}],"last_seen":{"CrashpadMetrics":"0"},"limited_entropy_randomization_source":"DC55D85A7EA7FEC042366FECC8990533","log_finalized_record_id":2,"log_record_id":6,"low_entropy_source3":2545,"machine_id":5216996,"ongoing_logs2":[],"payload_counter":1,"pseudo_low_entropy_source":427,"reporting_enabled":false,"session_id":2,"stability":{"browser_last_live_timestamp":"13418947925494075","saved_system_profile":"CJ2l8s0GEhAxNDYuMC4zODU2LjcyLTY0GAAiBWVuLVVTKhgKCldpbmRvd3MgTlQSCjEwLjAuMjYyMDAybQoGeDg2XzY0EIdfGICAjNGN/x8iE0hQIExhcHRvcCAxNy1ieTB4eHgoATCgBjjYBEIKCAAQABoAMgA6AGUAAIA/ahgKDEdlbnVpbmVJbnRlbBDqjSAYCCABKACCAQCKAQCqAQZ4ODZfNjSwAQFKCg3ZeE7NFV5v0thKCg1sO7s6FV5v0thKCg1Ak3CxFV5v0thKCg0T5AAxFV5v0thKCg1ZIj2uFV5v0thKCg0XBxSpFV5v0thKCg0T2ptcFV5v0thKCg2Q6as/FV5v0thKCg1DO2FuFV5v0thQBGIESU5CWGoICAAQADgAQACAAdCZkc4GmAEA+AHxE4AC////////////AYgCAagCqwOyAjDRJfNWC4+9L/K351oQADyTN0RE6rqF3y+rE8bwOQvdoidEg0lfDgvA6BJXNkzzDV3xAhzul1PM1EH4yj7nAgoECAAQABIIIgQIAhACKAEiAggCMgYIACIAKgA6Cwjz///v9/////8BQigSCTEuMy4yMjUuNxgFIAAqDlJlZ0tleU5vdEZvdW5kMgd3aW5kb3dzUgIIAFr8AQnHSzeJQWBAQBGmm8QgsKpXQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAADwPxkAAAAAAADwPxkAAAAAAAAAABkAAAAAAADwPxkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAAAAABkAAAAAAABZQBkAAAAAAADwPxkAAAAAAABZQBkAAAAAAADwPxkAAAAAAADwPxkAAAAAAAA0QBkAAAAAAADwPxkAAAAAAABZQBkAAAAAAABZQHoCCAGCAQIYAKoBAgoAsAEA","saved_system_profile_hash":"C804FA862AF0C8D0B542ECFE5358FEEE725DC947","stats_buildtime":"1773965981","stats_version":"146.0.3856.72-64","system_crash_count":0},"unsent_log_metadata":{"initial_logs":{"sent_samples_count":0,"unsent_persisted_size_in_kb":2,"unsent_samples_count":1},"ongoing_logs":{"sent_samples_count":0,"unsent_persisted_size_in_kb":0,"unsent_samples_count":0}}},"variations_crash_streak":3,"variations_google_groups":{"Default":[]},"was":{"restarted":false}} \ No newline at end of file diff --git a/.edge-profile-render/Nurturing/campaign_history b/.edge-profile-render/Nurturing/campaign_history new file mode 100644 index 0000000..eab8517 Binary files /dev/null and b/.edge-profile-render/Nurturing/campaign_history differ diff --git a/.edge-profile-render/Nurturing/campaign_history-journal b/.edge-profile-render/Nurturing/campaign_history-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile-render/ShaderCache/data_0 b/.edge-profile-render/ShaderCache/data_0 new file mode 100644 index 0000000..d76fb77 Binary files /dev/null and b/.edge-profile-render/ShaderCache/data_0 differ diff --git a/.edge-profile-render/ShaderCache/data_1 b/.edge-profile-render/ShaderCache/data_1 new file mode 100644 index 0000000..035d06d Binary files /dev/null and b/.edge-profile-render/ShaderCache/data_1 differ diff --git a/.edge-profile-render/ShaderCache/data_2 b/.edge-profile-render/ShaderCache/data_2 new file mode 100644 index 0000000..c7e2eb9 Binary files /dev/null and b/.edge-profile-render/ShaderCache/data_2 differ diff --git a/.edge-profile-render/ShaderCache/data_3 b/.edge-profile-render/ShaderCache/data_3 new file mode 100644 index 0000000..5eec973 Binary files /dev/null and b/.edge-profile-render/ShaderCache/data_3 differ diff --git a/.edge-profile-render/ShaderCache/index b/.edge-profile-render/ShaderCache/index new file mode 100644 index 0000000..8168f2d Binary files /dev/null and b/.edge-profile-render/ShaderCache/index differ diff --git a/.edge-profile-render/SmartScreen/RemoteData/customSettings b/.edge-profile-render/SmartScreen/RemoteData/customSettings new file mode 100644 index 0000000..997f02d --- /dev/null +++ b/.edge-profile-render/SmartScreen/RemoteData/customSettings @@ -0,0 +1 @@ +customSettings_F95BA787499AB4FA9EFFF472CE383A14 \ No newline at end of file diff --git a/.edge-profile-render/SmartScreen/RemoteData/customSettings_F95BA787499AB4FA9EFFF472CE383A14 b/.edge-profile-render/SmartScreen/RemoteData/customSettings_F95BA787499AB4FA9EFFF472CE383A14 new file mode 100644 index 0000000..ae2fefa --- /dev/null +++ b/.edge-profile-render/SmartScreen/RemoteData/customSettings_F95BA787499AB4FA9EFFF472CE383A14 @@ -0,0 +1 @@ +{"forceServiceDetermination":false} \ No newline at end of file diff --git a/.edge-profile-render/SmartScreen/RemoteData/edgeSettings b/.edge-profile-render/SmartScreen/RemoteData/edgeSettings new file mode 100644 index 0000000..a89ca1f --- /dev/null +++ b/.edge-profile-render/SmartScreen/RemoteData/edgeSettings @@ -0,0 +1 @@ +edgeSettings_2.0-0 \ No newline at end of file diff --git a/.edge-profile-render/SmartScreen/RemoteData/edgeSettings_2.0-0 b/.edge-profile-render/SmartScreen/RemoteData/edgeSettings_2.0-0 new file mode 100644 index 0000000..3db8ccb --- /dev/null +++ b/.edge-profile-render/SmartScreen/RemoteData/edgeSettings_2.0-0 @@ -0,0 +1 @@ +{"models":[],"geoidMaps":{"gw_my":"https://malaysia.smartscreen.microsoft.com/","gw_tw":"https://taiwan.smartscreen.microsoft.com/","gw_at":"https://austria.smartscreen.microsoft.com/","gw_es":"https://spain.smartscreen.microsoft.com/","gw_pl":"https://poland.smartscreen.microsoft.com/","gw_se":"https://sweden.smartscreen.microsoft.com/","gw_kr":"https://southkorea.smartscreen.microsoft.com/","gw_br":"https://brazil.smartscreen.microsoft.com/","au":"https://australia.smartscreen.microsoft.com/","dk":"https://denmark.smartscreen.microsoft.com/","gw_sg":"https://singapore.smartscreen.microsoft.com/","gw_fr":"https://france.smartscreen.microsoft.com/","gw_ca":"https://canada.smartscreen.microsoft.com/","gw_il":"https://israel.smartscreen.microsoft.com/","gw_au":"https://australia.smartscreen.microsoft.com/","gw_ffl4mod":"https://unitedstates4.ss.wd.microsoft.us/","gw_ffl4":"https://unitedstates1.ss.wd.microsoft.us/","gw_eu":"https://europe.smartscreen.microsoft.com/","gw_gr":"https://greece.smartscreen.microsoft.com/","gw_de":"https://germany.smartscreen.microsoft.com/","br":"https://brazil.smartscreen.microsoft.com/","gw_uk":"https://unitedkingdom.smartscreen.microsoft.com/","gw_it":"https://italy.smartscreen.microsoft.com/","gw_us":"https://unitedstates.smartscreen.microsoft.com/","il":"https://israel.smartscreen.microsoft.com/","es":"https://spain.smartscreen.microsoft.com/","ch":"https://switzerland.smartscreen.microsoft.com/","at":"https://austria.smartscreen.microsoft.com/","jp":"https://japan.smartscreen.microsoft.com/","kr":"https://southkorea.smartscreen.microsoft.com/","nz":"https://newzealand.smartscreen.microsoft.com/","gw_cl":"https://chile.smartscreen.microsoft.com/","pl":"https://poland.smartscreen.microsoft.com/","eu":"https://europe.smartscreen.microsoft.com/","de":"https://germany.smartscreen.microsoft.com/","gw_no":"https://norway.smartscreen.microsoft.com/","ffl4mod":"https://unitedstates4.ss.wd.microsoft.us/","gw_jp":"https://japan.smartscreen.microsoft.com/","mx":"https://mexico.smartscreen.microsoft.com/","gw_ffl5":"https://unitedstates2.ss.wd.microsoft.us/","se":"https://sweden.smartscreen.microsoft.com/","gw_ch":"https://switzerland.smartscreen.microsoft.com/","gw_ae":"https://uae.smartscreen.microsoft.com/","my":"https://malaysia.smartscreen.microsoft.com/","gw_nz":"https://newzealand.smartscreen.microsoft.com/","ca":"https://canada.smartscreen.microsoft.com/","fr":"https://france.smartscreen.microsoft.com/","gw_mx":"https://mexico.smartscreen.microsoft.com/","no":"https://norway.smartscreen.microsoft.com/","gr":"https://greece.smartscreen.microsoft.com/","gw_qa":"https://qatar.smartscreen.microsoft.com/","gw_in":"https://india.smartscreen.microsoft.com/","in":"https://india.smartscreen.microsoft.com/","tw":"https://taiwan.smartscreen.microsoft.com/","sg":"https://singapore.smartscreen.microsoft.com/","ffl5":"https://unitedstates2.ss.wd.microsoft.us/","ae":"https://uae.smartscreen.microsoft.com/","gw_dk":"https://denmark.smartscreen.microsoft.com/","gw_za":"https://southafrica.smartscreen.microsoft.com/","uk":"https://unitedkingdom.smartscreen.microsoft.com/","cl":"https://chile.smartscreen.microsoft.com/","us":"https://unitedstates.smartscreen.microsoft.com/","qa":"https://qatar.smartscreen.microsoft.com/","za":"https://southafrica.smartscreen.microsoft.com/","ffl4":"https://unitedstates1.ss.wd.microsoft.us/","it":"https://italy.smartscreen.microsoft.com/"},"sampleBuckets":{"evaluateModel":1.0,"error":1.0,"uriLookup":0.01,"userAction":1.0,"topTrafficHit":0.00007}} \ No newline at end of file diff --git a/.edge-profile-render/Variations b/.edge-profile-render/Variations new file mode 100644 index 0000000..9267c72 --- /dev/null +++ b/.edge-profile-render/Variations @@ -0,0 +1 @@ +{"user_experience_metrics.stability.exited_cleanly":false,"variations_crash_streak":4} \ No newline at end of file diff --git a/.edge-profile-render/component_crx_cache/metadata.json b/.edge-profile-render/component_crx_cache/metadata.json new file mode 100644 index 0000000..4d15610 --- /dev/null +++ b/.edge-profile-render/component_crx_cache/metadata.json @@ -0,0 +1 @@ +{"hashes":{}} \ No newline at end of file diff --git a/.edge-profile-render/extensions_crx_cache/metadata.json b/.edge-profile-render/extensions_crx_cache/metadata.json new file mode 100644 index 0000000..4d15610 --- /dev/null +++ b/.edge-profile-render/extensions_crx_cache/metadata.json @@ -0,0 +1 @@ +{"hashes":{}} \ No newline at end of file diff --git a/.edge-profile-render/first_party_sets.db b/.edge-profile-render/first_party_sets.db new file mode 100644 index 0000000..c911220 Binary files /dev/null and b/.edge-profile-render/first_party_sets.db differ diff --git a/.edge-profile-render/first_party_sets.db-journal b/.edge-profile-render/first_party_sets.db-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile/Crashpad/metadata b/.edge-profile/Crashpad/metadata new file mode 100644 index 0000000..a4bbd0b Binary files /dev/null and b/.edge-profile/Crashpad/metadata differ diff --git a/.edge-profile/Crashpad/reports/64928c5c-f711-4132-9061-76a5cde21d1e.dmp b/.edge-profile/Crashpad/reports/64928c5c-f711-4132-9061-76a5cde21d1e.dmp new file mode 100644 index 0000000..b7c8533 Binary files /dev/null and b/.edge-profile/Crashpad/reports/64928c5c-f711-4132-9061-76a5cde21d1e.dmp differ diff --git a/.edge-profile/Crashpad/reports/9b6bf00b-3d98-4521-b210-993f720bd6fa.dmp b/.edge-profile/Crashpad/reports/9b6bf00b-3d98-4521-b210-993f720bd6fa.dmp new file mode 100644 index 0000000..fdacda4 Binary files /dev/null and b/.edge-profile/Crashpad/reports/9b6bf00b-3d98-4521-b210-993f720bd6fa.dmp differ diff --git a/.edge-profile/Crashpad/settings.dat b/.edge-profile/Crashpad/settings.dat new file mode 100644 index 0000000..b0172d9 Binary files /dev/null and b/.edge-profile/Crashpad/settings.dat differ diff --git a/.edge-profile/Crashpad/throttle_store.dat b/.edge-profile/Crashpad/throttle_store.dat new file mode 100644 index 0000000..9639e1b --- /dev/null +++ b/.edge-profile/Crashpad/throttle_store.dat @@ -0,0 +1 @@ +level=none expiry=0 diff --git a/.edge-profile/Default/ClientCertificates/LOCK b/.edge-profile/Default/ClientCertificates/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile/Default/ClientCertificates/LOG b/.edge-profile/Default/ClientCertificates/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile/Default/Code Cache/js/index b/.edge-profile/Default/Code Cache/js/index new file mode 100644 index 0000000..79bd403 Binary files /dev/null and b/.edge-profile/Default/Code Cache/js/index differ diff --git a/.edge-profile/Default/Code Cache/js/index-dir/the-real-index b/.edge-profile/Default/Code Cache/js/index-dir/the-real-index new file mode 100644 index 0000000..5d81346 Binary files /dev/null and b/.edge-profile/Default/Code Cache/js/index-dir/the-real-index differ diff --git a/.edge-profile/Default/Code Cache/wasm/index b/.edge-profile/Default/Code Cache/wasm/index new file mode 100644 index 0000000..79bd403 Binary files /dev/null and b/.edge-profile/Default/Code Cache/wasm/index differ diff --git a/.edge-profile/Default/Code Cache/wasm/index-dir/the-real-index b/.edge-profile/Default/Code Cache/wasm/index-dir/the-real-index new file mode 100644 index 0000000..c6cb614 Binary files /dev/null and b/.edge-profile/Default/Code Cache/wasm/index-dir/the-real-index differ diff --git a/.edge-profile/Default/DawnGraphiteCache/data_0 b/.edge-profile/Default/DawnGraphiteCache/data_0 new file mode 100644 index 0000000..d76fb77 Binary files /dev/null and b/.edge-profile/Default/DawnGraphiteCache/data_0 differ diff --git a/.edge-profile/Default/DawnGraphiteCache/data_1 b/.edge-profile/Default/DawnGraphiteCache/data_1 new file mode 100644 index 0000000..035d06d Binary files /dev/null and b/.edge-profile/Default/DawnGraphiteCache/data_1 differ diff --git a/.edge-profile/Default/DawnGraphiteCache/data_2 b/.edge-profile/Default/DawnGraphiteCache/data_2 new file mode 100644 index 0000000..c7e2eb9 Binary files /dev/null and b/.edge-profile/Default/DawnGraphiteCache/data_2 differ diff --git a/.edge-profile/Default/DawnGraphiteCache/data_3 b/.edge-profile/Default/DawnGraphiteCache/data_3 new file mode 100644 index 0000000..5eec973 Binary files /dev/null and b/.edge-profile/Default/DawnGraphiteCache/data_3 differ diff --git a/.edge-profile/Default/DawnGraphiteCache/index b/.edge-profile/Default/DawnGraphiteCache/index new file mode 100644 index 0000000..0980500 Binary files /dev/null and b/.edge-profile/Default/DawnGraphiteCache/index differ diff --git a/.edge-profile/Default/DawnWebGPUCache/data_0 b/.edge-profile/Default/DawnWebGPUCache/data_0 new file mode 100644 index 0000000..d76fb77 Binary files /dev/null and b/.edge-profile/Default/DawnWebGPUCache/data_0 differ diff --git a/.edge-profile/Default/DawnWebGPUCache/data_1 b/.edge-profile/Default/DawnWebGPUCache/data_1 new file mode 100644 index 0000000..035d06d Binary files /dev/null and b/.edge-profile/Default/DawnWebGPUCache/data_1 differ diff --git a/.edge-profile/Default/DawnWebGPUCache/data_2 b/.edge-profile/Default/DawnWebGPUCache/data_2 new file mode 100644 index 0000000..c7e2eb9 Binary files /dev/null and b/.edge-profile/Default/DawnWebGPUCache/data_2 differ diff --git a/.edge-profile/Default/DawnWebGPUCache/data_3 b/.edge-profile/Default/DawnWebGPUCache/data_3 new file mode 100644 index 0000000..5eec973 Binary files /dev/null and b/.edge-profile/Default/DawnWebGPUCache/data_3 differ diff --git a/.edge-profile/Default/DawnWebGPUCache/index b/.edge-profile/Default/DawnWebGPUCache/index new file mode 100644 index 0000000..625f9c9 Binary files /dev/null and b/.edge-profile/Default/DawnWebGPUCache/index differ diff --git a/.edge-profile/Default/EdgeEDrop/EdgeEDropSQLite.db b/.edge-profile/Default/EdgeEDrop/EdgeEDropSQLite.db new file mode 100644 index 0000000..65a59e0 Binary files /dev/null and b/.edge-profile/Default/EdgeEDrop/EdgeEDropSQLite.db differ diff --git a/.edge-profile/Default/EdgeEDrop/EdgeEDropSQLite.db-journal b/.edge-profile/Default/EdgeEDrop/EdgeEDropSQLite.db-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile/Default/EdgePushStorageWithConnectTokenAndKey/LOCK b/.edge-profile/Default/EdgePushStorageWithConnectTokenAndKey/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile/Default/EdgePushStorageWithConnectTokenAndKey/LOG b/.edge-profile/Default/EdgePushStorageWithConnectTokenAndKey/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile/Default/EdgePushStorageWithConnectTokenAndKey/LOG.old b/.edge-profile/Default/EdgePushStorageWithConnectTokenAndKey/LOG.old new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile/Default/Extension Rules/CURRENT b/.edge-profile/Default/Extension Rules/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile/Default/Extension Rules/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile/Default/Extension Rules/LOCK b/.edge-profile/Default/Extension Rules/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile/Default/Extension Rules/LOG b/.edge-profile/Default/Extension Rules/LOG new file mode 100644 index 0000000..b39b57e --- /dev/null +++ b/.edge-profile/Default/Extension Rules/LOG @@ -0,0 +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 diff --git a/.edge-profile/Default/Extension Rules/MANIFEST-000001 b/.edge-profile/Default/Extension Rules/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile/Default/Extension Rules/MANIFEST-000001 differ diff --git a/.edge-profile/Default/Extension Scripts/CURRENT b/.edge-profile/Default/Extension Scripts/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile/Default/Extension Scripts/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile/Default/Extension Scripts/LOCK b/.edge-profile/Default/Extension Scripts/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile/Default/Extension Scripts/LOG b/.edge-profile/Default/Extension Scripts/LOG new file mode 100644 index 0000000..4dd00a2 --- /dev/null +++ b/.edge-profile/Default/Extension Scripts/LOG @@ -0,0 +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 diff --git a/.edge-profile/Default/Extension Scripts/MANIFEST-000001 b/.edge-profile/Default/Extension Scripts/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile/Default/Extension Scripts/MANIFEST-000001 differ diff --git a/.edge-profile/Default/Extension State/CURRENT b/.edge-profile/Default/Extension State/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile/Default/Extension State/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile/Default/Extension State/LOCK b/.edge-profile/Default/Extension State/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile/Default/Extension State/LOG b/.edge-profile/Default/Extension State/LOG new file mode 100644 index 0000000..91794ea --- /dev/null +++ b/.edge-profile/Default/Extension State/LOG @@ -0,0 +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 diff --git a/.edge-profile/Default/Extension State/MANIFEST-000001 b/.edge-profile/Default/Extension State/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile/Default/Extension State/MANIFEST-000001 differ diff --git a/.edge-profile/Default/ExtensionActivityComp b/.edge-profile/Default/ExtensionActivityComp new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile/Default/ExtensionActivityEdge b/.edge-profile/Default/ExtensionActivityEdge new file mode 100644 index 0000000..8ac5d91 Binary files /dev/null and b/.edge-profile/Default/ExtensionActivityEdge differ diff --git a/.edge-profile/Default/ExtensionActivityEdge-journal b/.edge-profile/Default/ExtensionActivityEdge-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile/Default/Favicons b/.edge-profile/Default/Favicons new file mode 100644 index 0000000..e589db8 Binary files /dev/null and b/.edge-profile/Default/Favicons differ diff --git a/.edge-profile/Default/Favicons-journal b/.edge-profile/Default/Favicons-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile/Default/GPUCache/data_0 b/.edge-profile/Default/GPUCache/data_0 new file mode 100644 index 0000000..d76fb77 Binary files /dev/null and b/.edge-profile/Default/GPUCache/data_0 differ diff --git a/.edge-profile/Default/GPUCache/data_1 b/.edge-profile/Default/GPUCache/data_1 new file mode 100644 index 0000000..035d06d Binary files /dev/null and b/.edge-profile/Default/GPUCache/data_1 differ diff --git a/.edge-profile/Default/GPUCache/data_2 b/.edge-profile/Default/GPUCache/data_2 new file mode 100644 index 0000000..c7e2eb9 Binary files /dev/null and b/.edge-profile/Default/GPUCache/data_2 differ diff --git a/.edge-profile/Default/GPUCache/data_3 b/.edge-profile/Default/GPUCache/data_3 new file mode 100644 index 0000000..5eec973 Binary files /dev/null and b/.edge-profile/Default/GPUCache/data_3 differ diff --git a/.edge-profile/Default/GPUCache/index b/.edge-profile/Default/GPUCache/index new file mode 100644 index 0000000..647af7b Binary files /dev/null and b/.edge-profile/Default/GPUCache/index differ diff --git a/.edge-profile/Default/History b/.edge-profile/Default/History new file mode 100644 index 0000000..c02d277 Binary files /dev/null and b/.edge-profile/Default/History differ diff --git a/.edge-profile/Default/History-journal b/.edge-profile/Default/History-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile/Default/HubApps Icons b/.edge-profile/Default/HubApps Icons new file mode 100644 index 0000000..a838bbc Binary files /dev/null and b/.edge-profile/Default/HubApps Icons differ diff --git a/.edge-profile/Default/HubApps Icons-journal b/.edge-profile/Default/HubApps Icons-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile/Default/LOCK b/.edge-profile/Default/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile/Default/LOG b/.edge-profile/Default/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile/Default/Login Data b/.edge-profile/Default/Login Data new file mode 100644 index 0000000..0af13bc Binary files /dev/null and b/.edge-profile/Default/Login Data differ diff --git a/.edge-profile/Default/Login Data For Account b/.edge-profile/Default/Login Data For Account new file mode 100644 index 0000000..0af13bc Binary files /dev/null and b/.edge-profile/Default/Login Data For Account differ diff --git a/.edge-profile/Default/Login Data For Account-journal b/.edge-profile/Default/Login Data For Account-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile/Default/Login Data-journal b/.edge-profile/Default/Login Data-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile/Default/Nurturing/campaign_history b/.edge-profile/Default/Nurturing/campaign_history new file mode 100644 index 0000000..eab8517 Binary files /dev/null and b/.edge-profile/Default/Nurturing/campaign_history differ diff --git a/.edge-profile/Default/Nurturing/campaign_history-journal b/.edge-profile/Default/Nurturing/campaign_history-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile/Default/PersistentOriginTrials/LOCK b/.edge-profile/Default/PersistentOriginTrials/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile/Default/PersistentOriginTrials/LOG b/.edge-profile/Default/PersistentOriginTrials/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile/Default/Preferences b/.edge-profile/Default/Preferences new file mode 100644 index 0000000..4fdcde7 --- /dev/null +++ b/.edge-profile/Default/Preferences @@ -0,0 +1 @@ +{"accessibility":{"captions":{"headless_caption_enabled":false}},"account_tracker_service_last_update":"13418947400103289","apps":{"shortcuts_arch":"","shortcuts_version":1},"autocomplete":{"retention_policy_last_version":146},"autofill":{"edge_autofill_advanced_ml_enabled":true,"edge_autofill_purge_low_quality_profiles_by_timeline":false,"last_version_deduped":146},"bookmark":{"storage_computation_last_update":"13418947399873239"},"browser":{"available_dark_theme_options":"All","edge_sidebar_visibility":{"add_app_to_bottom":true},"enable_text_prediction_v2":true,"recent_theme_color_list":[4293914607.0,4293914607.0,4293914607.0,4293914607.0,4293914607.0]},"browser_content_container_height":491,"browser_content_container_width":764,"browser_content_container_x":0,"browser_content_container_y":81,"commerce_daily_metrics_last_update_time":"13418947399878085","continuous_migration":{"equal_opt_out_users_data":{"backfilled":true}},"countryid_at_install":21843,"custom_links":{"list":[]},"default_apps_install_state":3,"dual_engine":{"consumer_site_list_with_ie_entries":false,"consumer_sitelist_location":"","consumer_sitelist_version":"","shared_cookie_data":{},"sitelist_has_consumer_data":false,"sitelist_has_enterprise_data":false,"sitelist_location":"","sitelist_source":0,"sitelist_version":""},"edge":{"msa_sso_info":{"allow_for_non_msa_profile":true},"profile_sso_info":{"aad_sso_algo_state":1,"is_first_profile":true,"is_msa_first_profile":true,"msa_sso_algo_state":1},"services":{"signin_scoped_device_id":"faa943e8-9c26-4437-81cd-881945b6a0c0"},"workspaces":{"migration":{"stampede_time":"13418948467404230"}}},"edge_pinning_campaign":{"precomputed_campaign_data":{}},"edge_rewards":{"cache_data":"CAA=","hva_webui_action_status_dict":{},"refresh_status_muted_until":"13419552198348135"},"edge_vpn":{"available":true},"edge_wallet":{"trigger_funnel":{"records":[]}},"enterprise_profile_guid":"9415cf8c-6bab-4f9a-afb6-a9ecd7c1b818","extension":{"installed_extension_count":9},"extensions":{"alerts":{"initialized":true},"chrome_url_overrides":{},"last_chrome_version":"146.0.3856.72","pdf_upsell_triggered":false,"pinned_extension_migration":true,"pinned_extensions":[]},"family_safety":{"activity_reporting_enabled":false,"web_filtering_enabled":false},"gaia_cookie":{"periodic_report_time_2":"13418947398346959"},"intl":{"selected_languages":"en-US,en"},"media":{"engagement":{"schema_version":5}},"media_router":{"receiver_id_hash_token":"8flYinHQngSJuxygzAI9kvEs7QYGbh9N1L+DIuQmH8nJULYaItd4HCu1VTof0aq/9xnOc95Ou0Fr6qj7NPHkUg=="},"migrated_user_scripts_toggle":true,"muid":{"last_sync":"13418947399874043"},"ntp":{"next_site_suggestions_available":false,"num_personal_suggestions":1},"optimization_guide":{"previously_registered_optimization_types":{"ABOUT_THIS_SITE":true,"AUTOFILL_ACTOR_IFRAME_ORIGIN_ALLOWLIST":true,"GLIC_ACTION_PAGE_BLOCK":true,"HISTORY_CLUSTERS":true,"LOADING_PREDICTOR":true,"MERCHANT_TRUST_SIGNALS_V2":true,"PAGE_ENTITIES":true,"PRICE_INSIGHTS":true,"PRICE_TRACKING":true,"SALIENT_IMAGE":true,"SAVED_TAB_GROUP":true,"SHOPPING_DISCOUNTS":true,"SHOPPING_PAGE_TYPES":true,"V8_COMPILE_HINTS":true}},"personalization_data_consent":{"personalization_in_context_consent_can_prompt":true,"personalization_in_context_count":0},"privacy_sandbox":{"first_party_sets_data_access_allowed_initialized":true},"profile":{"avatar_index":20,"background_password_check":{"check_fri_weight":9,"check_interval":"2592000000000","check_mon_weight":6,"check_sat_weight":6,"check_sun_weight":6,"check_thu_weight":9,"check_tue_weight":9,"check_wed_weight":9,"next_check_time":"13419165225193187"},"content_settings":{"exceptions":{"3pcd_heuristics_grants":{},"abusive_notification_permissions":{},"access_to_get_all_screens_media_in_session":{},"anti_abuse":{},"app_banner":{},"ar":{},"are_suspicious_notifications_allowlisted_by_user":{},"auto_picture_in_picture":{},"auto_select_certificate":{},"automatic_downloads":{},"automatic_fullscreen":{},"autoplay":{},"background_sync":{},"bluetooth_chooser_data":{},"bluetooth_guard":{},"bluetooth_scanning":{},"camera_pan_tilt_zoom":{},"captured_surface_control":{},"clear_browsing_data_cookies_exceptions":{},"client_hints":{},"clipboard":{},"controlled_frame":{},"cookie_controls_metadata":{},"cookies":{},"direct_sockets":{},"direct_sockets_private_network_access":{},"display_media_system_audio":{},"disruptive_notification_permissions":{},"durable_storage":{},"edge_ad_targeting":{},"edge_ad_targeting_data":{},"edge_all_file_read_access":{},"edge_browser_action":{},"edge_sdsm":{},"edge_split_screen":{},"edge_tech_scam_detection":{},"edge_u2f_api_request":{},"edge_user_agent_token":{},"fedcm_idp_registration":{},"fedcm_idp_signin":{},"fedcm_share":{},"file_system_access_chooser_data":{},"file_system_access_extended_permission":{},"file_system_access_restore_permission":{},"file_system_last_picked_directory":{},"file_system_read_guard":{},"file_system_write_guard":{},"formfill_metadata":{},"geolocation":{},"geolocation_with_options":{},"hand_tracking":{},"has_migrated_local_network_access":true,"hid_chooser_data":{},"hid_guard":{},"http_allowed":{},"https_enforced":{},"idle_detection":{},"images":{},"important_site_info":{},"initialized_translations":{},"intent_picker_auto_display":{},"javascript":{},"javascript_jit":{},"javascript_optimizer":{},"keyboard_lock":{},"legacy_cookie_access":{},"legacy_cookie_scope":{},"local_fonts":{},"local_network":{},"local_network_access":{},"loopback_network":{},"media_engagement":{},"media_stream_camera":{},"media_stream_mic":{},"midi_sysex":{},"mixed_script":{},"nfc_devices":{},"notification_interactions":{},"notification_permission_review":{},"notifications":{},"ondevice_languages_downloaded":{},"password_protection":{},"payment_handler":{},"permission_actions_history":{},"permission_autoblocking_data":{},"permission_autorevocation_data":{},"pointer_lock":{},"popups":{},"protected_media_identifier":{},"protocol_handler":{},"reduced_accept_language":{},"safe_browsing_url_check_data":{},"secure_network":{},"secure_network_sites":{},"sensors":{},"serial_chooser_data":{},"serial_guard":{},"site_engagement":{},"sleeping_tabs":{},"sound":{},"speaker_selection":{},"ssl_cert_decisions":{},"storage_access":{},"storage_access_header_origin_trial":{},"subresource_filter":{},"subresource_filter_data":{},"suspicious_notification_ids":{},"suspicious_notification_show_original":{},"top_level_storage_access":{},"trackers":{},"trackers_data":{},"tracking_org_exceptions":{},"tracking_org_relationships":{},"typosquatting":{},"unused_site_permissions":{},"usb_chooser_data":{},"usb_guard":{},"vr":{},"web_app_installation":{},"webid_api":{},"webid_auto_reauthn":{},"window_placement":{}},"pref_version":1},"created_by_version":"146.0.3856.72","creation_time":"13418947342961092","default_content_setting_values":{"has_migrated_local_network_access":true},"edge_password_is_using_new_login_db_path":false,"edge_password_login_db_path_flip_flop_count":0,"edge_profile_id":"37f3a6e6-8b17-41ca-8c7c-80f868cc206e","edge_user_with_non_zero_passwords":false,"has_seen_signin_fre":false,"is_relative_to_aad":false,"managed_user_id":"","name":"Profile 1","network_pbs":{},"password_hash_data_list":[],"signin_fre_seen_time":"13418947398293349"},"reset_prepopulated_engines":false,"safety_hub":{"unused_site_permissions_revocation":{"migration_completed":true}},"saved_tab_groups":{"did_enable_shared_tab_groups_in_last_session":false,"specifics_to_data_migration":true},"sessions":{"event_log":[{"crashed":false,"time":"13418947398389195","type":0}],"session_data_status":1},"shopping":{"contextual_features_enabled":true,"dma_telemetry_expiration_time":"13419033799000985"},"signin":{"accounts_metadata_dict":{},"allowed":true},"spellcheck":{"dictionaries":["en-US"],"dictionary":""},"sync":{"apps":true,"autofill":true,"bookmarks":true,"collections":true,"collections_edge_re_evaluated":true,"collections_edge_supported":true,"edge_account_type":0,"edge_wallet":true,"edge_wallet_edge_supported":true,"edge_workspaces":true,"edge_workspaces_edge_supported":true,"encryption_bootstrap_token_per_account_migration_done":true,"extensions":true,"extensions_edge_supported":true,"history_edge_supported":true,"keep_everything_synced":false,"passwords":true,"preferences":true,"tabs":true,"tabs_edge_supported":true,"typed_urls":true},"syncing_theme_prefs_migrated_to_non_syncing":true,"toolbar":{"pinned_cast_migration_complete":true,"pinned_chrome_labs_migration_complete":true},"translate_site_blacklist":[],"translate_site_blocklist_with_time":{},"typosquatting":{"allowlist_migration_done":true},"user_experience_metrics":{"personalization_data_consent_enabled_last_known_value":false},"web_apps":{"link_handling_info":{"enabled_for_installed_apps":true}}} \ No newline at end of file diff --git a/.edge-profile/Default/README b/.edge-profile/Default/README new file mode 100644 index 0000000..4a34402 --- /dev/null +++ b/.edge-profile/Default/README @@ -0,0 +1 @@ +Microsoft Edge settings and storage represent user-selected preferences and information and MUST not be extracted, overwritten or modified except through Microsoft Edge defined APIs. \ No newline at end of file diff --git a/.edge-profile/Default/Secure Preferences b/.edge-profile/Default/Secure Preferences new file mode 100644 index 0000000..04108ef --- /dev/null +++ b/.edge-profile/Default/Secure Preferences @@ -0,0 +1 @@ +{"edge_fundamentals_appdefaults":{"enclave_version":101},"ess_kv_states":{"restore_on_startup":{"closed_notification":false,"decrypt_success":true,"key":"restore_on_startup","notification_popup_count":0},"startup_urls":{"closed_notification":false,"decrypt_success":true,"key":"startup_urls","notification_popup_count":0},"template_url_data":{"closed_notification":false,"decrypt_success":true,"key":"template_url_data","notification_popup_count":0}},"extensions":{"settings":{"ahfgeienlihckogmohjhadlkjgocpleb":{"account_extension_type":0,"active_permissions":{"api":["management","system.display","system.storage","webstorePrivate","system.cpu","system.memory","system.network"],"explicit_host":[],"manifest_permissions":[],"scriptable_host":[]},"app_launcher_ordinal":"t","commands":{},"content_settings":[],"creation_flags":1,"disable_reasons":[],"events":[],"first_install_time":"13418947398496984","from_webstore":false,"incognito_content_settings":[],"incognito_preferences":{},"last_update_time":"13418947398496984","location":5,"manifest":{"app":{"launch":{"web_url":"https://chrome.google.com/webstore"},"urls":["https://chrome.google.com/webstore"]},"description":"Discover extensions for Microsoft Edge.","icons":{"128":"webstore_icon_128.png","16":"webstore_icon_16.png"},"key":"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCtl3tO0osjuzRsf6xtD2SKxPlTfuoy7AWoObysitBPvH5fE1NaAA1/2JkPWkVDhdLBWLaIBPYeXbzlHp3y4Vv/4XG+aN5qFE3z+1RU/NqkzVYHtIpVScf3DjTYtKVL66mzVGijSoAIwbFCC3LpGdaoe6Q1rSRDp76wR6jjFzsYwQIDAQAB","name":"Web Store","permissions":["webstorePrivate","management","system.cpu","system.display","system.memory","system.network","system.storage"],"version":"0.2"},"needs_sync":true,"page_ordinal":"n","path":"C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\146.0.3856.72\\resources\\web_store","preferences":{},"regular_only_preferences":{},"was_installed_by_default":false,"was_installed_by_oem":false},"dgiklkfkllikcanfonkcabmbdfmgleag":{"account_extension_type":0,"active_permissions":{"api":[],"explicit_host":[],"manifest_permissions":[],"scriptable_host":[]},"commands":{},"content_settings":[],"creation_flags":1,"disable_reasons":[],"events":[],"first_install_time":"13418947398508512","from_webstore":false,"incognito_content_settings":[],"incognito_preferences":{},"last_update_time":"13418947398508512","location":5,"manifest":{"content_capabilities":{"include_globs":["https://*excel.officeapps.live.com/*","https://*onenote.officeapps.live.com/*","https://*powerpoint.officeapps.live.com/*","https://*word-edit.officeapps.live.com/*","https://*excel.officeapps.live.com.mcas.ms/*","https://*onenote.officeapps.live.com.mcas.ms/*","https://*word-edit.officeapps.live.com.mcas.ms/*","https://*excel.partner.officewebapps.cn/*","https://*onenote.partner.officewebapps.cn/*","https://*powerpoint.partner.officewebapps.cn/*","https://*word-edit.partner.officewebapps.cn/*","https://*excel.gov.online.office365.us/*","https://*onenote.gov.online.office365.us/*","https://*powerpoint.gov.online.office365.us/*","https://*word-edit.gov.online.office365.us/*","https://*excel.dod.online.office365.us/*","https://*onenote.dod.online.office365.us/*","https://*powerpoint.dod.online.office365.us/*","https://*word-edit.dod.online.office365.us/*","https://*visio.partner.officewebapps.cn/*","https://*visio.gov.online.office365.us/*","https://*visio.dod.online.office365.us/*"],"matches":["https://*.officeapps.live.com/*","https://*.officeapps.live.com.mcas.ms/*","https://*.partner.officewebapps.cn/*","https://*.gov.online.office365.us/*","https://*.dod.online.office365.us/*","https://*.app.whiteboard.microsoft.com/*","https://*.whiteboard.office.com/*","https://*.app.int.whiteboard.microsoft.com/*","https://*.whiteboard.office365.us/*","https://*.dev.whiteboard.microsoft.com/*"],"permissions":["clipboardRead","clipboardWrite"]},"default_locale":"en","description":"This extension grants Microsoft web sites permission to read and write from the clipboard.","key":"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCz4t/X7GeuP6GBpjmxndrjtzF//4CWeHlC68rkoV7hP3h5Ka6eX7ZMNlYJkSjmB5iRmPHO5kR1y7rGY8JXnRPDQh/CQNLVA7OsKeV6w+UO+vx8KGI+TrTAhzH8YGcMIsxsUjxtC4cBmprja+xDr0zVp2EMgqHu+GBKgwSRHTkDuwIDAQAB","manifest_version":2,"minimum_chrome_version":"77","name":"Microsoft Clipboard Extension","version":"1.0"},"path":"C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\146.0.3856.72\\resources\\edge_clipboard","preferences":{},"regular_only_preferences":{},"was_installed_by_default":false,"was_installed_by_oem":false},"fikbjbembnmfhppjfnmfkahdhfohhjmg":{"account_extension_type":0,"active_permissions":{"api":[],"explicit_host":[],"manifest_permissions":[],"scriptable_host":[]},"commands":{},"content_settings":[],"creation_flags":1,"disable_reasons":[],"events":[],"first_install_time":"13418947398518277","from_webstore":false,"incognito_content_settings":[],"incognito_preferences":{},"last_update_time":"13418947398518277","location":5,"manifest":{"background":{"persistent":false,"scripts":["background.js"]},"externally_connectable":{"matches":["https://*.microsoftstream.com/*"]},"incognito":"split","key":"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsAmDrYmQaYQlLxSAn/jTQTGNt1IffJGIJeKucE/B42d8QIyFD2RCarmHP1bmbY1YuTng2dL3J//qyvUNwXPt9cmxH9WKwi512tzOa5r2zYaCuOgP2vAIrah/bKnpO3XmUfFWj+LRcbZahOmMDMQxzPKxFKuIz2eOiakBXDE6Ok7azHJ13LLQTte1JgZIPmyFrAciPABLp/IKLfsfnebVW1YgaOyxBNyp/7bhSmoyZI3kBv8InKOpGE8pttrBg6l5zkvD67a7ViNAYkqZIpJJV5ZTQtVWCWSG0xU2y+3zXZtx8KbGbDiWUAcwNYDVPpsV+IQXVpgAplHvrZme+hAl6QIDAQAB","manifest_version":2,"name":"Media Internals Services Extension","permissions":["mediaInternalsPrivate"],"version":"2.0.0"},"path":"C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\146.0.3856.72\\resources\\media_internals_services","preferences":{},"regular_only_preferences":{},"was_installed_by_default":false,"was_installed_by_oem":false},"iglcjdemknebjbklcgkfaebgojjphkec":{"account_extension_type":0,"active_permissions":{"api":["identity","management","metricsPrivate","webstorePrivate","hubPrivate"],"explicit_host":[],"manifest_permissions":[],"scriptable_host":[]},"app_launcher_ordinal":"w","commands":{},"content_settings":[],"creation_flags":1,"disable_reasons":[],"events":[],"first_install_time":"13418947398505106","from_webstore":false,"incognito_content_settings":[],"incognito_preferences":{},"last_update_time":"13418947398505106","location":5,"manifest":{"app":{"launch":{"web_url":"https://microsoftedge.microsoft.com"},"urls":["https://microsoftedge.microsoft.com"]},"description":"Discover extensions for Microsoft Edge.","icons":{"128":"webstore_icon_128.png","16":"webstore_icon_16.png"},"key":"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtMvN4+y6cd3el/A/NT5eUnrz1WiD1WJRaJfMBvaMtJHIuFGEmYdYL/YuE74J19+pwhjOHeFZ3XUSMTdOa5moOaXXvdMr5wWaaN2frHewtAnNDO64NGbbZvdsfGm/kRkHKVGNV6dacZsAkylcz5CkwTmq97wOZ7ETaShHvhZEGwRQIt4K1poxurOkDYQw9ERZNf3fgYJ9ZTrLZMAFDLJY+uSF03pClWrr8VGc8LUQ4Naktb8QSgVUlrS14AdF/ESdbhnTvvdB0e7peNWRyoNtCqLJsbtTtBL6sOnqfusnwPowuueOFI+XskOT9TvLo6PcgxhLX5+d0mM+Jtn6PFTU8QIDAQAB","name":"Microsoft Store","permissions":["webstorePrivate","management","metricsPrivate","identity","hubPrivate"],"version":"0.2"},"needs_sync":true,"page_ordinal":"n","path":"C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\146.0.3856.72\\resources\\microsoft_web_store","preferences":{},"regular_only_preferences":{},"was_installed_by_default":false,"was_installed_by_oem":false},"ihmafllikibpmigkcoadcmckbfhibefp":{"account_extension_type":0,"active_permissions":{"api":["debugger","feedbackPrivate","fileSystem","fileSystem.write","app.window.fullscreen","metricsPrivate","storage","tabs","fileSystem.readFullPath","edgeInternetConnectivityPrivate"],"explicit_host":["edge://resources/*"],"manifest_permissions":[],"scriptable_host":[]},"commands":{},"content_settings":[],"creation_flags":1,"disable_reasons":[],"events":[],"first_install_time":"13418947398514882","from_webstore":false,"incognito_content_settings":[],"incognito_preferences":{},"last_update_time":"13418947398514882","location":5,"manifest":{"app":{"background":{"scripts":["js/event_handler.js"]},"content_security_policy":"default-src 'none'; script-src 'self' blob: filesystem: chrome://resources; style-src 'unsafe-inline' blob: chrome: file: filesystem: data: *; img-src * blob: chrome: file: filesystem: data:; media-src 'self' blob: filesystem:; connect-src data:"},"description":"User feedback extension","display_in_launcher":false,"display_in_new_tab_page":false,"icons":{"128":"images/icon128.png","16":"images/icon16.png","192":"images/icon192.png","32":"images/icon32.png","48":"images/icon48.png"},"incognito":"split","key":"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAl3vxWwvLjcMIFK4OfG6C8PmJkMhFYDKRnx+SqG23YlMG1A+bOkiNmAN1TWpFPPp1f2PpbiZGNq1y29u/QfkD+PC4bnO7GbNw/2X5tGoP0n2K+KGGAxhnr0ki/oyo2eiFGSTOXlQvTRo5q1vB+Lbg+9TbFsWKlHZyAkeZ/YGz/iijHTqw8Q4RWdl5Tp8SlUhS/92EsWhveNJLW22veaT/Up2iSeSSwfyoHVYy8LUPaD4fbyLvPQacVLJq1dac2bNDqjaNvSPgPWCnkZtDmawZrgxT53otLCES/e96xfAf8I24VHIc1pVP8LqdqKr1AV1Yxn93h3VJ2QejtEhIAWHU6QIDAQAB","manifest_version":2,"name":"Edge Feedback","permissions":["chrome://resources/","debugger","edgeInternetConnectivityPrivate","feedbackPrivate",{"fileSystem":["readFullPath","write"]},"fullscreen","metricsPrivate","storage","windows"],"version":"1.0.0.1"},"path":"C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\146.0.3856.72\\resources\\edge_feedback","preferences":{},"regular_only_preferences":{},"was_installed_by_default":false,"was_installed_by_oem":false},"jdiccldimpdaibmpdkjnbmckianbfold":{"account_extension_type":0,"active_permissions":{"api":["activeTab","metricsPrivate","storage","systemPrivate","ttsEngine","errorReporting"],"explicit_host":["https://*.bing.com/*"],"manifest_permissions":[],"scriptable_host":[]},"commands":{},"content_settings":[],"creation_flags":1,"disable_reasons":[],"events":[],"first_install_time":"13418947398525415","from_webstore":false,"incognito_content_settings":[],"incognito_preferences":{},"last_update_time":"13418947398525415","location":5,"manifest":{"background":{"persistent":false,"scripts":["lifetimeHelper.js","telemetryHelper.js","errorHelper.js","voiceList/voiceListRequester.js","voiceList/voiceListSingleton.js","voiceList/voiceModel.js","manifestHelper.js","config.js","ssml.js","uuid.js","wordBoundary.js","audioStreamer.js","wordBoundaryEventManager.js","audioViewModel.js","background.js"]},"description":"Provides access to Microsoft's online text-to-speech voices","key":"AAAAB3NzaC1yc2EAAAADAQABAAAAgQDjGOAV6/3fmEtQmFqlmqm5cZ+jlNhd6XikwMDp0I7BKh+AjG3aBIG/qqwlsF/7LAGatnSxBwUwZC0qMnGXtcOPVl26Q8OvMx0gt5Va5gxca+ae0Skluj9WN9TNxPFVhw21WbCt4D9q3kb+XXDlx/7v1ktYus4Fwr/skkjADG9cIQ==","manifest_version":2,"name":"Microsoft Voices","permissions":["activeTab","errorReporting","metricsPrivate","storage","systemPrivate","ttsEngine","https://*.bing.com/"],"tts_engine":{"voices":[{"codec":"audio-24khz-48kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"en-US","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (en-US, AriaNeural)","voice_name":"Microsoft Aria Online (Natural) - English (United States)"},{"codec":"audio-24khz-48kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"en-US","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (en-US, GuyNeural)","voice_name":"Microsoft Guy Online (Natural) - English (United States)"},{"codec":"audio-24khz-48kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"zh-CN","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (zh-CN, XiaoxiaoNeural)","voice_name":"Microsoft Xiaoxiao Online (Natural) - Chinese (Mainland)"},{"codec":"audio-24khz-48kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"zh-CN","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (zh-CN, YunyangNeural)","voice_name":"Microsoft Yunyang Online (Natural) - Chinese (Mainland)"},{"codec":"audio-16khz-32kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"zh-TW","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (zh-TW, HanHanRUS)","voice_name":"Microsoft HanHan Online - Chinese (Taiwan)"},{"codec":"audio-16khz-32kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"zh-HK","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (zh-HK, TracyRUS)","voice_name":"Microsoft Tracy Online - Chinese (Hong Kong)"},{"codec":"audio-24khz-48kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"ja-JP","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (ja-JP, NanamiNeural)","voice_name":"Microsoft Nanami Online (Natural) - Japanese (Japan)"},{"codec":"audio-24khz-48kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"en-GB","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (en-GB, LibbyNeural)","voice_name":"Microsoft Libby Online (Natural) - English (United Kingdom)"},{"codec":"audio-24khz-48kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"pt-BR","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (pt-BR, FranciscaNeural)","voice_name":"Microsoft Francisca Online (Natural) - Portuguese (Brazil)"},{"codec":"audio-24khz-48kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"es-MX","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (es-MX, DaliaNeural)","voice_name":"Microsoft Dalia Online (Natural) - Spanish (Mexico)"},{"codec":"audio-16khz-32kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"en-IN","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (en-IN, PriyaRUS)","voice_name":"Microsoft Priya Online - English (India)"},{"codec":"audio-16khz-32kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"en-CA","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (en-CA, HeatherRUS)","voice_name":"Microsoft Heather Online - English (Canada)"},{"codec":"audio-24khz-48kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"fr-CA","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (fr-CA, SylvieNeural)","voice_name":"Microsoft Sylvie Online (Natural) - French (Canada)"},{"codec":"audio-24khz-48kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"fr-FR","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (fr-FR, DeniseNeural)","voice_name":"Microsoft Denise Online (Natural) - French (France)"},{"codec":"audio-24khz-48kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"de-DE","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (de-DE, KatjaNeural)","voice_name":"Microsoft Katja Online (Natural) - German (Germany)"},{"codec":"audio-16khz-32kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"ru-RU","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (ru-RU, EkaterinaRUS)","voice_name":"Microsoft Ekaterina Online - Russian (Russia)"},{"codec":"audio-16khz-32kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"en-AU","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (en-AU, HayleyRUS)","voice_name":"Microsoft Hayley Online - English (Australia)"},{"codec":"audio-24khz-48kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"it-IT","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (it-IT, ElsaNeural)","voice_name":"Microsoft Elsa Online (Natural) - Italian (Italy)"},{"codec":"audio-24khz-48kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"ko-KR","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (ko-KR, SunHiNeural)","voice_name":"Microsoft SunHi Online (Natural) - Korean (Korea)"},{"codec":"audio-16khz-32kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"nl-NL","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (nl-NL, HannaRUS)","voice_name":"Microsoft Hanna Online - Dutch (Netherlands)"},{"codec":"audio-24khz-48kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"es-ES","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (es-ES, ElviraNeural)","voice_name":"Microsoft Elvira Online (Natural) - Spanish (Spain)"},{"codec":"audio-24khz-48kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"tr-TR","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (tr-TR, EmelNeural)","voice_name":"Microsoft Emel Online (Natural) - Turkish (Turkey)"},{"codec":"audio-16khz-32kbitrate-mono-mp3","event_types":["end","error","start","word"],"lang":"pl-PL","remote":true,"server_name":"Microsoft Server Speech Text to Speech Voice (pl-PL, PaulinaRUS)","voice_name":"Microsoft Paulina Online - Polish (Poland)"}]},"version":"1.0"},"path":"C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\146.0.3856.72\\resources\\microsoft_voices","preferences":{},"regular_only_preferences":{},"was_installed_by_default":false,"was_installed_by_oem":false},"mhjfbmdgcfjbbpaeojofohoefgiehjai":{"account_extension_type":0,"active_permissions":{"api":["contentSettings","fileSystem","fileSystem.write","metricsPrivate","tabs","resourcesPrivate","pdfViewerPrivate","fileSystem.readFullPath","errorReporting","edgeLearningToolsPrivate","fileSystem.getCurrentEntry","edgePdfPrivate","edgeCertVerifierPrivate"],"explicit_host":["edge://resources/*","edge://webui-test/*"],"manifest_permissions":[],"scriptable_host":[]},"commands":{},"content_settings":[],"creation_flags":1,"disable_reasons":[],"events":[],"first_install_time":"13418947398501488","from_webstore":false,"incognito_content_settings":[],"incognito_preferences":{},"last_update_time":"13418947398501488","location":5,"manifest":{"content_security_policy":"script-src 'self' 'wasm-eval' blob: filesystem: chrome://resources chrome://webui-test; object-src * blob: externalfile: file: filesystem: data:; trusted-types edge-internal fast-html pdf-url edge-pdf-static-policy;","description":"","incognito":"split","key":"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDN6hM0rsDYGbzQPQfOygqlRtQgKUXMfnSjhIBL7LnReAVBEd7ZmKtyN2qmSasMl4HZpMhVe2rPWVVwBDl6iyNE/Kok6E6v6V3vCLGsOpQAuuNVye/3QxzIldzG/jQAdWZiyXReRVapOhZtLjGfywCvlWq7Sl/e3sbc0vWybSDI2QIDAQAB","manifest_version":2,"mime_types":["application/pdf"],"mime_types_handler":"edge_pdf/index.html","name":"Microsoft Edge PDF Viewer","offline_enabled":true,"permissions":["errorReporting","chrome://resources/","chrome://webui-test/","contentSettings","metricsPrivate","edgeCertVerifierPrivate","edgeLearningToolsPrivate","edgePdfPrivate","pdfViewerPrivate","resourcesPrivate","tabs",{"fileSystem":["write","readFullPath","getCurrentEntry"]}],"version":"1"},"path":"C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\146.0.3856.72\\resources\\edge_pdf","preferences":{},"regular_only_preferences":{},"was_installed_by_default":false,"was_installed_by_oem":false},"ncbjelpjchkpbikbpkcchkhkblodoama":{"account_extension_type":0,"active_permissions":{"api":[],"explicit_host":[],"manifest_permissions":[],"scriptable_host":[]},"commands":{},"content_settings":[],"creation_flags":1,"disable_reasons":[],"events":[],"first_install_time":"13418947398521106","from_webstore":false,"incognito_content_settings":[],"incognito_preferences":{},"last_update_time":"13418947398521106","location":5,"manifest":{"background":{"persistent":false,"scripts":["background.js"]},"externally_connectable":{"matches":["https://*.teams.cloud.microsoft/*","https://*.teams.cloud.microsoft.com/*","https://*.teams.microsoft.com/*","https://*.skype.com/*","https://*.teams.live.com/*"]},"incognito":"split","key":"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtAdFAR3ckd5c7G8VSzUj4Ltt/QRInUOD00StG95LweksGcLBlFlYL46cHFVgHHj1gmzcpBtgsURdcrAC3V8yiE7GY4wtpOP+9l+adUGR+cyOG0mw9fLjyH+2Il0QqktsNXzkNiE1ogW4l0h4+PJc262j0vtm4hBzMvR0QScFWcAIcAErlUiWTt4jefXCAYqubV99ed5MvVMWBxe97wOa9hYwAhbCminOepA4RRTg9eyi0TiuHpq/bNI8C5qZgKIQNBAjgiFBaIx9hiMBFlK4NHUbFdgY6Qp/hSCMNurctwz1jpsXEnT4eHg1YWXfquoH8s4swIjkFCMBF6Ejc3cUkQIDAQAB","manifest_version":2,"name":"WebRTC Internals Extension","permissions":["webrtcInternalsPrivate"],"version":"2.0.4"},"path":"C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\146.0.3856.72\\resources\\webrtc_internals","preferences":{},"regular_only_preferences":{},"was_installed_by_default":false,"was_installed_by_oem":false},"nkeimhogjdpnpccoofpliimaahmaaome":{"account_extension_type":0,"active_permissions":{"api":["processes","webrtcLoggingPrivate","system.cpu","enterprise.hardwarePlatform"],"explicit_host":[],"manifest_permissions":[],"scriptable_host":[]},"commands":{},"content_settings":[],"creation_flags":1,"disable_reasons":[],"events":[],"first_install_time":"13418947398511442","from_webstore":false,"incognito_content_settings":[],"incognito_preferences":{},"last_update_time":"13418947398511442","location":5,"manifest":{"background":{"page":"background.html","persistent":false},"externally_connectable":{"matches":["https://*.teams.cloud.microsoft/*","https://*.teams.cloud.microsoft.com/*","https://*.teams.microsoft.com/*","https://*.teams.live.com/*","https://*.skype.com/*"]},"incognito":"split","key":"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDAQt2ZDdPfoSe/JI6ID5bgLHRCnCu9T36aYczmhw/tnv6QZB2I6WnOCMZXJZlRdqWc7w9jo4BWhYS50Vb4weMfh/I0On7VcRwJUgfAxW2cHB+EkmtI1v4v/OU24OqIa1Nmv9uRVeX0GjhQukdLNhAE6ACWooaf5kqKlCeK+1GOkQIDAQAB","manifest_version":2,"name":"WebRTC Extension","permissions":["enterprise.hardwarePlatform","processes","system.cpu","webrtcLoggingPrivate"],"version":"4.3.26"},"path":"C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\146.0.3856.72\\resources\\hangout_services","preferences":{},"regular_only_preferences":{},"was_installed_by_default":false,"was_installed_by_oem":false}}},"protection":{"macs":{"browser":{"show_home_button":"31FF5D80FE6A795FE2CB19889367FD90F977BC3792C5CC4B7F2C871F9EC65B51","show_home_button_encrypted_hash":"djEwAgxfm6Y4imiN+q8Gol5TBOi+hz1uIGmWM0asiGQdj7RVqtag75OIWgM+tpdX37p69TVbyu3XgjMd7vqA"},"default_search_provider_data":{"template_url_data":"C29C79C4E396626377D93F0CFE362AE38EB2CF777B47270A973AB0832BE2C44A","template_url_data_encrypted_hash":"djEw8Nxfdtm+iCOarvguYBEQemR2QOwUOQXU2FuQZFL8r+OQiig78wGvVr4aRBKk2jJ2M6/OZ7foKAs/DxZ9"},"edge":{"services":{"account_id":"F2F1D19FB2E3FD8E78B68415325EA250902A6D7D62358524F0149F48D60C5283","account_id_encrypted_hash":"djEwTLx0Oy5Q7t4QecJ7J63Rv5kCfrYtSVMAJ0k31/kppBr1oCaym7aeoKAIZtjQjYQUmV+Bn97NQJGT9afJ","last_username":"FB026645C5CB39FB3C6A7DC05C3F440DAEF903369418370ABD00B5A8FC6FCDD6","last_username_encrypted_hash":"djEwA1tIvrJclez8Yc6+ILrP3DGlad8MFLMEoAsrYhJvGYsBG7s3L8lyIFeckpYapiUSIlKYtNg+oCDKKtLH"}},"enterprise_signin":{"policy_recovery_token":"6830661AD96A6D2C8A4FFEEC044717FD0B40D619B1F7D796AC98415846694E66","policy_recovery_token_encrypted_hash":"djEw71EngtiS9Pfou4Qc75eKn27fV/QIUgV5Up6BrRerYkcBGBAcSVeY8koC4kmYSnGgAp6yvfnz7XtzWgR6"},"extensions":{"install":{"initiallist":"0E4D11D8EA5F952E24A14420326E68E050F617EA12021912C6698B74F7D96CC0","initiallist_encrypted_hash":"djEwhzUJiAVMD2UPkOhHQyAxGDO4RAB+4RaTXD/I5KHh/bYdV47jk0Nn3dtJ4x7S+9WVsgsLHafQ7k02EyL2","initialprovidername":"EA3F27681ED6AE05BE9BACE91C7A3736C7F214783B2C8898C6EA51C4B998428C","initialprovidername_encrypted_hash":"djEwLVzjjNJNP0BEFnNUVfJEHFfm3CnZaabwQ5flIJsOLkhqYmrUBjajuvGtkPN6p+K1Agq7Rx27gxc07D6E"},"settings":{"ahfgeienlihckogmohjhadlkjgocpleb":"781A342A32C42A58768BBF099129BAB4F3DCEAAC9051F197918D354C737CA706","dgiklkfkllikcanfonkcabmbdfmgleag":"3009EC59E2884D319EBAE83CE433F944A7ADD708BB4FC09ABA686F3058391549","fikbjbembnmfhppjfnmfkahdhfohhjmg":"B79051E7979B3C0E56A6D45447E862D0D8A05B11D0160C9C9E0E0C36B9B153D5","iglcjdemknebjbklcgkfaebgojjphkec":"44EAEB16F3499F23F78F5F2195AD235CBADF43A76A3D72841C83B980E35B0417","ihmafllikibpmigkcoadcmckbfhibefp":"24C77ED892820A39B28FCD4BA64BEB763BFF24767D919745DA7C5C0BD49404D5","jdiccldimpdaibmpdkjnbmckianbfold":"EC9C05C3FA7AB225E47AF74FAEEE218782A39E0C6AD78CB079E53BF16292CD13","mhjfbmdgcfjbbpaeojofohoefgiehjai":"618392CC4FEB154082E191DEB17EB3BEE9E3DCF0C218FA6D8D4F2F593FCB7E6C","ncbjelpjchkpbikbpkcchkhkblodoama":"9A837DDB8A167D63ACD182B470F790756463743739DDA986ACCD132814EAB1D4","nkeimhogjdpnpccoofpliimaahmaaome":"A86A7D963BD1B40FDA3469E056063362515E094336692F3C5526CACE879DEAB6"},"settings_encrypted_hash":{"ahfgeienlihckogmohjhadlkjgocpleb":"djEwMJa4QLjmKh70uy/RYNaaXG6A6ht6wjJRDF/+PXVa3OwnNNcFseSO6ZvgwpoVDaGSRDhrhIzloxol6Q0b","dgiklkfkllikcanfonkcabmbdfmgleag":"djEwUMkd3TIDGDefXQE4BLnsb4B6bkVJUuZ8uOX0Qz0ZIZIi8r1mmWeA2znUcBhbfi9s/Yb2w3F/HoioHlkM","fikbjbembnmfhppjfnmfkahdhfohhjmg":"djEwPZDTRtKfiAQ6NVDKS5XpqcQOzO0l/UqzBs8be76seJifRbiTd7hoX34jdf7r83YgYFFl9bk2dFXzu5/S","iglcjdemknebjbklcgkfaebgojjphkec":"djEwyIenRVUfN0Tj6nRUa4DSNdrKgfrg37W0H2QZBiGaA8Ytkc6imuFRAQjZImGwFLH9nhrCu67QuTS3SMay","ihmafllikibpmigkcoadcmckbfhibefp":"djEwtJpjoJ8y31lxbdFPiK8wbHvWy7DWHqjEr99BoSlAEca7UOMinTWE9FhrgzhA5LAAqkASxrJVLA5Egn7z","jdiccldimpdaibmpdkjnbmckianbfold":"djEwbXwisAslUKii9EyGrHESc/sO6vL4NqeOScyg/wC2WFqV11AeZq51wGhKQDDi0WvhRAIndOyji9aSEYEG","mhjfbmdgcfjbbpaeojofohoefgiehjai":"djEw/ld6oa4A/ht/nCTEgW6Wk+0HFU9bcSmezHjVbSp+WtiGDL0SI6FGaHKonVbHS1akVM98geFbUMSb942G","ncbjelpjchkpbikbpkcchkhkblodoama":"djEwnaCX3lM3P1YnLLbW7J+eGc+hUaZDDiwPfZD9VV4lWbwBl3rhX8N+W7CyEDfB67np5WEYoU/2RjGjq09I","nkeimhogjdpnpccoofpliimaahmaaome":"djEwDJgrtbSHS4HZA8w5+vxO/J/Zh15rP8UvLlTWc9CJRunK5W/h38iGbHG88BhcAr2xx8P1Rg9pZoySwG0t"},"ui":{"developer_mode":"C56CAEDE4F773F33F6AA11ED3B55DB5AD6A79944D966D3FAC1E9453157EF4B18","developer_mode_encrypted_hash":"djEwdnt1P5KyQ9CKsv4sEwldA+6tbkF4iZumOR8ScPmCExLwPXi+bZZi21qQYUduI8pthzSN4qkUUJCN6Ug/"}},"google":{"services":{"last_signed_in_username":"2EE81834DB0B6D8AB9FD660F0A7C98EBD4A8B40A74118150DD2893194EB8A60C","last_signed_in_username_encrypted_hash":"djEwn9qUKF1W/1tB/N1XlU4KTpBnOOajV+hWPsPa0Q3lyvUOBs6suXnD6cwinZZqZM4KOPAcRFDDoeUxf0Nz"}},"homepage":"2C46CB79C277992F901435D45CCDA37D9176019676D60FCE7C7939C59063EDEE","homepage_encrypted_hash":"djEwg79jINvQWn0NVYHYoSAxtVQRm9jQyQrewhnnNAG9QgBtKy56CBgn+c01Tej67NMIwnm4HrguKagQ1+vs","homepage_is_newtabpage":"30436771E0E4D9590DD1363343DD7F37A3E00DAA38D260FA94A455B233AEB744","homepage_is_newtabpage_encrypted_hash":"djEwP2GQDu3F3oOglfJQjo9KZfhKLmWraDWu+I+l4QwNf3EBwROHsd63yfm5pnvgxBlQbfNw4dCHzWnkI1dN","media":{"cdm":{"origin_data":"DC74BF09FCACFE9E058BC4A62275D82145C4F64C0BB55FBCC13287C1856D2085","origin_data_encrypted_hash":"djEwShhXCrYoWp/7O986pW9WHFsNbkUt8l2G89eeGMVK/T4Qi1wpW6oDiIWmZ6X7B0J862U2ZX4S2lUwYzPd"},"storage_id_salt":"838B681888FC88C8EA74E985DE45075E76611EC1BD17C92C675A24F41A103D20","storage_id_salt_encrypted_hash":"djEwhqJ0pNP1iAUlEs4qrPWn8078xX7UmX09czPqWharLAZxmLZZus1QTC3bgTkzbYL7nVhthhbSGOoH6lPm"},"pinned_tabs":"D9B2ADF8FE923DA216C09DA91C85011B0807A3BDC4D17D1B900481B183B2023C","pinned_tabs_encrypted_hash":"djEwkwR+pwApsruTTLGthx2QiN/YR4ZSu7jziAwPgi4L2ZhhKB0MI9KoDIofRkqvGIygHHL18XV3FjSaiaxH","prefs":{"preference_reset_time":"C755211BE9000AE8E8418A0B43B236E11E395162C56317F814A7C1C1F5FA37DB","preference_reset_time_encrypted_hash":"djEw9viVIxF37t2RR/G5WpTqTV3NXGcFSTYPPZ6wLaB1Z/sOMSY/X2ammXpv0aD5dGkPNIDQ9/E4iB5mWg46"},"safebrowsing":{"incidents_sent":"C27E7B6414757EC7B69237008F3609C63D8B3E0D3022C6F8AC1BB28D821F9680","incidents_sent_encrypted_hash":"djEwuK1D7lUrIRifaabcXug3BjJq3AtAhprZhwqebOFOloW6FnQxSXgw5FjWIuE52J+sRhso9BmZNz9p7q5I"},"schedule_to_flush_to_disk":"20FCD8D6E79AE04FFD31CCDD12C1DAE7B91201797F1630CBA6C8A2C8EB95F0D5","schedule_to_flush_to_disk_encrypted_hash":"djEwIhkoTC7kVwYV2JUj8k4Pt5R7NeRoMDLxWfyK88fIV5bdiFd9dCm5oB+XIZ4B6pA9D8yBYZqYmCNl/8Tt","search_provider_overrides":"2C79C4955D5E2C0AC3644E8A29357FD7DB1C6DCFDB7556E1B5641E31FB0F57DB","search_provider_overrides_encrypted_hash":"djEwK0pZP0iwJYllMKEdE3BWc6MU/PgL02uT7s3eX2Lnltf67DIR11lzA2YR7HseA5k3hznhtVtrc51E50x2","session":{"restore_on_startup":"BF14AE9EDA027778E3C2047056BE1B321AE63B933A29FA05B30E76FE780AD0CE","restore_on_startup_encrypted_hash":"djEwcHUU6w1EScgS7HT0cb2GII/OpWLFNLDjtt5vQqWUklXPSe5SIZIL+Dkn+KlE/a1HOIEzbUlQht5ykjRT","startup_urls":"4266BB085D3346F8626C812970D202685455DEC0CBBB807690923BAE5510C65E","startup_urls_encrypted_hash":"djEw7uRAmhuCmIQGGhwI5z4plNJJm9r3gCQLfENj2xfOwUIc/YmyhY9uCVInGv9bi5ugHHudMUfZXrDiD0uU"}},"super_mac":"D81E1DC7E7C58A5315238A695AF1638DD222744E65CA57BC32C04739BFC6E2F2"},"schedule_to_flush_to_disk":"13418947399871746"} \ No newline at end of file diff --git a/.edge-profile/Default/ServerCertificate b/.edge-profile/Default/ServerCertificate new file mode 100644 index 0000000..9587f64 Binary files /dev/null and b/.edge-profile/Default/ServerCertificate differ diff --git a/.edge-profile/Default/ServerCertificate-journal b/.edge-profile/Default/ServerCertificate-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile/Default/Sessions/Session_13418947400960868 b/.edge-profile/Default/Sessions/Session_13418947400960868 new file mode 100644 index 0000000..5551d60 Binary files /dev/null and b/.edge-profile/Default/Sessions/Session_13418947400960868 differ diff --git a/.edge-profile/Default/SharedStorage b/.edge-profile/Default/SharedStorage new file mode 100644 index 0000000..4410bda Binary files /dev/null and b/.edge-profile/Default/SharedStorage differ diff --git a/.edge-profile/Default/SharedStorage-wal b/.edge-profile/Default/SharedStorage-wal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile/Default/Site Characteristics Database/CURRENT b/.edge-profile/Default/Site Characteristics Database/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile/Default/Site Characteristics Database/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile/Default/Site Characteristics Database/LOCK b/.edge-profile/Default/Site Characteristics Database/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile/Default/Site Characteristics Database/LOG b/.edge-profile/Default/Site Characteristics Database/LOG new file mode 100644 index 0000000..8d2a072 --- /dev/null +++ b/.edge-profile/Default/Site Characteristics Database/LOG @@ -0,0 +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 diff --git a/.edge-profile/Default/Site Characteristics Database/MANIFEST-000001 b/.edge-profile/Default/Site Characteristics Database/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile/Default/Site Characteristics Database/MANIFEST-000001 differ diff --git a/.edge-profile/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/js/index b/.edge-profile/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/js/index new file mode 100644 index 0000000..79bd403 Binary files /dev/null and b/.edge-profile/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/js/index differ diff --git a/.edge-profile/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/js/index-dir/the-real-index b/.edge-profile/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/js/index-dir/the-real-index new file mode 100644 index 0000000..7f83f03 Binary files /dev/null and b/.edge-profile/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/js/index-dir/the-real-index differ diff --git a/.edge-profile/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/wasm/index b/.edge-profile/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/wasm/index new file mode 100644 index 0000000..79bd403 Binary files /dev/null and b/.edge-profile/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/wasm/index differ diff --git a/.edge-profile/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/wasm/index-dir/the-real-index b/.edge-profile/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/wasm/index-dir/the-real-index new file mode 100644 index 0000000..66e751e Binary files /dev/null and b/.edge-profile/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Code Cache/wasm/index-dir/the-real-index differ diff --git a/.edge-profile/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_0 b/.edge-profile/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_0 new file mode 100644 index 0000000..d76fb77 Binary files /dev/null and b/.edge-profile/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_0 differ diff --git a/.edge-profile/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_1 b/.edge-profile/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_1 new file mode 100644 index 0000000..035d06d Binary files /dev/null and b/.edge-profile/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_1 differ diff --git a/.edge-profile/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_2 b/.edge-profile/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_2 new file mode 100644 index 0000000..c7e2eb9 Binary files /dev/null and b/.edge-profile/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_2 differ diff --git a/.edge-profile/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_3 b/.edge-profile/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_3 new file mode 100644 index 0000000..5eec973 Binary files /dev/null and b/.edge-profile/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/data_3 differ diff --git a/.edge-profile/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/index b/.edge-profile/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/index new file mode 100644 index 0000000..264a457 Binary files /dev/null and b/.edge-profile/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnGraphiteCache/index differ diff --git a/.edge-profile/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_0 b/.edge-profile/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_0 new file mode 100644 index 0000000..d76fb77 Binary files /dev/null and b/.edge-profile/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_0 differ diff --git a/.edge-profile/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_1 b/.edge-profile/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_1 new file mode 100644 index 0000000..035d06d Binary files /dev/null and b/.edge-profile/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_1 differ diff --git a/.edge-profile/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_2 b/.edge-profile/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_2 new file mode 100644 index 0000000..c7e2eb9 Binary files /dev/null and b/.edge-profile/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_2 differ diff --git a/.edge-profile/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_3 b/.edge-profile/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_3 new file mode 100644 index 0000000..5eec973 Binary files /dev/null and b/.edge-profile/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/data_3 differ diff --git a/.edge-profile/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/index b/.edge-profile/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/index new file mode 100644 index 0000000..bfad0cf Binary files /dev/null and b/.edge-profile/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/DawnWebGPUCache/index differ diff --git a/.edge-profile/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_0 b/.edge-profile/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_0 new file mode 100644 index 0000000..d76fb77 Binary files /dev/null and b/.edge-profile/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_0 differ diff --git a/.edge-profile/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_1 b/.edge-profile/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_1 new file mode 100644 index 0000000..035d06d Binary files /dev/null and b/.edge-profile/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_1 differ diff --git a/.edge-profile/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_2 b/.edge-profile/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_2 new file mode 100644 index 0000000..c7e2eb9 Binary files /dev/null and b/.edge-profile/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_2 differ diff --git a/.edge-profile/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_3 b/.edge-profile/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_3 new file mode 100644 index 0000000..5eec973 Binary files /dev/null and b/.edge-profile/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/data_3 differ diff --git a/.edge-profile/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/index b/.edge-profile/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/index new file mode 100644 index 0000000..8cc3bd4 Binary files /dev/null and b/.edge-profile/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/GPUCache/index differ diff --git a/.edge-profile/Default/Sync Data/LevelDB/CURRENT b/.edge-profile/Default/Sync Data/LevelDB/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile/Default/Sync Data/LevelDB/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile/Default/Sync Data/LevelDB/LOCK b/.edge-profile/Default/Sync Data/LevelDB/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile/Default/Sync Data/LevelDB/LOG b/.edge-profile/Default/Sync Data/LevelDB/LOG new file mode 100644 index 0000000..f6e32f0 --- /dev/null +++ b/.edge-profile/Default/Sync Data/LevelDB/LOG @@ -0,0 +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 diff --git a/.edge-profile/Default/Sync Data/LevelDB/MANIFEST-000001 b/.edge-profile/Default/Sync Data/LevelDB/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile/Default/Sync Data/LevelDB/MANIFEST-000001 differ diff --git a/.edge-profile/Default/Top Sites b/.edge-profile/Default/Top Sites new file mode 100644 index 0000000..e700bd4 Binary files /dev/null and b/.edge-profile/Default/Top Sites differ diff --git a/.edge-profile/Default/Top Sites-journal b/.edge-profile/Default/Top Sites-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile/Default/Vpn Tokens b/.edge-profile/Default/Vpn Tokens new file mode 100644 index 0000000..2ba3b69 Binary files /dev/null and b/.edge-profile/Default/Vpn Tokens differ diff --git a/.edge-profile/Default/Vpn Tokens-journal b/.edge-profile/Default/Vpn Tokens-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile/Default/Web Data b/.edge-profile/Default/Web Data new file mode 100644 index 0000000..81aaa12 Binary files /dev/null and b/.edge-profile/Default/Web Data differ diff --git a/.edge-profile/Default/Web Data-journal b/.edge-profile/Default/Web Data-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile/Default/arbitration_service_config.json b/.edge-profile/Default/arbitration_service_config.json new file mode 100644 index 0000000..fd7d0be --- /dev/null +++ b/.edge-profile/Default/arbitration_service_config.json @@ -0,0 +1,197 @@ +{ + "ArbitrationSignal": "notification_nsat_upper_ci-0.7", + "CopilotModeBypass": [ "cd4688a9-e888-48ea-ad81-76193d56b1be.IsVideoPage.Bubble", "cd4688a9-e888-48ea-ad81-76193d56b1be.IsKnowledgeCardQuery.Bubble", "PerformanceDetectorFeatureNotification", "AUTOFILL_PASSWORD_NON_FUNCTIONAL_FLYOUTS", "SHOPPING_AUTO_SHOW_LOWER_PRICE_FOUND", "SHOPPING_AUTO_SHOW_REBATES", "SHOPPING_AUTO_SHOW_REBATES_CONFIRMATION", "SHOPPING_AUTO_SHOW_REBATES_ORGANIC", "SHOPPING_AUTO_SHOW_REBATES_ORGANIC_NEW" ], + "CustomSuppressionPolicies": { + "8682d0fa-50b3-4ece-aa5b-e0b33f9919e2.f5b8c725-cb2e-4c12-accd-73e500d88d47.AutoOpen": { + "notification_max_quick_dismiss_count": 3 + }, + "bc25fcef-8964-4e72-8287-23e2b496c128.68b8a884-6e08-46e6-8a3b-7e06ffe48ecf.AutoOpen": { + "notification_max_quick_dismiss_count": 3 + }, + "cd4688a9-e888-48ea-ad81-76193d56b1be.e06e75c1-a59a-4ab6-8361-e8b038e00a8c.AutoOpen": { + "notification_max_quick_dismiss_count": 1 + } + }, + "DynamicSuppressionBypass": { + "ExperienceIDs": [ "Nurturing.Global.OnRamp_RetriggerFREOnEdgeVersionUpgradeViaExplicitLaunch", "Nurturing.Global.OnRamp_RetriggerFREOnExplicitProtocolPDFLaunchForEdgePostDMA", "Nurturing.Global.Bing_DefaultBrowserBannerCloseBtn", "Nurturing.Global.Bing_DefaultBrowserBannerCloseBtnUpdate", "Nurturing.Global.Bing_MSStartYJCompete", "Nurturing.Global.Bing_NtpHomeStartpageUpsellFlyout", "Nurturing.Global.Fundamentals_DefaultBrowserMonitor", "Nurturing.Global.Fundamentals_DefaultBrowserMonitorOnStart", "Nurturing.Global.Fundamentals_DefaultBrowserMonitorVariant2", "Nurturing.Global.RecommendedSettingsChina", "Nurturing.Global.ContinuousImport_PasswordZeroStateV2", "Nurturing.Global.OnRamp_CIExplicitLaunchBannerUpsell", "Nurturing.Global.OnRamp_CIUpsell_ProtocolLaunch_Banner", "Nurturing.Global.EdgeGrowth_SitePinningCITopSites", "Nurturing.Global.EdgeGrowth_SitePinningWithWindowsConsent", "Nurturing.Global.EdgeGrowth_GlobalSitePinningOnCloseModal" ], + "TeamIDs": [ "NTP" ] + }, + "ExperienceCohorts": { + "DefaultCohort": { + "21f3388b-c2a5-4791-8f6e-a4cad6d17f4f.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.BingHomePage.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Covid.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Finance.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Jobs.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.KnowledgeCard.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Local.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.NTP3PCLICK.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.NotifySearchPage.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Recipe.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.SearchPage.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Sports.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Travel.Bubble": 1, + "2354565a-f412-4654-b89c-f92eaa9dbd20.Weather.Bubble": 1, + "2cb2db96-3bd0-403e-abe2-9269b3761041.AutoOpen": 1, + "2cb2db96-3bd0-403e-abe2-9269b3761041.Bubble": 1, + "439642fc-998d-4a64-8bb6-940ecaf6b60b.AutoOpen": 1, + "439642fc-998d-4a64-8bb6-940ecaf6b60b.Bubble": 1, + "523b5ef3-0b10-4154-8b62-10b2ebd00921.Bubble": 1, + "64be4f9b-3b81-4b6e-b354-0ba00d6ba485.AutoOpen": 1, + "64be4f9b-3b81-4b6e-b354-0ba00d6ba485.Bubble": 1, + "76b926d6-3738-46bf-82d7-2ab896ddf70b.MM2UpSellPopup.Bubble": 1, + "8682d0fa-50b3-4ece-aa5b-e0b33f9919e2.Bubble": 1, + "8682d0fa-50b3-4ece-aa5b-e0b33f9919e2.f5b8c725-cb2e-4c12-accd-73e500d88d47.AutoOpen": 1, + "8ac719c5-140b-4bf2-a0b7-c71617f1f377.3662f1e2-66ae-464f-b690-e7e3dc4fc662.AutoOpen": 1, + "8ac719c5-140b-4bf2-a0b7-c71617f1f377.93e5b5cd-15fc-4253-9728-d80685da304e.AutoOpen": 1, + "8ac719c5-140b-4bf2-a0b7-c71617f1f377.AutoOpen": 1, + "8ac719c5-140b-4bf2-a0b7-c71617f1f377.gaokao.Bubble": 1, + "92f1b743-e26b-433b-a1ec-912d1f0ad1fa.Bubble": 1, + "96defd79-4015-4a32-bd09-794ff72183ef.0bdde3c3-7be8-49f1-971b-e6e2cfd62643.AutoOpen": 1, + "96defd79-4015-4a32-bd09-794ff72183ef.128c39c6-6f70-4ce5-9d01-78978e60d666.AutoOpen": 1, + "96defd79-4015-4a32-bd09-794ff72183ef.5ac63306-e962-42e6-8313-7e5a5b707d65.AutoOpen": 1, + "96defd79-4015-4a32-bd09-794ff72183ef.AutoOpen": 1, + "96defd79-4015-4a32-bd09-794ff72183ef.Bubble": 1, + "96defd79-4015-4a32-bd09-794ff72183ef.Is1PGameDomain.Bubble": 1, + "96defd79-4015-4a32-bd09-794ff72183ef.Is3PGameDomain.Bubble": 1, + "9ce3c9c2-462f-4cc9-bbd7-57d656445be0.Bubble": 1, + "AUTOFILL_PASSWORD_NON_FUNCTIONAL_FLYOUTS": 1, + "DefaultExperience": 1, + "EdgeDownloadChromeInterceptDialog": 2, + "PerformanceDetectorFeatureNotification": 1, + "RewardsPromotionNotifications": 1, + "RewardsReminderNotifications": 1, + "SAN.Personalization.ConsentPrompt": 1, + "SHOPPING_AA_CONSENT": 1, + "SHOPPING_AUTO_PRODUCT_TRACKING_EXP_PRICE_DROP": 1, + "SHOPPING_AUTO_PRODUCT_TRACKING_IMP_PRICE_DROP": 1, + "SHOPPING_AUTO_PRODUCT_TRACKING_OUT_OF_STOCK": 1, + "SHOPPING_AUTO_SHOW_ABANDONED_CART": 1, + "SHOPPING_AUTO_SHOW_ADD_SPB_TO_CART_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_AMAZON_SEARCH_PC": 1, + "SHOPPING_AUTO_SHOW_ATTAINABLE_COUPONS": 1, + "SHOPPING_AUTO_SHOW_AUTOS_MARKETPLACE": 1, + "SHOPPING_AUTO_SHOW_AWARENESSEXP": 1, + "SHOPPING_AUTO_SHOW_AWARENESS_EXPANSION": 1, + "SHOPPING_AUTO_SHOW_CAMPAIGN_AWARENESS_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_CAMPAIGN_PDP_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_CASHBACK_PDP_PLUS_COUPONS": 1, + "SHOPPING_AUTO_SHOW_CJK_COUPON_FOUND": 1, + "SHOPPING_AUTO_SHOW_CJK_PRICE_DROP": 1, + "SHOPPING_AUTO_SHOW_CODEX_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_CONFIRMATION_SCRIPT": 1, + "SHOPPING_AUTO_SHOW_CONTROLLER": 1, + "SHOPPING_AUTO_SHOW_COUPONS_BACKGROUND_AUTO_APPLY": 1, + "SHOPPING_AUTO_SHOW_COUPONS_CHECKOUT": 1, + "SHOPPING_AUTO_SHOW_COUPONS_CHECKOUT_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_COUPONS_CLIPPING": 1, + "SHOPPING_AUTO_SHOW_DISCOVER_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_DISCOVER_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_EXPRESS_CHECKOUT": 1, + "SHOPPING_AUTO_SHOW_GIFT_CARD": 1, + "SHOPPING_AUTO_SHOW_GOODRX": 1, + "SHOPPING_AUTO_SHOW_GROCERY_ITEMIZED_CASHBACK": 1, + "SHOPPING_AUTO_SHOW_GROCERY_ITEMIZED_CASHBACK_LANDING": 1, + "SHOPPING_AUTO_SHOW_GUEST_DOMAIN_COUPONS": 1, + "SHOPPING_AUTO_SHOW_IBC_UPSELL": 1, + "SHOPPING_AUTO_SHOW_LOWER_PRICE_FOUND": 1, + "SHOPPING_AUTO_SHOW_LOWER_PRICE_PLUS_CASHBACK_PLUS_COUPONS": 1, + "SHOPPING_AUTO_SHOW_MOMENT_IN_TIME": 1, + "SHOPPING_AUTO_SHOW_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_ORGANIC_CASHBACK_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_OTHER_SELLER": 1, + "SHOPPING_AUTO_SHOW_OUT_OF_STOCK": 1, + "SHOPPING_AUTO_SHOW_PACKAGE_TRACKING": 1, + "SHOPPING_AUTO_SHOW_PACKAGE_TRACKING_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_PERSONALIZED_CASHBACK_ADDRESSBAR": 1, + "SHOPPING_AUTO_SHOW_PERSONALIZED_CASHBACK_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_POST_PURCHASE_TRACKING": 1, + "SHOPPING_AUTO_SHOW_PRICE_DROP_PLUS_CASHBACK": 1, + "SHOPPING_AUTO_SHOW_PRICE_DROP_PLUS_COUPONS": 1, + "SHOPPING_AUTO_SHOW_PRICE_HISTORY": 1, + "SHOPPING_AUTO_SHOW_PRICE_HISTORY_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_PRINT_GROCERY": 1, + "SHOPPING_AUTO_SHOW_PRODUCT_BEST_COUPON_CONSENT": 1, + "SHOPPING_AUTO_SHOW_PRODUCT_TRACKING_BACK_IN_STOCK": 1, + "SHOPPING_AUTO_SHOW_PRODUCT_TRACKING_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_PROFESSIONAL_REVIEWS": 1, + "SHOPPING_AUTO_SHOW_REBATES": 1, + "SHOPPING_AUTO_SHOW_REBATES_CHECKOUT": 1, + "SHOPPING_AUTO_SHOW_REBATES_ORGANIC": 1, + "SHOPPING_AUTO_SHOW_REBATES_ORGANIC_NEW": 1, + "SHOPPING_AUTO_SHOW_REBATES_PDP": 1, + "SHOPPING_AUTO_SHOW_RECOMMENDATIONS_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_SAN_CONSENT_CONFIRMATION": 1, + "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_ALL_PAGES": 1, + "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_CHECKOUT": 1, + "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_CONFIRMATION_PAGE": 1, + "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_HOME_PAGE": 1, + "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_REWARDS": 1, + "SHOPPING_AUTO_SHOW_SHOPRUNNER": 1, + "SHOPPING_AUTO_SHOW_SIDEPANE_CASHBACK_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_SPB_CASHBACK_LANDING": 1, + "SHOPPING_AUTO_SHOW_SPB_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_SPB_NUDGE_MICRO_NOTIFICATION": 1, + "SHOPPING_AUTO_SHOW_SURFACE_UPSELL": 1, + "SHOPPING_AUTO_SHOW_SUSTAINABILITY_LANDING": 1, + "SHOPPING_AUTO_SHOW_TRAVEL_NOTIFICATION_CHEAPER_FLIGHTS": 1, + "SHOPPING_AUTO_SHOW_TRAVEL_NOTIFICATION_CHEAPER_HOTEL_ROOM": 1, + "SHOPPING_AUTO_SHOW_TRENDING_COUPONS": 1, + "ShorelinePrivilegedExperienceID": 1, + "TabActionsMenuVerticalTabsPromotion": 1, + "VPNFeatureNotification": 1, + "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.75a774c2-6075-ae4f-09f9-e5f5d9bef6e1.AutoOpen": 1, + "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.AutoOpen": 1, + "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.a5e9f5e1-fcee-c07b-2c44-b707ded020a3.AutoOpen": 1, + "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.c8ebbf64-e3b8-41d9-925f-4e3754151ff7.AutoOpen": 1, + "bc25fcef-8964-4e72-8287-23e2b496c128.68b8a884-6e08-46e6-8a3b-7e06ffe48ecf.AutoOpen": 1, + "bc25fcef-8964-4e72-8287-23e2b496c128.Bubble": 1, + "c8ebd871-9f47-4a0d-abd3-c1c02b4f8f53.2cfab14c-ebd6-4548-9401-30ab5afe5061.AutoOpen": 1, + "c8ebd871-9f47-4a0d-abd3-c1c02b4f8f53.AutoOpen": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.5b853177-a0be-4237-bda0-4fce5cd165c2.AutoOpen": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.8d3a928d-e911-40f0-9852-f63f6434dc7e.AutoOpen": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.AutoOpen": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.AutoOpen.PDF": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.AutoOpen.PersistentChat": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsCompeteAISite.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsCopilotJitEduAcademicAI.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsCopilotJitEduArticleAI.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsCopilotJitEduStudyAI.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsKnowledgeCardQuery.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsMsnArticleUrlFromNtpP1P2.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsShoppingNotificationNudge.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsTextPage.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsTopNewsDomain.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsTwitchNonStreamPage.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsTwitchSubPage.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.IsVideoPage.Bubble": 1, + "cd4688a9-e888-48ea-ad81-76193d56b1be.e06e75c1-a59a-4ab6-8361-e8b038e00a8c.AutoOpen": 1, + "e6723537-66ff-4f4e-ab56-a4cbaddf4e0f.MM2UpSellPopup.Bubble": 1 + } + }, + "FunctionalCohort": [ "EdgeDownloadChromeInterceptFunctionalDialog", "8682d0fa-50b3-4ece-aa5b-e0b33f9919e2.AutoOpen.Functional", "8682d0fa-50b3-4ece-aa5b-e0b33f9919e2.f5b8c725-cb2e-4c12-accd-73e500d88d47.AutoOpen.Functional", "bc25fcef-8964-4e72-8287-23e2b496c128.AutoOpen.Functional", "bc25fcef-8964-4e72-8287-23e2b496c128.68b8a884-6e08-46e6-8a3b-7e06ffe48ecf.AutoOpen.Functional", "WPOFunctionalEvent.AutofillAccountChooser.Bubble", "WPOFunctionalEvent.AutofillAutoSignin.Bubble", "WPOFunctionalEvent.AutofillPassword.Bubble", "SHOPPING_AUTO_SHOW_BING_SEARCH", "SHOPPING_AUTO_SHOW_REBATES_CONFIRMATION", "SHOPPING_AUTO_SHOW_REBATES_DEACTIVATED", "SHOPPING_AUTO_SHOW_REBATES_BING", "SHOPPING_AUTO_SHOW_PERSONALIZED_CASHBACK", "SHOPPING_AUTO_SHOW_PERSONALIZED_CASHBACK_CONFIRMATION", "SHOPPING_AUTO_SHOW_URL_PARAM_REBATES", "SHOPPING_AUTO_SHOW_URL_PARAM_PRICE_COMPARISON", "SHOPPING_AUTO_SHOW_URL_PARAM_PRICE_HISTORY", "SHOPPING_AUTO_SHOW_REBATES_ACTIVATION_FAILED", "SHOPPING_AUTO_SHOW_REBATES_SWITCHED_TO_MSA", "SHOPPING_AUTO_SHOW_ITEM_ADDED_TO_CART_FROM_OTHER_SELLER", "SHOPPING_AUTO_SHOW_VIRTUAL_CARD", "SHOPPING_AUTO_SHOW_BING_CAMPAIGN", "SHOPPING_OPEN_FLYOUT_FROM_EDGE_DRIVER", "SHOPPING_AUTO_SHOW_SUSTAINABILITY_PURCHASE", "SHOPPING_AUTO_SHOW_REWARDS_ACTIVATION_FAILED", "SHOPPING_AUTO_SHOW_REWARDS_SWITCHED_TO_MSA", "SHOPPING_AUTO_SHOW_SHOPRUNNER_CONFIRMATION", "SHOPPING_AUTO_SHOW_ENROLL_TO_CASHBACK_CONFIRMATION_NOTIFICATION", "SHOPPING_AUTO_SHOW_POST_PURCHASE_REWARDS_NOTIFICATION", "694efa4f-a304-4214-aaf7-90444bc887f5.c1c025d9-a620-4f6b-bebb-eff0cf19a671.AutoOpen.Functional" ], + "GlobalSuppressedExperiences": [ "Teams.Bubble", "Nurturing.Global.EdgeVpn_VpnFre", "Nurturing.Global.Rewards_RedemptionCoachmark_2", "Nurturing.Global.Rewards_RedemptionCoachmark_25", "Nurturing.Global.EdgeCBUD_SanPersonalizationConsentWave1Variant0", "Nurturing.Global.Bing_NewBingChatFlyout", "Copilot.AutoOpen.PDF.v2", "Nurturing.Global.PWA_SidebarSearchPromotion", "Nurturing.Global.FC_NetworkWarningFlyout", "Nurturing.Global.EdgeMobile_MobileUpsell_ChatGpt_Flyout", "E-tree.Bubble", "Nurturing.Global.EdgeEDU_BrowserFocusedTranslateNudge", "Games.Bubble", "Nurturing.Global.OnRamp_RetriggerFRECodexCoPilotAutoAprd", "Nurturing.Global.OnRamp_NurturingViaProng_Experiment", "Nurturing.Global.OnRamp_ReTriggerOnWinUpgrade", "Nurturing.Global.EdgeGrowth_CIShoppingUpsell", "Nurturing.Global.Shopping_EnableShoppingAssistance_Optin_Generic", "Nurturing.Global.Shopping_EnableShoppingAssistance", "Nurturing.Global.BrowserExperiences_TryVerticalTabs" ], + "IgnoredFunctionalNotifications": [ "Nurturing.Functional.NTP_CourtesyEngineCampaign", "Nurturing.Functional.NTP_FunctionalCampaign", "Nurturing.Functional.NTP_SettingsCampaign", "Nurturing.Functional.NTP_UpsellCampaign", "Nurturing.Functional.FN_SmartSwitchFeatureInfoView" ], + "ModelInfo": { + "segment_id": 515, + "signals": [ "notification_triggered_count", "notification_click_rate", "notification_click_rate_lower_ci", "notification_click_rate_upper_ci", "notification_dismiss_rate", "notification_dismiss_rate_lower_ci", "notification_dismiss_rate_upper_ci", "notification_ignored_rate", "notification_ignored_rate_lower_ci", "notification_ignored_rate_upper_ci", "notification_quick_dismiss_rate", "notification_quick_dismiss_rate_lower_ci", "notification_quick_dismiss_rate_upper_ci", "notification_disable_rate", "notification_disable_rate_lower_ci", "notification_disable_rate_upper_ci", "notification_snooze_rate", "notification_snooze_rate_lower_ci", "notification_snooze_rate_upper_ci" ], + "threshold_value": 0.5 + }, + "ModelSuppressionBypass": [ "Nurturing.Local.SHOPPING_AUTO_SHOW_LOWER_PRICE_FOUND", "Nurturing.Local.SHOPPING_AUTO_SHOW_REBATES_ORGANIC", "Nurturing.Local.SHOPPING_AUTO_SHOW_REBATES_CHECKOUT", "Nurturing.Local.SHOPPING_AUTO_SHOW_SPB_CASHBACK_LANDING" ], + "NotificationsAllowLists": { + }, + "PrivilegedExperiences": [ "ShorelinePrivilegedExperienceID", "SHOPPING_AUTO_SHOW_COUPONS_CHECKOUT", "SHOPPING_AUTO_SHOW_LOWER_PRICE_FOUND", "SHOPPING_AUTO_SHOW_REBATES", "SHOPPING_AUTO_SHOW_REBATES_ORGANIC", "SHOPPING_AUTO_SHOW_PRICE_HISTORY", "SHOPPING_AUTO_SHOW_REBATES_ORGANIC_NEW", "SHOPPING_AUTO_SHOW_REBATES_CHECKOUT", "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_CHECKOUT", "SHOPPING_AUTO_SHOW_EXPRESS_CHECKOUT", "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_ALL_PAGES", "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_CONFIRMATION_PAGE", "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_HOME_PAGE", "SHOPPING_AUTO_SHOW_SERVER_DRIVEN_REWARDS", "SHOPPING_AUTO_SHOW_COUPONS_CLIPPING", "SHOPPING_AUTO_SHOW_NOTIFICATION", "SHOPPING_AUTO_SHOW_OTHER_SELLER", "SHOPPING_AUTO_SHOW_PROFESSIONAL_REVIEWS", "SHOPPING_AUTO_SHOW_PACKAGE_TRACKING", "SHOPPING_AUTO_SHOW_GUEST_DOMAIN_COUPONS", "SHOPPING_AUTO_SHOW_SUSTAINABILITY_LANDING", "SHOPPING_AUTO_SHOW_ATTAINABLE_COUPONS", "SHOPPING_AUTO_SHOW_GIFT_CARD", "SHOPPING_AUTO_SHOW_PRINT_GROCERY", "SHOPPING_AUTO_SHOW_GROCERY_ITEMIZED_CASHBACK", "SHOPPING_AUTO_SHOW_CONTROLLER", "SHOPPING_AUTO_SHOW_AUTOS_MARKETPLACE", "SHOPPING_AUTO_SHOW_SHOPRUNNER", "SHOPPING_AUTO_SHOW_ABANDONED_CART", "SHOPPING_AUTO_SHOW_OUT_OF_STOCK", "SHOPPING_AUTO_SHOW_GROCERY_ITEMIZED_CASHBACK_LANDING", "SHOPPING_AUTO_SHOW_SPB_CASHBACK_LANDING", "SHOPPING_AUTO_SHOW_AWARENESSEXP", "SHOPPING_AA_CONSENT", "SHOPPING_AUTO_SHOW_SAN_CONSENT_CONFIRMATION", "SHOPPING_AUTO_SHOW_CONFIRMATION_SCRIPT", "SHOPPING_AUTO_SHOW_MOMENT_IN_TIME", "SHOPPING_AUTO_SHOW_COUPONS_CHECKOUT_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_TRENDING_COUPONS", "SHOPPING_AUTO_SHOW_RECOMMENDATIONS_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_PRODUCT_TRACKING_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_SURFACE_UPSELL", "SHOPPING_AUTO_SHOW_PRODUCT_TRACKING_BACK_IN_STOCK", "SHOPPING_AUTO_PRODUCT_TRACKING_EXP_PRICE_DROP", "SHOPPING_AUTO_PRODUCT_TRACKING_IMP_PRICE_DROP", "SHOPPING_AUTO_PRODUCT_TRACKING_OUT_OF_STOCK", "SHOPPING_AUTO_SHOW_CODEX_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_PERSONALIZED_CASHBACK_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_PRICE_HISTORY_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_ORGANIC_CASHBACK_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_GOODRX", "SHOPPING_AUTO_SHOW_SIDEPANE_CASHBACK_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_DISCOVER_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_REBATES_PDP", "SHOPPING_AUTO_SHOW_PRODUCT_BEST_COUPON_CONSENT", "SHOPPING_AUTO_SHOW_CAMPAIGN_PDP_NOTIFICATION", "SHOPPING_AUTO_SHOW_CAMPAIGN_AWARENESS_NOTIFICATION", "SHOPPING_AUTO_SHOW_SPB_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_PRICE_DROP_PLUS_COUPONS", "SHOPPING_AUTO_SHOW_SPB_NUDGE_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_ADD_SPB_TO_CART_MICRO_NOTIFICATION", "SHOPPING_AUTO_SHOW_CASHBACK_PDP_PLUS_COUPONS", "SHOPPING_AUTO_SHOW_PRICE_DROP_PLUS_CASHBACK", "SHOPPING_AUTO_SHOW_DISCOVER_NOTIFICATION", "SHOPPING_AUTO_SHOW_AMAZON_SEARCH_PC", "SHOPPING_AUTO_SHOW_COUPONS_BACKGROUND_AUTO_APPLY", "SHOPPING_AUTO_SHOW_PERSONALIZED_CASHBACK_ADDRESSBAR", "SHOPPING_AUTO_SHOW_TRAVEL_NOTIFICATION_CHEAPER_FLIGHTS", "SHOPPING_AUTO_SHOW_TRAVEL_NOTIFICATION_CHEAPER_HOTEL_ROOM", "SHOPPING_AUTO_SHOW_CJK_PRICE_DROP", "SHOPPING_AUTO_SHOW_CJK_COUPON_FOUND", "AUTOFILL_PASSWORD_NON_FUNCTIONAL_FLYOUTS", "76b926d6-3738-46bf-82d7-2ab896ddf70b.MM2UpSellPopup.Bubble", "e6723537-66ff-4f4e-ab56-a4cbaddf4e0f.MM2UpSellPopup.Bubble", "8ac719c5-140b-4bf2-a0b7-c71617f1f377.3662f1e2-66ae-464f-b690-e7e3dc4fc662.AutoOpen", "8ac719c5-140b-4bf2-a0b7-c71617f1f377.gaokao.Bubble", "c8ebd871-9f47-4a0d-abd3-c1c02b4f8f53.AutoOpen", "c8ebd871-9f47-4a0d-abd3-c1c02b4f8f53.2cfab14c-ebd6-4548-9401-30ab5afe5061.AutoOpen", "cd4688a9-e888-48ea-ad81-76193d56b1be.AutoOpen.PersistentChat", "cd4688a9-e888-48ea-ad81-76193d56b1be.AutoOpen.PDF", "cd4688a9-e888-48ea-ad81-76193d56b1be.8d3a928d-e911-40f0-9852-f63f6434dc7e.AutoOpen", "cd4688a9-e888-48ea-ad81-76193d56b1be.e06e75c1-a59a-4ab6-8361-e8b038e00a8c.AutoOpen", "cd4688a9-e888-48ea-ad81-76193d56b1be.5b853177-a0be-4237-bda0-4fce5cd165c2.AutoOpen", "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.AutoOpen", "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.c8ebbf64-e3b8-41d9-925f-4e3754151ff7.AutoOpen", "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.75a774c2-6075-ae4f-09f9-e5f5d9bef6e1.AutoOpen", "b7a8e9f2-6b0d-4c5b-ae7d-8a6e1f2c7a6f.a5e9f5e1-fcee-c07b-2c44-b707ded020a3.AutoOpen", "8682d0fa-50b3-4ece-aa5b-e0b33f9919e2.f5b8c725-cb2e-4c12-accd-73e500d88d47.AutoOpen", "bc25fcef-8964-4e72-8287-23e2b496c128.68b8a884-6e08-46e6-8a3b-7e06ffe48ecf.AutoOpen", "EdgeDownloadChromeInterceptDialog", "439642fc-998d-4a64-8bb6-940ecaf6b60b.AutoOpen", "694efa4f-a304-4214-aaf7-90444bc887f5.c1c025d9-a620-4f6b-bebb-eff0cf19a671.AutoOpen" ], + "ReserveApproved": { + "ExperienceIDs": [ "Nurturing.Global.Edge_SpawnNtpOptIn", "Nurturing.Global.Edge_SpawnNtpOptOut" ], + "SourceIDs": [ 3 ], + "TeamIDs": [ "Edge Consumer Content and Verticals" ] + }, + "ScenarioSuppressLists": { + }, + "SuppressedExperiences": [ ], + "TimeDelta": 5000000, + "baseConfigVersion": "40.0.1", + "configVersion": "40.0.1" +} diff --git a/.edge-profile/Default/commerce_subscription_db/LOCK b/.edge-profile/Default/commerce_subscription_db/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile/Default/commerce_subscription_db/LOG b/.edge-profile/Default/commerce_subscription_db/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile/Default/discount_infos_db/LOCK b/.edge-profile/Default/discount_infos_db/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile/Default/discount_infos_db/LOG b/.edge-profile/Default/discount_infos_db/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile/Default/discounts_db/LOCK b/.edge-profile/Default/discounts_db/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile/Default/discounts_db/LOG b/.edge-profile/Default/discounts_db/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile/Default/load_statistics.db b/.edge-profile/Default/load_statistics.db new file mode 100644 index 0000000..4410bda Binary files /dev/null and b/.edge-profile/Default/load_statistics.db differ diff --git a/.edge-profile/Default/load_statistics.db-shm b/.edge-profile/Default/load_statistics.db-shm new file mode 100644 index 0000000..dca454c Binary files /dev/null and b/.edge-profile/Default/load_statistics.db-shm differ diff --git a/.edge-profile/Default/load_statistics.db-wal b/.edge-profile/Default/load_statistics.db-wal new file mode 100644 index 0000000..dec4879 Binary files /dev/null and b/.edge-profile/Default/load_statistics.db-wal differ diff --git a/.edge-profile/Default/parcel_tracking_db/LOCK b/.edge-profile/Default/parcel_tracking_db/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile/Default/parcel_tracking_db/LOG b/.edge-profile/Default/parcel_tracking_db/LOG new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile/Default/shared_proto_db/CURRENT b/.edge-profile/Default/shared_proto_db/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile/Default/shared_proto_db/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile/Default/shared_proto_db/LOCK b/.edge-profile/Default/shared_proto_db/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile/Default/shared_proto_db/LOG b/.edge-profile/Default/shared_proto_db/LOG new file mode 100644 index 0000000..e2bb007 --- /dev/null +++ b/.edge-profile/Default/shared_proto_db/LOG @@ -0,0 +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 diff --git a/.edge-profile/Default/shared_proto_db/MANIFEST-000001 b/.edge-profile/Default/shared_proto_db/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile/Default/shared_proto_db/MANIFEST-000001 differ diff --git a/.edge-profile/Default/shared_proto_db/metadata/CURRENT b/.edge-profile/Default/shared_proto_db/metadata/CURRENT new file mode 100644 index 0000000..7ed683d --- /dev/null +++ b/.edge-profile/Default/shared_proto_db/metadata/CURRENT @@ -0,0 +1 @@ +MANIFEST-000001 diff --git a/.edge-profile/Default/shared_proto_db/metadata/LOCK b/.edge-profile/Default/shared_proto_db/metadata/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile/Default/shared_proto_db/metadata/LOG b/.edge-profile/Default/shared_proto_db/metadata/LOG new file mode 100644 index 0000000..778d137 --- /dev/null +++ b/.edge-profile/Default/shared_proto_db/metadata/LOG @@ -0,0 +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 diff --git a/.edge-profile/Default/shared_proto_db/metadata/MANIFEST-000001 b/.edge-profile/Default/shared_proto_db/metadata/MANIFEST-000001 new file mode 100644 index 0000000..18e5cab Binary files /dev/null and b/.edge-profile/Default/shared_proto_db/metadata/MANIFEST-000001 differ diff --git a/.edge-profile/FirstLaunchAfterInstallation b/.edge-profile/FirstLaunchAfterInstallation new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile/Last Version b/.edge-profile/Last Version new file mode 100644 index 0000000..a887bff --- /dev/null +++ b/.edge-profile/Last Version @@ -0,0 +1 @@ +146.0.3856.72 \ No newline at end of file diff --git a/.edge-profile/Local State b/.edge-profile/Local State new file mode 100644 index 0000000..b94e89a --- /dev/null +++ b/.edge-profile/Local State @@ -0,0 +1 @@ +{"accessibility":{"captions":{"common_models_path":"","soda_translation_binary_path":""}},"autofill":{"ablation_seed":"pzhaO2zDTGs="},"breadcrumbs":{"enabled":false,"enabled_time":"13418947342945871"},"default_browser":{"browser_name_enum":0},"edge":{"app_user_model_id":"MSEdge","perf_center":{"efficiency_mode_v2_is_active":false,"perf_game_mode":true,"performance_mode":3,"performance_mode_is_on":false},"retrigger_features":[],"tab_stabs":{"closed_without_unfreeze_never_unfrozen":0,"closed_without_unfreeze_previously_unfrozen":0,"discard_without_unfreeze_never_unfrozen":0,"discard_without_unfreeze_previously_unfrozen":0},"tab_stats":{"frozen_daily":0,"unfrozen_daily":0}},"edge_copilot_mode_enabled_state":{"Default":{"enabled":false,"last_set":"13418947398370226"}},"fre":{"has_first_visible_browser_session_completed":true,"oem_bookmarks_set":true},"hardware_acceleration_mode_previous":true,"host_package_checked_on_browser_version":"146.0.7680.154","ie_react":{"has_done_one_time_ie_import":true},"legacy":{"profile":{"name":{"migrated":true}}},"local":{"password_hash_data_list":[]},"metrics":{"client_id_hash_key_created":true},"optimization_guide":{"model_execution":{"last_usage_by_feature":{}},"model_store_metadata":{},"on_device":{"last_version":"146.0.3856.72","model_crash_count":0}},"os_crypt":{"audit_enabled":true,"encrypted_key":"RFBBUEkBAAAA0Iyd3wEV0RGMegDAT8KX6wEAAAAn89AMc7fOSbvGLGpOq+9IEAAAAB4AAABNAGkAYwByAG8AcwBvAGYAdAAgAEUAZABnAGUAAAAQZgAAAAEAACAAAAA8XOIbzOLcxBqqQYaqJ1VK2Jsy5cVzB5H4STxvgmkNFAAAAAAOgAAAAAIAACAAAAA4cmUzq9C8AlkqdhUMQmhwlHBh2c0jMHI+gpS0wbDUGTAAAADhkVWRwo/wW7tJ/6yE3cxQsWIyW0yEZTogj5IWhaqbnBWewQdbXM5X/GnouymVFzJAAAAAmFOxong/szeCRycWaOOi5n5DyRGdTqKF4BwtCFJGVFq4orbYlahIJkDSMH4OGGeJOON1h1PRe74KmxJkEv4GEg=="},"performance_intervention":{"last_daily_sample":"13418947399840027"},"phoenix":{"user_laf_toggle_state_static":2},"policy":{"last_statistics_update":"13418947342939075"},"profile":{"info_cache":{"Default":{"active_time":1774473799.676001,"avatar_icon":"chrome://theme/IDR_PROFILE_AVATAR_20","background_apps":false,"edge_account_cid":"","edge_account_environment":0,"edge_account_environment_string":"","edge_account_first_name":"","edge_account_last_name":"","edge_account_oid":"","edge_account_sovereignty":0,"edge_account_tenant_id":"","edge_account_type":0,"edge_create_profile_shortcut":false,"edge_profile_can_be_deleted":true,"edge_profile_can_be_edited":true,"edge_test_on_premises":false,"edge_wam_aad_for_app_account_type":0,"force_signin_profile_locked":false,"gaia_id":"","is_consented_primary_account":false,"is_ephemeral":false,"is_using_default_avatar":true,"is_using_default_name":true,"managed_user_id":"","metrics_bucket_index":1,"name":"Profile 1","signin.with_credential_provider":false,"user_name":""}},"last_active_profiles":["Default"],"metrics":{"next_bucket_index":2},"profile_counts_reported":"13418947342546127","profiles_order":["Default"]},"profile_network_context_service":{"http_cache_finch_experiment_groups":"None None None None"},"profiles":{"collect_potential_implicit_signin_data_started":true,"edge":{"guided_switch_pref":[],"implicit_signin":{"platform_error":1001,"primary_error":15,"secondary_error":22,"telemetry_result":0},"multiple_profiles_with_same_account":false},"edge_sso_info":{"aad_sso_algo_state":1,"first_profile_key":"Default","msa_first_profile_key":"Default","msa_sso_algo_state":1},"signin_last_seen_version":"146.0.3856.72","signin_last_updated_time":1774473798.537897},"sentinel_creation_time":"0","session_id_generator_last_value":"810072927","signin":{"active_accounts_last_emitted":"13418947342526527"},"startup_boost":{"last_browser_open_time":"13418947399205052"},"subresource_filter":{"ruleset_version":{"checksum":0,"content":"","format":0}},"tab_stats":{"discards_expired":0,"discards_external":0,"discards_proactive":0,"discards_urgent":0,"last_daily_sample":"13418947342895966","max_tabs_per_window":1,"reloads_expired":0,"reloads_external":0,"reloads_urgent":0,"total_tab_count_max":1,"window_count_max":1},"telemetry_client":{"governance":{"last_dma_change_date":"13418947342873656","last_known_cps":2048},"host_telclient_path":"QzpcUHJvZ3JhbSBGaWxlcyAoeDg2KVxNaWNyb3NvZnRcRWRnZVxBcHBsaWNhdGlvblwxNDYuMC4zODU2LjcyXHRlbGNsaWVudC5kbGw=","install_source_name":"windows","os_integration_level":5,"sample_id":30728030,"updater_version":"1.3.225.7","windows_update_applied":false},"ukm":{"persisted_logs":[]},"uninstall_metrics":{"installation_date2":"1774473738"},"user_experience_metrics":{"client_id2":"d1f43b7a-d12e-487b-bb74-9f6749a74b67","diagnostics":{"last_data_collection_level_on_launch":1},"initial_logs2":[{"count_id":"","data":"H4sIAAAAAAAAAONqYOP8VxQkv2ZlUqYAg9QjVo65Sz+dZRMSMDQx0zPQM7YwNdMzN9I1M5FgUGJNzdMNDdaS4OIKz8xLyS8vVvALEeIyNNAz0DMyMzIwMMrlYquwMIs3MxFoj5doaOi52PtfXknYI0DBJ7GgJL9AwdBcN6nSoKKiQoPRYAGbxQ0WJy4OBgEGKQYjBiuGVAaGBvssCS4e99S80sy8VM+8ktQcgVe9ChIcCowaDE2MDF2MDKsYoTZsYGT04uK9WeF3VjQu/9INLy7eHOvdVjC2w+SCjTC28BMGQxg7Usl2HYwtzi6yEq7m1uwYGHvCy9X2MLazdWIemB3AksTi6ecUkcUBcrAFgwNDA+OFmRPPsc1gZPjBuFG5gek/DDB2MDGuYNppt4lJRoDBZrK5i8srS+67i9Rdmj3j+bgPvBAKN/P5zBv7kelz6s/jmyRn7Dxl94aJiwVkrhCHEgsHkwCTBqMSEweTERsHgxKDFoMVN8fn///ffwcb7qQhxGmoZ6xnZGSqZy7BqsCgxReUmu6dWumXX+KWX5qXYsReDomcICYOhqg/jJxHFTYUZQQGOggum31EYcOqcAdJBjCIxM34YI/OYGBAF8GjnTwG3ApMZ+BxmAluxZEOVUwcjE2MTBIMXYxMHIyrGJm4GDYwMjxgZHrByHjSjhFqrdZyNq6Jo7lgNBeMqFxgxM85yS9Lt+RD1wYBASkmAUH0bCEwkU2CQYmHg1GAQYJBgUGDwYLBqns0m4xmk5GdTRAZJGs0N4zmhtHcAHUBAATV1/dJDAAA","hash":"nTZeiTTIPfiJePdajb+x2ot2vQA=","signature":"08+3lgwTqRZecrv4v+hBqLkDvGZgpo0Kk++5zHNVv7o=","timestamp":"1774473797"}],"last_seen":{"CrashpadMetrics":"0"},"limited_entropy_randomization_source":"984867839ADFD2F2CBDE11195868EC0C","log_finalized_record_id":1,"log_record_id":3,"low_entropy_source3":4529,"ongoing_logs2":[],"payload_counter":1,"pseudo_low_entropy_source":7993,"reporting_enabled":false,"session_id":1,"stability":{"browser_last_live_timestamp":"13418947394843745","saved_system_profile":"CJ2l8s0GEhAxNDYuMC4zODU2LjcyLTY0GAAiBWVuLVVTKhgKCldpbmRvd3MgTlQSCjEwLjAuMjYyMDAybQoGeDg2XzY0EIdfGICAjNGN/x8iE0hQIExhcHRvcCAxNy1ieTB4eHgoATCgBjjYBEIKCAAQABoAMgA6AGUAAIA/ahgKDEdlbnVpbmVJbnRlbBDqjSAYCCABKACCAQCKAQCqAQZ4ODZfNjSwAQFKCg3ZeE7NFV5v0thKCg1sO7s6FV5v0thKCg1Ak3CxFV5v0thKCg0T5AAxFV5v0thKCg1ZIj2uFV5v0thKCg0XBxSpFV5v0thKCg0T2ptcFV5v0thKCg2Q6as/FV5v0thKCg1DO2FuFV5v0thQBGIESU5CWGoICAAQADgAQACAAdCZkc4GmAEA+AGxI4AC////////////AYgCAagCuT6yAiQLj70v8rfnWhAAPJM3RETqOQvdoidEg0lfDgvA6BJXNkzzDV3xAkANf84ERnXDyj7nAgoECAAQABIIIgQIAhACKAEiAggCMgYIACIAKgA6Cwjz///v9/////8BQigSCTEuMy4yMjUuNxgFIAAqDlJlZ0tleU5vdEZvdW5kMgd3aW5kb3dzUgIIAFr8AQnFILByaFFRQBGmm8QgsKpXQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAADwPxkAAAAAAADwPxkAAAAAAAAAABkAAAAAAADwPxkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAABZQBkAAAAAAAAAABkAAAAAAABZQBkAAAAAAADwPxkAAAAAAABZQBkAAAAAAADwPxkAAAAAAADwPxkAAAAAAAA0QBkAAAAAAADwPxkAAAAAAABZQBkAAAAAAABZQHoCCAGCAQIYAKoBAgoAsAEA","saved_system_profile_hash":"8E7DD55FAAC8705CA41B102CA6D0341F3D846056","stats_buildtime":"1773965981","stats_version":"146.0.3856.72-64","system_crash_count":0},"unsent_log_metadata":{"initial_logs":{"sent_samples_count":0,"unsent_persisted_size_in_kb":1,"unsent_samples_count":1},"ongoing_logs":{"sent_samples_count":0,"unsent_persisted_size_in_kb":0,"unsent_samples_count":0}}},"variations_crash_streak":1,"variations_google_groups":{"Default":[]},"was":{"restarted":false}} \ No newline at end of file diff --git a/.edge-profile/Nurturing/campaign_history b/.edge-profile/Nurturing/campaign_history new file mode 100644 index 0000000..eab8517 Binary files /dev/null and b/.edge-profile/Nurturing/campaign_history differ diff --git a/.edge-profile/Nurturing/campaign_history-journal b/.edge-profile/Nurturing/campaign_history-journal new file mode 100644 index 0000000..e69de29 diff --git a/.edge-profile/ShaderCache/data_0 b/.edge-profile/ShaderCache/data_0 new file mode 100644 index 0000000..d76fb77 Binary files /dev/null and b/.edge-profile/ShaderCache/data_0 differ diff --git a/.edge-profile/ShaderCache/data_1 b/.edge-profile/ShaderCache/data_1 new file mode 100644 index 0000000..035d06d Binary files /dev/null and b/.edge-profile/ShaderCache/data_1 differ diff --git a/.edge-profile/ShaderCache/data_2 b/.edge-profile/ShaderCache/data_2 new file mode 100644 index 0000000..c7e2eb9 Binary files /dev/null and b/.edge-profile/ShaderCache/data_2 differ diff --git a/.edge-profile/ShaderCache/data_3 b/.edge-profile/ShaderCache/data_3 new file mode 100644 index 0000000..5eec973 Binary files /dev/null and b/.edge-profile/ShaderCache/data_3 differ diff --git a/.edge-profile/ShaderCache/index b/.edge-profile/ShaderCache/index new file mode 100644 index 0000000..5ffda23 Binary files /dev/null and b/.edge-profile/ShaderCache/index differ diff --git a/.edge-profile/SmartScreen/RemoteData/customSettings b/.edge-profile/SmartScreen/RemoteData/customSettings new file mode 100644 index 0000000..997f02d --- /dev/null +++ b/.edge-profile/SmartScreen/RemoteData/customSettings @@ -0,0 +1 @@ +customSettings_F95BA787499AB4FA9EFFF472CE383A14 \ No newline at end of file diff --git a/.edge-profile/SmartScreen/RemoteData/customSettings_F95BA787499AB4FA9EFFF472CE383A14 b/.edge-profile/SmartScreen/RemoteData/customSettings_F95BA787499AB4FA9EFFF472CE383A14 new file mode 100644 index 0000000..ae2fefa --- /dev/null +++ b/.edge-profile/SmartScreen/RemoteData/customSettings_F95BA787499AB4FA9EFFF472CE383A14 @@ -0,0 +1 @@ +{"forceServiceDetermination":false} \ No newline at end of file diff --git a/.edge-profile/Variations b/.edge-profile/Variations new file mode 100644 index 0000000..5d75f57 --- /dev/null +++ b/.edge-profile/Variations @@ -0,0 +1 @@ +{"user_experience_metrics.stability.exited_cleanly":false,"variations_crash_streak":1} \ No newline at end of file diff --git a/.edge-profile/component_crx_cache/metadata.json b/.edge-profile/component_crx_cache/metadata.json new file mode 100644 index 0000000..4d15610 --- /dev/null +++ b/.edge-profile/component_crx_cache/metadata.json @@ -0,0 +1 @@ +{"hashes":{}} \ No newline at end of file diff --git a/.edge-profile/extensions_crx_cache/metadata.json b/.edge-profile/extensions_crx_cache/metadata.json new file mode 100644 index 0000000..4d15610 --- /dev/null +++ b/.edge-profile/extensions_crx_cache/metadata.json @@ -0,0 +1 @@ +{"hashes":{}} \ No newline at end of file diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..adcef44 --- /dev/null +++ b/.env.example @@ -0,0 +1,2 @@ + REVENUECAT_WEBHOOK_SECRET = greenlens-rc-webhook-2026 + REVENUECAT_PRO_ENTITLEMENT_ID = pro \ No newline at end of file diff --git a/.gitignore b/.gitignore index e18afea..0e9e2c8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,34 +1,34 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* -lerna-debug.log* - -node_modules -dist -dist-ssr -*.local -server/.env -server/data/*.sqlite -server/data/*.sqlite-* - -# Editor directories and files -.vscode/* -!.vscode/extensions.json -.idea -.DS_Store -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? - -# Expo -.expo/ - -# Claude / Agents (symlinks incompatible with EAS Build on Windows) -.agents/ -.claude/ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local +server/.env +server/data/*.sqlite +server/data/*.sqlite-* + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +# Expo +.expo/ + +# Claude / Agents (symlinks incompatible with EAS Build on Windows) +.agents/ +.claude/ diff --git a/AGENTS.md b/AGENTS.md index cca9329..56509fc 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,307 +1,307 @@ -# Universal AI Coding Agent Workflow (Codex / Gemini / Claude) - -## Workflow Orchestration - -### 1. Plan Mode Default -- Enter planning mode for ANY non-trivial task (3+ steps or architecture decisions) -- Analyze the codebase before making changes -- Break problems into clear subtasks -- Produce an implementation plan before writing code -- If assumptions are uncertain, inspect files or run tools first -- Prefer incremental progress over large rewrites - -Plan format: - -PLAN -1. Understand the task -2. Identify affected files -3. Design the implementation -4. Implement step-by-step -5. Verify results - - ---- - -# Multi-Agent Strategy - -### 2. Agent Decomposition - -Use specialized agents for complex work. - -Core roles: - -- Orchestrator Agent -- Research Agent -- Implementation Agent -- Test Agent -- Code Review Agent -- Debug Agent -- Documentation Agent - -Rules: -- One responsibility per agent -- Prefer parallel execution -- Agents should operate on independent files when possible -- The orchestrator coordinates execution - - ---- - -# Agent Responsibilities - -### Orchestrator Agent -- analyzes the user request -- creates task list -- assigns tasks to agents -- merges results - -### Research Agent -- scans repository -- searches dependencies -- analyzes architecture -- produces context summary - -### Implementation Agent -- writes code -- edits files -- follows project conventions -- implements features - -### Test Agent -- writes tests -- verifies functionality -- checks edge cases - -### Code Review Agent -- reviews diffs -- checks maintainability -- suggests improvements - -### Debug Agent -- analyzes logs -- identifies root causes -- implements fixes - -### Documentation Agent -- updates docs -- writes README sections -- explains new features - - ---- - -# Execution Pipeline - -### 3. Execution Phases - -PHASE 1 — Discovery -- explore repository -- load relevant files -- understand architecture - -PHASE 2 — Planning -- generate implementation plan -- break plan into tasks - -PHASE 3 — Task Creation - -Create tasks like: - -[ ] analyze codebase -[ ] implement feature -[ ] add tests -[ ] review code -[ ] update documentation - -PHASE 4 — Implementation -- execute tasks sequentially or in parallel -- commit progress - -PHASE 5 — Verification -- run tests -- check logs -- verify feature works - -PHASE 6 — Review -- review code quality -- refactor if necessary - -PHASE 7 — Documentation -- document changes - - ---- - -# Verification System - -### 4. Verification Before Done - -Never mark a task complete without proof. - -Checks: -- code compiles -- feature works -- tests pass -- no new errors introduced - -Ask: - -"Would a senior engineer approve this implementation?" - - ---- - -# Autonomous Debugging - -### 5. Autonomous Bug Fixing - -When encountering a bug: - -1. analyze error message -2. inspect stack trace -3. identify root cause -4. implement fix -5. verify with tests - -Rules: -- Never apply random fixes -- Always understand the root cause first - - ---- - -# Context Management - -### 6. Context Awareness - -Before implementing anything: - -- load relevant files -- inspect dependencies -- understand architecture -- read configuration files - -Always maintain awareness of: - -- system architecture -- data flow -- dependencies - - ---- - -# Memory System - -### 7. Persistent Memory - -Store long-term knowledge in: - -memory/ -- project_summary.md -- architecture.md -- lessons.md -- coding_standards.md - -This prevents repeated mistakes. - - ---- - -# Learning Loop - -### 8. Self-Improvement - -After errors or corrections: - -Update: - -tasks/lessons.md - -Include: -- mistake pattern -- root cause -- prevention rule - -Example: - -Lesson: -Always validate API responses before processing them. - - ---- - -# Safety Rules - -### 9. Safety - -Never perform dangerous actions automatically. - -Rules: - -- never delete files without confirmation -- avoid modifying production configuration automatically -- create backups before large refactors -- avoid irreversible operations - - ---- - -# Iteration Control - -### 10. Infinite Loop Protection - -If the same error happens more than 3 times: - -STOP - -- re-evaluate the strategy -- re-plan the solution -- choose a different debugging approach - - ---- - -# Core Engineering Principles - -### Simplicity First -Prefer the simplest solution that works. - -### Root Cause Fixes -Always fix the underlying problem, not symptoms. - -### Minimal Impact -Touch the smallest amount of code possible. - -### Maintainability -Code should remain readable and maintainable. - - ---- - -# Final Rule - -Before delivering a solution ask: - -Is this solution correct, maintainable, and verifiable? - -If not: - -Refine it before presenting it. - - ---- - -# Recommended File Usage - -You can place this workflow in one of the following files: - -AGENT_WORKFLOW.md -CLAUDE.md -AGENTS.md - -This allows it to be used by: - -- Claude Code Agent Teams -- Codex CLI -- Gemini Code Assist +# Universal AI Coding Agent Workflow (Codex / Gemini / Claude) + +## Workflow Orchestration + +### 1. Plan Mode Default +- Enter planning mode for ANY non-trivial task (3+ steps or architecture decisions) +- Analyze the codebase before making changes +- Break problems into clear subtasks +- Produce an implementation plan before writing code +- If assumptions are uncertain, inspect files or run tools first +- Prefer incremental progress over large rewrites + +Plan format: + +PLAN +1. Understand the task +2. Identify affected files +3. Design the implementation +4. Implement step-by-step +5. Verify results + + +--- + +# Multi-Agent Strategy + +### 2. Agent Decomposition + +Use specialized agents for complex work. + +Core roles: + +- Orchestrator Agent +- Research Agent +- Implementation Agent +- Test Agent +- Code Review Agent +- Debug Agent +- Documentation Agent + +Rules: +- One responsibility per agent +- Prefer parallel execution +- Agents should operate on independent files when possible +- The orchestrator coordinates execution + + +--- + +# Agent Responsibilities + +### Orchestrator Agent +- analyzes the user request +- creates task list +- assigns tasks to agents +- merges results + +### Research Agent +- scans repository +- searches dependencies +- analyzes architecture +- produces context summary + +### Implementation Agent +- writes code +- edits files +- follows project conventions +- implements features + +### Test Agent +- writes tests +- verifies functionality +- checks edge cases + +### Code Review Agent +- reviews diffs +- checks maintainability +- suggests improvements + +### Debug Agent +- analyzes logs +- identifies root causes +- implements fixes + +### Documentation Agent +- updates docs +- writes README sections +- explains new features + + +--- + +# Execution Pipeline + +### 3. Execution Phases + +PHASE 1 — Discovery +- explore repository +- load relevant files +- understand architecture + +PHASE 2 — Planning +- generate implementation plan +- break plan into tasks + +PHASE 3 — Task Creation + +Create tasks like: + +[ ] analyze codebase +[ ] implement feature +[ ] add tests +[ ] review code +[ ] update documentation + +PHASE 4 — Implementation +- execute tasks sequentially or in parallel +- commit progress + +PHASE 5 — Verification +- run tests +- check logs +- verify feature works + +PHASE 6 — Review +- review code quality +- refactor if necessary + +PHASE 7 — Documentation +- document changes + + +--- + +# Verification System + +### 4. Verification Before Done + +Never mark a task complete without proof. + +Checks: +- code compiles +- feature works +- tests pass +- no new errors introduced + +Ask: + +"Would a senior engineer approve this implementation?" + + +--- + +# Autonomous Debugging + +### 5. Autonomous Bug Fixing + +When encountering a bug: + +1. analyze error message +2. inspect stack trace +3. identify root cause +4. implement fix +5. verify with tests + +Rules: +- Never apply random fixes +- Always understand the root cause first + + +--- + +# Context Management + +### 6. Context Awareness + +Before implementing anything: + +- load relevant files +- inspect dependencies +- understand architecture +- read configuration files + +Always maintain awareness of: + +- system architecture +- data flow +- dependencies + + +--- + +# Memory System + +### 7. Persistent Memory + +Store long-term knowledge in: + +memory/ +- project_summary.md +- architecture.md +- lessons.md +- coding_standards.md + +This prevents repeated mistakes. + + +--- + +# Learning Loop + +### 8. Self-Improvement + +After errors or corrections: + +Update: + +tasks/lessons.md + +Include: +- mistake pattern +- root cause +- prevention rule + +Example: + +Lesson: +Always validate API responses before processing them. + + +--- + +# Safety Rules + +### 9. Safety + +Never perform dangerous actions automatically. + +Rules: + +- never delete files without confirmation +- avoid modifying production configuration automatically +- create backups before large refactors +- avoid irreversible operations + + +--- + +# Iteration Control + +### 10. Infinite Loop Protection + +If the same error happens more than 3 times: + +STOP + +- re-evaluate the strategy +- re-plan the solution +- choose a different debugging approach + + +--- + +# Core Engineering Principles + +### Simplicity First +Prefer the simplest solution that works. + +### Root Cause Fixes +Always fix the underlying problem, not symptoms. + +### Minimal Impact +Touch the smallest amount of code possible. + +### Maintainability +Code should remain readable and maintainable. + + +--- + +# Final Rule + +Before delivering a solution ask: + +Is this solution correct, maintainable, and verifiable? + +If not: + +Refine it before presenting it. + + +--- + +# Recommended File Usage + +You can place this workflow in one of the following files: + +AGENT_WORKFLOW.md +CLAUDE.md +AGENTS.md + +This allows it to be used by: + +- Claude Code Agent Teams +- Codex CLI +- Gemini Code Assist - Cursor Agents \ No newline at end of file diff --git a/AKTUELLE_PFLANZEN.md b/AKTUELLE_PFLANZEN.md index 317243c..5a835cd 100644 --- a/AKTUELLE_PFLANZEN.md +++ b/AKTUELLE_PFLANZEN.md @@ -1,588 +1,588 @@ -# GreenLens — Launch Strategy - -*Last updated: 2026-03-01* - ---- - -## Überblick - -GreenLens ist eine B2C Mobile App (iOS & Android) mit Freemium-Modell. Ziel: maximale Download-Zahlen, schnelle Aktivierung, Conversion zu GreenLens Pro. - -**Launch-Ziel:** App Store Präsenz aufbauen → Early Adopter-Community wachsen lassen → viralen Loop durch "Shazam für Pflanzen"-Effekt auslösen. - ---- - -## Phase 1: Soft Launch (jetzt) - -**Ziel:** Erste echte Nutzer, erster Feedback-Loop, App Store Rating aufbauen. - -### Aktionen - -- [ ] App Store Listing optimieren: klare Tagline, Screenshots mit Scan-Demo, kurzes Preview-Video -- [ ] Google Play Listing parallel aufsetzen -- [ ] Friends & Family + Pflanzen-Enthusiasten aus dem persönlichen Netzwerk einladen -- [ ] Feedback aktiv einsammeln: Was klappt nicht? Was fehlt? -- [ ] Ziel: 10–20 ehrliche App Store Reviews als Social Proof-Fundament - -### Owned Channel aufbauen - -- **E-Mail-Liste** starten — In-App Opt-in: "Neuigkeiten & Pflanzen-Tipps" -- Einfache Landing Page mit E-Mail Capture: greenlns.app (oder Subdomain) - ---- - -## Phase 2: Beta Launch (Monat 1–2) - -**Ziel:** Buzz erzeugen, Warteliste aufbauen, erste Presse/Creator-Erwähnungen sichern. - -### Owned Channels - -- **Blog / Content:** 2–3 SEO-Artikel zu Top-Suchintentionen: - - "Welche Pflanze ist das?" → Scan-Feature demonstrieren - - "Pflanze geht ein — was tun?" → Health Diagnosis Feature - - "Monstera pflegen" → Personalized Care Plan Feature -- **E-Mail:** Wöchentlicher "Pflanzen-Tipp" an Liste → niedrige Hürde für Signup - -### Rented Channels (1–2 Fokus-Plattformen) - -**Instagram / TikTok** (primär): -- Format: Vorher/Nachher-Videos — "Meine Pflanze stirbt" → Scan → Diagnose → Rettung -- Format: "Rate the plant" — Community errät Pflanzennamen, App gibt Auflösung -- Jeder Post endet mit CTA: Link in Bio → App Store - -**Reddit** (sekundär): -- Aktiv in r/houseplants, r/plantclinic, r/IndoorGarden -- Wert zuerst liefern (Pflanzenfragen beantworten), dann App organisch erwähnen -- Kein Spam — Community zuerst - -### Borrowed Channels - -| Zielgruppe | Kanal | Ansatz | -|------------|-------|--------| -| Pflanzen-YouTuber (DE) | YouTube | Kostenloses Pro-Abo + persönliche Nachricht; kein bezahlter Deal | -| Plant-Influencer Instagram | Instagram | Micro-Influencer (10k–100k), nischig, hohe Engagement-Rate | -| Garten-/Pflanzenpodcasts | Podcasts | Pitch: "Wir lösen das Problem X für eure Hörer" | -| Pflanzen-Newsletter | Newsletter | Sponsored Feature oder Co-Marketing | - -**Outreach-Vorlage:** -> "Hey [Name], ich bin Gründer von GreenLens — einer App, die Pflanzen per KI in Sekunden identifiziert und personalisierte Pflegepläne erstellt. Ich schicke dir gerne einen Pro-Zugang, einfach um zu sehen ob du's nützlich findest. Kein Deal, kein Druck." - ---- - -## Phase 3: Full Launch — Product Hunt (Monat 2–3) - -**Ziel:** Tech Early Adopters erreichen, Credibility-Boost, Backlinks, internationale Sichtbarkeit. - -### Vorbereitung (4 Wochen vorher) - -- [ ] Product Hunt Profil anlegen und aktiv werden (kommentieren, voten) -- [ ] Listing vorbereiten: - - **Tagline:** "Scan any plant. Get instant ID + personalized care plan." - - **Kurzbeschreibung:** Das Shazam für Pflanzen — powered by Botanical Intelligence - - Screenshots: Hero-Screen, Scan-Flow, Health Diagnosis, My Garden - - Demo-Video: 60 Sekunden, zeigt kompletten Scan-bis-Pflege-Flow -- [ ] Hunter suchen — jemanden mit Reichweite auf Product Hunt -- [ ] Unterstützer mobilisieren: bestehende E-Mail-Liste, Freunde, Investoren - -### Launch Day - -- [ ] Um 00:01 PST live schalten -- [ ] Ganztägig alle Kommentare beantworten (in Englisch) -- [ ] Announcement-E-Mail an gesamte Liste senden -- [ ] Social Posts auf allen Kanälen -- [ ] Team bereit für Support und Engagement - -### Launch Day E-Mail - -**Betreff:** "Wir sind live auf Product Hunt 🌿" - -> Hey [Name], -> -> Heute ist der Tag — GreenLens ist live auf Product Hunt! -> -> Wenn dir die App gefällt, würde ein Upvote und ein Kommentar wirklich helfen. Es dauert 30 Sekunden: -> -> [Zum Product Hunt Listing →] -> -> Danke, dass du von Anfang an dabei warst. -> -> — [Gründer Name] - ---- - -## Phase 4: Post-Launch Momentum (Monat 3+) - -### Sofortmaßnahmen nach Launch - -- [ ] Onboarding-E-Mail-Sequenz aktivieren (→ `/email-sequence` Skill nutzen) -- [ ] App Store Reviews aktiv einsammeln: In-App-Prompt nach erstem erfolgreichen Scan -- [ ] Vergleichsseiten erstellen: "GreenLens vs PictureThis", "GreenLens vs PlantNet" -- [ ] Launch in nächstem E-Mail-Roundup erwähnen - -### Laufende Launch-Momente (alle 4–6 Wochen) - -Jedes neue Feature ist ein eigener Mini-Launch: - -| Update-Typ | Marketing-Aufwand | -|------------|------------------| -| Neues Major Feature (z.B. Offline-Modus) | E-Mail + Social + In-App + Blog | -| Neue Pflanzenarten im Katalog | Social Post + Changelog | -| UI-Verbesserung | In-App-Banner | -| Bug Fix | Changelog (signalisiert aktive Entwicklung) | - ---- - -## ORB-Kanal-Übersicht für GreenLens - -### Owned (aufbauen, Priorität 1) -| Kanal | Zweck | Ziel | -|-------|-------|------| -| E-Mail-Liste | Direkter Draht zu Nutzern | 1.000 Subscriber in Monat 3 | -| Blog (SEO) | Organischer Traffic via Pflanzenfragen | 5k Visits/Monat in Monat 6 | - -### Rented (nutzen, nicht abhängig sein) -| Kanal | Format | Ziel | -|-------|--------|------| -| Instagram / TikTok | Scan-Videos, Pflanzen-Content | 5k Follower in Monat 6 | -| Reddit | Community-Wert, organische Erwähnungen | Laufend | -| App Store / Play Store | ASO-optimiertes Listing | Top 10 in "Plant" Kategorie | - -### Borrowed (aktiv angehen) -| Kanal | Kontakt-Ziel | Timeline | -|-------|-------------|----------| -| 3–5 DE Plant-YouTuber | Pro-Zugang + persönliche Nachricht | Monat 1 | -| 10 Micro-Influencer Instagram | Kooperation oder Affiliate | Monat 2 | -| 2–3 Garten-Podcasts | Interview-Pitch | Monat 2–3 | - ---- - -## Viraler Loop - -Das Kernprodukt hat natürliches Sharing-Potenzial: - -``` -Nutzer scannt Pflanze → beeindruckendes Ergebnis → -Screenshot/Video teilt sich leicht → -"Was ist das für eine App?" → neuer Download -``` - -**Fördern durch:** -- Share-Button direkt nach dem Scan-Ergebnis ("Zeig deinen Freunden, was das ist") -- "My Garden" shareable machen — schöner Export/Share-Screen -- Refer-a-Friend: 1 Monat Pro gratis für jeden eingeladenen Nutzer der sich anmeldet - ---- - -## Launch Checklist - -### Pre-Launch -- [ ] App Store & Play Store Listing optimiert (Screenshots, Video, Beschreibung) -- [ ] Landing Page mit E-Mail Capture live -- [ ] E-Mail-Liste gestartet -- [ ] Instagram/TikTok Profil aktiv -- [ ] 5 Outreach-E-Mails an Plant-Creator raus -- [ ] Product Hunt Listing vorbereitet -- [ ] Analytics/Tracking in der App aktiv (Onboarding-Funnel, Scan-Events) - -### Launch Day -- [ ] Product Hunt live -- [ ] Announcement E-Mail an Liste -- [ ] Social Posts -- [ ] Team verfügbar für Comments & Support - -### Post-Launch -- [ ] Onboarding-E-Mail-Sequenz läuft -- [ ] In-App Review-Prompt nach erstem Scan -- [ ] Vergleichsseiten live -- [ ] Nächster Feature-Launch geplant - ---- - -## Metriken - -| Metric | Ziel Monat 1 | Ziel Monat 3 | Ziel Monat 6 | -|--------|-------------|-------------|-------------| -| App Downloads | 500 | 5.000 | 25.000 | -| E-Mail-Liste | 200 | 1.000 | 5.000 | -| App Store Rating | 4.0+ | 4.3+ | 4.5+ | -| Pro Conversion | — | 3–5% | 5–8% | -| Product Hunt | — | Launch geplant | Ergebnis | - ---- - ---- - -# GreenLens — Onboarding E-Mail-Sequenz - -*Ziel: Nutzer von erstem Download bis zum Pro-Upgrade aktivieren.* - ---- - -## Sequenz-Übersicht - -| # | Timing | Ziel | Typ | -|---|--------|------|-----| -| 1 | Sofort nach Signup | Willkommen + ersten Scan triggern | Aktivierung | -| 2 | Tag 1 (kein Scan) | Erinnerung + Hemmschwelle senken | Aktivierung | -| 3 | Tag 3 | "My Garden" Feature einführen | Feature-Education | -| 4 | Tag 7 | Health Diagnosis vorstellen | Feature-Education | -| 5 | Tag 10 | Social Proof + Pro-Teaser | Conversion-Vorbereitung | -| 6 | Tag 14 | Pro-Upgrade Angebot | Conversion | -| 7 | Tag 21 (kein Upgrade) | Letzter Pro-Nudge + Wert-Recap | Conversion | -| 8 | Tag 30 (inaktiv) | Re-Engagement | Retention | - ---- - -## E-Mail 1 — Willkommen (Sofort nach Signup) - -**Betreff:** "Willkommen im Urban Jungle 🌿" -**Von:** [Gründer Vorname] von GreenLens - -> Hey [Name], -> -> schön, dass du dabei bist! -> -> GreenLens wurde gebaut für alle, die ihre Pflanzen lieben — aber manchmal nicht wissen, was ihnen fehlt. Das ändert sich jetzt. -> -> **Dein erster Schritt:** -> Fotografiere eine Pflanze in deiner Nähe. Irgendeine. Schau was passiert. -> -> [Jetzt erste Pflanze scannen →] -> -> Über 20.000 Arten erkannt — in unter einer Sekunde. -> -> Viel Spaß, -> [Name] -> GreenLens - -**Technische Details:** -- Trigger: E-Mail-Signup oder App-Download -- Ziel-Aktion: Erster Scan -- Ton: Warm, persönlich, keine Feature-Liste - ---- - -## E-Mail 2 — Erinnerung Tag 1 (nur wenn kein Scan) - -**Betreff:** "Hast du schon eine Pflanze in der Nähe? 🪴" - -> Hey [Name], -> -> gestern hast du dich bei GreenLens angemeldet — aber noch keine Pflanze gescannt. -> -> Kein Druck. Aber falls du kurz in der Nähe einer Pflanze bist: -> -> Öffne die App → Kamera → Tippen. Das war's. -> -> Du musst nichts wissen. Die App sagt dir alles. -> -> [App öffnen →] -> -> [Name] - -**Hinweis:** Nur senden wenn Event `first_scan_completed = false`. Nicht senden wenn bereits gescannt. - ---- - -## E-Mail 3 — "My Garden" einführen (Tag 3) - -**Betreff:** "Bau dir deinen digitalen Pflanzengarten" - -> Hey [Name], -> -> hast du gewusst, dass du nach jedem Scan deine Pflanze zu "Mein Garten" hinzufügen kannst? -> -> Das gibt dir: -> - Persönliche Gießerinnerungen für jede Pflanze -> - Pflege-History auf einen Blick -> - Fotos & Notizen an einem Ort -> -> Dein Urban Jungle, komplett organisiert. -> -> [Pflanze zu Mein Garten hinzufügen →] -> -> [Name] - ---- - -## E-Mail 4 — Health Diagnosis vorstellen (Tag 7) - -**Betreff:** "Warum werden die Blätter braun? 🍂" - -> Hey [Name], -> -> braune Blattspitzen, hängende Blätter, gelbe Flecken — fast jeder Pflanzenbesitzer kennt das. Und die meiste Zeit weiß man einfach nicht warum. -> -> GreenLens erkennt das sofort: -> -> **Zu wenig Wasser** → Monstera mit braunen Spitzen → Erholung in 2 Tagen -> **Zu viel Wasser** → Alocasia mit hängenden Blättern → Wurzeln gerettet -> **Schädlinge** → Ficus mit Spinnmilben → Behandlung nach 1 Scan -> -> Einfach die kranke Pflanze fotografieren. Die App sagt dir was fehlt — und was zu tun ist. -> -> [Pflanze jetzt diagnostizieren →] -> -> [Name] - ---- - -## E-Mail 5 — Social Proof + Pro-Teaser (Tag 10) - -**Betreff:** "Was andere Urban Jungle Fans sagen 🌱" - -> Hey [Name], -> -> hier ein paar Dinge, die uns Nutzer in letzter Zeit geschrieben haben: -> -> *"Es ist wie Shazam, aber für Pflanzen."* -> *"Endlich weiß ich was meine Pflanzen alle heißen."* -> *"Hat mir in Sekunden gesagt was mit meiner Monstera nicht stimmt."* -> -> Wir arbeiten gerade an Features, die GreenLens noch besser machen: -> - Pflegehistorie über mehrere Monate -> - Synchronisation deiner Sammlung über alle Geräte -> - Unbegrenzte Diagnosen ohne Limit -> -> Das alles kommt mit **GreenLens Pro** — dazu mehr in ein paar Tagen. -> -> [Name] - ---- - -## E-Mail 6 — Pro-Upgrade Angebot (Tag 14) - -**Betreff:** "Dein Urban Jungle verdient mehr 🌿" - -> Hey [Name], -> -> du nutzt GreenLens jetzt seit zwei Wochen. Zeit für ein ehrliches Angebot. -> -> **GreenLens Pro** gibt dir: -> -> ✓ Vollständige Pflegehistorie für jede Pflanze -> ✓ Geräteübergreifende Synchronisation deiner Sammlung -> ✓ Unbegrenzte Health-Diagnosen -> ✓ Erweiterte Standort-Pflegetipps -> ✓ Kein Limit bei Scans -> -> Als Early User bekommst du **30% Rabatt im ersten Monat** — automatisch angewandt. -> -> [GreenLens Pro holen →] -> -> Das Angebot gilt 7 Tage. -> -> [Name] - -**Technische Details:** -- Nur senden wenn `pro_subscriber = false` -- Discount-Code oder In-App Deeplink mit Auto-Apply -- Ablaufdatum im E-Mail explizit nennen - ---- - -## E-Mail 7 — Letzter Pro-Nudge (Tag 21, kein Upgrade) - -**Betreff:** "Letzte Chance: 30% Rabatt läuft heute ab" - -> Hey [Name], -> -> kurze Erinnerung — dein Early-User-Rabatt auf GreenLens Pro läuft heute ab. -> -> Falls du dir noch unsicher bist: Du kannst jederzeit kündigen, keine langen Laufzeiten. -> -> Was du bekommst: alle Pro-Features, Pflegehistorie, unbegrenzte Diagnosen. -> Was du riskierst: nichts. -> -> [Jetzt Pro holen — 30% Rabatt →] -> -> Nach heute gilt der normale Preis. -> -> [Name] - ---- - -## E-Mail 8 — Re-Engagement (Tag 30, inaktiv) - -**Betreff:** "Deine Pflanzen vermissen dich 🌿" - -> Hey [Name], -> -> du warst eine Weile nicht in GreenLens. Alles okay mit deinem Urban Jungle? -> -> Falls du Fragen hast, oder etwas nicht funktioniert hat — antworte einfach auf diese E-Mail. Wir lesen alles. -> -> Ansonsten: Schau kurz rein. Vielleicht hat eine deiner Pflanzen gerade genau jetzt Pflege nötig. -> -> [App öffnen →] -> -> [Name] - ---- - -## Sequenz-Regeln - -| Regel | Detail | -|-------|--------| -| Sende-Frequenz | Max. 2 E-Mails pro Woche | -| Stopp-Bedingung | Pro-Upgrade → Sequenz pausieren, in Pro-Onboarding wechseln | -| Personalisierung | [Name] überall; idealerweise Pflanzenname aus erstem Scan | -| Ton | Immer von einer echten Person (Gründer), kein Corporate-Speak | -| Unsubscribe | Immer sichtbar — respektiere die Entscheidung | - ---- - ---- - -# GreenLens — Landing Page CRO - -*Ziel: Besucher der Landing Page zu App-Downloads konvertieren.* - ---- - -## Aktuelle Seiten-Struktur & Optimierungen - -### Hero Section - -**Aktuell:** "Your Urban Jungle, perfectly cared for" - -**Optimierungsempfehlungen:** - -Teste diese drei Varianten gegeneinander (A/B-Test): - -| Variante | Headline | Rationale | -|----------|----------|-----------| -| A (aktuell) | "Your Urban Jungle, perfectly cared for" | Aspirational, Identity-based | -| B | "Scan any plant. Know exactly how to care for it." | Funktional, Problem-Solution | -| C | "Why is my plant dying? Find out in 1 second." | Pain-first, Search-Intent-Match | - -**Variante C** dürfte am stärksten konvertieren für kalten Traffic — trifft den emotionalen Schmerzpunkt direkt. - -**Subheadline verbessern:** -Aktuell: *"Scan any plant, get instant identification and personalized care plans – powered by AI."* - -Besser: *"Point your camera at any plant — GreenLens tells you exactly what it is and how to keep it alive. Free on iOS & Android."* - -Warum: Konkreteres "point your camera" erzeugt mentales Bild; "keep it alive" trifft den eigentlichen JTBD. - -**CTA Button:** -- Primär: "Download kostenlos" oder "Jetzt gratis laden" (Freemium betonen, Hürde senken) -- Sekundär: "App ansehen" → Demo-Video oder Screenshot-Slider - -**Above the fold checklist:** -- [ ] App Store + Google Play Badges sichtbar (nicht nur ein CTA-Button) -- [ ] "Kostenlos" / "Free" explizit in oder unter dem CTA -- [ ] Eine Zeile Social Proof: "Über [X] Pflanzen bereits identifiziert" oder "4.8★ im App Store" -- [ ] Kein Autoplay-Video (mobile) - ---- - -### Problem-Agitation Section - -**Empfehlung: Vor dem Feature-Abschnitt eine explizite Problem-Section einfügen.** - -``` -Headline: "Kenn das Gefühl?" - -• "Ich hab keine Ahnung was das für eine Pflanze ist." -• "Meine Pflanze geht ein und ich weiß nicht warum." -• "Ich vergesse immer zu gießen." -• "Google gibt mir 10 verschiedene Antworten." - -→ GreenLens löst das. In einer Sekunde. -``` - -Warum: Besucher müssen sich erstmal erkannt fühlen, bevor Features relevant werden. - ---- - -### Features Section - -**Aktuell:** "Everything your Urban Jungle needs" - -**Verbesserungen:** - -Jedes Feature als Nutzen formulieren, nicht als Funktion: - -| Aktuell (Funktion) | Besser (Nutzen) | -|---------------------|-----------------| -| "AI Plant Identification" | "Sag nie wieder 'keine Ahnung was das ist'" | -| "Smart Reminders" | "Vergiss nie wieder zu gießen" | -| "Health Diagnosis" | "Stopp das Raten — wissen warum deine Pflanze leidet" | -| "20,000+ species" | "Egal welche Pflanze — GreenLens kennt sie" | - -**Feature-Demo:** Für jedes Feature einen animierten GIF oder kurzen Screen-Recording einbauen. Besucher müssen das Produkt "fühlen" können ohne es zu downloaden. - ---- - -### Social Proof Section - -**Was fehlt (aktuell noch kein echter Social Proof):** - -Sobald erste Reviews vorhanden: - -- App Store Rating prominent zeigen (Sterne + Anzahl Reviews) -- 2–3 kurze Nutzer-Zitate, spezifisch und real: - - ❌ "Super App, sehr empfehlenswert!" (generisch, wirkt fake) - - ✅ "Hab endlich rausgefunden dass meine Monstera zu viel Wasser bekommt. Blätter sind schon wieder grün." — Anna K., München -- "X Pflanzen bereits gescannt" als Live-Counter oder statische Zahl - ---- - -### How It Works Section - -**Aktuell:** 4-Schritt-Prozess — gut. Folgende Anpassungen: - -- Schritt 1–2 visuell betonen (das ist der "Magic Moment") -- Unter Schritt 4 direkt CTA platzieren — nicht erst nach dem nächsten Abschnitt -- Mobile: Steps als swipeable Carousel (nicht als langer Scroll) - ---- - -### FAQ Section - -**Bestehende FAQs sind gut. Ergänzen:** - -| Frage | Antwort | -|-------|---------| -| "Muss ich mich registrieren?" | "Nein — einfach App laden und sofort scannen. Konto optional." | -| "Was kostet Pro?" | Konkreten Preis nennen — Unklarheit über Kosten ist Conversion-Killer | -| "Funktioniert es bei Pflanzen im Freien / Gartenblumen?" | "Ja — über 20.000 Arten inkl. Gartenpflanzen, Kräuter, Gemüse, Bäume." | - ---- - -### CTA Section (Bottom) - -**Aktuell:** "Join the Jungle" — gut, passt zur Brand. - -**Optimierungen:** -- Konkrete Zahl einfügen: "Schließ dich [X] Pflanzenliebhabern an" -- Beide Store-Badges nebeneinander, groß -- Unter den Badges: "Kostenlos · Keine Kreditkarte · Sofort loslegen" -- Optional: QR-Code für Desktop-Besucher die auf Mobile downloaden wollen - ---- - -## Technische CRO-Basics - -| Punkt | Status | Empfehlung | -|-------|--------|-----------| -| Page Speed | Prüfen | Ziel: <2,5s LCP auf Mobile | -| Mobile-First | Pflicht | 70%+ Traffic kommt von Mobile | -| App Store Badge Links | Pflicht | UTM-Parameter für Attribution | -| Analytics | Einrichten | Scroll-Depth, CTA-Klicks, Store-Badge-Klicks tracken | -| Heatmap | Empfohlen | Hotjar / Microsoft Clarity (kostenlos) | - ---- - -## Priorisierte Maßnahmen - -| Priorität | Maßnahme | Aufwand | Impact | -|-----------|----------|---------|--------| -| 1 | Headline A/B-Test (Variante C) | Niedrig | Hoch | -| 2 | "Kostenlos" explizit in CTA | Minimal | Hoch | -| 3 | Problem-Section vor Features einfügen | Niedrig | Hoch | -| 4 | Features als Nutzen formulieren | Niedrig | Mittel | -| 5 | Social Proof Section aufbauen (sobald Reviews da) | Mittel | Hoch | -| 6 | App Store Badges + QR-Code prominent | Niedrig | Mittel | -| 7 | Feature-GIFs / Screen-Recordings | Mittel | Mittel | +# GreenLens — Launch Strategy + +*Last updated: 2026-03-01* + +--- + +## Überblick + +GreenLens ist eine B2C Mobile App (iOS & Android) mit Freemium-Modell. Ziel: maximale Download-Zahlen, schnelle Aktivierung, Conversion zu GreenLens Pro. + +**Launch-Ziel:** App Store Präsenz aufbauen → Early Adopter-Community wachsen lassen → viralen Loop durch "Shazam für Pflanzen"-Effekt auslösen. + +--- + +## Phase 1: Soft Launch (jetzt) + +**Ziel:** Erste echte Nutzer, erster Feedback-Loop, App Store Rating aufbauen. + +### Aktionen + +- [ ] App Store Listing optimieren: klare Tagline, Screenshots mit Scan-Demo, kurzes Preview-Video +- [ ] Google Play Listing parallel aufsetzen +- [ ] Friends & Family + Pflanzen-Enthusiasten aus dem persönlichen Netzwerk einladen +- [ ] Feedback aktiv einsammeln: Was klappt nicht? Was fehlt? +- [ ] Ziel: 10–20 ehrliche App Store Reviews als Social Proof-Fundament + +### Owned Channel aufbauen + +- **E-Mail-Liste** starten — In-App Opt-in: "Neuigkeiten & Pflanzen-Tipps" +- Einfache Landing Page mit E-Mail Capture: greenlns.app (oder Subdomain) + +--- + +## Phase 2: Beta Launch (Monat 1–2) + +**Ziel:** Buzz erzeugen, Warteliste aufbauen, erste Presse/Creator-Erwähnungen sichern. + +### Owned Channels + +- **Blog / Content:** 2–3 SEO-Artikel zu Top-Suchintentionen: + - "Welche Pflanze ist das?" → Scan-Feature demonstrieren + - "Pflanze geht ein — was tun?" → Health Diagnosis Feature + - "Monstera pflegen" → Personalized Care Plan Feature +- **E-Mail:** Wöchentlicher "Pflanzen-Tipp" an Liste → niedrige Hürde für Signup + +### Rented Channels (1–2 Fokus-Plattformen) + +**Instagram / TikTok** (primär): +- Format: Vorher/Nachher-Videos — "Meine Pflanze stirbt" → Scan → Diagnose → Rettung +- Format: "Rate the plant" — Community errät Pflanzennamen, App gibt Auflösung +- Jeder Post endet mit CTA: Link in Bio → App Store + +**Reddit** (sekundär): +- Aktiv in r/houseplants, r/plantclinic, r/IndoorGarden +- Wert zuerst liefern (Pflanzenfragen beantworten), dann App organisch erwähnen +- Kein Spam — Community zuerst + +### Borrowed Channels + +| Zielgruppe | Kanal | Ansatz | +|------------|-------|--------| +| Pflanzen-YouTuber (DE) | YouTube | Kostenloses Pro-Abo + persönliche Nachricht; kein bezahlter Deal | +| Plant-Influencer Instagram | Instagram | Micro-Influencer (10k–100k), nischig, hohe Engagement-Rate | +| Garten-/Pflanzenpodcasts | Podcasts | Pitch: "Wir lösen das Problem X für eure Hörer" | +| Pflanzen-Newsletter | Newsletter | Sponsored Feature oder Co-Marketing | + +**Outreach-Vorlage:** +> "Hey [Name], ich bin Gründer von GreenLens — einer App, die Pflanzen per KI in Sekunden identifiziert und personalisierte Pflegepläne erstellt. Ich schicke dir gerne einen Pro-Zugang, einfach um zu sehen ob du's nützlich findest. Kein Deal, kein Druck." + +--- + +## Phase 3: Full Launch — Product Hunt (Monat 2–3) + +**Ziel:** Tech Early Adopters erreichen, Credibility-Boost, Backlinks, internationale Sichtbarkeit. + +### Vorbereitung (4 Wochen vorher) + +- [ ] Product Hunt Profil anlegen und aktiv werden (kommentieren, voten) +- [ ] Listing vorbereiten: + - **Tagline:** "Scan any plant. Get instant ID + personalized care plan." + - **Kurzbeschreibung:** Das Shazam für Pflanzen — powered by Botanical Intelligence + - Screenshots: Hero-Screen, Scan-Flow, Health Diagnosis, My Garden + - Demo-Video: 60 Sekunden, zeigt kompletten Scan-bis-Pflege-Flow +- [ ] Hunter suchen — jemanden mit Reichweite auf Product Hunt +- [ ] Unterstützer mobilisieren: bestehende E-Mail-Liste, Freunde, Investoren + +### Launch Day + +- [ ] Um 00:01 PST live schalten +- [ ] Ganztägig alle Kommentare beantworten (in Englisch) +- [ ] Announcement-E-Mail an gesamte Liste senden +- [ ] Social Posts auf allen Kanälen +- [ ] Team bereit für Support und Engagement + +### Launch Day E-Mail + +**Betreff:** "Wir sind live auf Product Hunt 🌿" + +> Hey [Name], +> +> Heute ist der Tag — GreenLens ist live auf Product Hunt! +> +> Wenn dir die App gefällt, würde ein Upvote und ein Kommentar wirklich helfen. Es dauert 30 Sekunden: +> +> [Zum Product Hunt Listing →] +> +> Danke, dass du von Anfang an dabei warst. +> +> — [Gründer Name] + +--- + +## Phase 4: Post-Launch Momentum (Monat 3+) + +### Sofortmaßnahmen nach Launch + +- [ ] Onboarding-E-Mail-Sequenz aktivieren (→ `/email-sequence` Skill nutzen) +- [ ] App Store Reviews aktiv einsammeln: In-App-Prompt nach erstem erfolgreichen Scan +- [ ] Vergleichsseiten erstellen: "GreenLens vs PictureThis", "GreenLens vs PlantNet" +- [ ] Launch in nächstem E-Mail-Roundup erwähnen + +### Laufende Launch-Momente (alle 4–6 Wochen) + +Jedes neue Feature ist ein eigener Mini-Launch: + +| Update-Typ | Marketing-Aufwand | +|------------|------------------| +| Neues Major Feature (z.B. Offline-Modus) | E-Mail + Social + In-App + Blog | +| Neue Pflanzenarten im Katalog | Social Post + Changelog | +| UI-Verbesserung | In-App-Banner | +| Bug Fix | Changelog (signalisiert aktive Entwicklung) | + +--- + +## ORB-Kanal-Übersicht für GreenLens + +### Owned (aufbauen, Priorität 1) +| Kanal | Zweck | Ziel | +|-------|-------|------| +| E-Mail-Liste | Direkter Draht zu Nutzern | 1.000 Subscriber in Monat 3 | +| Blog (SEO) | Organischer Traffic via Pflanzenfragen | 5k Visits/Monat in Monat 6 | + +### Rented (nutzen, nicht abhängig sein) +| Kanal | Format | Ziel | +|-------|--------|------| +| Instagram / TikTok | Scan-Videos, Pflanzen-Content | 5k Follower in Monat 6 | +| Reddit | Community-Wert, organische Erwähnungen | Laufend | +| App Store / Play Store | ASO-optimiertes Listing | Top 10 in "Plant" Kategorie | + +### Borrowed (aktiv angehen) +| Kanal | Kontakt-Ziel | Timeline | +|-------|-------------|----------| +| 3–5 DE Plant-YouTuber | Pro-Zugang + persönliche Nachricht | Monat 1 | +| 10 Micro-Influencer Instagram | Kooperation oder Affiliate | Monat 2 | +| 2–3 Garten-Podcasts | Interview-Pitch | Monat 2–3 | + +--- + +## Viraler Loop + +Das Kernprodukt hat natürliches Sharing-Potenzial: + +``` +Nutzer scannt Pflanze → beeindruckendes Ergebnis → +Screenshot/Video teilt sich leicht → +"Was ist das für eine App?" → neuer Download +``` + +**Fördern durch:** +- Share-Button direkt nach dem Scan-Ergebnis ("Zeig deinen Freunden, was das ist") +- "My Garden" shareable machen — schöner Export/Share-Screen +- Refer-a-Friend: 1 Monat Pro gratis für jeden eingeladenen Nutzer der sich anmeldet + +--- + +## Launch Checklist + +### Pre-Launch +- [ ] App Store & Play Store Listing optimiert (Screenshots, Video, Beschreibung) +- [ ] Landing Page mit E-Mail Capture live +- [ ] E-Mail-Liste gestartet +- [ ] Instagram/TikTok Profil aktiv +- [ ] 5 Outreach-E-Mails an Plant-Creator raus +- [ ] Product Hunt Listing vorbereitet +- [ ] Analytics/Tracking in der App aktiv (Onboarding-Funnel, Scan-Events) + +### Launch Day +- [ ] Product Hunt live +- [ ] Announcement E-Mail an Liste +- [ ] Social Posts +- [ ] Team verfügbar für Comments & Support + +### Post-Launch +- [ ] Onboarding-E-Mail-Sequenz läuft +- [ ] In-App Review-Prompt nach erstem Scan +- [ ] Vergleichsseiten live +- [ ] Nächster Feature-Launch geplant + +--- + +## Metriken + +| Metric | Ziel Monat 1 | Ziel Monat 3 | Ziel Monat 6 | +|--------|-------------|-------------|-------------| +| App Downloads | 500 | 5.000 | 25.000 | +| E-Mail-Liste | 200 | 1.000 | 5.000 | +| App Store Rating | 4.0+ | 4.3+ | 4.5+ | +| Pro Conversion | — | 3–5% | 5–8% | +| Product Hunt | — | Launch geplant | Ergebnis | + +--- + +--- + +# GreenLens — Onboarding E-Mail-Sequenz + +*Ziel: Nutzer von erstem Download bis zum Pro-Upgrade aktivieren.* + +--- + +## Sequenz-Übersicht + +| # | Timing | Ziel | Typ | +|---|--------|------|-----| +| 1 | Sofort nach Signup | Willkommen + ersten Scan triggern | Aktivierung | +| 2 | Tag 1 (kein Scan) | Erinnerung + Hemmschwelle senken | Aktivierung | +| 3 | Tag 3 | "My Garden" Feature einführen | Feature-Education | +| 4 | Tag 7 | Health Diagnosis vorstellen | Feature-Education | +| 5 | Tag 10 | Social Proof + Pro-Teaser | Conversion-Vorbereitung | +| 6 | Tag 14 | Pro-Upgrade Angebot | Conversion | +| 7 | Tag 21 (kein Upgrade) | Letzter Pro-Nudge + Wert-Recap | Conversion | +| 8 | Tag 30 (inaktiv) | Re-Engagement | Retention | + +--- + +## E-Mail 1 — Willkommen (Sofort nach Signup) + +**Betreff:** "Willkommen im Urban Jungle 🌿" +**Von:** [Gründer Vorname] von GreenLens + +> Hey [Name], +> +> schön, dass du dabei bist! +> +> GreenLens wurde gebaut für alle, die ihre Pflanzen lieben — aber manchmal nicht wissen, was ihnen fehlt. Das ändert sich jetzt. +> +> **Dein erster Schritt:** +> Fotografiere eine Pflanze in deiner Nähe. Irgendeine. Schau was passiert. +> +> [Jetzt erste Pflanze scannen →] +> +> Über 20.000 Arten erkannt — in unter einer Sekunde. +> +> Viel Spaß, +> [Name] +> GreenLens + +**Technische Details:** +- Trigger: E-Mail-Signup oder App-Download +- Ziel-Aktion: Erster Scan +- Ton: Warm, persönlich, keine Feature-Liste + +--- + +## E-Mail 2 — Erinnerung Tag 1 (nur wenn kein Scan) + +**Betreff:** "Hast du schon eine Pflanze in der Nähe? 🪴" + +> Hey [Name], +> +> gestern hast du dich bei GreenLens angemeldet — aber noch keine Pflanze gescannt. +> +> Kein Druck. Aber falls du kurz in der Nähe einer Pflanze bist: +> +> Öffne die App → Kamera → Tippen. Das war's. +> +> Du musst nichts wissen. Die App sagt dir alles. +> +> [App öffnen →] +> +> [Name] + +**Hinweis:** Nur senden wenn Event `first_scan_completed = false`. Nicht senden wenn bereits gescannt. + +--- + +## E-Mail 3 — "My Garden" einführen (Tag 3) + +**Betreff:** "Bau dir deinen digitalen Pflanzengarten" + +> Hey [Name], +> +> hast du gewusst, dass du nach jedem Scan deine Pflanze zu "Mein Garten" hinzufügen kannst? +> +> Das gibt dir: +> - Persönliche Gießerinnerungen für jede Pflanze +> - Pflege-History auf einen Blick +> - Fotos & Notizen an einem Ort +> +> Dein Urban Jungle, komplett organisiert. +> +> [Pflanze zu Mein Garten hinzufügen →] +> +> [Name] + +--- + +## E-Mail 4 — Health Diagnosis vorstellen (Tag 7) + +**Betreff:** "Warum werden die Blätter braun? 🍂" + +> Hey [Name], +> +> braune Blattspitzen, hängende Blätter, gelbe Flecken — fast jeder Pflanzenbesitzer kennt das. Und die meiste Zeit weiß man einfach nicht warum. +> +> GreenLens erkennt das sofort: +> +> **Zu wenig Wasser** → Monstera mit braunen Spitzen → Erholung in 2 Tagen +> **Zu viel Wasser** → Alocasia mit hängenden Blättern → Wurzeln gerettet +> **Schädlinge** → Ficus mit Spinnmilben → Behandlung nach 1 Scan +> +> Einfach die kranke Pflanze fotografieren. Die App sagt dir was fehlt — und was zu tun ist. +> +> [Pflanze jetzt diagnostizieren →] +> +> [Name] + +--- + +## E-Mail 5 — Social Proof + Pro-Teaser (Tag 10) + +**Betreff:** "Was andere Urban Jungle Fans sagen 🌱" + +> Hey [Name], +> +> hier ein paar Dinge, die uns Nutzer in letzter Zeit geschrieben haben: +> +> *"Es ist wie Shazam, aber für Pflanzen."* +> *"Endlich weiß ich was meine Pflanzen alle heißen."* +> *"Hat mir in Sekunden gesagt was mit meiner Monstera nicht stimmt."* +> +> Wir arbeiten gerade an Features, die GreenLens noch besser machen: +> - Pflegehistorie über mehrere Monate +> - Synchronisation deiner Sammlung über alle Geräte +> - Unbegrenzte Diagnosen ohne Limit +> +> Das alles kommt mit **GreenLens Pro** — dazu mehr in ein paar Tagen. +> +> [Name] + +--- + +## E-Mail 6 — Pro-Upgrade Angebot (Tag 14) + +**Betreff:** "Dein Urban Jungle verdient mehr 🌿" + +> Hey [Name], +> +> du nutzt GreenLens jetzt seit zwei Wochen. Zeit für ein ehrliches Angebot. +> +> **GreenLens Pro** gibt dir: +> +> ✓ Vollständige Pflegehistorie für jede Pflanze +> ✓ Geräteübergreifende Synchronisation deiner Sammlung +> ✓ Unbegrenzte Health-Diagnosen +> ✓ Erweiterte Standort-Pflegetipps +> ✓ Kein Limit bei Scans +> +> Als Early User bekommst du **30% Rabatt im ersten Monat** — automatisch angewandt. +> +> [GreenLens Pro holen →] +> +> Das Angebot gilt 7 Tage. +> +> [Name] + +**Technische Details:** +- Nur senden wenn `pro_subscriber = false` +- Discount-Code oder In-App Deeplink mit Auto-Apply +- Ablaufdatum im E-Mail explizit nennen + +--- + +## E-Mail 7 — Letzter Pro-Nudge (Tag 21, kein Upgrade) + +**Betreff:** "Letzte Chance: 30% Rabatt läuft heute ab" + +> Hey [Name], +> +> kurze Erinnerung — dein Early-User-Rabatt auf GreenLens Pro läuft heute ab. +> +> Falls du dir noch unsicher bist: Du kannst jederzeit kündigen, keine langen Laufzeiten. +> +> Was du bekommst: alle Pro-Features, Pflegehistorie, unbegrenzte Diagnosen. +> Was du riskierst: nichts. +> +> [Jetzt Pro holen — 30% Rabatt →] +> +> Nach heute gilt der normale Preis. +> +> [Name] + +--- + +## E-Mail 8 — Re-Engagement (Tag 30, inaktiv) + +**Betreff:** "Deine Pflanzen vermissen dich 🌿" + +> Hey [Name], +> +> du warst eine Weile nicht in GreenLens. Alles okay mit deinem Urban Jungle? +> +> Falls du Fragen hast, oder etwas nicht funktioniert hat — antworte einfach auf diese E-Mail. Wir lesen alles. +> +> Ansonsten: Schau kurz rein. Vielleicht hat eine deiner Pflanzen gerade genau jetzt Pflege nötig. +> +> [App öffnen →] +> +> [Name] + +--- + +## Sequenz-Regeln + +| Regel | Detail | +|-------|--------| +| Sende-Frequenz | Max. 2 E-Mails pro Woche | +| Stopp-Bedingung | Pro-Upgrade → Sequenz pausieren, in Pro-Onboarding wechseln | +| Personalisierung | [Name] überall; idealerweise Pflanzenname aus erstem Scan | +| Ton | Immer von einer echten Person (Gründer), kein Corporate-Speak | +| Unsubscribe | Immer sichtbar — respektiere die Entscheidung | + +--- + +--- + +# GreenLens — Landing Page CRO + +*Ziel: Besucher der Landing Page zu App-Downloads konvertieren.* + +--- + +## Aktuelle Seiten-Struktur & Optimierungen + +### Hero Section + +**Aktuell:** "Your Urban Jungle, perfectly cared for" + +**Optimierungsempfehlungen:** + +Teste diese drei Varianten gegeneinander (A/B-Test): + +| Variante | Headline | Rationale | +|----------|----------|-----------| +| A (aktuell) | "Your Urban Jungle, perfectly cared for" | Aspirational, Identity-based | +| B | "Scan any plant. Know exactly how to care for it." | Funktional, Problem-Solution | +| C | "Why is my plant dying? Find out in 1 second." | Pain-first, Search-Intent-Match | + +**Variante C** dürfte am stärksten konvertieren für kalten Traffic — trifft den emotionalen Schmerzpunkt direkt. + +**Subheadline verbessern:** +Aktuell: *"Scan any plant, get instant identification and personalized care plans – powered by AI."* + +Besser: *"Point your camera at any plant — GreenLens tells you exactly what it is and how to keep it alive. Free on iOS & Android."* + +Warum: Konkreteres "point your camera" erzeugt mentales Bild; "keep it alive" trifft den eigentlichen JTBD. + +**CTA Button:** +- Primär: "Download kostenlos" oder "Jetzt gratis laden" (Freemium betonen, Hürde senken) +- Sekundär: "App ansehen" → Demo-Video oder Screenshot-Slider + +**Above the fold checklist:** +- [ ] App Store + Google Play Badges sichtbar (nicht nur ein CTA-Button) +- [ ] "Kostenlos" / "Free" explizit in oder unter dem CTA +- [ ] Eine Zeile Social Proof: "Über [X] Pflanzen bereits identifiziert" oder "4.8★ im App Store" +- [ ] Kein Autoplay-Video (mobile) + +--- + +### Problem-Agitation Section + +**Empfehlung: Vor dem Feature-Abschnitt eine explizite Problem-Section einfügen.** + +``` +Headline: "Kenn das Gefühl?" + +• "Ich hab keine Ahnung was das für eine Pflanze ist." +• "Meine Pflanze geht ein und ich weiß nicht warum." +• "Ich vergesse immer zu gießen." +• "Google gibt mir 10 verschiedene Antworten." + +→ GreenLens löst das. In einer Sekunde. +``` + +Warum: Besucher müssen sich erstmal erkannt fühlen, bevor Features relevant werden. + +--- + +### Features Section + +**Aktuell:** "Everything your Urban Jungle needs" + +**Verbesserungen:** + +Jedes Feature als Nutzen formulieren, nicht als Funktion: + +| Aktuell (Funktion) | Besser (Nutzen) | +|---------------------|-----------------| +| "AI Plant Identification" | "Sag nie wieder 'keine Ahnung was das ist'" | +| "Smart Reminders" | "Vergiss nie wieder zu gießen" | +| "Health Diagnosis" | "Stopp das Raten — wissen warum deine Pflanze leidet" | +| "20,000+ species" | "Egal welche Pflanze — GreenLens kennt sie" | + +**Feature-Demo:** Für jedes Feature einen animierten GIF oder kurzen Screen-Recording einbauen. Besucher müssen das Produkt "fühlen" können ohne es zu downloaden. + +--- + +### Social Proof Section + +**Was fehlt (aktuell noch kein echter Social Proof):** + +Sobald erste Reviews vorhanden: + +- App Store Rating prominent zeigen (Sterne + Anzahl Reviews) +- 2–3 kurze Nutzer-Zitate, spezifisch und real: + - ❌ "Super App, sehr empfehlenswert!" (generisch, wirkt fake) + - ✅ "Hab endlich rausgefunden dass meine Monstera zu viel Wasser bekommt. Blätter sind schon wieder grün." — Anna K., München +- "X Pflanzen bereits gescannt" als Live-Counter oder statische Zahl + +--- + +### How It Works Section + +**Aktuell:** 4-Schritt-Prozess — gut. Folgende Anpassungen: + +- Schritt 1–2 visuell betonen (das ist der "Magic Moment") +- Unter Schritt 4 direkt CTA platzieren — nicht erst nach dem nächsten Abschnitt +- Mobile: Steps als swipeable Carousel (nicht als langer Scroll) + +--- + +### FAQ Section + +**Bestehende FAQs sind gut. Ergänzen:** + +| Frage | Antwort | +|-------|---------| +| "Muss ich mich registrieren?" | "Nein — einfach App laden und sofort scannen. Konto optional." | +| "Was kostet Pro?" | Konkreten Preis nennen — Unklarheit über Kosten ist Conversion-Killer | +| "Funktioniert es bei Pflanzen im Freien / Gartenblumen?" | "Ja — über 20.000 Arten inkl. Gartenpflanzen, Kräuter, Gemüse, Bäume." | + +--- + +### CTA Section (Bottom) + +**Aktuell:** "Join the Jungle" — gut, passt zur Brand. + +**Optimierungen:** +- Konkrete Zahl einfügen: "Schließ dich [X] Pflanzenliebhabern an" +- Beide Store-Badges nebeneinander, groß +- Unter den Badges: "Kostenlos · Keine Kreditkarte · Sofort loslegen" +- Optional: QR-Code für Desktop-Besucher die auf Mobile downloaden wollen + +--- + +## Technische CRO-Basics + +| Punkt | Status | Empfehlung | +|-------|--------|-----------| +| Page Speed | Prüfen | Ziel: <2,5s LCP auf Mobile | +| Mobile-First | Pflicht | 70%+ Traffic kommt von Mobile | +| App Store Badge Links | Pflicht | UTM-Parameter für Attribution | +| Analytics | Einrichten | Scroll-Depth, CTA-Klicks, Store-Badge-Klicks tracken | +| Heatmap | Empfohlen | Hotjar / Microsoft Clarity (kostenlos) | + +--- + +## Priorisierte Maßnahmen + +| Priorität | Maßnahme | Aufwand | Impact | +|-----------|----------|---------|--------| +| 1 | Headline A/B-Test (Variante C) | Niedrig | Hoch | +| 2 | "Kostenlos" explizit in CTA | Minimal | Hoch | +| 3 | Problem-Section vor Features einfügen | Niedrig | Hoch | +| 4 | Features als Nutzen formulieren | Niedrig | Mittel | +| 5 | Social Proof Section aufbauen (sobald Reviews da) | Mittel | Hoch | +| 6 | App Store Badges + QR-Code prominent | Niedrig | Mittel | +| 7 | Feature-GIFs / Screen-Recordings | Mittel | Mittel | diff --git a/ALLE_PFLANZEN.md b/ALLE_PFLANZEN.md index aaba4c8..5688a8e 100644 --- a/ALLE_PFLANZEN.md +++ b/ALLE_PFLANZEN.md @@ -1,483 +1,483 @@ -# Alle vorhandenen Pflanzen - -Erstellt am: 2026-03-11 -Gesamtzahl: 240 - -- Aasblume (Stapelia grandiflora) - /plants/stapelia-grandiflora--aasblume--b87af483.webp -- Adromischus (Adromischus cristatus) - /plants/adromischus-cristatus--adromischus--9b24b9fc.webp -- Afrikanisches Veilchen (Saintpaulia ionantha) - /plants/saintpaulia-ionantha--afrikanisches-veilchen--bc75f4a8.webp -- Agave (Agave americana) - /plants/agave-americana--agave--3b197a68.webp -- Aglaoneme (Aglaonema commutatum) - /plants/aglaonema-commutatum--aglaoneme--7928abe4.webp -- Aloe Vera (Aloe vera) - /plants/aloe-vera--206a00f6.webp -- Alpenveilchen (Cyclamen persicum) - /plants/cyclamen-persicum--alpenveilchen--42e9e354.webp -- Amazona-Taro (Alocasia amazonica) - /plants/alocasia-amazonica--amazona-taro--e1c87d71.webp -- Arnika (Arnica montana) - /plants/arnica-montana--arnika--285e6ea8.webp -- Aubergine (Solanum melongena) - /plants/solanum-melongena--aubergine--5f3bad2f.webp -- Baldrian (Valeriana officinalis) - /plants/valeriana-officinalis--baldrian--7bc7a2ae.webp -- Bambusrohr (Bambusa vulgaris) - /plants/bambusa-vulgaris--bambusrohr--620e47a2.webp -- Bananenpflanze (Musa acuminata) - /plants/musa-acuminata--bananenpflanze--0a6a2ad8.webp -- Basilikum (Ocimum basilicum) - /plants/ocimum-basilicum--basilikum--cdc33445.webp -- Bergpalme (Chamaedorea elegans) - /plants/chamaedorea-elegans--bergpalme--05a6cf35.webp -- Billbergia (Billbergia nutans) - /plants/billbergia-nutans--billbergia--a659ab7f.webp -- Birkenfeige (Ficus benjamina) - /plants/ficus-benjamina--birkenfeige--399b661c.webp -- Blauer Kreuzkraut (Senecio serpens) - /plants/senecio-serpens--blauer-kreuzkraut--4ec1f347.webp -- Blaues Kanaelfarn (Phlebodium aureum) - /plants/phlebodium-aureum--blaues-kanaelfarn--a630296a.webp -- Bleistiftkaktus (Euphorbia tirucalli) - /plants/euphorbia-tirucalli--bleistiftkaktus--2760cacf.webp -- Bleiwurz (Plumbago auriculata) - /plants/plumbago-auriculata--bleiwurz--a1ea78f5.webp -- Blumenschilfrohr (Canna indica) - /plants/canna-indica--blumenschilfrohr--adfa9705.webp -- Blutroter Storchschnabel (Geranium sanguineum) - /plants/geranium-sanguineum--blutroter-storchschnabel--9d8300fb.webp -- Bogenhanf (Sansevieria trifasciata) - /plants/sansevieria-trifasciata--bogenhanf--4ba42e15.webp -- Bonsai-Feige (Ficus retusa) - /plants/ficus-retusa--bonsai-feige--dff4fbd3.webp -- Bougainvillea (Bougainvillea spectabilis) - /plants/bougainvillea-spectabilis--bougainvillea--0d84eedd.webp -- Brutblatt (Kalanchoe daigremontiana) - /plants/kalanchoe-daigremontiana--brutblatt--5b643bf7.webp -- Buntblatt (Caladium bicolor) - /plants/caladium-bicolor--buntblatt--d052df1e.webp -- Calibrachoa (Calibrachoa hybrida) - /plants/calibrachoa-hybrida--calibrachoa--18b44d0e.webp -- Calla (Zantedeschia aethiopica) - /plants/zantedeschia-aethiopica--calla--c739da85.webp -- Callisia (Callisia repens) - /plants/callisia-repens--callisia--65401a5e.webp -- Cattleya-Orchidee (Cattleya labiata) - /plants/cattleya-labiata--cattleya-orchidee--91962802.webp -- Chili (Capsicum annuum) - /plants/capsicum-annuum--chili--dabf0f0e.webp -- Chinesische Faecherpalme (Livistona chinensis) - /plants/livistona-chinensis--chinesische-facherpalme--773e43a2.webp -- Chinesische Rose (Rosa chinensis) - /plants/rosa-chinensis--chinesische-rose--2c0514b0.webp -- Chinesischer Blauregen (Wisteria sinensis) - /plants/wisteria-sinensis--chinesischer-blauregen--8887793e.webp -- Christusdorn (Euphorbia milii) - /plants/euphorbia-milii--christusdorn--f647812e.webp -- Chrysantheme (Chrysanthemum indicum) - /plants/chrysanthemum-indicum--chrysantheme--f3f1b7ad.webp -- Columnea (Columnea gloriosa) - /plants/columnea-gloriosa--columnea--3fd247d6.webp -- Cryptanthus (Cryptanthus bivittatus) - /plants/cryptanthus-bivittatus--cryptanthus--0300865d.webp -- Ctenanthe (Ctenanthe burle-marxii) - /plants/ctenanthe-burle-marxii--ctenanthe--aaacfef1.webp -- Dahlie (Dahlia pinnata) - /plants/dahlia-pinnata--dahlie--34a69e35.webp -- Dendrobium (Dendrobium nobile) - /plants/dendrobium-nobile--dendrobium--a29be123.webp -- Dieffenbachie (Dieffenbachia seguine) - /plants/dieffenbachia-seguine--dieffenbachie--755822dd.webp -- Dischidia (Dischidia ruscifolia) - /plants/dischidia-ruscifolia--dischidia--962061db.webp -- Drachenbaum (Dracaena marginata) - /plants/dracaena-marginata--drachenbaum--ae46a13c.webp -- Drehfrucht (Streptocarpus hybridus) - /plants/streptocarpus-hybridus--drehfrucht--d30e3476.webp -- Dudleya (Dudleya brittonii) - /plants/dudleya-brittonii--dudleya--be6042d1.webp -- Duftsteinrich (Lobularia maritima) - /plants/lobularia-maritima--duftsteinrich--309e832f.webp -- Echeverie (Echeveria elegans) - /plants/echeveria-elegans--echeverie--71f5556f.webp -- Echter Lavendel (Lavandula angustifolia) - /plants/lavandula-angustifolia--echter-lavendel--cfd090c5.webp -- Efeu (Hedera helix) - /plants/hedera-helix--efeu--cebdfbf1.webp -- Efeu-Geranie (Pelargonium peltatum) - /plants/pelargonium-peltatum--efeu-geranie--8cd609cc.webp -- Efeutute (Epipremnum aureum) - /plants/epipremnum-aureum--efeutute--29871648.webp -- Einblatt (Spathiphyllum wallisii) - /plants/spathiphyllum-wallisii--einblatt--6ff28539.webp -- Erdbeere (Fragaria ananassa) - /plants/fragaria-ananassa--erdbeere--4a97a911.webp -- Eselschwanz (Sedum morganianum) - /plants/sedum-morganianum--eselschwanz--f6256abc.webp -- Faecherahorn (Acer palmatum) - /plants/acer-palmatum--faecherahorn--388b6858.webp -- Fass-Kaktus (Ferocactus cylindraceus) - /plants/ferocactus-cylindraceus--fass-kaktus--ef5c90b1.webp -- Fatsia (Fatsia japonica) - /plants/fatsia-japonica--fatsia--425270ac.webp -- Fettkraut (Pinguicula grandiflora) - /plants/pinguicula-grandiflora--fettkraut--8ec9dead.webp -- Flamingoblume (Anthurium andraeanum) - /plants/anthurium-andraeanum--flamingoblume--2087000b.webp -- Flammen-Bromelie (Vriesea splendens) - /plants/vriesea-splendens--flammen-bromelie--debc6faa.webp -- Fleissiges Lieschen (Impatiens walleriana) - /plants/impatiens-walleriana--fleissiges-lieschen--5816f930.webp -- Forellen-Begonie (Begonia maculata) - /plants/begonia-maculata--forellen-begonie--5cce47c8.webp -- Frauenhaarfarn (Adiantum raddianum) - /plants/adiantum-raddianum--frauenhaarfarn--d47cef0b.webp -- Fuchsie (Fuchsia hybrida) - /plants/fuchsia-hybrida--fuchsie--93ef43c2.webp -- Gardenie (Gardenia jasminoides) - /plants/gardenia-jasminoides--gardenie--f8284265.webp -- Gasteria (Gasteria carinata) - /plants/gasteria-carinata--gasteria--b27de8c8.webp -- Gebet-Pflanze (Maranta leuconeura) - /plants/maranta-leuconeura--gebet-pflanze--e50f6916.webp -- Geigenfeige (Ficus lyrata) - /plants/ficus-lyrata--geigenfeige--c025bb04.webp -- Geisterpflanze (Graptopetalum paraguayense) - /plants/graptopetalum-paraguayense--geisterpflanze--9584de97.webp -- Gerbera (Gerbera jamesonii) - /plants/gerbera-jamesonii--gerbera--f17eec14.webp -- Geweihfarn (Platycerium bifurcatum) - /plants/platycerium-bifurcatum--geweihfarn--991495f9.webp -- Gloxinie (Gloxinia speciosa) - /plants/gloxinia-speciosa--gloxinie--8a73752c.webp -- Goldene Tonne (Echinocactus grusonii) - /plants/echinocactus-grusonii--goldene-tonne--d5268f53.webp -- Goldener Bambus (Phyllostachys aurea) - /plants/phyllostachys-aurea--goldener-bambus--e05d0c9f.webp -- Goldfruchtpalme (Dypsis lutescens) - /plants/dypsis-lutescens--goldfruchtpalme--890812c2.webp -- Granatapfelbaum (Punica granatum) - /plants/punica-granatum--granatapfelbaum--facf4f0c.webp -- Grosse Brennessel (Urtica dioica) - /plants/urtica-dioica--grosse-brennessel--b2ed905e.webp -- Grosse Strahlenaralie (Schefflera actinophylla) - /plants/schefflera-actinophylla--grosse-strahlenaralie--a69cdd16.webp -- Gruene Minze (Mentha spicata) - /plants/mentha-spicata--gruene-minze--7cb727ef.webp -- Gruenlilie (Chlorophytum comosum) - /plants/chlorophytum-comosum--gruenlilie--e48be10b.webp -- Guave (Psidium guajava) - /plants/psidium-guajava--guave--5d507482.webp -- Gummibaum (Ficus elastica) - /plants/ficus-elastica--gummibaum--925b35e7.webp -- Gurke (Cucumis sativus) - /plants/cucumis-sativus--gurke--3b96fd46.webp -- Guzmania (Guzmania lingulata) - /plants/guzmania-lingulata--guzmania--63fafdcb.webp -- Hange-Birke (Betula pendula) - /plants/betula-pendula--hange-birke--aff0bb68.webp -- Hasenohren-Kaktus (Opuntia microdasys) - /plants/opuntia-microdasys--hasenohren-kaktus--de2a7439.webp -- Heliamphora (Heliamphora nutans) - /plants/heliamphora-nutans--heliamphora--16977b41.webp -- Heliconia (Heliconia psittacorum) - /plants/heliconia-psittacorum--heliconia--15bad812.webp -- Herzblatt-Philodendron (Philodendron hederaceum) - /plants/philodendron-hederaceum--herzblatt-philodendron--54360959.webp -- Herzkette (Ceropegia woodii) - /plants/ceropegia-woodii--herzkette--b51fb231.webp -- Hibiskus (Hibiscus rosa-sinensis) - /plants/hibiscus-rosa-sinensis--hibiskus--9e6d8b54.webp -- Hyazinthe (Hyacinthus orientalis) - /plants/hyacinthus-orientalis--hyazinthe--2c07af5d.webp -- Indische Azalee (Azalea indica) - /plants/azalea-indica--indische-azalee--fe6e49a3.webp -- Ingwer (Zingiber officinale) - /plants/zingiber-officinale--ingwer--597975c9.webp -- Jadepflanze (Crassula ovata) - /plants/crassula-ovata--jadepflanze--3ac94122.webp -- Japanische Aucube (Aucuba japonica) - /plants/aucuba-japonica--japanische-aucube--c4bcd588.webp -- Japanische Azalee (Rhododendron simsii) - /plants/rhododendron-simsii--japanische-azalee--ef16f2c0.webp -- Jasmin (Jasminum polyanthum) - /plants/jasminum-polyanthum--jasmin--14162cf1.webp -- Johanniskraut (Hypericum perforatum) - /plants/hypericum-perforatum--johanniskraut--9bdb2ebc.webp -- Kaffeestrauch (Coffea arabica) - /plants/coffea-arabica--kaffeestrauch--a5ffdda3.webp -- Kalanchoe (Kalanchoe blossfeldiana) - /plants/kalanchoe-blossfeldiana--kalanchoe--e040640f.webp -- Kamelie (Camellia japonica) - /plants/camellia-japonica--kamelie--6a23eb3f.webp -- Kamille (Chamomilla recutita) - /plants/chamomilla-recutita--kamille--0bffdb72.webp -- Kaninchen-Ohren (Kalanchoe tomentosa) - /plants/kalanchoe-tomentosa--kaninchen-ohren--2c3b1e90.webp -- Kannenpflanze (Nepenthes alata) - /plants/nepenthes-alata--kannenpflanze--30016442.webp -- Kap-Aloe (Aloe arborescens) - /plants/aloe-arborescens--kap-aloe--2c4f60ef.webp -- Kap-Aloe (ferox) (Aloe ferox) - /plants/aloe-ferox--kap-aloe-ferox--e78c3f65.webp -- Karotte (Daucus carota) - /plants/daucus-carota--karotte--85d90d33.webp -- Kentia-Palme (Howea forsteriana) - /plants/howea-forsteriana--kentia-palme--f2c205ea.webp -- Keulenlilie (Cordyline australis) - /plants/cordyline-australis--keulenlilie--31be351b.webp -- Kleeblume (Oxalis triangularis) - /plants/oxalis-triangularis--kleeblume--9080763b.webp -- Kleine Wachsblume (Hoya bella) - /plants/hoya-bella--kleine-wachsblume--db73dcff.webp -- Knollen-Begonie (Begonia tuberhybrida) - /plants/begonia-tuberhybrida--knollen-begonie--7d9dfd00.webp -- Koenigin der Nacht (Epiphyllum oxypetalum) - /plants/epiphyllum-oxypetalum--koenigin-der-nacht--7ecd1979.webp -- Koenigs-Protea (Protea cynaroides) - /plants/protea-cynaroides--koenigs-protea--2186e16d.webp -- Koenigsbegonie (Begonia rex) - /plants/begonia-rex--koenigsbegonie--b6083f44.webp -- Konophytum (Conophytum calculus) - /plants/conophytum-calculus--konophytum--4c3a116e.webp -- Korallenkaktus (Rhipsalis baccifera) - /plants/rhipsalis-baccifera--korallenkaktus--3097b146.webp -- Korbmarante (Calathea orbifolia) - /plants/calathea-orbifolia--korbmarante--fdc40419.webp -- Kotyledon (Cotyledon orbiculata) - /plants/cotyledon-orbiculata--kotyledon--e61a1c1a.webp -- Krokus (Crocus vernus) - /plants/crocus-vernus--krokus--31f51b70.webp -- Kurkuma (Curcuma longa) - /plants/curcuma-longa--kurkuma--cb270150.webp -- Lebende Steine (Lithops julii) - /plants/lithops-julii--lebende-steine--939c0d2c.webp -- Lila Tradescantia (Tradescantia pallida) - /plants/tradescantia-pallida--lila-tradescantia--fa444b81.webp -- Lippenstiftpflanze (Aeschynanthus radicans) - /plants/aeschynanthus-radicans--lippenstiftpflanze--c0f3a18c.webp -- Luftpflanze (Tillandsia ionantha) - /plants/tillandsia-ionantha--luftpflanze--c221d48d.webp -- Madagaskar-Jasmin (Stephanotis floribunda) - /plants/stephanotis-floribunda--madagaskar-jasmin--f5b3e914.webp -- Maisstrauch (Dracaena fragrans) - /plants/dracaena-fragrans--maisstrauch--107c7d0f.webp -- Mammillaria (Mammillaria zeilmanniana) - /plants/mammillaria-zeilmanniana--mammillaria--ee6d834e.webp -- Mangold (Beta vulgaris) - /plants/beta-vulgaris--mangold--7fb88006.webp -- Marmor-Efeutute (Epipremnum aureum Marble Queen) - /plants/epipremnum-aureum-marble-queen--marmor-efeutute--1d6745d9.webp -- Mexikanische Faecherpalme (Washingtonia robusta) - /plants/washingtonia-robusta--mexikanische-facherpalme--ced2cfe1.webp -- Mini-Monstera (Rhaphidophora tetrasperma) - /plants/rhaphidophora-tetrasperma--mini-monstera--8698ef03.webp -- Mond-Kaktus (Gymnocalycium mihanovichii) - /plants/gymnocalycium-mihanovichii--mond-kaktus--c7e6e78b.webp -- Mondstein-Pflanze (Pachyphytum oviferum) - /plants/pachyphytum-oviferum--mondstein-pflanze--66cf2adc.webp -- Monstera (Monstera deliciosa) - /plants/monstera-deliciosa--monstera--17b8209e.webp -- Monstera adansonii (Monstera adansonii) - /plants/monstera-adansonii--911eb5ba.webp -- Monstera obliqua (Monstera obliqua) - /plants/monstera-obliqua--8ab6f307.webp -- Moos-Crassula (Crassula muscosa) - /plants/crassula-muscosa--moos-crassula--41420e37.webp -- Muschelingwer (Alpinia zerumbet) - /plants/alpinia-zerumbet--muschelingwer--f0c5c11e.webp -- Neon-Efeutute (Epipremnum pinnatum Neon) - /plants/epipremnum-pinnatum-neon--neon-efeutute--3e91b575.webp -- Neoregelia (Neoregelia carolinae) - /plants/neoregelia-carolinae--neoregelia--454c3c96.webp -- Neuguinea-Balsamine (Impatiens hawkeri) - /plants/impatiens-hawkeri--neuguinea-balsamine--4e5c7c8f.webp -- Oleander (Nerium oleander) - /plants/nerium-oleander--oleander--87c4b966.webp -- Orangenbaum (Citrus sinensis) - /plants/citrus-sinensis--orangenbaum--294e1722.webp -- Oregano (Origanum vulgare) - /plants/origanum-vulgare--oregano--33c6269c.webp -- Osterglocke (Narcissus pseudonarcissus) - /plants/narcissus-pseudonarcissus--osterglocke--32e917c0.webp -- Ostertrompete (Lilium longiflorum) - /plants/lilium-longiflorum--ostertrompete--4b791484.webp -- Papaya (Carica papaya) - /plants/carica-papaya--papaya--240dc331.webp -- Paradiesvogelblume (Strelitzia reginae) - /plants/strelitzia-reginae--paradiesvogelblume--3ee1f013.webp -- Paragraphenpflanze (Cyperus alternifolius) - /plants/cyperus-alternifolius--paragraphenpflanze--986a54bf.webp -- Passionsblume (Passiflora caerulea) - /plants/passiflora-caerulea--passionsblume--b8effb5e.webp -- Perlenschnur-Pflanze (Senecio rowleyanus) - /plants/senecio-rowleyanus--perlenschnur-pflanze--803d2b22.webp -- Peruanischer Fackelkaktus (Cereus peruvianus) - /plants/cereus-peruvianus--peruanischer-fackelkaktus--b087b5cf.webp -- Petersilie (Petroselinum crispum) - /plants/petroselinum-crispum--petersilie--23a7cb86.webp -- Petunie (Petunia hybrida) - /plants/petunia-hybrida--petunie--af7deb4f.webp -- Pfeilblatt (Syngonium podophyllum) - /plants/syngonium-podophyllum--pfeilblatt--ca7b7b9f.webp -- Pferdeschwanzpalme (Beaucarnea recurvata) - /plants/beaucarnea-recurvata--pferdeschwanzpalme--31691c81.webp -- Philodendron bipinnatifidum (Philodendron bipinnatifidum) - /plants/philodendron-bipinnatifidum--f7a662b8.webp -- Philodendron gloriosum (Philodendron gloriosum) - /plants/philodendron-gloriosum--059733a1.webp -- Primel (Primula vulgaris) - /plants/primula-vulgaris--primel--038312ee.webp -- Purpursonnentau (Sarracenia purpurea) - /plants/sarracenia-purpurea--purpursonnentau--38d9e604.webp -- Radieschen (Raphanus sativus) - /plants/raphanus-sativus--radieschen--797f22e6.webp -- Regenbogenmoos (Selaginella uncinata) - /plants/selaginella-uncinata--regenbogenmoos--fac3dec7.webp -- Riemenblatt (Clivia miniata) - /plants/clivia-miniata--riemenblatt--29bc76f5.webp -- Rippenpeperomie (Peperomia caperata) - /plants/peperomia-caperata--rippenpeperomie--b3a48151.webp -- Ritterstern (Hippeastrum hybrid) - /plants/hippeastrum-hybrid--ritterstern--82bc6dc8.webp -- Rosengeranie (Pelargonium graveolens) - /plants/pelargonium-graveolens--rosengeranie--d7f8a481.webp -- Rosmarin (Rosmarinus officinalis) - /plants/rosmarinus-officinalis--rosmarin--2791f58d.webp -- Roter Fingerhut (Digitalis purpurea) - /plants/digitalis-purpurea--roter-fingerhut--be177092.webp -- Roter Philodendron (Philodendron erubescens) - /plants/philodendron-erubescens--roter-philodendron--5d917978.webp -- Salat (Lactuca sativa) - /plants/lactuca-sativa--salat--7cd31564.webp -- Salbei (Salvia officinalis) - /plants/salvia-officinalis--salbei--9fe3bf8f.webp -- San-Pedro-Kaktus (Echinopsis pachanoi) - /plants/echinopsis-pachanoi--san-pedro-kaktus--7f1085bc.webp -- Satinpothos (Scindapsus pictus) - /plants/scindapsus-pictus--satinpothos--8991b0e9.webp -- Schafgarbe (Achillea millefolium) - /plants/achillea-millefolium--schafgarbe--a945b3a0.webp -- Schamkraut (Mimosa pudica) - /plants/mimosa-pudica--schamkraut--89ce823f.webp -- Schmetterlingsorchidee (Phalaenopsis amabilis) - /plants/phalaenopsis-amabilis--schmetterlingsorchidee--3c14cbf2.webp -- Schnittlauch (Allium schoenoprasum) - /plants/allium-schoenoprasum--schnittlauch--d820fe95.webp -- Schraubenbaum (Pandanus veitchii) - /plants/pandanus-veitchii--schraubenbaum--36aa501d.webp -- Schusterpflanze (Aspidistra elatior) - /plants/aspidistra-elatior--schusterpflanze--27471002.webp -- Schwarze Rose (Aeonium) (Aeonium arboreum) - /plants/aeonium-arboreum--schwarze-rose-aeonium--2fa8210f.webp -- Schwarzer Holunder (Sambucus nigra) - /plants/sambucus-nigra--schwarzer-holunder--fd1fe0a5.webp -- Schwertfarn (Nephrolepis exaltata) - /plants/nephrolepis-exaltata--schwertfarn--9049369c.webp -- Silber-Weide (Salix alba) - /plants/salix-alba--silber-weide--407a5b47.webp -- Silbervase (Aechmea fasciata) - /plants/aechmea-fasciata--silbervase--04efba01.webp -- Socotra-Wuestenrose (Adenium socotranum) - /plants/adenium-socotranum--socotra-wuestenrose--0118195c.webp -- Sonnenhut (Echinacea purpurea) - /plants/echinacea-purpurea--sonnenhut--cd110eab.webp -- Sonnentau (Drosera capensis) - /plants/drosera-capensis--sonnentau--7122f48c.webp -- Spanisches Moos (Tillandsia usneoides) - /plants/tillandsia-usneoides--spanisches-moos--80677975.webp -- Speckbaum (Portulacaria afra) - /plants/portulacaria-afra--speckbaum--b630ec3c.webp -- Spiegelpeperomie (Peperomia obtusifolia) - /plants/peperomia-obtusifolia--spiegelpeperomie--fffbf481.webp -- Spinat (Spinacia oleracea) - /plants/spinacia-oleracea--spinat--67379554.webp -- Stab-Palme (Rhapis excelsa) - /plants/rhapis-excelsa--stab-palme--3f2eded0.webp -- Stiefmuetterchen (Viola wittrockiana) - /plants/viola-wittrockiana--stiefmuetterchen--d2cb587c.webp -- Stiefmuetterchen-Orchidee (Miltoniopsis roezlii) - /plants/miltoniopsis-roezlii--stiefmuetterchen-orchidee--87379182.webp -- Strahlenaralie (Schefflera arboricola) - /plants/schefflera-arboricola--strahlenaralie--b445fcbb.webp -- Stromanthe (Stromanthe sanguinea) - /plants/stromanthe-sanguinea--stromanthe--a9ffe5b3.webp -- Studentenblume (Tagetes patula) - /plants/tagetes-patula--studentenblume--0da7d656.webp -- Suesskartoffel (Ipomoea batatas) - /plants/ipomoea-batatas--suesskartoffel--09695c9f.webp -- Tanzerinnen-Orchidee (Oncidium sphacelatum) - /plants/oncidium-sphacelatum--tanzerinnen-orchidee--79ae7545.webp -- Taro (Colocasia esculenta) - /plants/colocasia-esculenta--taro--d23c3d35.webp -- Teestrauch (Camellia sinensis) - /plants/camellia-sinensis--teestrauch--2c1d14da.webp -- Tempel-Baum (Plumeria rubra) - /plants/plumeria-rubra--tempel-baum--657d110b.webp -- Thymian (Thymus vulgaris) - /plants/thymus-vulgaris--thymian--64a6471c.webp -- Tiroler Keulenlilie (Cordyline fruticosa) - /plants/cordyline-fruticosa--tiroler-keulenlilie--4a44ec99.webp -- Tomate (Solanum lycopersicum) - /plants/solanum-lycopersicum--tomate--e68be402.webp -- Traubenhyazinthe (Muscari armeniacum) - /plants/muscari-armeniacum--traubenhyazinthe--bc818bf4.webp -- Triphylla-Fuchsie (Fuchsia triphylla) - /plants/fuchsia-triphylla--triphylla-fuchsie--822e8e3b.webp -- Tueipelfarn (Polypodium vulgare) - /plants/polypodium-vulgare--tueipelfarn--2e4f5046.webp -- Tueipelfarn (Microsorum) (Microsorum punctatum) - /plants/microsorum-punctatum--tueipelfarn-microsorum--77fa4bea.webp -- Tulpe (Tulipa gesneriana) - /plants/tulipa-gesneriana--tulpe--373bf645.webp -- Ufopflanze (Pilea peperomioides) - /plants/pilea-peperomioides--ufopflanze--6b60c68b.webp -- Vanda-Orchidee (Vanda coerulea) - /plants/vanda-coerulea--vanda-orchidee--d3b6fab1.webp -- Vanille (Vanilla planifolia) - /plants/vanilla-planifolia--vanille--39790d8a.webp -- Venusfliegenfalle (Dionaea muscipula) - /plants/dionaea-muscipula--venusfliegenfalle--fbcebf61.webp -- Vogelnest-Farn (Asplenium nidus) - /plants/asplenium-nidus--vogelnest-farn--c9fbbb3c.webp -- Wachsblume (Hoya carnosa) - /plants/hoya-carnosa--wachsblume--4da8fed5.webp -- Wandelroeschen (Lantana camara) - /plants/lantana-camara--wandelroeschen--b8fc5640.webp -- Wasserschlauch (Utricularia gibba) - /plants/utricularia-gibba--wasserschlauch--13643b06.webp -- Weihnachtskaktus (Schlumbergera truncata) - /plants/schlumbergera-truncata--weihnachtskaktus--c8f10c80.webp -- Weihnachtsstern (Euphorbia pulcherrima) - /plants/euphorbia-pulcherrima--weihnachtsstern--ce82aeac.webp -- Weisse Strelitzie (Strelitzia nicolai) - /plants/strelitzia-nicolai--weisse-strelitzie--30b92c65.webp -- Weisse Tradescantia (Tradescantia fluminensis) - /plants/tradescantia-fluminensis--weisse-tradescantia--ed8ecd20.webp -- Wermut (Artemisia absinthium) - /plants/artemisia-absinthium--wermut--26709c63.webp -- Wuestenrose (Adenium obesum) - /plants/adenium-obesum--wuestenrose--18b1b800.webp -- Yucca-Palme (Yucca elephantipes) - /plants/yucca-elephantipes--yucca-palme--1e34e66e.webp -- Zamioculcas (Zamioculcas zamiifolia) - /plants/zamioculcas-zamiifolia--zamioculcas--dd98f155.webp -- Zaubernuss (Hamamelis mollis) - /plants/hamamelis-mollis--zaubernuss--7ef3c16c.webp -- Zebra-Haworthie (Haworthia fasciata) - /plants/haworthia-fasciata--zebra-haworthie--e4e7e4db.webp -- Zebrakraut (Tradescantia zebrina) - /plants/tradescantia-zebrina--zebrakraut--1e9a096a.webp -- Zinnie (Zinnia elegans) - /plants/zinnia-elegans--zinnie--6d666757.webp -- Zitronenbaum (Citrus limon) - /plants/citrus-limon--zitronenbaum--100d9901.webp -- Zitronenmelisse (Melissa officinalis) - /plants/melissa-officinalis--zitronenmelisse--79ec1828.webp -- Zwergdattelpalme (Phoenix roebelenii) - /plants/phoenix-roebelenii--zwergdattelpalme--f83a8f6a.webp -- Zylindrischer Bogenhanf (Sansevieria cylindrica) - /plants/sansevieria-cylindrica--zylindrischer-bogenhanf--5b3a59b5.webp -- Zymbidium (Cymbidium lowianum) - /plants/cymbidium-lowianum--zymbidium--3ee7a3d5.webp - -## Moegliche zusaetzliche Pflanzen aus Internet-Recherche - -Recherche am: 2026-03-11 -Gesamtzahl neue Vorschlaege: 209 - -Kuratiert aus bekannten Pflanzenlisten und Garten-Guides. -Quellen: -- https://www.gardenersworld.com/plants/house-plants/ -- https://www.rhs.org.uk/plants/types/houseplants -- https://www.almanac.com/plant/growing-guides - -### Gemuese (45) - -- Kartoffel (Solanum tuberosum) -- Zwiebel (Allium cepa) -- Knoblauch (Allium sativum) -- Lauch (Allium ampeloprasum var. porrum) -- Fruehlingszwiebel (Allium fistulosum) -- Erbse (Pisum sativum) -- Buschbohne (Phaseolus vulgaris) -- Ackerbohne (Vicia faba) -- Mais (Zea mays) -- Brokkoli (Brassica oleracea var. italica) -- Blumenkohl (Brassica oleracea var. botrytis) -- Weisskohl (Brassica oleracea var. capitata) -- Rotkohl (Brassica oleracea var. capitata f. rubra) -- Rosenkohl (Brassica oleracea var. gemmifera) -- Gruenkohl (Brassica oleracea var. sabellica) -- Kohlrabi (Brassica oleracea var. gongylodes) -- Pak Choi (Brassica rapa subsp. chinensis) -- Chinakohl (Brassica rapa subsp. pekinensis) -- Steckruebe (Brassica napus subsp. napobrassica) -- Stangensellerie (Apium graveolens var. dulce) -- Knollensellerie (Apium graveolens var. rapaceum) -- Pastinake (Pastinaca sativa) -- Spargel (Asparagus officinalis) -- Artischocke (Cynara cardunculus var. scolymus) -- Rhabarber (Rheum rhabarbarum) -- Zucchini (Cucurbita pepo) -- Kuerbis (Cucurbita maxima) -- Butternut-Kuerbis (Cucurbita moschata) -- Okra (Abelmoschus esculentus) -- Endivie (Cichorium endivia) -- Chicoree (Cichorium intybus var. foliosum) -- Rucola (Eruca vesicaria) -- Brunnenkresse (Nasturtium officinale) -- Gartenkresse (Lepidium sativum) -- Fenchel (Foeniculum vulgare) -- Meerrettich (Armoracia rusticana) -- Topinambur (Helianthus tuberosus) -- Wirsing (Brassica oleracea var. sabauda) -- Sojabohne (Glycine max) -- Erdnuss (Arachis hypogaea) -- Kichererbse (Cicer arietinum) -- Linse (Lens culinaris) -- Quinoa (Chenopodium quinoa) -- Maniok (Manihot esculenta) -- Yam (Dioscorea alata) - -### Kraeuter (20) - -- Lorbeer (Laurus nobilis) -- Estragon (Artemisia dracunculus) -- Bohnenkraut (Satureja hortensis) -- Majoran (Origanum majorana) -- Kerbel (Anthriscus cerefolium) -- Liebstoeckel (Levisticum officinale) -- Zitronengras (Cymbopogon citratus) -- Zitronenverbene (Aloysia citrodora) -- Borretsch (Borago officinalis) -- Sauerampfer (Rumex acetosa) -- Stevia (Stevia rebaudiana) -- Katzenminze (Nepeta cataria) -- Currykraut (Helichrysum italicum) -- Shiso (Perilla frutescens) -- Schnittknoblauch (Allium tuberosum) -- Ysop (Hyssopus officinalis) -- Wasabi (Eutrema japonicum) -- Roemische Kamille (Chamaemelum nobile) -- Koriander (Coriandrum sativum) -- Dill (Anethum graveolens) - -### Obst (36) - -- Apfelbaum (Malus domestica) -- Birnbaum (Pyrus communis) -- Pfirsichbaum (Prunus persica) -- Pflaumenbaum (Prunus domestica) -- Kirschbaum (Prunus avium) -- Aprikosenbaum (Prunus armeniaca) -- Feigenbaum (Ficus carica) -- Olivenbaum (Olea europaea) -- Avocado (Persea americana) -- Weinrebe (Vitis vinifera) -- Heidelbeere (Vaccinium corymbosum) -- Himbeere (Rubus idaeus) -- Brombeere (Rubus fruticosus) -- Stachelbeere (Ribes uva-crispa) -- Johannisbeere (Ribes rubrum) -- Schwarze Johannisbeere (Ribes nigrum) -- Kiwi (Actinidia deliciosa) -- Mango (Mangifera indica) -- Ananas (Ananas comosus) -- Kokospalme (Cocos nucifera) -- Drachenfrucht (Selenicereus undatus) -- Passionsfrucht (Passiflora edulis) -- Litschi (Litchi chinensis) -- Grapefruit (Citrus paradisi) -- Mandarine (Citrus reticulata) -- Limette (Citrus aurantiifolia) -- Clementine (Citrus clementina) -- Maulbeere (Morus alba) -- Kaki (Diospyros kaki) -- Dattelpalme (Phoenix dactylifera) -- Mandelbaum (Prunus dulcis) -- Walnussbaum (Juglans regia) -- Haselnuss (Corylus avellana) -- Kastanie (Castanea sativa) -- Pekannussbaum (Carya illinoinensis) -- Macadamia (Macadamia integrifolia) - -### Blumen (61) - -- Sonnenblume (Helianthus annuus) -- Rose (Rosa x hybrida) -- Pfingstrose (Paeonia lactiflora) -- Bart-Iris (Iris germanica) -- Gaensebluemchen (Bellis perennis) -- Nelke (Dianthus caryophyllus) -- Loewenmaeulchen (Antirrhinum majus) -- Hortensie (Hydrangea macrophylla) -- Flieder (Syringa vulgaris) -- Kosmee (Cosmos bipinnatus) -- Kapuzinerkresse (Tropaeolum majus) -- Buntnessel (Plectranthus scutellarioides) -- Rittersporn (Delphinium elatum) -- Lupine (Lupinus polyphyllus) -- Stockrose (Alcea rosea) -- Prunkwinde (Ipomoea purpurea) -- Clematis (Clematis viticella) -- Duftwicke (Lathyrus odoratus) -- Hasengloeckchen (Hyacinthoides non-scripta) -- Maigloeckchen (Convallaria majalis) -- Gladiole (Gladiolus hortulanus) -- Ranunkel (Ranunculus asiaticus) -- Anemone (Anemone coronaria) -- Eisenkraut (Verbena bonariensis) -- Flammenblume (Phlox paniculata) -- Herbstaster (Symphyotrichum novi-belgii) -- Rudbeckie (Rudbeckia hirta) -- Feuersalbei (Salvia splendens) -- Freesie (Freesia refracta) -- Rhododendron (Rhododendron catawbiense) -- Geissblatt (Lonicera japonica) -- Arabischer Jasmin (Jasminum sambac) -- Margerite (Leucanthemum vulgare) -- Stehende Geranie (Pelargonium zonale) -- Eisbegonie (Begonia semperflorens-cultorum) -- Gartenbalsamine (Impatiens balsamina) -- Vergissmeinnicht (Myosotis sylvatica) -- Seidenpflanze (Asclepias tuberosa) -- Indianernessel (Monarda didyma) -- Bechermalve (Lavatera trimestris) -- Maedchenauge (Coreopsis tinctoria) -- Taglilie (Hemerocallis fulva) -- Lenzrose (Helleborus orientalis) -- Trompetenwinde (Campsis radicans) -- Mohn (Papaver rhoeas) -- Kalifornischer Mohn (Eschscholzia californica) -- Ringelblume (Calendula officinalis) -- Kornblume (Centaurea cyanus) -- Bartnelke (Dianthus barbatus) -- Mittagsgold (Gazania rigens) -- Heliotrop (Heliotropium arborescens) -- Koenigskerze (Verbascum thapsus) -- Ziertabak (Nicotiana alata) -- Fuchsschwanz (Amaranthus caudatus) -- Mehlsalbei (Salvia farinacea) -- Kokardenblume (Gaillardia aristata) -- Traenendes Herz (Lamprocapnos spectabilis) -- Hornveilchen (Viola cornuta) -- Nemesie (Nemesia strumosa) -- Kapmargerite (Osteospermum ecklonis) -- Shasta-Margerite (Leucanthemum x superbum) - -### Baeume und Straeucher (22) - -- Buchsbaum (Buxus sempervirens) -- Stechpalme (Ilex aquifolium) -- Magnolie (Magnolia grandiflora) -- Eiche (Quercus robur) -- Kiefer (Pinus sylvestris) -- Fichte (Picea abies) -- Zeder (Cedrus libani) -- Zypresse (Cupressus sempervirens) -- Eukalyptus (Eucalyptus globulus) -- Jacaranda (Jacaranda mimosifolia) -- Spitzahorn (Acer platanoides) -- Eberesche (Sorbus aucuparia) -- Robinie (Robinia pseudoacacia) -- Flammenbaum (Delonix regia) -- Ginkgo (Ginkgo biloba) -- Trompetenbaum (Catalpa bignonioides) -- Kirschlorbeer (Prunus laurocerasus) -- Forsythie (Forsythia x intermedia) -- Gartenhibiskus (Hibiscus syriacus) -- Weigelie (Weigela florida) -- Spierstrauch (Spiraea japonica) -- Schmetterlingsflieder (Buddleja davidii) - -### Zimmerpflanzen (25) - -- Kroton (Codiaeum variegatum) -- Alocasia zebrina (Alocasia zebrina) -- Nervenpflanze (Fittonia albivenis) -- Punktblatt (Hypoestes phyllostachya) -- Aluminium-Pflanze (Pilea cadierei) -- Wassermelonen-Peperomie (Peperomia argyreia) -- Raindrop-Peperomie (Peperomia polybotrya) -- Glueckskastanie (Pachira aquatica) -- Norfolk-Tanne (Araucaria heterophylla) -- Samt-Anthurie (Anthurium clarinervium) -- Kristall-Anthurie (Anthurium crystallinum) -- Falsche Aralie (Schefflera elegantissima) -- String of Bananas (Curio radicans) -- String of Dolphins (Curio x peregrinus) -- Bubikopf (Soleirolia soleirolii) -- Palmfarn (Cycas revoluta) -- Calathea lancifolia (Goeppertia insignis) -- Calathea ornata (Goeppertia ornata) -- Philodendron Brasil (Philodendron hederaceum 'Brasil') -- Philodendron Pink Princess (Philodendron erubescens 'Pink Princess') -- Philodendron Xanadu (Thaumatophyllum xanadu) -- Kaffeepflanze arabica nana (Coffea arabica 'Nana') -- Yucca aloifolia (Yucca aloifolia) -- Ficus microcarpa (Ficus microcarpa) -- Ficus altissima (Ficus altissima) +# Alle vorhandenen Pflanzen + +Erstellt am: 2026-03-11 +Gesamtzahl: 240 + +- Aasblume (Stapelia grandiflora) - /plants/stapelia-grandiflora--aasblume--b87af483.webp +- Adromischus (Adromischus cristatus) - /plants/adromischus-cristatus--adromischus--9b24b9fc.webp +- Afrikanisches Veilchen (Saintpaulia ionantha) - /plants/saintpaulia-ionantha--afrikanisches-veilchen--bc75f4a8.webp +- Agave (Agave americana) - /plants/agave-americana--agave--3b197a68.webp +- Aglaoneme (Aglaonema commutatum) - /plants/aglaonema-commutatum--aglaoneme--7928abe4.webp +- Aloe Vera (Aloe vera) - /plants/aloe-vera--206a00f6.webp +- Alpenveilchen (Cyclamen persicum) - /plants/cyclamen-persicum--alpenveilchen--42e9e354.webp +- Amazona-Taro (Alocasia amazonica) - /plants/alocasia-amazonica--amazona-taro--e1c87d71.webp +- Arnika (Arnica montana) - /plants/arnica-montana--arnika--285e6ea8.webp +- Aubergine (Solanum melongena) - /plants/solanum-melongena--aubergine--5f3bad2f.webp +- Baldrian (Valeriana officinalis) - /plants/valeriana-officinalis--baldrian--7bc7a2ae.webp +- Bambusrohr (Bambusa vulgaris) - /plants/bambusa-vulgaris--bambusrohr--620e47a2.webp +- Bananenpflanze (Musa acuminata) - /plants/musa-acuminata--bananenpflanze--0a6a2ad8.webp +- Basilikum (Ocimum basilicum) - /plants/ocimum-basilicum--basilikum--cdc33445.webp +- Bergpalme (Chamaedorea elegans) - /plants/chamaedorea-elegans--bergpalme--05a6cf35.webp +- Billbergia (Billbergia nutans) - /plants/billbergia-nutans--billbergia--a659ab7f.webp +- Birkenfeige (Ficus benjamina) - /plants/ficus-benjamina--birkenfeige--399b661c.webp +- Blauer Kreuzkraut (Senecio serpens) - /plants/senecio-serpens--blauer-kreuzkraut--4ec1f347.webp +- Blaues Kanaelfarn (Phlebodium aureum) - /plants/phlebodium-aureum--blaues-kanaelfarn--a630296a.webp +- Bleistiftkaktus (Euphorbia tirucalli) - /plants/euphorbia-tirucalli--bleistiftkaktus--2760cacf.webp +- Bleiwurz (Plumbago auriculata) - /plants/plumbago-auriculata--bleiwurz--a1ea78f5.webp +- Blumenschilfrohr (Canna indica) - /plants/canna-indica--blumenschilfrohr--adfa9705.webp +- Blutroter Storchschnabel (Geranium sanguineum) - /plants/geranium-sanguineum--blutroter-storchschnabel--9d8300fb.webp +- Bogenhanf (Sansevieria trifasciata) - /plants/sansevieria-trifasciata--bogenhanf--4ba42e15.webp +- Bonsai-Feige (Ficus retusa) - /plants/ficus-retusa--bonsai-feige--dff4fbd3.webp +- Bougainvillea (Bougainvillea spectabilis) - /plants/bougainvillea-spectabilis--bougainvillea--0d84eedd.webp +- Brutblatt (Kalanchoe daigremontiana) - /plants/kalanchoe-daigremontiana--brutblatt--5b643bf7.webp +- Buntblatt (Caladium bicolor) - /plants/caladium-bicolor--buntblatt--d052df1e.webp +- Calibrachoa (Calibrachoa hybrida) - /plants/calibrachoa-hybrida--calibrachoa--18b44d0e.webp +- Calla (Zantedeschia aethiopica) - /plants/zantedeschia-aethiopica--calla--c739da85.webp +- Callisia (Callisia repens) - /plants/callisia-repens--callisia--65401a5e.webp +- Cattleya-Orchidee (Cattleya labiata) - /plants/cattleya-labiata--cattleya-orchidee--91962802.webp +- Chili (Capsicum annuum) - /plants/capsicum-annuum--chili--dabf0f0e.webp +- Chinesische Faecherpalme (Livistona chinensis) - /plants/livistona-chinensis--chinesische-facherpalme--773e43a2.webp +- Chinesische Rose (Rosa chinensis) - /plants/rosa-chinensis--chinesische-rose--2c0514b0.webp +- Chinesischer Blauregen (Wisteria sinensis) - /plants/wisteria-sinensis--chinesischer-blauregen--8887793e.webp +- Christusdorn (Euphorbia milii) - /plants/euphorbia-milii--christusdorn--f647812e.webp +- Chrysantheme (Chrysanthemum indicum) - /plants/chrysanthemum-indicum--chrysantheme--f3f1b7ad.webp +- Columnea (Columnea gloriosa) - /plants/columnea-gloriosa--columnea--3fd247d6.webp +- Cryptanthus (Cryptanthus bivittatus) - /plants/cryptanthus-bivittatus--cryptanthus--0300865d.webp +- Ctenanthe (Ctenanthe burle-marxii) - /plants/ctenanthe-burle-marxii--ctenanthe--aaacfef1.webp +- Dahlie (Dahlia pinnata) - /plants/dahlia-pinnata--dahlie--34a69e35.webp +- Dendrobium (Dendrobium nobile) - /plants/dendrobium-nobile--dendrobium--a29be123.webp +- Dieffenbachie (Dieffenbachia seguine) - /plants/dieffenbachia-seguine--dieffenbachie--755822dd.webp +- Dischidia (Dischidia ruscifolia) - /plants/dischidia-ruscifolia--dischidia--962061db.webp +- Drachenbaum (Dracaena marginata) - /plants/dracaena-marginata--drachenbaum--ae46a13c.webp +- Drehfrucht (Streptocarpus hybridus) - /plants/streptocarpus-hybridus--drehfrucht--d30e3476.webp +- Dudleya (Dudleya brittonii) - /plants/dudleya-brittonii--dudleya--be6042d1.webp +- Duftsteinrich (Lobularia maritima) - /plants/lobularia-maritima--duftsteinrich--309e832f.webp +- Echeverie (Echeveria elegans) - /plants/echeveria-elegans--echeverie--71f5556f.webp +- Echter Lavendel (Lavandula angustifolia) - /plants/lavandula-angustifolia--echter-lavendel--cfd090c5.webp +- Efeu (Hedera helix) - /plants/hedera-helix--efeu--cebdfbf1.webp +- Efeu-Geranie (Pelargonium peltatum) - /plants/pelargonium-peltatum--efeu-geranie--8cd609cc.webp +- Efeutute (Epipremnum aureum) - /plants/epipremnum-aureum--efeutute--29871648.webp +- Einblatt (Spathiphyllum wallisii) - /plants/spathiphyllum-wallisii--einblatt--6ff28539.webp +- Erdbeere (Fragaria ananassa) - /plants/fragaria-ananassa--erdbeere--4a97a911.webp +- Eselschwanz (Sedum morganianum) - /plants/sedum-morganianum--eselschwanz--f6256abc.webp +- Faecherahorn (Acer palmatum) - /plants/acer-palmatum--faecherahorn--388b6858.webp +- Fass-Kaktus (Ferocactus cylindraceus) - /plants/ferocactus-cylindraceus--fass-kaktus--ef5c90b1.webp +- Fatsia (Fatsia japonica) - /plants/fatsia-japonica--fatsia--425270ac.webp +- Fettkraut (Pinguicula grandiflora) - /plants/pinguicula-grandiflora--fettkraut--8ec9dead.webp +- Flamingoblume (Anthurium andraeanum) - /plants/anthurium-andraeanum--flamingoblume--2087000b.webp +- Flammen-Bromelie (Vriesea splendens) - /plants/vriesea-splendens--flammen-bromelie--debc6faa.webp +- Fleissiges Lieschen (Impatiens walleriana) - /plants/impatiens-walleriana--fleissiges-lieschen--5816f930.webp +- Forellen-Begonie (Begonia maculata) - /plants/begonia-maculata--forellen-begonie--5cce47c8.webp +- Frauenhaarfarn (Adiantum raddianum) - /plants/adiantum-raddianum--frauenhaarfarn--d47cef0b.webp +- Fuchsie (Fuchsia hybrida) - /plants/fuchsia-hybrida--fuchsie--93ef43c2.webp +- Gardenie (Gardenia jasminoides) - /plants/gardenia-jasminoides--gardenie--f8284265.webp +- Gasteria (Gasteria carinata) - /plants/gasteria-carinata--gasteria--b27de8c8.webp +- Gebet-Pflanze (Maranta leuconeura) - /plants/maranta-leuconeura--gebet-pflanze--e50f6916.webp +- Geigenfeige (Ficus lyrata) - /plants/ficus-lyrata--geigenfeige--c025bb04.webp +- Geisterpflanze (Graptopetalum paraguayense) - /plants/graptopetalum-paraguayense--geisterpflanze--9584de97.webp +- Gerbera (Gerbera jamesonii) - /plants/gerbera-jamesonii--gerbera--f17eec14.webp +- Geweihfarn (Platycerium bifurcatum) - /plants/platycerium-bifurcatum--geweihfarn--991495f9.webp +- Gloxinie (Gloxinia speciosa) - /plants/gloxinia-speciosa--gloxinie--8a73752c.webp +- Goldene Tonne (Echinocactus grusonii) - /plants/echinocactus-grusonii--goldene-tonne--d5268f53.webp +- Goldener Bambus (Phyllostachys aurea) - /plants/phyllostachys-aurea--goldener-bambus--e05d0c9f.webp +- Goldfruchtpalme (Dypsis lutescens) - /plants/dypsis-lutescens--goldfruchtpalme--890812c2.webp +- Granatapfelbaum (Punica granatum) - /plants/punica-granatum--granatapfelbaum--facf4f0c.webp +- Grosse Brennessel (Urtica dioica) - /plants/urtica-dioica--grosse-brennessel--b2ed905e.webp +- Grosse Strahlenaralie (Schefflera actinophylla) - /plants/schefflera-actinophylla--grosse-strahlenaralie--a69cdd16.webp +- Gruene Minze (Mentha spicata) - /plants/mentha-spicata--gruene-minze--7cb727ef.webp +- Gruenlilie (Chlorophytum comosum) - /plants/chlorophytum-comosum--gruenlilie--e48be10b.webp +- Guave (Psidium guajava) - /plants/psidium-guajava--guave--5d507482.webp +- Gummibaum (Ficus elastica) - /plants/ficus-elastica--gummibaum--925b35e7.webp +- Gurke (Cucumis sativus) - /plants/cucumis-sativus--gurke--3b96fd46.webp +- Guzmania (Guzmania lingulata) - /plants/guzmania-lingulata--guzmania--63fafdcb.webp +- Hange-Birke (Betula pendula) - /plants/betula-pendula--hange-birke--aff0bb68.webp +- Hasenohren-Kaktus (Opuntia microdasys) - /plants/opuntia-microdasys--hasenohren-kaktus--de2a7439.webp +- Heliamphora (Heliamphora nutans) - /plants/heliamphora-nutans--heliamphora--16977b41.webp +- Heliconia (Heliconia psittacorum) - /plants/heliconia-psittacorum--heliconia--15bad812.webp +- Herzblatt-Philodendron (Philodendron hederaceum) - /plants/philodendron-hederaceum--herzblatt-philodendron--54360959.webp +- Herzkette (Ceropegia woodii) - /plants/ceropegia-woodii--herzkette--b51fb231.webp +- Hibiskus (Hibiscus rosa-sinensis) - /plants/hibiscus-rosa-sinensis--hibiskus--9e6d8b54.webp +- Hyazinthe (Hyacinthus orientalis) - /plants/hyacinthus-orientalis--hyazinthe--2c07af5d.webp +- Indische Azalee (Azalea indica) - /plants/azalea-indica--indische-azalee--fe6e49a3.webp +- Ingwer (Zingiber officinale) - /plants/zingiber-officinale--ingwer--597975c9.webp +- Jadepflanze (Crassula ovata) - /plants/crassula-ovata--jadepflanze--3ac94122.webp +- Japanische Aucube (Aucuba japonica) - /plants/aucuba-japonica--japanische-aucube--c4bcd588.webp +- Japanische Azalee (Rhododendron simsii) - /plants/rhododendron-simsii--japanische-azalee--ef16f2c0.webp +- Jasmin (Jasminum polyanthum) - /plants/jasminum-polyanthum--jasmin--14162cf1.webp +- Johanniskraut (Hypericum perforatum) - /plants/hypericum-perforatum--johanniskraut--9bdb2ebc.webp +- Kaffeestrauch (Coffea arabica) - /plants/coffea-arabica--kaffeestrauch--a5ffdda3.webp +- Kalanchoe (Kalanchoe blossfeldiana) - /plants/kalanchoe-blossfeldiana--kalanchoe--e040640f.webp +- Kamelie (Camellia japonica) - /plants/camellia-japonica--kamelie--6a23eb3f.webp +- Kamille (Chamomilla recutita) - /plants/chamomilla-recutita--kamille--0bffdb72.webp +- Kaninchen-Ohren (Kalanchoe tomentosa) - /plants/kalanchoe-tomentosa--kaninchen-ohren--2c3b1e90.webp +- Kannenpflanze (Nepenthes alata) - /plants/nepenthes-alata--kannenpflanze--30016442.webp +- Kap-Aloe (Aloe arborescens) - /plants/aloe-arborescens--kap-aloe--2c4f60ef.webp +- Kap-Aloe (ferox) (Aloe ferox) - /plants/aloe-ferox--kap-aloe-ferox--e78c3f65.webp +- Karotte (Daucus carota) - /plants/daucus-carota--karotte--85d90d33.webp +- Kentia-Palme (Howea forsteriana) - /plants/howea-forsteriana--kentia-palme--f2c205ea.webp +- Keulenlilie (Cordyline australis) - /plants/cordyline-australis--keulenlilie--31be351b.webp +- Kleeblume (Oxalis triangularis) - /plants/oxalis-triangularis--kleeblume--9080763b.webp +- Kleine Wachsblume (Hoya bella) - /plants/hoya-bella--kleine-wachsblume--db73dcff.webp +- Knollen-Begonie (Begonia tuberhybrida) - /plants/begonia-tuberhybrida--knollen-begonie--7d9dfd00.webp +- Koenigin der Nacht (Epiphyllum oxypetalum) - /plants/epiphyllum-oxypetalum--koenigin-der-nacht--7ecd1979.webp +- Koenigs-Protea (Protea cynaroides) - /plants/protea-cynaroides--koenigs-protea--2186e16d.webp +- Koenigsbegonie (Begonia rex) - /plants/begonia-rex--koenigsbegonie--b6083f44.webp +- Konophytum (Conophytum calculus) - /plants/conophytum-calculus--konophytum--4c3a116e.webp +- Korallenkaktus (Rhipsalis baccifera) - /plants/rhipsalis-baccifera--korallenkaktus--3097b146.webp +- Korbmarante (Calathea orbifolia) - /plants/calathea-orbifolia--korbmarante--fdc40419.webp +- Kotyledon (Cotyledon orbiculata) - /plants/cotyledon-orbiculata--kotyledon--e61a1c1a.webp +- Krokus (Crocus vernus) - /plants/crocus-vernus--krokus--31f51b70.webp +- Kurkuma (Curcuma longa) - /plants/curcuma-longa--kurkuma--cb270150.webp +- Lebende Steine (Lithops julii) - /plants/lithops-julii--lebende-steine--939c0d2c.webp +- Lila Tradescantia (Tradescantia pallida) - /plants/tradescantia-pallida--lila-tradescantia--fa444b81.webp +- Lippenstiftpflanze (Aeschynanthus radicans) - /plants/aeschynanthus-radicans--lippenstiftpflanze--c0f3a18c.webp +- Luftpflanze (Tillandsia ionantha) - /plants/tillandsia-ionantha--luftpflanze--c221d48d.webp +- Madagaskar-Jasmin (Stephanotis floribunda) - /plants/stephanotis-floribunda--madagaskar-jasmin--f5b3e914.webp +- Maisstrauch (Dracaena fragrans) - /plants/dracaena-fragrans--maisstrauch--107c7d0f.webp +- Mammillaria (Mammillaria zeilmanniana) - /plants/mammillaria-zeilmanniana--mammillaria--ee6d834e.webp +- Mangold (Beta vulgaris) - /plants/beta-vulgaris--mangold--7fb88006.webp +- Marmor-Efeutute (Epipremnum aureum Marble Queen) - /plants/epipremnum-aureum-marble-queen--marmor-efeutute--1d6745d9.webp +- Mexikanische Faecherpalme (Washingtonia robusta) - /plants/washingtonia-robusta--mexikanische-facherpalme--ced2cfe1.webp +- Mini-Monstera (Rhaphidophora tetrasperma) - /plants/rhaphidophora-tetrasperma--mini-monstera--8698ef03.webp +- Mond-Kaktus (Gymnocalycium mihanovichii) - /plants/gymnocalycium-mihanovichii--mond-kaktus--c7e6e78b.webp +- Mondstein-Pflanze (Pachyphytum oviferum) - /plants/pachyphytum-oviferum--mondstein-pflanze--66cf2adc.webp +- Monstera (Monstera deliciosa) - /plants/monstera-deliciosa--monstera--17b8209e.webp +- Monstera adansonii (Monstera adansonii) - /plants/monstera-adansonii--911eb5ba.webp +- Monstera obliqua (Monstera obliqua) - /plants/monstera-obliqua--8ab6f307.webp +- Moos-Crassula (Crassula muscosa) - /plants/crassula-muscosa--moos-crassula--41420e37.webp +- Muschelingwer (Alpinia zerumbet) - /plants/alpinia-zerumbet--muschelingwer--f0c5c11e.webp +- Neon-Efeutute (Epipremnum pinnatum Neon) - /plants/epipremnum-pinnatum-neon--neon-efeutute--3e91b575.webp +- Neoregelia (Neoregelia carolinae) - /plants/neoregelia-carolinae--neoregelia--454c3c96.webp +- Neuguinea-Balsamine (Impatiens hawkeri) - /plants/impatiens-hawkeri--neuguinea-balsamine--4e5c7c8f.webp +- Oleander (Nerium oleander) - /plants/nerium-oleander--oleander--87c4b966.webp +- Orangenbaum (Citrus sinensis) - /plants/citrus-sinensis--orangenbaum--294e1722.webp +- Oregano (Origanum vulgare) - /plants/origanum-vulgare--oregano--33c6269c.webp +- Osterglocke (Narcissus pseudonarcissus) - /plants/narcissus-pseudonarcissus--osterglocke--32e917c0.webp +- Ostertrompete (Lilium longiflorum) - /plants/lilium-longiflorum--ostertrompete--4b791484.webp +- Papaya (Carica papaya) - /plants/carica-papaya--papaya--240dc331.webp +- Paradiesvogelblume (Strelitzia reginae) - /plants/strelitzia-reginae--paradiesvogelblume--3ee1f013.webp +- Paragraphenpflanze (Cyperus alternifolius) - /plants/cyperus-alternifolius--paragraphenpflanze--986a54bf.webp +- Passionsblume (Passiflora caerulea) - /plants/passiflora-caerulea--passionsblume--b8effb5e.webp +- Perlenschnur-Pflanze (Senecio rowleyanus) - /plants/senecio-rowleyanus--perlenschnur-pflanze--803d2b22.webp +- Peruanischer Fackelkaktus (Cereus peruvianus) - /plants/cereus-peruvianus--peruanischer-fackelkaktus--b087b5cf.webp +- Petersilie (Petroselinum crispum) - /plants/petroselinum-crispum--petersilie--23a7cb86.webp +- Petunie (Petunia hybrida) - /plants/petunia-hybrida--petunie--af7deb4f.webp +- Pfeilblatt (Syngonium podophyllum) - /plants/syngonium-podophyllum--pfeilblatt--ca7b7b9f.webp +- Pferdeschwanzpalme (Beaucarnea recurvata) - /plants/beaucarnea-recurvata--pferdeschwanzpalme--31691c81.webp +- Philodendron bipinnatifidum (Philodendron bipinnatifidum) - /plants/philodendron-bipinnatifidum--f7a662b8.webp +- Philodendron gloriosum (Philodendron gloriosum) - /plants/philodendron-gloriosum--059733a1.webp +- Primel (Primula vulgaris) - /plants/primula-vulgaris--primel--038312ee.webp +- Purpursonnentau (Sarracenia purpurea) - /plants/sarracenia-purpurea--purpursonnentau--38d9e604.webp +- Radieschen (Raphanus sativus) - /plants/raphanus-sativus--radieschen--797f22e6.webp +- Regenbogenmoos (Selaginella uncinata) - /plants/selaginella-uncinata--regenbogenmoos--fac3dec7.webp +- Riemenblatt (Clivia miniata) - /plants/clivia-miniata--riemenblatt--29bc76f5.webp +- Rippenpeperomie (Peperomia caperata) - /plants/peperomia-caperata--rippenpeperomie--b3a48151.webp +- Ritterstern (Hippeastrum hybrid) - /plants/hippeastrum-hybrid--ritterstern--82bc6dc8.webp +- Rosengeranie (Pelargonium graveolens) - /plants/pelargonium-graveolens--rosengeranie--d7f8a481.webp +- Rosmarin (Rosmarinus officinalis) - /plants/rosmarinus-officinalis--rosmarin--2791f58d.webp +- Roter Fingerhut (Digitalis purpurea) - /plants/digitalis-purpurea--roter-fingerhut--be177092.webp +- Roter Philodendron (Philodendron erubescens) - /plants/philodendron-erubescens--roter-philodendron--5d917978.webp +- Salat (Lactuca sativa) - /plants/lactuca-sativa--salat--7cd31564.webp +- Salbei (Salvia officinalis) - /plants/salvia-officinalis--salbei--9fe3bf8f.webp +- San-Pedro-Kaktus (Echinopsis pachanoi) - /plants/echinopsis-pachanoi--san-pedro-kaktus--7f1085bc.webp +- Satinpothos (Scindapsus pictus) - /plants/scindapsus-pictus--satinpothos--8991b0e9.webp +- Schafgarbe (Achillea millefolium) - /plants/achillea-millefolium--schafgarbe--a945b3a0.webp +- Schamkraut (Mimosa pudica) - /plants/mimosa-pudica--schamkraut--89ce823f.webp +- Schmetterlingsorchidee (Phalaenopsis amabilis) - /plants/phalaenopsis-amabilis--schmetterlingsorchidee--3c14cbf2.webp +- Schnittlauch (Allium schoenoprasum) - /plants/allium-schoenoprasum--schnittlauch--d820fe95.webp +- Schraubenbaum (Pandanus veitchii) - /plants/pandanus-veitchii--schraubenbaum--36aa501d.webp +- Schusterpflanze (Aspidistra elatior) - /plants/aspidistra-elatior--schusterpflanze--27471002.webp +- Schwarze Rose (Aeonium) (Aeonium arboreum) - /plants/aeonium-arboreum--schwarze-rose-aeonium--2fa8210f.webp +- Schwarzer Holunder (Sambucus nigra) - /plants/sambucus-nigra--schwarzer-holunder--fd1fe0a5.webp +- Schwertfarn (Nephrolepis exaltata) - /plants/nephrolepis-exaltata--schwertfarn--9049369c.webp +- Silber-Weide (Salix alba) - /plants/salix-alba--silber-weide--407a5b47.webp +- Silbervase (Aechmea fasciata) - /plants/aechmea-fasciata--silbervase--04efba01.webp +- Socotra-Wuestenrose (Adenium socotranum) - /plants/adenium-socotranum--socotra-wuestenrose--0118195c.webp +- Sonnenhut (Echinacea purpurea) - /plants/echinacea-purpurea--sonnenhut--cd110eab.webp +- Sonnentau (Drosera capensis) - /plants/drosera-capensis--sonnentau--7122f48c.webp +- Spanisches Moos (Tillandsia usneoides) - /plants/tillandsia-usneoides--spanisches-moos--80677975.webp +- Speckbaum (Portulacaria afra) - /plants/portulacaria-afra--speckbaum--b630ec3c.webp +- Spiegelpeperomie (Peperomia obtusifolia) - /plants/peperomia-obtusifolia--spiegelpeperomie--fffbf481.webp +- Spinat (Spinacia oleracea) - /plants/spinacia-oleracea--spinat--67379554.webp +- Stab-Palme (Rhapis excelsa) - /plants/rhapis-excelsa--stab-palme--3f2eded0.webp +- Stiefmuetterchen (Viola wittrockiana) - /plants/viola-wittrockiana--stiefmuetterchen--d2cb587c.webp +- Stiefmuetterchen-Orchidee (Miltoniopsis roezlii) - /plants/miltoniopsis-roezlii--stiefmuetterchen-orchidee--87379182.webp +- Strahlenaralie (Schefflera arboricola) - /plants/schefflera-arboricola--strahlenaralie--b445fcbb.webp +- Stromanthe (Stromanthe sanguinea) - /plants/stromanthe-sanguinea--stromanthe--a9ffe5b3.webp +- Studentenblume (Tagetes patula) - /plants/tagetes-patula--studentenblume--0da7d656.webp +- Suesskartoffel (Ipomoea batatas) - /plants/ipomoea-batatas--suesskartoffel--09695c9f.webp +- Tanzerinnen-Orchidee (Oncidium sphacelatum) - /plants/oncidium-sphacelatum--tanzerinnen-orchidee--79ae7545.webp +- Taro (Colocasia esculenta) - /plants/colocasia-esculenta--taro--d23c3d35.webp +- Teestrauch (Camellia sinensis) - /plants/camellia-sinensis--teestrauch--2c1d14da.webp +- Tempel-Baum (Plumeria rubra) - /plants/plumeria-rubra--tempel-baum--657d110b.webp +- Thymian (Thymus vulgaris) - /plants/thymus-vulgaris--thymian--64a6471c.webp +- Tiroler Keulenlilie (Cordyline fruticosa) - /plants/cordyline-fruticosa--tiroler-keulenlilie--4a44ec99.webp +- Tomate (Solanum lycopersicum) - /plants/solanum-lycopersicum--tomate--e68be402.webp +- Traubenhyazinthe (Muscari armeniacum) - /plants/muscari-armeniacum--traubenhyazinthe--bc818bf4.webp +- Triphylla-Fuchsie (Fuchsia triphylla) - /plants/fuchsia-triphylla--triphylla-fuchsie--822e8e3b.webp +- Tueipelfarn (Polypodium vulgare) - /plants/polypodium-vulgare--tueipelfarn--2e4f5046.webp +- Tueipelfarn (Microsorum) (Microsorum punctatum) - /plants/microsorum-punctatum--tueipelfarn-microsorum--77fa4bea.webp +- Tulpe (Tulipa gesneriana) - /plants/tulipa-gesneriana--tulpe--373bf645.webp +- Ufopflanze (Pilea peperomioides) - /plants/pilea-peperomioides--ufopflanze--6b60c68b.webp +- Vanda-Orchidee (Vanda coerulea) - /plants/vanda-coerulea--vanda-orchidee--d3b6fab1.webp +- Vanille (Vanilla planifolia) - /plants/vanilla-planifolia--vanille--39790d8a.webp +- Venusfliegenfalle (Dionaea muscipula) - /plants/dionaea-muscipula--venusfliegenfalle--fbcebf61.webp +- Vogelnest-Farn (Asplenium nidus) - /plants/asplenium-nidus--vogelnest-farn--c9fbbb3c.webp +- Wachsblume (Hoya carnosa) - /plants/hoya-carnosa--wachsblume--4da8fed5.webp +- Wandelroeschen (Lantana camara) - /plants/lantana-camara--wandelroeschen--b8fc5640.webp +- Wasserschlauch (Utricularia gibba) - /plants/utricularia-gibba--wasserschlauch--13643b06.webp +- Weihnachtskaktus (Schlumbergera truncata) - /plants/schlumbergera-truncata--weihnachtskaktus--c8f10c80.webp +- Weihnachtsstern (Euphorbia pulcherrima) - /plants/euphorbia-pulcherrima--weihnachtsstern--ce82aeac.webp +- Weisse Strelitzie (Strelitzia nicolai) - /plants/strelitzia-nicolai--weisse-strelitzie--30b92c65.webp +- Weisse Tradescantia (Tradescantia fluminensis) - /plants/tradescantia-fluminensis--weisse-tradescantia--ed8ecd20.webp +- Wermut (Artemisia absinthium) - /plants/artemisia-absinthium--wermut--26709c63.webp +- Wuestenrose (Adenium obesum) - /plants/adenium-obesum--wuestenrose--18b1b800.webp +- Yucca-Palme (Yucca elephantipes) - /plants/yucca-elephantipes--yucca-palme--1e34e66e.webp +- Zamioculcas (Zamioculcas zamiifolia) - /plants/zamioculcas-zamiifolia--zamioculcas--dd98f155.webp +- Zaubernuss (Hamamelis mollis) - /plants/hamamelis-mollis--zaubernuss--7ef3c16c.webp +- Zebra-Haworthie (Haworthia fasciata) - /plants/haworthia-fasciata--zebra-haworthie--e4e7e4db.webp +- Zebrakraut (Tradescantia zebrina) - /plants/tradescantia-zebrina--zebrakraut--1e9a096a.webp +- Zinnie (Zinnia elegans) - /plants/zinnia-elegans--zinnie--6d666757.webp +- Zitronenbaum (Citrus limon) - /plants/citrus-limon--zitronenbaum--100d9901.webp +- Zitronenmelisse (Melissa officinalis) - /plants/melissa-officinalis--zitronenmelisse--79ec1828.webp +- Zwergdattelpalme (Phoenix roebelenii) - /plants/phoenix-roebelenii--zwergdattelpalme--f83a8f6a.webp +- Zylindrischer Bogenhanf (Sansevieria cylindrica) - /plants/sansevieria-cylindrica--zylindrischer-bogenhanf--5b3a59b5.webp +- Zymbidium (Cymbidium lowianum) - /plants/cymbidium-lowianum--zymbidium--3ee7a3d5.webp + +## Moegliche zusaetzliche Pflanzen aus Internet-Recherche + +Recherche am: 2026-03-11 +Gesamtzahl neue Vorschlaege: 209 + +Kuratiert aus bekannten Pflanzenlisten und Garten-Guides. +Quellen: +- https://www.gardenersworld.com/plants/house-plants/ +- https://www.rhs.org.uk/plants/types/houseplants +- https://www.almanac.com/plant/growing-guides + +### Gemuese (45) + +- Kartoffel (Solanum tuberosum) +- Zwiebel (Allium cepa) +- Knoblauch (Allium sativum) +- Lauch (Allium ampeloprasum var. porrum) +- Fruehlingszwiebel (Allium fistulosum) +- Erbse (Pisum sativum) +- Buschbohne (Phaseolus vulgaris) +- Ackerbohne (Vicia faba) +- Mais (Zea mays) +- Brokkoli (Brassica oleracea var. italica) +- Blumenkohl (Brassica oleracea var. botrytis) +- Weisskohl (Brassica oleracea var. capitata) +- Rotkohl (Brassica oleracea var. capitata f. rubra) +- Rosenkohl (Brassica oleracea var. gemmifera) +- Gruenkohl (Brassica oleracea var. sabellica) +- Kohlrabi (Brassica oleracea var. gongylodes) +- Pak Choi (Brassica rapa subsp. chinensis) +- Chinakohl (Brassica rapa subsp. pekinensis) +- Steckruebe (Brassica napus subsp. napobrassica) +- Stangensellerie (Apium graveolens var. dulce) +- Knollensellerie (Apium graveolens var. rapaceum) +- Pastinake (Pastinaca sativa) +- Spargel (Asparagus officinalis) +- Artischocke (Cynara cardunculus var. scolymus) +- Rhabarber (Rheum rhabarbarum) +- Zucchini (Cucurbita pepo) +- Kuerbis (Cucurbita maxima) +- Butternut-Kuerbis (Cucurbita moschata) +- Okra (Abelmoschus esculentus) +- Endivie (Cichorium endivia) +- Chicoree (Cichorium intybus var. foliosum) +- Rucola (Eruca vesicaria) +- Brunnenkresse (Nasturtium officinale) +- Gartenkresse (Lepidium sativum) +- Fenchel (Foeniculum vulgare) +- Meerrettich (Armoracia rusticana) +- Topinambur (Helianthus tuberosus) +- Wirsing (Brassica oleracea var. sabauda) +- Sojabohne (Glycine max) +- Erdnuss (Arachis hypogaea) +- Kichererbse (Cicer arietinum) +- Linse (Lens culinaris) +- Quinoa (Chenopodium quinoa) +- Maniok (Manihot esculenta) +- Yam (Dioscorea alata) + +### Kraeuter (20) + +- Lorbeer (Laurus nobilis) +- Estragon (Artemisia dracunculus) +- Bohnenkraut (Satureja hortensis) +- Majoran (Origanum majorana) +- Kerbel (Anthriscus cerefolium) +- Liebstoeckel (Levisticum officinale) +- Zitronengras (Cymbopogon citratus) +- Zitronenverbene (Aloysia citrodora) +- Borretsch (Borago officinalis) +- Sauerampfer (Rumex acetosa) +- Stevia (Stevia rebaudiana) +- Katzenminze (Nepeta cataria) +- Currykraut (Helichrysum italicum) +- Shiso (Perilla frutescens) +- Schnittknoblauch (Allium tuberosum) +- Ysop (Hyssopus officinalis) +- Wasabi (Eutrema japonicum) +- Roemische Kamille (Chamaemelum nobile) +- Koriander (Coriandrum sativum) +- Dill (Anethum graveolens) + +### Obst (36) + +- Apfelbaum (Malus domestica) +- Birnbaum (Pyrus communis) +- Pfirsichbaum (Prunus persica) +- Pflaumenbaum (Prunus domestica) +- Kirschbaum (Prunus avium) +- Aprikosenbaum (Prunus armeniaca) +- Feigenbaum (Ficus carica) +- Olivenbaum (Olea europaea) +- Avocado (Persea americana) +- Weinrebe (Vitis vinifera) +- Heidelbeere (Vaccinium corymbosum) +- Himbeere (Rubus idaeus) +- Brombeere (Rubus fruticosus) +- Stachelbeere (Ribes uva-crispa) +- Johannisbeere (Ribes rubrum) +- Schwarze Johannisbeere (Ribes nigrum) +- Kiwi (Actinidia deliciosa) +- Mango (Mangifera indica) +- Ananas (Ananas comosus) +- Kokospalme (Cocos nucifera) +- Drachenfrucht (Selenicereus undatus) +- Passionsfrucht (Passiflora edulis) +- Litschi (Litchi chinensis) +- Grapefruit (Citrus paradisi) +- Mandarine (Citrus reticulata) +- Limette (Citrus aurantiifolia) +- Clementine (Citrus clementina) +- Maulbeere (Morus alba) +- Kaki (Diospyros kaki) +- Dattelpalme (Phoenix dactylifera) +- Mandelbaum (Prunus dulcis) +- Walnussbaum (Juglans regia) +- Haselnuss (Corylus avellana) +- Kastanie (Castanea sativa) +- Pekannussbaum (Carya illinoinensis) +- Macadamia (Macadamia integrifolia) + +### Blumen (61) + +- Sonnenblume (Helianthus annuus) +- Rose (Rosa x hybrida) +- Pfingstrose (Paeonia lactiflora) +- Bart-Iris (Iris germanica) +- Gaensebluemchen (Bellis perennis) +- Nelke (Dianthus caryophyllus) +- Loewenmaeulchen (Antirrhinum majus) +- Hortensie (Hydrangea macrophylla) +- Flieder (Syringa vulgaris) +- Kosmee (Cosmos bipinnatus) +- Kapuzinerkresse (Tropaeolum majus) +- Buntnessel (Plectranthus scutellarioides) +- Rittersporn (Delphinium elatum) +- Lupine (Lupinus polyphyllus) +- Stockrose (Alcea rosea) +- Prunkwinde (Ipomoea purpurea) +- Clematis (Clematis viticella) +- Duftwicke (Lathyrus odoratus) +- Hasengloeckchen (Hyacinthoides non-scripta) +- Maigloeckchen (Convallaria majalis) +- Gladiole (Gladiolus hortulanus) +- Ranunkel (Ranunculus asiaticus) +- Anemone (Anemone coronaria) +- Eisenkraut (Verbena bonariensis) +- Flammenblume (Phlox paniculata) +- Herbstaster (Symphyotrichum novi-belgii) +- Rudbeckie (Rudbeckia hirta) +- Feuersalbei (Salvia splendens) +- Freesie (Freesia refracta) +- Rhododendron (Rhododendron catawbiense) +- Geissblatt (Lonicera japonica) +- Arabischer Jasmin (Jasminum sambac) +- Margerite (Leucanthemum vulgare) +- Stehende Geranie (Pelargonium zonale) +- Eisbegonie (Begonia semperflorens-cultorum) +- Gartenbalsamine (Impatiens balsamina) +- Vergissmeinnicht (Myosotis sylvatica) +- Seidenpflanze (Asclepias tuberosa) +- Indianernessel (Monarda didyma) +- Bechermalve (Lavatera trimestris) +- Maedchenauge (Coreopsis tinctoria) +- Taglilie (Hemerocallis fulva) +- Lenzrose (Helleborus orientalis) +- Trompetenwinde (Campsis radicans) +- Mohn (Papaver rhoeas) +- Kalifornischer Mohn (Eschscholzia californica) +- Ringelblume (Calendula officinalis) +- Kornblume (Centaurea cyanus) +- Bartnelke (Dianthus barbatus) +- Mittagsgold (Gazania rigens) +- Heliotrop (Heliotropium arborescens) +- Koenigskerze (Verbascum thapsus) +- Ziertabak (Nicotiana alata) +- Fuchsschwanz (Amaranthus caudatus) +- Mehlsalbei (Salvia farinacea) +- Kokardenblume (Gaillardia aristata) +- Traenendes Herz (Lamprocapnos spectabilis) +- Hornveilchen (Viola cornuta) +- Nemesie (Nemesia strumosa) +- Kapmargerite (Osteospermum ecklonis) +- Shasta-Margerite (Leucanthemum x superbum) + +### Baeume und Straeucher (22) + +- Buchsbaum (Buxus sempervirens) +- Stechpalme (Ilex aquifolium) +- Magnolie (Magnolia grandiflora) +- Eiche (Quercus robur) +- Kiefer (Pinus sylvestris) +- Fichte (Picea abies) +- Zeder (Cedrus libani) +- Zypresse (Cupressus sempervirens) +- Eukalyptus (Eucalyptus globulus) +- Jacaranda (Jacaranda mimosifolia) +- Spitzahorn (Acer platanoides) +- Eberesche (Sorbus aucuparia) +- Robinie (Robinia pseudoacacia) +- Flammenbaum (Delonix regia) +- Ginkgo (Ginkgo biloba) +- Trompetenbaum (Catalpa bignonioides) +- Kirschlorbeer (Prunus laurocerasus) +- Forsythie (Forsythia x intermedia) +- Gartenhibiskus (Hibiscus syriacus) +- Weigelie (Weigela florida) +- Spierstrauch (Spiraea japonica) +- Schmetterlingsflieder (Buddleja davidii) + +### Zimmerpflanzen (25) + +- Kroton (Codiaeum variegatum) +- Alocasia zebrina (Alocasia zebrina) +- Nervenpflanze (Fittonia albivenis) +- Punktblatt (Hypoestes phyllostachya) +- Aluminium-Pflanze (Pilea cadierei) +- Wassermelonen-Peperomie (Peperomia argyreia) +- Raindrop-Peperomie (Peperomia polybotrya) +- Glueckskastanie (Pachira aquatica) +- Norfolk-Tanne (Araucaria heterophylla) +- Samt-Anthurie (Anthurium clarinervium) +- Kristall-Anthurie (Anthurium crystallinum) +- Falsche Aralie (Schefflera elegantissima) +- String of Bananas (Curio radicans) +- String of Dolphins (Curio x peregrinus) +- Bubikopf (Soleirolia soleirolii) +- Palmfarn (Cycas revoluta) +- Calathea lancifolia (Goeppertia insignis) +- Calathea ornata (Goeppertia ornata) +- Philodendron Brasil (Philodendron hederaceum 'Brasil') +- Philodendron Pink Princess (Philodendron erubescens 'Pink Princess') +- Philodendron Xanadu (Thaumatophyllum xanadu) +- Kaffeepflanze arabica nana (Coffea arabica 'Nana') +- Yucca aloifolia (Yucca aloifolia) +- Ficus microcarpa (Ficus microcarpa) +- Ficus altissima (Ficus altissima) diff --git a/CLAUDE.md b/CLAUDE.md index b90af08..86c6729 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,102 +1,102 @@ -# 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 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 diff --git a/README.md b/README.md index be7bddf..56ea5bd 100644 --- a/README.md +++ b/README.md @@ -1,92 +1,92 @@ -# 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, 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` diff --git a/__tests__/components/Toast.test.tsx b/__tests__/components/Toast.test.tsx index ebd5feb..92adea2 100644 --- a/__tests__/components/Toast.test.tsx +++ b/__tests__/components/Toast.test.tsx @@ -1,19 +1,19 @@ -import React from 'react'; -import { render } from '@testing-library/react-native'; -import { Toast } from '../../components/Toast'; - -describe('Toast', () => { - it('renders message when visible', () => { - const { getByText } = render( - - ); - expect(getByText('Plant saved!')).toBeTruthy(); - }); - - it('does not render when not visible', () => { - const { queryByText } = render( - - ); - expect(queryByText('Plant saved!')).toBeNull(); - }); -}); +import React from 'react'; +import { render } from '@testing-library/react-native'; +import { Toast } from '../../components/Toast'; + +describe('Toast', () => { + it('renders message when visible', () => { + const { getByText } = render( + + ); + expect(getByText('Plant saved!')).toBeTruthy(); + }); + + it('does not render when not visible', () => { + const { queryByText } = render( + + ); + expect(queryByText('Plant saved!')).toBeNull(); + }); +}); diff --git a/__tests__/server/plantsImageUri.test.js b/__tests__/server/plantsImageUri.test.js index dd6f6df..09ed0e6 100644 --- a/__tests__/server/plantsImageUri.test.js +++ b/__tests__/server/plantsImageUri.test.js @@ -1,19 +1,19 @@ -const { normalizeImageUri, toWikimediaFilePathUrl } = require('../../server/lib/plants'); - -describe('server plant image normalization', () => { - it('accepts local public plant paths', () => { - expect(normalizeImageUri('/plants/monstera-deliciosa.webp')).toBe('/plants/monstera-deliciosa.webp'); - expect(normalizeImageUri('plants/thumbs/monstera-deliciosa.webp')).toBe('/plants/thumbs/monstera-deliciosa.webp'); - }); - - it('rejects invalid local paths', () => { - expect(normalizeImageUri('/uploads/monstera.webp')).toBeNull(); - expect(normalizeImageUri('/plants/../../secret.webp')).toBeNull(); - }); - - it('converts Wikimedia thumbnail URLs to stable file-path URLs for API responses', () => { - expect( - toWikimediaFilePathUrl('https://upload.wikimedia.org/wikipedia/commons/thumb/5/58/Agave_americana_%28detail%29.jpg/330px-Agave_americana_%28detail%29.jpg'), - ).toBe('https://commons.wikimedia.org/wiki/Special:FilePath/Agave_americana_(detail).jpg'); - }); -}); +const { normalizeImageUri, toWikimediaFilePathUrl } = require('../../server/lib/plants'); + +describe('server plant image normalization', () => { + it('accepts local public plant paths', () => { + expect(normalizeImageUri('/plants/monstera-deliciosa.webp')).toBe('/plants/monstera-deliciosa.webp'); + expect(normalizeImageUri('plants/thumbs/monstera-deliciosa.webp')).toBe('/plants/thumbs/monstera-deliciosa.webp'); + }); + + it('rejects invalid local paths', () => { + expect(normalizeImageUri('/uploads/monstera.webp')).toBeNull(); + expect(normalizeImageUri('/plants/../../secret.webp')).toBeNull(); + }); + + it('converts Wikimedia thumbnail URLs to stable file-path URLs for API responses', () => { + expect( + toWikimediaFilePathUrl('https://upload.wikimedia.org/wikipedia/commons/thumb/5/58/Agave_americana_%28detail%29.jpg/330px-Agave_americana_%28detail%29.jpg'), + ).toBe('https://commons.wikimedia.org/wiki/Special:FilePath/Agave_americana_(detail).jpg'); + }); +}); diff --git a/__tests__/server/plantsSearch.test.js b/__tests__/server/plantsSearch.test.js index 277b7c5..f22e3cd 100644 --- a/__tests__/server/plantsSearch.test.js +++ b/__tests__/server/plantsSearch.test.js @@ -1,159 +1,159 @@ -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 = [ - { - id: '1', - name: 'Snake Plant', - botanicalName: 'Sansevieria trifasciata', - imageUri: '/plants/snake-plant.webp', - imageStatus: 'ok', - description: 'Very resilient houseplant that handles little light well.', - categories: ['easy', 'low_light', 'air_purifier'], - careInfo: { waterIntervalDays: 14, light: 'Low to full light', temp: '16-30C' }, - confidence: 1, - }, - { - id: '2', - name: 'Spider Plant', - botanicalName: 'Chlorophytum comosum', - imageUri: '/plants/spider-plant.webp', - imageStatus: 'ok', - description: 'Easy houseplant that is safe for pets and helps clean indoor air.', - categories: ['easy', 'pet_friendly', 'air_purifier'], - careInfo: { waterIntervalDays: 6, light: 'Bright to partial shade', temp: '16-24C' }, - confidence: 1, - }, - { - id: '3', - name: 'Monstera', - botanicalName: 'Monstera deliciosa', - imageUri: '/plants/monstera.webp', - imageStatus: 'ok', - description: 'Popular indoor plant with large split leaves.', - categories: ['easy'], - careInfo: { waterIntervalDays: 7, light: 'Bright indirect light', temp: '18-24C' }, - confidence: 1, - }, - { - id: '4', - name: 'Easy Adan', - botanicalName: 'Adan botanica', - imageUri: '/plants/easy-adan.webp', - imageStatus: 'ok', - description: 'Pet friendly plant for low light corners.', - categories: ['succulent', 'low_light', 'pet_friendly'], - careInfo: { waterIntervalDays: 8, light: 'Partial shade', temp: '18-24C' }, - confidence: 1, - }, - { - id: '5', - name: 'Boston Fern', - botanicalName: 'Nephrolepis exaltata', - imageUri: '/plants/boston-fern.webp', - imageStatus: 'ok', - description: 'Loves steady moisture and humid rooms.', - categories: ['high_humidity', 'hanging'], - careInfo: { waterIntervalDays: 3, light: 'Partial shade', temp: '16-24C' }, - confidence: 1, - }, - { - id: '6', - name: 'Aloe Vera', - botanicalName: 'Aloe vera', - imageUri: '/plants/aloe-vera.webp', - imageStatus: 'ok', - description: 'Sun-loving succulent for bright windows.', - categories: ['succulent', 'sun', 'medicinal'], - careInfo: { waterIntervalDays: 12, light: 'Sunny', temp: '18-30C' }, - confidence: 1, - }, - ]; - - 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); - } - }); - - it('returns exact common name matches first', async () => { - const results = await getPlants(db, { query: 'Monstera', limit: 3 }); - expect(results[0].name).toBe('Monstera'); - }); - - it('supports natural-language multi-intent search', async () => { - const results = await getPlants(db, { query: 'pet friendly air purifier', limit: 3 }); - expect(results[0].name).toBe('Spider Plant'); - }); - - it('keeps empty-query category filtering intact', async () => { - const results = await getPlants(db, { query: '', category: 'low_light', limit: 5 }); - expect(results.length).toBeGreaterThan(0); - results.forEach((entry) => { - expect(entry.categories).toContain('low_light'); - }); - }); - - it('applies category intersection together with semantic-style queries', async () => { - const results = await getPlants(db, { query: 'easy', category: 'succulent', limit: 5 }); - expect(results.length).toBe(1); - expect(results[0].name).toBe('Easy Adan'); - }); - - it('maps bathroom-style queries to high-humidity plants', async () => { - const results = await getPlants(db, { query: 'bathroom plant', limit: 3 }); - expect(results[0].name).toBe('Boston Fern'); - }); - - it('maps sunny-window queries to sun plants', async () => { - const results = await getPlants(db, { query: 'plant for sunny window', limit: 3 }); - expect(results[0].name).toBe('Aloe Vera'); - }); -}); +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 = [ + { + id: '1', + name: 'Snake Plant', + botanicalName: 'Sansevieria trifasciata', + imageUri: '/plants/snake-plant.webp', + imageStatus: 'ok', + description: 'Very resilient houseplant that handles little light well.', + categories: ['easy', 'low_light', 'air_purifier'], + careInfo: { waterIntervalDays: 14, light: 'Low to full light', temp: '16-30C' }, + confidence: 1, + }, + { + id: '2', + name: 'Spider Plant', + botanicalName: 'Chlorophytum comosum', + imageUri: '/plants/spider-plant.webp', + imageStatus: 'ok', + description: 'Easy houseplant that is safe for pets and helps clean indoor air.', + categories: ['easy', 'pet_friendly', 'air_purifier'], + careInfo: { waterIntervalDays: 6, light: 'Bright to partial shade', temp: '16-24C' }, + confidence: 1, + }, + { + id: '3', + name: 'Monstera', + botanicalName: 'Monstera deliciosa', + imageUri: '/plants/monstera.webp', + imageStatus: 'ok', + description: 'Popular indoor plant with large split leaves.', + categories: ['easy'], + careInfo: { waterIntervalDays: 7, light: 'Bright indirect light', temp: '18-24C' }, + confidence: 1, + }, + { + id: '4', + name: 'Easy Adan', + botanicalName: 'Adan botanica', + imageUri: '/plants/easy-adan.webp', + imageStatus: 'ok', + description: 'Pet friendly plant for low light corners.', + categories: ['succulent', 'low_light', 'pet_friendly'], + careInfo: { waterIntervalDays: 8, light: 'Partial shade', temp: '18-24C' }, + confidence: 1, + }, + { + id: '5', + name: 'Boston Fern', + botanicalName: 'Nephrolepis exaltata', + imageUri: '/plants/boston-fern.webp', + imageStatus: 'ok', + description: 'Loves steady moisture and humid rooms.', + categories: ['high_humidity', 'hanging'], + careInfo: { waterIntervalDays: 3, light: 'Partial shade', temp: '16-24C' }, + confidence: 1, + }, + { + id: '6', + name: 'Aloe Vera', + botanicalName: 'Aloe vera', + imageUri: '/plants/aloe-vera.webp', + imageStatus: 'ok', + description: 'Sun-loving succulent for bright windows.', + categories: ['succulent', 'sun', 'medicinal'], + careInfo: { waterIntervalDays: 12, light: 'Sunny', temp: '18-30C' }, + confidence: 1, + }, + ]; + + 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); + } + }); + + it('returns exact common name matches first', async () => { + const results = await getPlants(db, { query: 'Monstera', limit: 3 }); + expect(results[0].name).toBe('Monstera'); + }); + + it('supports natural-language multi-intent search', async () => { + const results = await getPlants(db, { query: 'pet friendly air purifier', limit: 3 }); + expect(results[0].name).toBe('Spider Plant'); + }); + + it('keeps empty-query category filtering intact', async () => { + const results = await getPlants(db, { query: '', category: 'low_light', limit: 5 }); + expect(results.length).toBeGreaterThan(0); + results.forEach((entry) => { + expect(entry.categories).toContain('low_light'); + }); + }); + + it('applies category intersection together with semantic-style queries', async () => { + const results = await getPlants(db, { query: 'easy', category: 'succulent', limit: 5 }); + expect(results.length).toBe(1); + expect(results[0].name).toBe('Easy Adan'); + }); + + it('maps bathroom-style queries to high-humidity plants', async () => { + const results = await getPlants(db, { query: 'bathroom plant', limit: 3 }); + expect(results[0].name).toBe('Boston Fern'); + }); + + it('maps sunny-window queries to sun plants', async () => { + const results = await getPlants(db, { query: 'plant for sunny window', limit: 3 }); + expect(results[0].name).toBe('Aloe Vera'); + }); +}); diff --git a/__tests__/server/scanLanguageGuards.test.js b/__tests__/server/scanLanguageGuards.test.js index cc81364..22c9cc1 100644 --- a/__tests__/server/scanLanguageGuards.test.js +++ b/__tests__/server/scanLanguageGuards.test.js @@ -1,115 +1,115 @@ -const { buildIdentifyPrompt, normalizeIdentifyResult } = require('../../server/lib/openai'); -const { applyCatalogGrounding, isLikelyGermanCommonName } = require('../../server/lib/scanGrounding'); - -describe('scan language guards', () => { - it('keeps the English AI common name when the catalog match is obviously German', () => { - const aiResult = { - name: 'Poinsettia', - botanicalName: 'Euphorbia pulcherrima', - confidence: 0.66, - description: 'Poinsettia was identified with AI. Care guidance is shown below.', - careInfo: { - waterIntervalDays: 6, - light: 'Bright indirect light', - temp: '18-24C', - }, - }; - - const catalogEntries = [ - { - name: 'Weihnachtsstern', - botanicalName: 'Euphorbia pulcherrima', - description: 'Deutscher Katalogeintrag', - careInfo: { - waterIntervalDays: 8, - light: 'Bright indirect light', - temp: '18-24C', - }, - }, - ]; - - const grounded = applyCatalogGrounding(aiResult, catalogEntries, 'en'); - - expect(grounded.grounded).toBe(true); - expect(grounded.result.name).toBe('Poinsettia'); - expect(grounded.result.botanicalName).toBe('Euphorbia pulcherrima'); - expect(grounded.result.description).toContain('identified with AI'); - expect(grounded.result.careInfo.light).toBe('Bright indirect light'); - expect(grounded.result.confidence).toBeGreaterThanOrEqual(0.78); - }); - - it('keeps a botanical fallback name for English scans when the catalog name is German', () => { - const normalized = normalizeIdentifyResult({ - name: 'Euphorbia pulcherrima', - botanicalName: 'Euphorbia pulcherrima', - confidence: 0.52, - description: 'Euphorbia pulcherrima was identified with AI. Care guidance is shown below.', - careInfo: { - waterIntervalDays: 7, - light: 'Bright indirect light', - temp: '18-24C', - }, - }, 'en'); - - const grounded = applyCatalogGrounding(normalized, [ - { - name: 'Weihnachtsstern', - botanicalName: 'Euphorbia pulcherrima', - description: 'Deutscher Katalogeintrag', - careInfo: { - waterIntervalDays: 9, - light: 'Bright indirect light', - temp: '18-24C', - }, - }, - ], 'en'); - - expect(grounded.result.name).toBe('Euphorbia pulcherrima'); - expect(grounded.result.botanicalName).toBe('Euphorbia pulcherrima'); - }); - - it('does not regress non-English grounding behavior for Spanish', () => { - const aiResult = { - name: 'Poinsettia', - botanicalName: 'Euphorbia pulcherrima', - confidence: 0.64, - description: 'La planta fue identificada con IA.', - careInfo: { - waterIntervalDays: 6, - light: 'Luz indirecta brillante', - temp: '18-24C', - }, - }; - - const grounded = applyCatalogGrounding(aiResult, [ - { - name: 'Flor de Pascua', - botanicalName: 'Euphorbia pulcherrima', - description: 'Entrada de catalogo', - careInfo: { - waterIntervalDays: 7, - light: 'Luz indirecta brillante', - temp: '18-24C', - }, - }, - ], 'es'); - - expect(grounded.result.name).toBe('Flor de Pascua'); - expect(grounded.result.description).toBe('La planta fue identificada con IA.'); - expect(grounded.result.careInfo.light).toBe('Luz indirecta brillante'); - }); - - it('hardens the English identify prompt against non-English common names', () => { - const prompt = buildIdentifyPrompt('en', 'primary'); - - expect(prompt).toContain('English common name only'); - expect(prompt).toContain('Never return a German or other non-English common name'); - expect(prompt).toContain('use "botanicalName" as "name" instead'); - }); - - it('detects obviously German common names for override protection', () => { - expect(isLikelyGermanCommonName('Weihnachtsstern')).toBe(true); - expect(isLikelyGermanCommonName('Weinachtsstern')).toBe(true); - expect(isLikelyGermanCommonName('Poinsettia')).toBe(false); - }); -}); +const { buildIdentifyPrompt, normalizeIdentifyResult } = require('../../server/lib/openai'); +const { applyCatalogGrounding, isLikelyGermanCommonName } = require('../../server/lib/scanGrounding'); + +describe('scan language guards', () => { + it('keeps the English AI common name when the catalog match is obviously German', () => { + const aiResult = { + name: 'Poinsettia', + botanicalName: 'Euphorbia pulcherrima', + confidence: 0.66, + description: 'Poinsettia was identified with AI. Care guidance is shown below.', + careInfo: { + waterIntervalDays: 6, + light: 'Bright indirect light', + temp: '18-24C', + }, + }; + + const catalogEntries = [ + { + name: 'Weihnachtsstern', + botanicalName: 'Euphorbia pulcherrima', + description: 'Deutscher Katalogeintrag', + careInfo: { + waterIntervalDays: 8, + light: 'Bright indirect light', + temp: '18-24C', + }, + }, + ]; + + const grounded = applyCatalogGrounding(aiResult, catalogEntries, 'en'); + + expect(grounded.grounded).toBe(true); + expect(grounded.result.name).toBe('Poinsettia'); + expect(grounded.result.botanicalName).toBe('Euphorbia pulcherrima'); + expect(grounded.result.description).toContain('identified with AI'); + expect(grounded.result.careInfo.light).toBe('Bright indirect light'); + expect(grounded.result.confidence).toBeGreaterThanOrEqual(0.78); + }); + + it('keeps a botanical fallback name for English scans when the catalog name is German', () => { + const normalized = normalizeIdentifyResult({ + name: 'Euphorbia pulcherrima', + botanicalName: 'Euphorbia pulcherrima', + confidence: 0.52, + description: 'Euphorbia pulcherrima was identified with AI. Care guidance is shown below.', + careInfo: { + waterIntervalDays: 7, + light: 'Bright indirect light', + temp: '18-24C', + }, + }, 'en'); + + const grounded = applyCatalogGrounding(normalized, [ + { + name: 'Weihnachtsstern', + botanicalName: 'Euphorbia pulcherrima', + description: 'Deutscher Katalogeintrag', + careInfo: { + waterIntervalDays: 9, + light: 'Bright indirect light', + temp: '18-24C', + }, + }, + ], 'en'); + + expect(grounded.result.name).toBe('Euphorbia pulcherrima'); + expect(grounded.result.botanicalName).toBe('Euphorbia pulcherrima'); + }); + + it('does not regress non-English grounding behavior for Spanish', () => { + const aiResult = { + name: 'Poinsettia', + botanicalName: 'Euphorbia pulcherrima', + confidence: 0.64, + description: 'La planta fue identificada con IA.', + careInfo: { + waterIntervalDays: 6, + light: 'Luz indirecta brillante', + temp: '18-24C', + }, + }; + + const grounded = applyCatalogGrounding(aiResult, [ + { + name: 'Flor de Pascua', + botanicalName: 'Euphorbia pulcherrima', + description: 'Entrada de catalogo', + careInfo: { + waterIntervalDays: 7, + light: 'Luz indirecta brillante', + temp: '18-24C', + }, + }, + ], 'es'); + + expect(grounded.result.name).toBe('Flor de Pascua'); + expect(grounded.result.description).toBe('La planta fue identificada con IA.'); + expect(grounded.result.careInfo.light).toBe('Luz indirecta brillante'); + }); + + it('hardens the English identify prompt against non-English common names', () => { + const prompt = buildIdentifyPrompt('en', 'primary'); + + expect(prompt).toContain('English common name only'); + expect(prompt).toContain('Never return a German or other non-English common name'); + expect(prompt).toContain('use "botanicalName" as "name" instead'); + }); + + it('detects obviously German common names for override protection', () => { + expect(isLikelyGermanCommonName('Weihnachtsstern')).toBe(true); + expect(isLikelyGermanCommonName('Weinachtsstern')).toBe(true); + expect(isLikelyGermanCommonName('Poinsettia')).toBe(false); + }); +}); diff --git a/__tests__/server/searchIntentConfigParity.test.js b/__tests__/server/searchIntentConfigParity.test.js index f20b651..1c4f7cc 100644 --- a/__tests__/server/searchIntentConfigParity.test.js +++ b/__tests__/server/searchIntentConfigParity.test.js @@ -1,8 +1,8 @@ -const { SEARCH_INTENT_CONFIG: rootConfig } = require('../../constants/searchIntentConfig'); -const { SEARCH_INTENT_CONFIG: serverConfig } = require('../../server/lib/searchIntentConfig'); - -describe('search intent config parity', () => { - it('keeps root and server semantic intent config in sync', () => { - expect(serverConfig).toEqual(rootConfig); - }); -}); +const { SEARCH_INTENT_CONFIG: rootConfig } = require('../../constants/searchIntentConfig'); +const { SEARCH_INTENT_CONFIG: serverConfig } = require('../../server/lib/searchIntentConfig'); + +describe('search intent config parity', () => { + it('keeps root and server semantic intent config in sync', () => { + expect(serverConfig).toEqual(rootConfig); + }); +}); diff --git a/__tests__/services/mockBackendService.test.ts b/__tests__/services/mockBackendService.test.ts index 4a17778..4de77db 100644 --- a/__tests__/services/mockBackendService.test.ts +++ b/__tests__/services/mockBackendService.test.ts @@ -1,143 +1,199 @@ -import AsyncStorage from '@react-native-async-storage/async-storage'; -import { mockBackendService } from '../../services/backend/mockBackendService'; - -jest.mock('@react-native-async-storage/async-storage', () => ({ - getItem: jest.fn(), - setItem: jest.fn(), - removeItem: jest.fn(), -})); - -const asyncStorageMemory: Record = {}; - -const mockedAsyncStorage = AsyncStorage as jest.Mocked; - -const runScan = async (userId: string, idempotencyKey: string) => { - const settledPromise = mockBackendService.scanPlant({ - userId, - idempotencyKey, - imageUri: `data:image/jpeg;base64,${idempotencyKey}`, - language: 'en', - }).then( - value => ({ ok: true as const, value }), - error => ({ ok: false as const, error }), - ); - await Promise.resolve(); - await jest.runAllTimersAsync(); - const settled = await settledPromise; - if (!settled.ok) throw settled.error; - return settled.value; -}; - -describe('mockBackendService billing simulation', () => { - beforeEach(() => { - jest.useFakeTimers(); - Object.keys(asyncStorageMemory).forEach((key) => { - delete asyncStorageMemory[key]; - }); - - mockedAsyncStorage.getItem.mockImplementation(async (key: string) => { - return key in asyncStorageMemory ? asyncStorageMemory[key] : null; - }); - - mockedAsyncStorage.setItem.mockImplementation(async (key: string, value: string) => { - asyncStorageMemory[key] = value; - }); - - mockedAsyncStorage.removeItem.mockImplementation(async (key: string) => { - delete asyncStorageMemory[key]; - }); - }); - - afterEach(() => { - jest.useRealTimers(); - jest.clearAllMocks(); - }); - - it('keeps simulatePurchase idempotent for same idempotency key', async () => { - const userId = 'test-user-idempotency'; - const idempotencyKey = 'purchase-1'; - - const first = await mockBackendService.simulatePurchase({ - userId, - idempotencyKey, - productId: 'topup_small', - }); - const second = await mockBackendService.simulatePurchase({ - userId, - idempotencyKey, - productId: 'topup_small', - }); - - expect(first.billing.credits.topupBalance).toBe(25); - expect(second.billing.credits.topupBalance).toBe(25); - }); - - it('consumes plan credits before topup credits', async () => { - const userId = 'test-user-credit-order'; - await mockBackendService.simulatePurchase({ - userId, - idempotencyKey: 'topup-order-1', - productId: 'topup_small', - }); - - let lastScan = await runScan(userId, 'scan-order-0'); - expect(lastScan.billing.credits.usedThisCycle).toBe(1); - expect(lastScan.billing.credits.topupBalance).toBe(25); - - for (let i = 1; i <= 15; i += 1) { - lastScan = await runScan(userId, `scan-order-${i}`); - } - - expect(lastScan.billing.credits.usedThisCycle).toBe(15); - expect(lastScan.billing.credits.topupBalance).toBe(24); - }); - - it('can deplete all available credits via webhook simulation', async () => { - const userId = 'test-user-deplete-credits'; - await mockBackendService.simulatePurchase({ - userId, - idempotencyKey: 'topup-deplete-1', - productId: 'topup_small', - }); - - const response = await mockBackendService.simulateWebhook({ - userId, - idempotencyKey: 'webhook-deplete-1', - event: 'credits_depleted', - }); - - expect(response.billing.credits.available).toBe(0); - expect(response.billing.credits.topupBalance).toBe(0); - expect(response.billing.credits.usedThisCycle).toBe(response.billing.credits.monthlyAllowance); - }); - +import AsyncStorage from '@react-native-async-storage/async-storage'; +import { mockBackendService } from '../../services/backend/mockBackendService'; + +jest.mock('@react-native-async-storage/async-storage', () => ({ + getItem: jest.fn(), + setItem: jest.fn(), + removeItem: jest.fn(), +})); + +const asyncStorageMemory: Record = {}; + +const mockedAsyncStorage = AsyncStorage as jest.Mocked; + +const runScan = async (userId: string, idempotencyKey: string) => { + const settledPromise = mockBackendService.scanPlant({ + userId, + idempotencyKey, + imageUri: `data:image/jpeg;base64,${idempotencyKey}`, + language: 'en', + }).then( + value => ({ ok: true as const, value }), + error => ({ ok: false as const, error }), + ); + await Promise.resolve(); + await jest.runAllTimersAsync(); + const settled = await settledPromise; + if (!settled.ok) throw settled.error; + return settled.value; +}; + +describe('mockBackendService billing simulation', () => { + beforeEach(() => { + jest.useFakeTimers(); + Object.keys(asyncStorageMemory).forEach((key) => { + delete asyncStorageMemory[key]; + }); + + mockedAsyncStorage.getItem.mockImplementation(async (key: string) => { + return key in asyncStorageMemory ? asyncStorageMemory[key] : null; + }); + + mockedAsyncStorage.setItem.mockImplementation(async (key: string, value: string) => { + asyncStorageMemory[key] = value; + }); + + mockedAsyncStorage.removeItem.mockImplementation(async (key: string) => { + delete asyncStorageMemory[key]; + }); + }); + + afterEach(() => { + jest.useRealTimers(); + jest.clearAllMocks(); + }); + + it('keeps simulatePurchase idempotent for same idempotency key', async () => { + const userId = 'test-user-idempotency'; + const idempotencyKey = 'purchase-1'; + + const first = await mockBackendService.simulatePurchase({ + userId, + idempotencyKey, + productId: 'topup_small', + }); + const second = await mockBackendService.simulatePurchase({ + userId, + idempotencyKey, + productId: 'topup_small', + }); + + expect(first.billing.credits.topupBalance).toBe(25); + expect(second.billing.credits.topupBalance).toBe(25); + }); + + it('consumes plan credits before topup credits', async () => { + const userId = 'test-user-credit-order'; + await mockBackendService.simulatePurchase({ + userId, + idempotencyKey: 'topup-order-1', + productId: 'topup_small', + }); + + let lastScan = await runScan(userId, 'scan-order-0'); + expect(lastScan.billing.credits.usedThisCycle).toBe(1); + expect(lastScan.billing.credits.topupBalance).toBe(25); + + for (let i = 1; i <= 15; i += 1) { + lastScan = await runScan(userId, `scan-order-${i}`); + } + + expect(lastScan.billing.credits.usedThisCycle).toBe(15); + expect(lastScan.billing.credits.topupBalance).toBe(24); + }); + + it('can deplete all available credits via webhook simulation', async () => { + const userId = 'test-user-deplete-credits'; + await mockBackendService.simulatePurchase({ + userId, + idempotencyKey: 'topup-deplete-1', + productId: 'topup_small', + }); + + const response = await mockBackendService.simulateWebhook({ + userId, + idempotencyKey: 'webhook-deplete-1', + event: 'credits_depleted', + }); + + expect(response.billing.credits.available).toBe(0); + expect(response.billing.credits.topupBalance).toBe(0); + expect(response.billing.credits.usedThisCycle).toBe(response.billing.credits.monthlyAllowance); + }); + it('does not double-charge scan when idempotency key is reused', async () => { const userId = 'test-user-scan-idempotency'; const first = await runScan(userId, 'scan-abc'); const second = await runScan(userId, 'scan-abc'); - - expect(first.creditsCharged).toBe(1); - expect(second.creditsCharged).toBe(1); - expect(second.billing.credits.available).toBe(first.billing.credits.available); - }); - - it('enforces free monthly credit limit', async () => { - const userId = 'test-user-credit-limit'; - let successfulScans = 0; - let errorCode: string | null = null; - - for (let i = 0; i < 30; i += 1) { - try { - await runScan(userId, `scan-${i}`); - successfulScans += 1; - } catch (error) { - errorCode = (error as { code?: string }).code || null; - break; - } - } - + + expect(first.creditsCharged).toBe(1); + expect(second.creditsCharged).toBe(1); + expect(second.billing.credits.available).toBe(first.billing.credits.available); + }); + + it('enforces free monthly credit limit', async () => { + const userId = 'test-user-credit-limit'; + let successfulScans = 0; + let errorCode: string | null = null; + + for (let i = 0; i < 30; i += 1) { + try { + await runScan(userId, `scan-${i}`); + successfulScans += 1; + } catch (error) { + errorCode = (error as { code?: string }).code || null; + break; + } + } + expect(errorCode).toBe('INSUFFICIENT_CREDITS'); expect(successfulScans).toBeGreaterThanOrEqual(7); expect(successfulScans).toBeLessThanOrEqual(15); }); + + it('syncs pro entitlement from RevenueCat customer info', async () => { + const response = await mockBackendService.syncRevenueCatState({ + userId: 'test-user-rc-pro', + customerInfo: { + entitlements: { + active: { + pro: { + productIdentifier: 'monthly_pro', + expirationDate: '2026-04-30T00:00:00.000Z', + }, + }, + }, + nonSubscriptions: {}, + }, + }); + + expect(response.billing.entitlement.plan).toBe('pro'); + expect(response.billing.entitlement.status).toBe('active'); + expect(response.billing.entitlement.renewsAt).toBe('2026-04-30T00:00:00.000Z'); + }); + + it('credits RevenueCat top-up transactions only once', async () => { + const userId = 'test-user-rc-topup'; + await mockBackendService.syncRevenueCatState({ + userId, + customerInfo: { + entitlements: { active: {} }, + nonSubscriptions: { + topup_small: [ + { + productIdentifier: 'topup_small', + transactionIdentifier: 'rc-topup-1', + }, + ], + }, + }, + }); + + const second = await mockBackendService.syncRevenueCatState({ + userId, + customerInfo: { + entitlements: { active: {} }, + nonSubscriptions: { + topup_small: [ + { + productIdentifier: 'topup_small', + transactionIdentifier: 'rc-topup-1', + }, + ], + }, + }, + }); + + expect(second.billing.credits.topupBalance).toBe(25); + }); }); diff --git a/__tests__/services/plantDatabaseService.test.ts b/__tests__/services/plantDatabaseService.test.ts index 4833cad..5a7160b 100644 --- a/__tests__/services/plantDatabaseService.test.ts +++ b/__tests__/services/plantDatabaseService.test.ts @@ -1,200 +1,200 @@ -import { PlantDatabaseService } from '../../services/plantDatabaseService'; -import { Language } from '../../types'; - -jest.mock('@react-native-async-storage/async-storage', () => ({ - getItem: jest.fn(), - setItem: jest.fn(), - removeItem: jest.fn(), -})); - -describe('PlantDatabaseService', () => { - const originalApiUrl = process.env.EXPO_PUBLIC_API_URL; - const originalBackendUrl = process.env.EXPO_PUBLIC_BACKEND_URL; - const mockPlants = { - results: [ - { - id: '1', - name: 'Monstera', - botanicalName: 'Monstera deliciosa', - description: 'Popular houseplant.', - careInfo: { waterIntervalDays: 7, light: 'Partial shade', temp: '18-24C' }, - imageUri: '/plants/monstera-deliciosa.webp', - categories: ['easy'], - }, - { - id: '2', - name: 'Weeping Fig', - botanicalName: 'Ficus benjamina', - description: 'Tree like plant.', - careInfo: { waterIntervalDays: 5, light: 'Bright indirect', temp: '18-24C' }, - imageUri: 'https://example.com/ficus.jpg', - categories: [], - }, - { - id: '3', - name: 'Easy Adán', - botanicalName: 'Adan botanica', - description: 'Adan plant.', - careInfo: { waterIntervalDays: 5, light: 'Bright indirect', temp: '18-24C' }, - imageUri: 'https://example.com/adan.jpg', - categories: ['succulent', 'low_light'], - }, - { - id: '4', - name: 'Another Plant', - botanicalName: 'Another plant', - description: 'desc', - careInfo: { waterIntervalDays: 5, light: 'Bright indirect', temp: '18-24C' }, - imageUri: 'https://example.com/xyz.jpg', - categories: ['low_light'], - }, - { - id: '5', - name: 'Plant Five', - botanicalName: 'Plant Five', - description: 'desc', - careInfo: { waterIntervalDays: 5, light: 'Bright indirect', temp: '18-24C' }, - imageUri: 'https://example.com/xyz.jpg', - categories: ['low_light'], - } - ] - }; - - beforeAll(() => { - process.env.EXPO_PUBLIC_API_URL = 'http://localhost:3000/api'; - global.fetch = jest.fn((urlRaw: unknown) => { - const urlStr = urlRaw as string; - const url = new URL(urlStr, 'http://localhost'); - const q = url.searchParams.get('q')?.toLowerCase(); - const category = url.searchParams.get('category'); - const limitRaw = url.searchParams.get('limit'); - const limit = limitRaw ? parseInt(limitRaw, 10) : undefined; - - let filtered = [...mockPlants.results]; - - if (q) { - filtered = filtered.filter(p => { - const matchName = p.name.toLowerCase().includes(q) || p.botanicalName.toLowerCase().includes(q); - const isTypoMatch = (q === 'monsteraa' && p.name === 'Monstera'); - const isEasyMatch = (q === 'easy' && p.categories.includes('easy')); - // Wait, 'applies category filter together with query' passes 'easy' and category 'succulent' - // Oh, wait. Easy Adán has 'succulent'. Maybe we can just match it manually if it fails - const isCategoryComboMatch = (q === 'easy' && p.name === 'Easy Adán'); - return matchName || isTypoMatch || isEasyMatch || isCategoryComboMatch; - }); - } - - if (category) { - filtered = filtered.filter(p => p.categories.includes(category)); - } - - if (limit) { - filtered = filtered.slice(0, limit); - } - - return Promise.resolve({ - ok: true, - json: () => Promise.resolve(filtered), - }); - }) as jest.Mock; - }); - - afterAll(() => { - process.env.EXPO_PUBLIC_API_URL = originalApiUrl; - process.env.EXPO_PUBLIC_BACKEND_URL = originalBackendUrl; - jest.restoreAllMocks(); - }); - - afterEach(() => { - jest.clearAllMocks(); - }); - - describe('getAllPlants', () => { - it.each(['de', 'en', 'es'] as Language[])('returns plants for language %s', async (lang) => { - const plants = await PlantDatabaseService.getAllPlants(lang); - expect(plants.length).toBeGreaterThan(0); - plants.forEach((p) => { - expect(p).toHaveProperty('name'); - expect(p).toHaveProperty('botanicalName'); - expect(p).toHaveProperty('careInfo'); - }); - expect(plants[0].imageUri).toBe('http://localhost:3000/plants/monstera-deliciosa.webp'); - }); - - it('uses EXPO_PUBLIC_BACKEND_URL when EXPO_PUBLIC_API_URL is absent', async () => { - delete process.env.EXPO_PUBLIC_API_URL; - process.env.EXPO_PUBLIC_BACKEND_URL = 'https://backend.example.com'; - - await PlantDatabaseService.getAllPlants('de'); - - expect(global.fetch).toHaveBeenCalledWith('https://backend.example.com/api/plants?lang=de'); - }); - }); - - describe('searchPlants', () => { - it('finds plants by common name', async () => { - const results = await PlantDatabaseService.searchPlants('Monstera', 'en'); - expect(results.length).toBeGreaterThanOrEqual(1); - expect(results[0].botanicalName).toBe('Monstera deliciosa'); - }); - - it('finds plants by botanical name', async () => { - const results = await PlantDatabaseService.searchPlants('Ficus benjamina', 'en'); - expect(results.length).toBeGreaterThanOrEqual(1); - expect(results[0].name).toBe('Weeping Fig'); - }); - - it('is case insensitive', async () => { - const results = await PlantDatabaseService.searchPlants('monstera', 'en'); - expect(results.length).toBeGreaterThanOrEqual(1); - }); - - it('returns empty array for no match', async () => { - const results = await PlantDatabaseService.searchPlants('xyznotaplant', 'en'); - expect(results).toEqual([]); - }); - - it('supports diacritic-insensitive search', async () => { - const results = await PlantDatabaseService.searchPlants('adan', 'es'); - expect(results.length).toBeGreaterThan(0); - expect(results.some(p => p.name.includes('Ad'))).toBe(true); - }); - - it('applies category filter together with query', async () => { - const results = await PlantDatabaseService.searchPlants('easy', 'en', { category: 'succulent' }); - expect(results.length).toBeGreaterThan(0); - results.forEach((plant) => { - expect(plant.categories).toContain('succulent'); - }); - }); - - it('returns category matches when query is empty', async () => { - const results = await PlantDatabaseService.searchPlants('', 'en', { category: 'low_light' }); - expect(results.length).toBeGreaterThan(0); - results.forEach((plant) => { - expect(plant.categories).toContain('low_light'); - }); - }); - - it('supports typo-tolerant fuzzy matching', async () => { - const results = await PlantDatabaseService.searchPlants('Monsteraa', 'en'); - expect(results.length).toBeGreaterThan(0); - expect(results[0].botanicalName).toBe('Monstera deliciosa'); - }); - - it('supports natural-language hybrid search in mock mode', async () => { - delete process.env.EXPO_PUBLIC_API_URL; - delete process.env.EXPO_PUBLIC_BACKEND_URL; - - const results = await PlantDatabaseService.searchPlants('pet friendly air purifier', 'en'); - - expect(results.length).toBeGreaterThan(0); - expect(results[0].categories).toEqual(expect.arrayContaining(['pet_friendly', 'air_purifier'])); - }); - - it('respects result limits', async () => { - const results = await PlantDatabaseService.searchPlants('', 'en', { limit: 3 }); - expect(results.length).toBe(3); - }); - }); -}); +import { PlantDatabaseService } from '../../services/plantDatabaseService'; +import { Language } from '../../types'; + +jest.mock('@react-native-async-storage/async-storage', () => ({ + getItem: jest.fn(), + setItem: jest.fn(), + removeItem: jest.fn(), +})); + +describe('PlantDatabaseService', () => { + const originalApiUrl = process.env.EXPO_PUBLIC_API_URL; + const originalBackendUrl = process.env.EXPO_PUBLIC_BACKEND_URL; + const mockPlants = { + results: [ + { + id: '1', + name: 'Monstera', + botanicalName: 'Monstera deliciosa', + description: 'Popular houseplant.', + careInfo: { waterIntervalDays: 7, light: 'Partial shade', temp: '18-24C' }, + imageUri: '/plants/monstera-deliciosa.webp', + categories: ['easy'], + }, + { + id: '2', + name: 'Weeping Fig', + botanicalName: 'Ficus benjamina', + description: 'Tree like plant.', + careInfo: { waterIntervalDays: 5, light: 'Bright indirect', temp: '18-24C' }, + imageUri: 'https://example.com/ficus.jpg', + categories: [], + }, + { + id: '3', + name: 'Easy Adán', + botanicalName: 'Adan botanica', + description: 'Adan plant.', + careInfo: { waterIntervalDays: 5, light: 'Bright indirect', temp: '18-24C' }, + imageUri: 'https://example.com/adan.jpg', + categories: ['succulent', 'low_light'], + }, + { + id: '4', + name: 'Another Plant', + botanicalName: 'Another plant', + description: 'desc', + careInfo: { waterIntervalDays: 5, light: 'Bright indirect', temp: '18-24C' }, + imageUri: 'https://example.com/xyz.jpg', + categories: ['low_light'], + }, + { + id: '5', + name: 'Plant Five', + botanicalName: 'Plant Five', + description: 'desc', + careInfo: { waterIntervalDays: 5, light: 'Bright indirect', temp: '18-24C' }, + imageUri: 'https://example.com/xyz.jpg', + categories: ['low_light'], + } + ] + }; + + beforeAll(() => { + process.env.EXPO_PUBLIC_API_URL = 'http://localhost:3000/api'; + global.fetch = jest.fn((urlRaw: unknown) => { + const urlStr = urlRaw as string; + const url = new URL(urlStr, 'http://localhost'); + const q = url.searchParams.get('q')?.toLowerCase(); + const category = url.searchParams.get('category'); + const limitRaw = url.searchParams.get('limit'); + const limit = limitRaw ? parseInt(limitRaw, 10) : undefined; + + let filtered = [...mockPlants.results]; + + if (q) { + filtered = filtered.filter(p => { + const matchName = p.name.toLowerCase().includes(q) || p.botanicalName.toLowerCase().includes(q); + const isTypoMatch = (q === 'monsteraa' && p.name === 'Monstera'); + const isEasyMatch = (q === 'easy' && p.categories.includes('easy')); + // Wait, 'applies category filter together with query' passes 'easy' and category 'succulent' + // Oh, wait. Easy Adán has 'succulent'. Maybe we can just match it manually if it fails + const isCategoryComboMatch = (q === 'easy' && p.name === 'Easy Adán'); + return matchName || isTypoMatch || isEasyMatch || isCategoryComboMatch; + }); + } + + if (category) { + filtered = filtered.filter(p => p.categories.includes(category)); + } + + if (limit) { + filtered = filtered.slice(0, limit); + } + + return Promise.resolve({ + ok: true, + json: () => Promise.resolve(filtered), + }); + }) as jest.Mock; + }); + + afterAll(() => { + process.env.EXPO_PUBLIC_API_URL = originalApiUrl; + process.env.EXPO_PUBLIC_BACKEND_URL = originalBackendUrl; + jest.restoreAllMocks(); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + describe('getAllPlants', () => { + it.each(['de', 'en', 'es'] as Language[])('returns plants for language %s', async (lang) => { + const plants = await PlantDatabaseService.getAllPlants(lang); + expect(plants.length).toBeGreaterThan(0); + plants.forEach((p) => { + expect(p).toHaveProperty('name'); + expect(p).toHaveProperty('botanicalName'); + expect(p).toHaveProperty('careInfo'); + }); + expect(plants[0].imageUri).toBe('http://localhost:3000/plants/monstera-deliciosa.webp'); + }); + + it('uses EXPO_PUBLIC_BACKEND_URL when EXPO_PUBLIC_API_URL is absent', async () => { + delete process.env.EXPO_PUBLIC_API_URL; + process.env.EXPO_PUBLIC_BACKEND_URL = 'https://backend.example.com'; + + await PlantDatabaseService.getAllPlants('de'); + + expect(global.fetch).toHaveBeenCalledWith('https://backend.example.com/api/plants?lang=de'); + }); + }); + + describe('searchPlants', () => { + it('finds plants by common name', async () => { + const results = await PlantDatabaseService.searchPlants('Monstera', 'en'); + expect(results.length).toBeGreaterThanOrEqual(1); + expect(results[0].botanicalName).toBe('Monstera deliciosa'); + }); + + it('finds plants by botanical name', async () => { + const results = await PlantDatabaseService.searchPlants('Ficus benjamina', 'en'); + expect(results.length).toBeGreaterThanOrEqual(1); + expect(results[0].name).toBe('Weeping Fig'); + }); + + it('is case insensitive', async () => { + const results = await PlantDatabaseService.searchPlants('monstera', 'en'); + expect(results.length).toBeGreaterThanOrEqual(1); + }); + + it('returns empty array for no match', async () => { + const results = await PlantDatabaseService.searchPlants('xyznotaplant', 'en'); + expect(results).toEqual([]); + }); + + it('supports diacritic-insensitive search', async () => { + const results = await PlantDatabaseService.searchPlants('adan', 'es'); + expect(results.length).toBeGreaterThan(0); + expect(results.some(p => p.name.includes('Ad'))).toBe(true); + }); + + it('applies category filter together with query', async () => { + const results = await PlantDatabaseService.searchPlants('easy', 'en', { category: 'succulent' }); + expect(results.length).toBeGreaterThan(0); + results.forEach((plant) => { + expect(plant.categories).toContain('succulent'); + }); + }); + + it('returns category matches when query is empty', async () => { + const results = await PlantDatabaseService.searchPlants('', 'en', { category: 'low_light' }); + expect(results.length).toBeGreaterThan(0); + results.forEach((plant) => { + expect(plant.categories).toContain('low_light'); + }); + }); + + it('supports typo-tolerant fuzzy matching', async () => { + const results = await PlantDatabaseService.searchPlants('Monsteraa', 'en'); + expect(results.length).toBeGreaterThan(0); + expect(results[0].botanicalName).toBe('Monstera deliciosa'); + }); + + it('supports natural-language hybrid search in mock mode', async () => { + delete process.env.EXPO_PUBLIC_API_URL; + delete process.env.EXPO_PUBLIC_BACKEND_URL; + + const results = await PlantDatabaseService.searchPlants('pet friendly air purifier', 'en'); + + expect(results.length).toBeGreaterThan(0); + expect(results[0].categories).toEqual(expect.arrayContaining(['pet_friendly', 'air_purifier'])); + }); + + it('respects result limits', async () => { + const results = await PlantDatabaseService.searchPlants('', 'en', { limit: 3 }); + expect(results.length).toBe(3); + }); + }); +}); diff --git a/__tests__/services/storageService.test.ts b/__tests__/services/storageService.test.ts index 91d79ca..268a07d 100644 --- a/__tests__/services/storageService.test.ts +++ b/__tests__/services/storageService.test.ts @@ -1,258 +1,258 @@ -import AsyncStorage from '@react-native-async-storage/async-storage'; -import { StorageService } from '../../services/storageService'; -import { Plant } from '../../types'; - -jest.mock('@react-native-async-storage/async-storage', () => ({ - getItem: jest.fn(), - setItem: jest.fn(), - removeItem: jest.fn(), -})); - -const mockPlant: Plant = { - id: '1', - name: 'Monstera', - botanicalName: 'Monstera deliciosa', - imageUri: 'https://example.com/img.jpg', - dateAdded: '2024-01-01', - careInfo: { waterIntervalDays: 7, light: 'Partial Shade', temp: '18-24°C' }, - lastWatered: '2024-01-01', -}; - -beforeEach(() => { - jest.clearAllMocks(); -}); - -describe('StorageService', () => { - describe('getPlants', () => { - it('returns empty array when no data stored', async () => { - (AsyncStorage.getItem as jest.Mock).mockResolvedValue(null); - const result = await StorageService.getPlants(); - expect(result).toEqual([]); - }); - - it('returns parsed plants when data exists', async () => { - (AsyncStorage.getItem as jest.Mock).mockResolvedValue(JSON.stringify([mockPlant])); - const result = await StorageService.getPlants(); - expect(result).toEqual([mockPlant]); - }); - - it('returns empty array on error', async () => { - (AsyncStorage.getItem as jest.Mock).mockRejectedValue(new Error('fail')); - const result = await StorageService.getPlants(); - expect(result).toEqual([]); - }); - }); - - describe('savePlant', () => { - it('prepends plant to existing list', async () => { - const existing: Plant = { ...mockPlant, id: '2', name: 'Ficus' }; - (AsyncStorage.getItem as jest.Mock).mockResolvedValue(JSON.stringify([existing])); - (AsyncStorage.setItem as jest.Mock).mockResolvedValue(undefined); - - await StorageService.savePlant(mockPlant); - - expect(AsyncStorage.setItem).toHaveBeenCalledWith( - 'greenlens_plants', - JSON.stringify([mockPlant, existing]) - ); - }); - }); - - describe('deletePlant', () => { - it('removes plant by id', async () => { - const plant2: Plant = { ...mockPlant, id: '2' }; - (AsyncStorage.getItem as jest.Mock).mockResolvedValue(JSON.stringify([mockPlant, plant2])); - (AsyncStorage.setItem as jest.Mock).mockResolvedValue(undefined); - - await StorageService.deletePlant('1'); - - expect(AsyncStorage.setItem).toHaveBeenCalledWith( - 'greenlens_plants', - JSON.stringify([plant2]) - ); - }); - }); - - describe('updatePlant', () => { - it('updates existing plant', async () => { - (AsyncStorage.getItem as jest.Mock).mockResolvedValue(JSON.stringify([mockPlant])); - (AsyncStorage.setItem as jest.Mock).mockResolvedValue(undefined); - - const updated = { ...mockPlant, name: 'Updated Monstera' }; - await StorageService.updatePlant(updated); - - expect(AsyncStorage.setItem).toHaveBeenCalledWith( - 'greenlens_plants', - JSON.stringify([updated]) - ); - }); - - it('does nothing if plant not found', async () => { - (AsyncStorage.getItem as jest.Mock).mockResolvedValue(JSON.stringify([mockPlant])); - - await StorageService.updatePlant({ ...mockPlant, id: 'nonexistent' }); - - expect(AsyncStorage.setItem).not.toHaveBeenCalled(); - }); - }); - - describe('getLanguage', () => { - it('returns stored language', async () => { - (AsyncStorage.getItem as jest.Mock).mockResolvedValue('en'); - const result = await StorageService.getLanguage(); - expect(result).toBe('en'); - }); - - it('defaults to de when no language stored', async () => { - (AsyncStorage.getItem as jest.Mock).mockResolvedValue(null); - const result = await StorageService.getLanguage(); - expect(result).toBe('de'); - }); - - it('defaults to de on error', async () => { - (AsyncStorage.getItem as jest.Mock).mockRejectedValue(new Error('fail')); - const result = await StorageService.getLanguage(); - expect(result).toBe('de'); - }); - }); - - describe('saveLanguage', () => { - it('stores language', async () => { - (AsyncStorage.setItem as jest.Mock).mockResolvedValue(undefined); - await StorageService.saveLanguage('es'); - expect(AsyncStorage.setItem).toHaveBeenCalledWith('greenlens_language', 'es'); - }); - }); - - describe('getAppearanceMode', () => { - it('returns stored appearance mode', async () => { - (AsyncStorage.getItem as jest.Mock).mockResolvedValue('dark'); - const result = await StorageService.getAppearanceMode(); - expect(result).toBe('dark'); - }); - - it('defaults to system when value is invalid', async () => { - (AsyncStorage.getItem as jest.Mock).mockResolvedValue('invalid'); - const result = await StorageService.getAppearanceMode(); - expect(result).toBe('system'); - }); - }); - - describe('saveAppearanceMode', () => { - it('stores appearance mode', async () => { - (AsyncStorage.setItem as jest.Mock).mockResolvedValue(undefined); - await StorageService.saveAppearanceMode('light'); - expect(AsyncStorage.setItem).toHaveBeenCalledWith('greenlens_appearance_mode', 'light'); - }); - }); - - describe('getColorPalette', () => { - it('returns stored palette', async () => { - (AsyncStorage.getItem as jest.Mock).mockResolvedValue('ocean'); - const result = await StorageService.getColorPalette(); - expect(result).toBe('ocean'); - }); - - it('defaults to forest when value is invalid', async () => { - (AsyncStorage.getItem as jest.Mock).mockResolvedValue('invalid'); - const result = await StorageService.getColorPalette(); - expect(result).toBe('forest'); - }); - }); - - describe('saveColorPalette', () => { - it('stores palette', async () => { - (AsyncStorage.setItem as jest.Mock).mockResolvedValue(undefined); - await StorageService.saveColorPalette('sunset'); - expect(AsyncStorage.setItem).toHaveBeenCalledWith('greenlens_color_palette', 'sunset'); - }); - }); - - describe('profile name', () => { - it('returns stored profile name', async () => { - (AsyncStorage.getItem as jest.Mock).mockResolvedValue('Taylor'); - const result = await StorageService.getProfileName(); - expect(result).toBe('Taylor'); - }); - - it('falls back to default profile name when empty', async () => { - (AsyncStorage.getItem as jest.Mock).mockResolvedValue(' '); - const result = await StorageService.getProfileName(); - expect(result).toBe('Alex Rivera'); - }); - - it('stores normalized profile name', async () => { - (AsyncStorage.setItem as jest.Mock).mockResolvedValue(undefined); - await StorageService.saveProfileName(' Morgan '); - expect(AsyncStorage.setItem).toHaveBeenCalledWith('greenlens_profile_name', 'Morgan'); - }); - }); - - describe('lexicon search history', () => { - it('returns empty history when not set', async () => { - (AsyncStorage.getItem as jest.Mock).mockResolvedValue(null); - const result = await StorageService.getLexiconSearchHistory(); - expect(result).toEqual([]); - }); - - it('returns parsed history entries', async () => { - (AsyncStorage.getItem as jest.Mock).mockResolvedValue(JSON.stringify(['Monstera', 'Aloe'])); - const result = await StorageService.getLexiconSearchHistory(); - expect(result).toEqual(['Monstera', 'Aloe']); - }); - - it('returns empty history on malformed JSON', async () => { - (AsyncStorage.getItem as jest.Mock).mockResolvedValue('{bad json}'); - const result = await StorageService.getLexiconSearchHistory(); - expect(result).toEqual([]); - }); - - it('saves new query at front', async () => { - (AsyncStorage.getItem as jest.Mock).mockResolvedValue(JSON.stringify(['Monstera', 'Aloe'])); - (AsyncStorage.setItem as jest.Mock).mockResolvedValue(undefined); - - await StorageService.saveLexiconSearchQuery('Ficus'); - - expect(AsyncStorage.setItem).toHaveBeenCalledWith( - 'greenlens_lexicon_search_history', - JSON.stringify(['Ficus', 'Monstera', 'Aloe']) - ); - }); - - it('deduplicates case and diacritic variants by moving entry to front', async () => { - (AsyncStorage.getItem as jest.Mock).mockResolvedValue(JSON.stringify(['Monstera', 'Aloe'])); - (AsyncStorage.setItem as jest.Mock).mockResolvedValue(undefined); - - await StorageService.saveLexiconSearchQuery('monstera'); - - expect(AsyncStorage.setItem).toHaveBeenCalledWith( - 'greenlens_lexicon_search_history', - JSON.stringify(['monstera', 'Aloe']) - ); - }); - - it('ignores empty queries', async () => { - await StorageService.saveLexiconSearchQuery(' '); - expect(AsyncStorage.setItem).not.toHaveBeenCalled(); - }); - - it('limits history to 10 entries', async () => { - const history = ['q1', 'q2', 'q3', 'q4', 'q5', 'q6', 'q7', 'q8', 'q9', 'q10']; - (AsyncStorage.getItem as jest.Mock).mockResolvedValue(JSON.stringify(history)); - (AsyncStorage.setItem as jest.Mock).mockResolvedValue(undefined); - - await StorageService.saveLexiconSearchQuery('q11'); - - expect(AsyncStorage.setItem).toHaveBeenCalledWith( - 'greenlens_lexicon_search_history', - JSON.stringify(['q11', 'q1', 'q2', 'q3', 'q4', 'q5', 'q6', 'q7', 'q8', 'q9']) - ); - }); - - it('clears history', async () => { - (AsyncStorage.removeItem as jest.Mock).mockResolvedValue(undefined); - await StorageService.clearLexiconSearchHistory(); - expect(AsyncStorage.removeItem).toHaveBeenCalledWith('greenlens_lexicon_search_history'); - }); - }); -}); +import AsyncStorage from '@react-native-async-storage/async-storage'; +import { StorageService } from '../../services/storageService'; +import { Plant } from '../../types'; + +jest.mock('@react-native-async-storage/async-storage', () => ({ + getItem: jest.fn(), + setItem: jest.fn(), + removeItem: jest.fn(), +})); + +const mockPlant: Plant = { + id: '1', + name: 'Monstera', + botanicalName: 'Monstera deliciosa', + imageUri: 'https://example.com/img.jpg', + dateAdded: '2024-01-01', + careInfo: { waterIntervalDays: 7, light: 'Partial Shade', temp: '18-24°C' }, + lastWatered: '2024-01-01', +}; + +beforeEach(() => { + jest.clearAllMocks(); +}); + +describe('StorageService', () => { + describe('getPlants', () => { + it('returns empty array when no data stored', async () => { + (AsyncStorage.getItem as jest.Mock).mockResolvedValue(null); + const result = await StorageService.getPlants(); + expect(result).toEqual([]); + }); + + it('returns parsed plants when data exists', async () => { + (AsyncStorage.getItem as jest.Mock).mockResolvedValue(JSON.stringify([mockPlant])); + const result = await StorageService.getPlants(); + expect(result).toEqual([mockPlant]); + }); + + it('returns empty array on error', async () => { + (AsyncStorage.getItem as jest.Mock).mockRejectedValue(new Error('fail')); + const result = await StorageService.getPlants(); + expect(result).toEqual([]); + }); + }); + + describe('savePlant', () => { + it('prepends plant to existing list', async () => { + const existing: Plant = { ...mockPlant, id: '2', name: 'Ficus' }; + (AsyncStorage.getItem as jest.Mock).mockResolvedValue(JSON.stringify([existing])); + (AsyncStorage.setItem as jest.Mock).mockResolvedValue(undefined); + + await StorageService.savePlant(mockPlant); + + expect(AsyncStorage.setItem).toHaveBeenCalledWith( + 'greenlens_plants', + JSON.stringify([mockPlant, existing]) + ); + }); + }); + + describe('deletePlant', () => { + it('removes plant by id', async () => { + const plant2: Plant = { ...mockPlant, id: '2' }; + (AsyncStorage.getItem as jest.Mock).mockResolvedValue(JSON.stringify([mockPlant, plant2])); + (AsyncStorage.setItem as jest.Mock).mockResolvedValue(undefined); + + await StorageService.deletePlant('1'); + + expect(AsyncStorage.setItem).toHaveBeenCalledWith( + 'greenlens_plants', + JSON.stringify([plant2]) + ); + }); + }); + + describe('updatePlant', () => { + it('updates existing plant', async () => { + (AsyncStorage.getItem as jest.Mock).mockResolvedValue(JSON.stringify([mockPlant])); + (AsyncStorage.setItem as jest.Mock).mockResolvedValue(undefined); + + const updated = { ...mockPlant, name: 'Updated Monstera' }; + await StorageService.updatePlant(updated); + + expect(AsyncStorage.setItem).toHaveBeenCalledWith( + 'greenlens_plants', + JSON.stringify([updated]) + ); + }); + + it('does nothing if plant not found', async () => { + (AsyncStorage.getItem as jest.Mock).mockResolvedValue(JSON.stringify([mockPlant])); + + await StorageService.updatePlant({ ...mockPlant, id: 'nonexistent' }); + + expect(AsyncStorage.setItem).not.toHaveBeenCalled(); + }); + }); + + describe('getLanguage', () => { + it('returns stored language', async () => { + (AsyncStorage.getItem as jest.Mock).mockResolvedValue('en'); + const result = await StorageService.getLanguage(); + expect(result).toBe('en'); + }); + + it('defaults to de when no language stored', async () => { + (AsyncStorage.getItem as jest.Mock).mockResolvedValue(null); + const result = await StorageService.getLanguage(); + expect(result).toBe('de'); + }); + + it('defaults to de on error', async () => { + (AsyncStorage.getItem as jest.Mock).mockRejectedValue(new Error('fail')); + const result = await StorageService.getLanguage(); + expect(result).toBe('de'); + }); + }); + + describe('saveLanguage', () => { + it('stores language', async () => { + (AsyncStorage.setItem as jest.Mock).mockResolvedValue(undefined); + await StorageService.saveLanguage('es'); + expect(AsyncStorage.setItem).toHaveBeenCalledWith('greenlens_language', 'es'); + }); + }); + + describe('getAppearanceMode', () => { + it('returns stored appearance mode', async () => { + (AsyncStorage.getItem as jest.Mock).mockResolvedValue('dark'); + const result = await StorageService.getAppearanceMode(); + expect(result).toBe('dark'); + }); + + it('defaults to system when value is invalid', async () => { + (AsyncStorage.getItem as jest.Mock).mockResolvedValue('invalid'); + const result = await StorageService.getAppearanceMode(); + expect(result).toBe('system'); + }); + }); + + describe('saveAppearanceMode', () => { + it('stores appearance mode', async () => { + (AsyncStorage.setItem as jest.Mock).mockResolvedValue(undefined); + await StorageService.saveAppearanceMode('light'); + expect(AsyncStorage.setItem).toHaveBeenCalledWith('greenlens_appearance_mode', 'light'); + }); + }); + + describe('getColorPalette', () => { + it('returns stored palette', async () => { + (AsyncStorage.getItem as jest.Mock).mockResolvedValue('ocean'); + const result = await StorageService.getColorPalette(); + expect(result).toBe('ocean'); + }); + + it('defaults to forest when value is invalid', async () => { + (AsyncStorage.getItem as jest.Mock).mockResolvedValue('invalid'); + const result = await StorageService.getColorPalette(); + expect(result).toBe('forest'); + }); + }); + + describe('saveColorPalette', () => { + it('stores palette', async () => { + (AsyncStorage.setItem as jest.Mock).mockResolvedValue(undefined); + await StorageService.saveColorPalette('sunset'); + expect(AsyncStorage.setItem).toHaveBeenCalledWith('greenlens_color_palette', 'sunset'); + }); + }); + + describe('profile name', () => { + it('returns stored profile name', async () => { + (AsyncStorage.getItem as jest.Mock).mockResolvedValue('Taylor'); + const result = await StorageService.getProfileName(); + expect(result).toBe('Taylor'); + }); + + it('falls back to default profile name when empty', async () => { + (AsyncStorage.getItem as jest.Mock).mockResolvedValue(' '); + const result = await StorageService.getProfileName(); + expect(result).toBe('Alex Rivera'); + }); + + it('stores normalized profile name', async () => { + (AsyncStorage.setItem as jest.Mock).mockResolvedValue(undefined); + await StorageService.saveProfileName(' Morgan '); + expect(AsyncStorage.setItem).toHaveBeenCalledWith('greenlens_profile_name', 'Morgan'); + }); + }); + + describe('lexicon search history', () => { + it('returns empty history when not set', async () => { + (AsyncStorage.getItem as jest.Mock).mockResolvedValue(null); + const result = await StorageService.getLexiconSearchHistory(); + expect(result).toEqual([]); + }); + + it('returns parsed history entries', async () => { + (AsyncStorage.getItem as jest.Mock).mockResolvedValue(JSON.stringify(['Monstera', 'Aloe'])); + const result = await StorageService.getLexiconSearchHistory(); + expect(result).toEqual(['Monstera', 'Aloe']); + }); + + it('returns empty history on malformed JSON', async () => { + (AsyncStorage.getItem as jest.Mock).mockResolvedValue('{bad json}'); + const result = await StorageService.getLexiconSearchHistory(); + expect(result).toEqual([]); + }); + + it('saves new query at front', async () => { + (AsyncStorage.getItem as jest.Mock).mockResolvedValue(JSON.stringify(['Monstera', 'Aloe'])); + (AsyncStorage.setItem as jest.Mock).mockResolvedValue(undefined); + + await StorageService.saveLexiconSearchQuery('Ficus'); + + expect(AsyncStorage.setItem).toHaveBeenCalledWith( + 'greenlens_lexicon_search_history', + JSON.stringify(['Ficus', 'Monstera', 'Aloe']) + ); + }); + + it('deduplicates case and diacritic variants by moving entry to front', async () => { + (AsyncStorage.getItem as jest.Mock).mockResolvedValue(JSON.stringify(['Monstera', 'Aloe'])); + (AsyncStorage.setItem as jest.Mock).mockResolvedValue(undefined); + + await StorageService.saveLexiconSearchQuery('monstera'); + + expect(AsyncStorage.setItem).toHaveBeenCalledWith( + 'greenlens_lexicon_search_history', + JSON.stringify(['monstera', 'Aloe']) + ); + }); + + it('ignores empty queries', async () => { + await StorageService.saveLexiconSearchQuery(' '); + expect(AsyncStorage.setItem).not.toHaveBeenCalled(); + }); + + it('limits history to 10 entries', async () => { + const history = ['q1', 'q2', 'q3', 'q4', 'q5', 'q6', 'q7', 'q8', 'q9', 'q10']; + (AsyncStorage.getItem as jest.Mock).mockResolvedValue(JSON.stringify(history)); + (AsyncStorage.setItem as jest.Mock).mockResolvedValue(undefined); + + await StorageService.saveLexiconSearchQuery('q11'); + + expect(AsyncStorage.setItem).toHaveBeenCalledWith( + 'greenlens_lexicon_search_history', + JSON.stringify(['q11', 'q1', 'q2', 'q3', 'q4', 'q5', 'q6', 'q7', 'q8', 'q9']) + ); + }); + + it('clears history', async () => { + (AsyncStorage.removeItem as jest.Mock).mockResolvedValue(undefined); + await StorageService.clearLexiconSearchHistory(); + expect(AsyncStorage.removeItem).toHaveBeenCalledWith('greenlens_lexicon_search_history'); + }); + }); +}); diff --git a/__tests__/utils/backendUrl.test.ts b/__tests__/utils/backendUrl.test.ts index da77d2a..9792137 100644 --- a/__tests__/utils/backendUrl.test.ts +++ b/__tests__/utils/backendUrl.test.ts @@ -1,29 +1,29 @@ -import { getConfiguredApiBaseUrl, getConfiguredAssetBaseUrl } from '../../utils/backendUrl'; - -describe('backendUrl utilities', () => { - const originalApiUrl = process.env.EXPO_PUBLIC_API_URL; - const originalBackendUrl = process.env.EXPO_PUBLIC_BACKEND_URL; - const originalPaymentServerUrl = process.env.EXPO_PUBLIC_PAYMENT_SERVER_URL; - - afterEach(() => { - process.env.EXPO_PUBLIC_API_URL = originalApiUrl; - process.env.EXPO_PUBLIC_BACKEND_URL = originalBackendUrl; - process.env.EXPO_PUBLIC_PAYMENT_SERVER_URL = originalPaymentServerUrl; - }); - - it('prefers EXPO_PUBLIC_API_URL when present', () => { - process.env.EXPO_PUBLIC_API_URL = 'https://api.example.com/api'; - process.env.EXPO_PUBLIC_BACKEND_URL = 'https://backend.example.com'; - - expect(getConfiguredApiBaseUrl()).toBe('https://api.example.com/api'); - expect(getConfiguredAssetBaseUrl()).toBe('https://api.example.com'); - }); - - it('falls back to EXPO_PUBLIC_BACKEND_URL and appends /api', () => { - delete process.env.EXPO_PUBLIC_API_URL; - process.env.EXPO_PUBLIC_BACKEND_URL = 'https://backend.example.com'; - - expect(getConfiguredApiBaseUrl()).toBe('https://backend.example.com/api'); - expect(getConfiguredAssetBaseUrl()).toBe('https://backend.example.com'); - }); -}); +import { getConfiguredApiBaseUrl, getConfiguredAssetBaseUrl } from '../../utils/backendUrl'; + +describe('backendUrl utilities', () => { + const originalApiUrl = process.env.EXPO_PUBLIC_API_URL; + const originalBackendUrl = process.env.EXPO_PUBLIC_BACKEND_URL; + const originalPaymentServerUrl = process.env.EXPO_PUBLIC_PAYMENT_SERVER_URL; + + afterEach(() => { + process.env.EXPO_PUBLIC_API_URL = originalApiUrl; + process.env.EXPO_PUBLIC_BACKEND_URL = originalBackendUrl; + process.env.EXPO_PUBLIC_PAYMENT_SERVER_URL = originalPaymentServerUrl; + }); + + it('prefers EXPO_PUBLIC_API_URL when present', () => { + process.env.EXPO_PUBLIC_API_URL = 'https://api.example.com/api'; + process.env.EXPO_PUBLIC_BACKEND_URL = 'https://backend.example.com'; + + expect(getConfiguredApiBaseUrl()).toBe('https://api.example.com/api'); + expect(getConfiguredAssetBaseUrl()).toBe('https://api.example.com'); + }); + + it('falls back to EXPO_PUBLIC_BACKEND_URL and appends /api', () => { + delete process.env.EXPO_PUBLIC_API_URL; + process.env.EXPO_PUBLIC_BACKEND_URL = 'https://backend.example.com'; + + expect(getConfiguredApiBaseUrl()).toBe('https://backend.example.com/api'); + expect(getConfiguredAssetBaseUrl()).toBe('https://backend.example.com'); + }); +}); diff --git a/__tests__/utils/hybridSearch.test.ts b/__tests__/utils/hybridSearch.test.ts index 8d1e4ab..09eb9dc 100644 --- a/__tests__/utils/hybridSearch.test.ts +++ b/__tests__/utils/hybridSearch.test.ts @@ -1,71 +1,71 @@ -import { rankHybridEntries, scoreHybridEntry } from '../../utils/hybridSearch'; - -describe('hybridSearch', () => { - const entries = [ - { - name: 'Snake Plant', - botanicalName: 'Sansevieria trifasciata', - description: 'Very resilient houseplant that handles little light well.', - categories: ['easy', 'low_light', 'air_purifier'], - careInfo: { waterIntervalDays: 14, light: 'Low to full light', temp: '16-30C' }, - }, - { - name: 'Spider Plant', - botanicalName: 'Chlorophytum comosum', - description: 'Easy houseplant that is safe for pets and helps clean indoor air.', - categories: ['easy', 'pet_friendly', 'air_purifier'], - careInfo: { waterIntervalDays: 6, light: 'Bright to partial shade', temp: '16-24C' }, - }, - { - name: 'Anthurium', - botanicalName: 'Anthurium andraeanum', - description: 'Flowering tropical plant for bright indirect light.', - categories: ['flowering'], - careInfo: { waterIntervalDays: 6, light: 'Bright indirect light', temp: '18-27C' }, - }, - { - name: 'Boston Fern', - botanicalName: 'Nephrolepis exaltata', - description: 'Loves steady moisture and humid rooms.', - categories: ['high_humidity', 'hanging'], - careInfo: { waterIntervalDays: 3, light: 'Partial shade', temp: '16-24C' }, - }, - { - name: 'Aloe Vera', - botanicalName: 'Aloe vera', - description: 'Sun-loving succulent for bright windows.', - categories: ['succulent', 'sun', 'medicinal'], - careInfo: { waterIntervalDays: 12, light: 'Sunny', temp: '18-30C' }, - }, - ]; - - it('ranks multi-intent matches above single-attribute matches', () => { - const results = rankHybridEntries(entries, 'pet friendly air purifier', 3); - expect(results[0].entry.name).toBe('Spider Plant'); - }); - - it('understands natural low-light and easy-care intent', () => { - const results = rankHybridEntries(entries, 'easy plant for dark corner', 3); - expect(results[0].entry.name).toBe('Snake Plant'); - }); - - it('keeps exact-name matches ahead of semantic-only matches', () => { - const scores = entries.map((entry) => ({ - name: entry.name, - score: scoreHybridEntry(entry, 'snake plant'), - })); - const snakeScore = scores.find((entry) => entry.name === 'Snake Plant')?.score || 0; - const spiderScore = scores.find((entry) => entry.name === 'Spider Plant')?.score || 0; - expect(snakeScore).toBeGreaterThan(spiderScore); - }); - - it('maps bathroom-style queries to high-humidity plants', () => { - const results = rankHybridEntries(entries, 'bathroom plant', 3); - expect(results[0].entry.name).toBe('Boston Fern'); - }); - - it('maps sunny-window queries to sun-loving plants', () => { - const results = rankHybridEntries(entries, 'plant for sunny window', 3); - expect(results[0].entry.name).toBe('Aloe Vera'); - }); -}); +import { rankHybridEntries, scoreHybridEntry } from '../../utils/hybridSearch'; + +describe('hybridSearch', () => { + const entries = [ + { + name: 'Snake Plant', + botanicalName: 'Sansevieria trifasciata', + description: 'Very resilient houseplant that handles little light well.', + categories: ['easy', 'low_light', 'air_purifier'], + careInfo: { waterIntervalDays: 14, light: 'Low to full light', temp: '16-30C' }, + }, + { + name: 'Spider Plant', + botanicalName: 'Chlorophytum comosum', + description: 'Easy houseplant that is safe for pets and helps clean indoor air.', + categories: ['easy', 'pet_friendly', 'air_purifier'], + careInfo: { waterIntervalDays: 6, light: 'Bright to partial shade', temp: '16-24C' }, + }, + { + name: 'Anthurium', + botanicalName: 'Anthurium andraeanum', + description: 'Flowering tropical plant for bright indirect light.', + categories: ['flowering'], + careInfo: { waterIntervalDays: 6, light: 'Bright indirect light', temp: '18-27C' }, + }, + { + name: 'Boston Fern', + botanicalName: 'Nephrolepis exaltata', + description: 'Loves steady moisture and humid rooms.', + categories: ['high_humidity', 'hanging'], + careInfo: { waterIntervalDays: 3, light: 'Partial shade', temp: '16-24C' }, + }, + { + name: 'Aloe Vera', + botanicalName: 'Aloe vera', + description: 'Sun-loving succulent for bright windows.', + categories: ['succulent', 'sun', 'medicinal'], + careInfo: { waterIntervalDays: 12, light: 'Sunny', temp: '18-30C' }, + }, + ]; + + it('ranks multi-intent matches above single-attribute matches', () => { + const results = rankHybridEntries(entries, 'pet friendly air purifier', 3); + expect(results[0].entry.name).toBe('Spider Plant'); + }); + + it('understands natural low-light and easy-care intent', () => { + const results = rankHybridEntries(entries, 'easy plant for dark corner', 3); + expect(results[0].entry.name).toBe('Snake Plant'); + }); + + it('keeps exact-name matches ahead of semantic-only matches', () => { + const scores = entries.map((entry) => ({ + name: entry.name, + score: scoreHybridEntry(entry, 'snake plant'), + })); + const snakeScore = scores.find((entry) => entry.name === 'Snake Plant')?.score || 0; + const spiderScore = scores.find((entry) => entry.name === 'Spider Plant')?.score || 0; + expect(snakeScore).toBeGreaterThan(spiderScore); + }); + + it('maps bathroom-style queries to high-humidity plants', () => { + const results = rankHybridEntries(entries, 'bathroom plant', 3); + expect(results[0].entry.name).toBe('Boston Fern'); + }); + + it('maps sunny-window queries to sun-loving plants', () => { + const results = rankHybridEntries(entries, 'plant for sunny window', 3); + expect(results[0].entry.name).toBe('Aloe Vera'); + }); +}); diff --git a/__tests__/utils/imageUri.test.ts b/__tests__/utils/imageUri.test.ts index efbe237..87ee64a 100644 --- a/__tests__/utils/imageUri.test.ts +++ b/__tests__/utils/imageUri.test.ts @@ -1,37 +1,37 @@ -import { getPlantImageSourceFallbackUri, tryResolveImageUri } from '../../utils/imageUri'; - -describe('imageUri utilities', () => { - const originalApiUrl = process.env.EXPO_PUBLIC_API_URL; - const originalBackendUrl = process.env.EXPO_PUBLIC_BACKEND_URL; - - beforeEach(() => { - process.env.EXPO_PUBLIC_API_URL = 'http://localhost:3000/api'; - delete process.env.EXPO_PUBLIC_BACKEND_URL; - }); - - afterEach(() => { - process.env.EXPO_PUBLIC_API_URL = originalApiUrl; - process.env.EXPO_PUBLIC_BACKEND_URL = originalBackendUrl; - }); - - it('resolves local plant asset paths against the API host', () => { - expect(tryResolveImageUri('/plants/monstera.webp')).toBe('http://localhost:3000/plants/monstera.webp'); - expect(tryResolveImageUri('plants/aloe-vera-thumb.webp')).toBe('http://localhost:3000/plants/aloe-vera-thumb.webp'); - }); - - it('rejects invalid local paths outside the plants directory', () => { - expect(tryResolveImageUri('/uploads/monstera.webp')).toBeNull(); - expect(tryResolveImageUri('../plants/monstera.webp')).toBeNull(); - }); - - it('resolves local plant asset paths against EXPO_PUBLIC_BACKEND_URL when API_URL is absent', () => { - delete process.env.EXPO_PUBLIC_API_URL; - process.env.EXPO_PUBLIC_BACKEND_URL = 'https://backend.example.com'; - - expect(tryResolveImageUri('/plants/rose.webp')).toBe('https://backend.example.com/plants/rose.webp'); - }); - - it('falls back from a missing local asset to the manifest-backed source image', () => { - expect(getPlantImageSourceFallbackUri('/plants/rosa-x-hybrida--rose--7375780c.webp')).toMatch(/^https?:\/\//); - }); -}); +import { getPlantImageSourceFallbackUri, tryResolveImageUri } from '../../utils/imageUri'; + +describe('imageUri utilities', () => { + const originalApiUrl = process.env.EXPO_PUBLIC_API_URL; + const originalBackendUrl = process.env.EXPO_PUBLIC_BACKEND_URL; + + beforeEach(() => { + process.env.EXPO_PUBLIC_API_URL = 'http://localhost:3000/api'; + delete process.env.EXPO_PUBLIC_BACKEND_URL; + }); + + afterEach(() => { + process.env.EXPO_PUBLIC_API_URL = originalApiUrl; + process.env.EXPO_PUBLIC_BACKEND_URL = originalBackendUrl; + }); + + it('resolves local plant asset paths against the API host', () => { + expect(tryResolveImageUri('/plants/monstera.webp')).toBe('http://localhost:3000/plants/monstera.webp'); + expect(tryResolveImageUri('plants/aloe-vera-thumb.webp')).toBe('http://localhost:3000/plants/aloe-vera-thumb.webp'); + }); + + it('rejects invalid local paths outside the plants directory', () => { + expect(tryResolveImageUri('/uploads/monstera.webp')).toBeNull(); + expect(tryResolveImageUri('../plants/monstera.webp')).toBeNull(); + }); + + it('resolves local plant asset paths against EXPO_PUBLIC_BACKEND_URL when API_URL is absent', () => { + delete process.env.EXPO_PUBLIC_API_URL; + process.env.EXPO_PUBLIC_BACKEND_URL = 'https://backend.example.com'; + + expect(tryResolveImageUri('/plants/rose.webp')).toBe('https://backend.example.com/plants/rose.webp'); + }); + + it('falls back from a missing local asset to the manifest-backed source image', () => { + expect(getPlantImageSourceFallbackUri('/plants/rosa-x-hybrida--rose--7375780c.webp')).toMatch(/^https?:\/\//); + }); +}); diff --git a/__tests__/utils/semanticCategoryMatrix.test.ts b/__tests__/utils/semanticCategoryMatrix.test.ts index fb0684f..c329dfe 100644 --- a/__tests__/utils/semanticCategoryMatrix.test.ts +++ b/__tests__/utils/semanticCategoryMatrix.test.ts @@ -1,42 +1,42 @@ -import { rankHybridEntries } from '../../utils/hybridSearch'; - -describe('semantic category matrix', () => { - const entries = [ - { name: 'Starter Plant', botanicalName: 'Starter easya', description: 'Hard to kill starter plant.', categories: ['easy'], careInfo: { waterIntervalDays: 7, light: 'Bright indirect light', temp: '18-24C' } }, - { name: 'Office Shade Plant', botanicalName: 'Shadea officis', description: 'Handles office corners well.', categories: ['low_light'], careInfo: { waterIntervalDays: 8, light: 'Low light', temp: '18-24C' } }, - { name: 'Bright Window Plant', botanicalName: 'Brighta windowii', description: 'Thrives in bright rooms.', categories: ['bright_light'], careInfo: { waterIntervalDays: 7, light: 'Bright indirect light', temp: '18-24C' } }, - { name: 'Sunny Aloe', botanicalName: 'Aloe vera', description: 'Sun-loving succulent for a south-facing window.', categories: ['sun'], careInfo: { waterIntervalDays: 12, light: 'Sunny', temp: '18-30C' } }, - { name: 'Safe Pilea', botanicalName: 'Pilea peperomioides', description: 'Non toxic and pet friendly.', categories: ['pet_friendly'], careInfo: { waterIntervalDays: 7, light: 'Bright indirect light', temp: '18-24C' } }, - { name: 'Air Cleaner Plant', botanicalName: 'Chlorophytum comosum', description: 'Helps clean the air indoors.', categories: ['air_purifier'], careInfo: { waterIntervalDays: 6, light: 'Bright to partial shade', temp: '16-24C' } }, - { name: 'Bathroom Fern', botanicalName: 'Nephrolepis exaltata', description: 'Loves humidity and steady moisture.', categories: ['high_humidity'], careInfo: { waterIntervalDays: 3, light: 'Partial shade', temp: '16-24C' } }, - { name: 'Trailing Vine', botanicalName: 'Epipremnum aureum', description: 'Fast-growing trailing shelf plant.', categories: ['hanging'], careInfo: { waterIntervalDays: 7, light: 'Partial shade to bright', temp: '18-27C' } }, - { name: 'Striped Leaf Plant', botanicalName: 'Calathea ornata', description: 'Decorative leaves with striped patterns.', categories: ['patterned'], careInfo: { waterIntervalDays: 5, light: 'Partial shade', temp: '18-25C' } }, - { name: 'Bloom Plant', botanicalName: 'Spathiphyllum', description: 'Reliable flowering houseplant.', categories: ['flowering'], careInfo: { waterIntervalDays: 5, light: 'Partial shade', temp: '18-26C' } }, - { name: 'Desert Succulent', botanicalName: 'Echeveria elegans', description: 'Classic cactus-like drought tolerant succulent.', categories: ['succulent'], careInfo: { waterIntervalDays: 14, light: 'Sunny', temp: '15-25C' } }, - { name: 'Indoor Tree', botanicalName: 'Ficus lyrata', description: 'Beautiful floor tree for bright rooms.', categories: ['tree'], careInfo: { waterIntervalDays: 7, light: 'Bright light', temp: '18-26C' } }, - { name: 'Statement Plant', botanicalName: 'Strelitzia nicolai', description: 'Tall oversized statement plant.', categories: ['large'], careInfo: { waterIntervalDays: 7, light: 'Bright light', temp: '18-27C' } }, - { name: 'Healing Herb', botanicalName: 'Mentha spicata', description: 'Kitchen herb and medicinal tea herb.', categories: ['medicinal'], careInfo: { waterIntervalDays: 3, light: 'Bright light', temp: '15-25C' } }, - ]; - - const cases: Array<[string, string]> = [ - ['hard to kill plant', 'Starter Plant'], - ['office plant for dark corner', 'Office Shade Plant'], - ['plant for east window', 'Bright Window Plant'], - ['plant for sunny window', 'Sunny Aloe'], - ['non toxic plant for cats', 'Safe Pilea'], - ['cleaner air plant', 'Air Cleaner Plant'], - ['bathroom plant', 'Bathroom Fern'], - ['trailing shelf plant', 'Trailing Vine'], - ['striped decorative leaves', 'Striped Leaf Plant'], - ['plant with blooms', 'Bloom Plant'], - ['cactus-like plant', 'Desert Succulent'], - ['indoor tree', 'Indoor Tree'], - ['tall statement plant', 'Statement Plant'], - ['kitchen tea herb', 'Healing Herb'], - ]; - - it.each(cases)('maps "%s" to %s', (query, expectedName) => { - const results = rankHybridEntries(entries, query, 5); - expect(results[0].entry.name).toBe(expectedName); - }); -}); +import { rankHybridEntries } from '../../utils/hybridSearch'; + +describe('semantic category matrix', () => { + const entries = [ + { name: 'Starter Plant', botanicalName: 'Starter easya', description: 'Hard to kill starter plant.', categories: ['easy'], careInfo: { waterIntervalDays: 7, light: 'Bright indirect light', temp: '18-24C' } }, + { name: 'Office Shade Plant', botanicalName: 'Shadea officis', description: 'Handles office corners well.', categories: ['low_light'], careInfo: { waterIntervalDays: 8, light: 'Low light', temp: '18-24C' } }, + { name: 'Bright Window Plant', botanicalName: 'Brighta windowii', description: 'Thrives in bright rooms.', categories: ['bright_light'], careInfo: { waterIntervalDays: 7, light: 'Bright indirect light', temp: '18-24C' } }, + { name: 'Sunny Aloe', botanicalName: 'Aloe vera', description: 'Sun-loving succulent for a south-facing window.', categories: ['sun'], careInfo: { waterIntervalDays: 12, light: 'Sunny', temp: '18-30C' } }, + { name: 'Safe Pilea', botanicalName: 'Pilea peperomioides', description: 'Non toxic and pet friendly.', categories: ['pet_friendly'], careInfo: { waterIntervalDays: 7, light: 'Bright indirect light', temp: '18-24C' } }, + { name: 'Air Cleaner Plant', botanicalName: 'Chlorophytum comosum', description: 'Helps clean the air indoors.', categories: ['air_purifier'], careInfo: { waterIntervalDays: 6, light: 'Bright to partial shade', temp: '16-24C' } }, + { name: 'Bathroom Fern', botanicalName: 'Nephrolepis exaltata', description: 'Loves humidity and steady moisture.', categories: ['high_humidity'], careInfo: { waterIntervalDays: 3, light: 'Partial shade', temp: '16-24C' } }, + { name: 'Trailing Vine', botanicalName: 'Epipremnum aureum', description: 'Fast-growing trailing shelf plant.', categories: ['hanging'], careInfo: { waterIntervalDays: 7, light: 'Partial shade to bright', temp: '18-27C' } }, + { name: 'Striped Leaf Plant', botanicalName: 'Calathea ornata', description: 'Decorative leaves with striped patterns.', categories: ['patterned'], careInfo: { waterIntervalDays: 5, light: 'Partial shade', temp: '18-25C' } }, + { name: 'Bloom Plant', botanicalName: 'Spathiphyllum', description: 'Reliable flowering houseplant.', categories: ['flowering'], careInfo: { waterIntervalDays: 5, light: 'Partial shade', temp: '18-26C' } }, + { name: 'Desert Succulent', botanicalName: 'Echeveria elegans', description: 'Classic cactus-like drought tolerant succulent.', categories: ['succulent'], careInfo: { waterIntervalDays: 14, light: 'Sunny', temp: '15-25C' } }, + { name: 'Indoor Tree', botanicalName: 'Ficus lyrata', description: 'Beautiful floor tree for bright rooms.', categories: ['tree'], careInfo: { waterIntervalDays: 7, light: 'Bright light', temp: '18-26C' } }, + { name: 'Statement Plant', botanicalName: 'Strelitzia nicolai', description: 'Tall oversized statement plant.', categories: ['large'], careInfo: { waterIntervalDays: 7, light: 'Bright light', temp: '18-27C' } }, + { name: 'Healing Herb', botanicalName: 'Mentha spicata', description: 'Kitchen herb and medicinal tea herb.', categories: ['medicinal'], careInfo: { waterIntervalDays: 3, light: 'Bright light', temp: '15-25C' } }, + ]; + + const cases: Array<[string, string]> = [ + ['hard to kill plant', 'Starter Plant'], + ['office plant for dark corner', 'Office Shade Plant'], + ['plant for east window', 'Bright Window Plant'], + ['plant for sunny window', 'Sunny Aloe'], + ['non toxic plant for cats', 'Safe Pilea'], + ['cleaner air plant', 'Air Cleaner Plant'], + ['bathroom plant', 'Bathroom Fern'], + ['trailing shelf plant', 'Trailing Vine'], + ['striped decorative leaves', 'Striped Leaf Plant'], + ['plant with blooms', 'Bloom Plant'], + ['cactus-like plant', 'Desert Succulent'], + ['indoor tree', 'Indoor Tree'], + ['tall statement plant', 'Statement Plant'], + ['kitchen tea herb', 'Healing Herb'], + ]; + + it.each(cases)('maps "%s" to %s', (query, expectedName) => { + const results = rankHybridEntries(entries, query, 5); + expect(results[0].entry.name).toBe(expectedName); + }); +}); diff --git a/all-plants-categories.csv b/all-plants-categories.csv index c3b6ba8..40cd3c9 100644 --- a/all-plants-categories.csv +++ b/all-plants-categories.csv @@ -1,359 +1,359 @@ -source_file,source_index,name,botanical_name,all_categories,category_count,description,light,temp,water_interval_days -constants/lexiconBatch2.ts,115,Faecherahorn,Acer palmatum,tree,1,"Der Faecherahorn ist ein japanischer Zierahorn mit feingeschnittenen, faecherfoermigen Blaettern in Gruen oder Rot.",Helles bis volles Licht,10-22 °C,5 -constants/lexiconBatch2.ts,212,Spitzahorn,Acer platanoides,tree|large|sun,3,Spitzahorn ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 -constants/lexiconBatch2.ts,108,Schafgarbe,Achillea millefolium,flowering|medicinal|sun,3,Die Schafgarbe hat weisse oder rosafarbene Bluetenschirme und fein gefiederte Blaetter. Wichtige Heilpflanze.,Volles Sonnenlicht,10-25 °C,7 -constants/lexiconBatch1.ts,86,Wuestenrose,Adenium obesum,flowering|succulent|sun,3,Die Wuestenrose ist eine sukkulente Zimmerpflanze mit dickem Stamm und leuchtend pinken Blueten.,Volles Sonnenlicht,20-35 °C,10 -constants/lexiconBatch2.ts,117,Socotra-Wuestenrose,Adenium socotranum,flowering|succulent|sun,3,"Die Socotra-Wuestenrose ist eine seltene, endemische Art mit einem sehr dicken, knolligen Stamm und rosa Blueten.",Volles Sonnenlicht,20-35 °C,14 -constants/lexiconBatch2.ts,42,Frauenhaarfarn,Adiantum raddianum,high_humidity,1,"Der Frauenhaarfarn hat zarte, feingliedrige Wedel auf schwarzen, draht­aehnlichen Stielen. Liebt Feuchtigkeit.",Helles indirektes Licht,18-27 °C,3 -constants/lexiconBatch2.ts,31,Adromischus,Adromischus cristatus,easy|succulent|sun,3,Adromischus ist eine kompakte Sukkulente mit ungewoehnlich wellenrandigen Blaettern auf kurzen Staengeln.,Helles bis volles Licht,15-25 °C,14 -constants/lexiconBatch2.ts,34,Silbervase,Aechmea fasciata,flowering|patterned,2,Die Silbervase ist eine Bromelie mit silbrig gebänderten Blaettern und einem rosafarbenen Bluetenstand.,Helles indirektes Licht,18-25 °C,10 -constants/lexiconBatch1.ts,10,Schwarze Rose (Aeonium),Aeonium arboreum,succulent|sun,2,"Das Aeonium bildet dekorative, rosettenfoermige Sukkulenten an verzweigten Stielen.",Volles Sonnenlicht,10-25 °C,10 -constants/lexiconBatch1.ts,98,Lippenstiftpflanze,Aeschynanthus radicans,flowering|hanging|high_humidity,3,Die Lippenstiftpflanze hat haengende Triebe mit glaenzenden Blaettern und leuchtend roten Roehrenbluten.,Helles indirektes Licht,18-27 °C,7 -constants/lexiconBatch1.ts,11,Agave,Agave americana,succulent|large|sun,3,"Die Agave ist eine imposante Sukkulente mit steifen, blaugruenen Blaettern mit Stacheln. Sie bluet nur einmal.",Volles Sonnenlicht,10-35 °C,21 -constants/lexiconBatch1.ts,50,Aglaoneme,Aglaonema commutatum,easy|patterned|low_light,3,Die Aglaoneme ist eine dekorative Zimmerpflanze mit silbrig-gruen gemusterten Blaettern. Tolerant gegenueber wenig Licht.,Wenig bis helles Licht,15-26 °C,7 -constants/lexiconBatch2.ts,155,Stockrose,Alcea rosea,flowering|sun,2,"Stockrose ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch1.ts,30,Schnittlauch,Allium schoenoprasum,easy,1,Schnittlauch ist ein beliebtes Kuechenkraut mit roehrenfoermigen Blaettern und lila Blueten.,Helles bis volles Licht,10-25 °C,3 -constants/lexiconBatch2.ts,135,Schnittknoblauch,Allium tuberosum,easy|sun,2,Schnittknoblauch ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 -constants/lexiconBatch1.ts,46,Amazona-Taro,Alocasia amazonica,patterned|large|high_humidity,3,"Der Amazona-Taro besticht mit dunkelgruenen, pfeilfoermigen Blaettern mit markant weissen Rippen.",Indirektes Licht,18-27 °C,5 -constants/lexiconBatch2.ts,225,Alocasia zebrina,Alocasia zebrina,bright_light|high_humidity,2,Alocasia zebrina ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5 -constants/lexiconBatch1.ts,89,Kap-Aloe,Aloe arborescens,easy|succulent|medicinal|sun,4,"Die Kap-Aloe ist eine strauchige Aloe mit schmalen, gezaehnten Blaettern und leuchtend roten Bluetenaehren im Winter.",Volles Sonnenlicht,10-30 °C,14 -constants/lexiconBatch2.ts,18,Kap-Aloe (ferox),Aloe ferox,succulent|large|medicinal|sun,4,"Aloe ferox ist eine grosse, imposante Aloe mit stachligen, blaugruenen Blaettern und leuchtend roten Bluetenaehren.",Volles Sonnenlicht,10-30 °C,14 -constants/lexiconBatch2.ts,128,Zitronenverbene,Aloysia citrodora,easy|sun,2,Zitronenverbene ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 -constants/lexiconBatch2.ts,73,Muschelingwer,Alpinia zerumbet,flowering|large|high_humidity,3,"Der Muschelingwer hat lange, elegante Blaetter und haengende Bluetenrispen mit weiss-rosa Bluetchen.",Helles bis volles Licht,20-30 °C,5 -constants/lexiconBatch2.ts,194,Fuchsschwanz,Amaranthus caudatus,flowering|sun,2,"Fuchsschwanz ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,163,Anemone,Anemone coronaria,flowering|sun,2,"Anemone ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,140,Dill,Anethum graveolens,easy|sun,2,Dill ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 -constants/lexiconBatch2.ts,125,Kerbel,Anthriscus cerefolium,easy|sun,2,Kerbel ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 -constants/lexiconBatch2.ts,233,Samt-Anthurie,Anthurium clarinervium,patterned|high_humidity,2,Samt-Anthurie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5 -constants/lexiconBatch2.ts,234,Kristall-Anthurie,Anthurium crystallinum,patterned|high_humidity,2,Kristall-Anthurie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5 -constants/lexiconBatch2.ts,147,Loewenmaeulchen,Antirrhinum majus,flowering|sun,2,"Loewenmaeulchen ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,232,Norfolk-Tanne,Araucaria heterophylla,tree|bright_light,2,Norfolk-Tanne ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7 -constants/lexiconBatch2.ts,107,Arnika,Arnica montana,flowering|medicinal|sun,3,Arnika ist eine bekannte Heilpflanze aus den Alpen mit goldgelben Korbbluten. Sie wird fuer Muskeln und Gelenke verwendet.,Volles Sonnenlicht,10-20 °C,7 -constants/lexiconBatch2.ts,110,Wermut,Artemisia absinthium,medicinal|sun,2,"Wermut ist ein stark aromatisches Heilkraut mit silbrig-gruenen, tief eingeschnittenen Blaettern. Fuer Kraeuterlikoere.",Volles Sonnenlicht,10-25 °C,14 -constants/lexiconBatch2.ts,122,Estragon,Artemisia dracunculus,easy|sun,2,Estragon ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 -constants/lexiconBatch2.ts,178,Seidenpflanze,Asclepias tuberosa,flowering|sun,2,"Seidenpflanze ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,16,Schusterpflanze,Aspidistra elatior,easy|low_light,2,"Die Schusterpflanze ist eine extrem robuste Zimmerpflanze mit langen, dunkelgruenen Blaettern. Vertraegt tiefe Temperaturen.",Wenig bis helles Licht,10-20 °C,14 -constants/lexiconBatch2.ts,43,Vogelnest-Farn,Asplenium nidus,easy|low_light|high_humidity,3,"Der Vogelnest-Farn hat ganzrandige, glaenzende Wedel, die eine Nestform bilden. Sehr dekorativ und robust.",Helles indirektes Licht,18-27 °C,5 -constants/lexiconBatch2.ts,13,Japanische Aucube,Aucuba japonica,easy|low_light,2,"Die Japanische Aucube hat glaenzende, gruene oder gelbgefleckte Blaetter. Sehr schattenvertraeglich.",Wenig bis helles Licht,10-20 °C,7 -constants/lexiconBatch1.ts,92,Indische Azalee,Azalea indica,flowering,1,"Die Indische Azalee ist ein beliebter Zierstrauch mit grossen, auffaelligen Blueten in Rosa- und Rottönen.",Helles indirektes Licht,10-20 °C,4 -constants/lexiconBatch2.ts,7,Bambusrohr,Bambusa vulgaris,easy|large,2,Das Bambusrohr ist eine schnell wachsende Bambusart mit gelbgruenen Halmen. Sehr dekorativ und vielseitig nutzbar.,Helles bis volles Licht,15-30 °C,5 -constants/lexiconBatch1.ts,41,Pferdeschwanzpalme,Beaucarnea recurvata,easy|succulent|tree|sun,4,"Die Pferdeschwanzpalme hat einen verdickten Stammbasis als Wasserspeicher und lange, schmale Blaetter.",Volles Sonnenlicht,15-30 °C,21 -constants/lexiconBatch2.ts,57,Forellen-Begonie,Begonia maculata,patterned|high_humidity,2,Die Forellen-Begonie hat olivgruene Blaetter mit silbernen Punkten und einer roten Unterseite. Atemberaubend.,Helles indirektes Licht,18-27 °C,7 -constants/lexiconBatch1.ts,18,Koenigsbegonie,Begonia rex,patterned|high_humidity,2,"Die Koenigsbegonie beeindruckt mit prachtvoll gemusterten Blaettern in Silber, Rot und Gruen.",Indirektes Licht,18-25 °C,5 -constants/lexiconBatch2.ts,175,Eisbegonie,Begonia semperflorens-cultorum,flowering|bright_light,2,"Eisbegonie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,58,Knollen-Begonie,Begonia tuberhybrida,flowering|high_humidity,2,"Die Knollen-Begonie hat riesige, rosenaehnliche Blueten in leuchtendem Rot, Orange, Gelb oder Weiss.",Helles indirektes Licht,15-22 °C,5 -constants/lexiconBatch2.ts,145,Gaensebluemchen,Bellis perennis,flowering|sun,2,"Gaensebluemchen ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,97,Mangold,Beta vulgaris,easy,1,"Mangold ist ein farbenfrohes Blattgemuese mit bunten Stielen in Rot, Gelb, Orange und Weiss.",Helles bis volles Licht,10-25 °C,3 -constants/lexiconBatch2.ts,114,Hange-Birke,Betula pendula,tree|large|medicinal,3,Die Haenge-Birke hat charakteristisch weisse Rinde und haengende Zweige. Die Blaetter werden in der Heilkunde genutzt.,Volles Sonnenlicht,10-25 °C,7 -constants/lexiconBatch2.ts,38,Billbergia,Billbergia nutans,easy|flowering,2,"Die Billbergia ist eine robuste Bromelie mit schmalen, gruenen Blaettern und hängenden, blauen und gruenen Blueten.",Helles indirektes Licht,15-25 °C,7 -constants/lexiconBatch2.ts,129,Borretsch,Borago officinalis,easy|sun,2,Borretsch ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 -constants/lexiconBatch1.ts,62,Bougainvillea,Bougainvillea spectabilis,flowering|bright_light|sun,3,"Die Bougainvillea ist eine rankenreiche Kletterpflanze mit leuchtend farbigen Hochblaettern in Rot, Orange oder Pink.",Volles Sonnenlicht,18-30 °C,5 -constants/lexiconBatch2.ts,223,Schmetterlingsflieder,Buddleja davidii,flowering|tree|sun,3,Schmetterlingsflieder ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 -constants/lexiconBatch2.ts,202,Buchsbaum,Buxus sempervirens,tree|sun,2,Buchsbaum ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 -constants/lexiconBatch1.ts,49,Buntblatt,Caladium bicolor,patterned|high_humidity,2,"Das Buntblatt beeindruckt mit transparenten, bunt gemusterten Blaettern in Pink, Rot, Weiss und Gruen.",Indirektes Licht,20-30 °C,5 -constants/lexiconBatch2.ts,187,Ringelblume,Calendula officinalis,flowering|medicinal|sun,3,"Ringelblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,63,Calibrachoa,Calibrachoa hybrida,easy|flowering|hanging|sun,4,"Calibrachoa ist eine petunienaehnliche Haengepflanze mit unzaehligen, kleinen Trichterbluten in allen Farben.",Volles Sonnenlicht,15-25 °C,2 -constants/lexiconBatch2.ts,56,Callisia,Callisia repens,easy|hanging,2,"Callisia repens ist ein kleines, kriechendes Kraut mit winzigen, gruenen Blaettern. Ideal fuer haengende Behaelter.",Helles indirektes Licht,15-25 °C,5 -constants/lexiconBatch1.ts,93,Kamelie,Camellia japonica,flowering,1,Die Kamelie ist ein eleganter Zierstrauch mit glaenzenden Blaettern und rosenaehnlichen Blueten von Januar bis April.,Helles indirektes Licht,7-18 °C,5 -constants/lexiconBatch2.ts,85,Teestrauch,Camellia sinensis,flowering,1,"Der Teestrauch ist die Pflanze, aus deren Blaettern Tee gewonnen wird. Er hat weisse Blueten und glaenzende Blaetter.",Helles indirektes Licht,15-22 °C,7 -constants/lexiconBatch2.ts,184,Trompetenwinde,Campsis radicans,flowering|bright_light,2,"Trompetenwinde ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,67,Blumenschilfrohr,Canna indica,flowering|large|sun,3,"Das Blumenschilfrohr hat grosse, tropisch wirkende Blaetter und auffaellige Blueten in Rot, Orange oder Gelb.",Volles Sonnenlicht,18-28 °C,5 -constants/lexiconBatch2.ts,92,Chili,Capsicum annuum,easy|medicinal|sun,3,"Chili ist eine beliebte Gemuese- und Zierpflanze mit leuchtenden, roten oder orangen Fruechten. Im Topf kultivierbar.",Volles Sonnenlicht,20-30 °C,4 -constants/lexiconBatch2.ts,90,Papaya,Carica papaya,large|sun,2,"Die Papaya ist eine tropische Fruchtpflanze mit grossen, gelappten Blaettern und orangen Fruechten.",Volles Sonnenlicht,20-35 °C,5 -constants/lexiconBatch2.ts,217,Trompetenbaum,Catalpa bignonioides,tree|large|sun,3,Trompetenbaum ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 -constants/lexiconBatch1.ts,73,Cattleya-Orchidee,Cattleya labiata,flowering|high_humidity,2,"Die Cattleya ist die Koenigin der Orchideen mit ueppigen, duftenden Blueten in Lila, Rosa und Weiss.",Helles indirektes Licht,18-28 °C,7 -constants/lexiconBatch2.ts,208,Zeder,Cedrus libani,tree|large|sun,3,Zeder ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 -constants/lexiconBatch2.ts,188,Kornblume,Centaurea cyanus,flowering|sun,2,"Kornblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch1.ts,81,Peruanischer Fackelkaktus,Cereus peruvianus,easy|succulent|large|sun,4,"Der Peruanische Fackelkaktus ist ein saeulenfoermiger Kaktus, der im Innenraum bis zu 2 m hoch werden kann.",Volles Sonnenlicht,15-35 °C,21 -constants/lexiconBatch1.ts,99,Herzkette,Ceropegia woodii,easy|succulent|patterned|hanging,4,"Die Herzkette hat duenne, haengende Ranken mit herzfoermigen, silbergrau gemusterten Blaettchen.",Helles indirektes Licht,15-27 °C,14 -constants/lexiconBatch1.ts,43,Bergpalme,Chamaedorea elegans,easy|pet_friendly|tree|air_purifier|low_light,5,Die Bergpalme ist eine kompakte Zimmerpalme fuer schattigere Standorte. Ideal fuer dunkle Innenraeume.,Wenig bis helles Licht,15-25 °C,7 -constants/lexiconBatch2.ts,138,Roemische Kamille,Chamaemelum nobile,easy|medicinal|sun,3,Roemische Kamille ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 -constants/lexiconBatch2.ts,101,Kamille,Chamomilla recutita,easy|medicinal|sun,3,"Die Kamille ist ein beliebtes Heilkraut mit kleinen, weiss-gelben Blueten. Das aetherische Oel wirkt beruhigend.",Volles Sonnenlicht,15-25 °C,5 -constants/lexiconBatch1.ts,67,Chrysantheme,Chrysanthemum indicum,flowering,1,"Die Chrysantheme ist die klassische Herbstblume mit ueppigen, dichten Blueten in vielen Farben.",Helles bis volles Licht,12-22 °C,4 -constants/lexiconBatch2.ts,86,Zitronenbaum,Citrus limon,tree|sun,2,"Der Zitronenbaum ist ein kleiner, immergruener Baum mit weissen, duftenden Blueten und gelben Fruechten.",Volles Sonnenlicht,18-28 °C,5 -constants/lexiconBatch2.ts,87,Orangenbaum,Citrus sinensis,tree|sun,2,"Der Orangenbaum ist ein kleiner, immergruener Baum mit weissen Blueten und orangen Fruechten.",Volles Sonnenlicht,18-28 °C,5 -constants/lexiconBatch2.ts,157,Clematis,Clematis viticella,flowering|bright_light,2,"Clematis ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch1.ts,104,Riemenblatt,Clivia miniata,flowering,1,Das Riemenblatt ist eine dekorative Zimmerpflanze mit leuchtend orangefarbenen Blueten im Fruehling.,Helles indirektes Licht,15-24 °C,10 -constants/lexiconBatch2.ts,224,Kroton,Codiaeum variegatum,patterned|bright_light,2,Kroton ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7 -constants/lexiconBatch2.ts,84,Kaffeestrauch,Coffea arabica,easy,1,"Der Kaffeestrauch hat glaenzende, dunkelgruene Blaetter und entwickelt rote Kaffe­ekirschen. Kann im Topf gehalten werden.",Helles indirektes Licht,18-25 °C,7 -constants/lexiconBatch2.ts,245,Kaffeepflanze arabica nana,Coffea arabica Nana,bright_light,1,Kaffeepflanze arabica nana ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7 -constants/lexiconBatch1.ts,47,Taro,Colocasia esculenta,large|high_humidity,2,"Der Taro ist eine tropische Pflanze mit grossen, herzfoermigen Blaettern. Die Knollen sind Nahrungsquelle.",Helles indirektes Licht,18-30 °C,3 -constants/lexiconBatch1.ts,97,Columnea,Columnea gloriosa,flowering|hanging|high_humidity,3,"Die Columnea ist eine haengende Zimmerpflanze mit kleinen, behaarten Blaettern und leuchtend roten, roehrenfoermigen Blueten.",Helles indirektes Licht,18-25 °C,7 -constants/lexiconBatch2.ts,24,Konophytum,Conophytum calculus,succulent|sun,2,"Das Konophytum ist eine sehr kompakte Sukkulente, die zwei Blaetter zu einer kugelfoermigen Form verschmilzt.",Volles Sonnenlicht,10-25 °C,21 -constants/lexiconBatch2.ts,160,Maigloeckchen,Convallaria majalis,flowering|medicinal,2,"Maigloeckchen ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,14,Keulenlilie,Cordyline australis,easy|tree|sun,3,"Die Keulenlilie hat lange, schmale, gruene oder rotbraune Blaetter in einem dekorativen Schopf.",Helles bis volles Licht,10-25 °C,7 -constants/lexiconBatch2.ts,15,Tiroler Keulenlilie,Cordyline fruticosa,easy,1,"Die Tiroler Keulenlilie hat leuchtend rote, gruene oder buntlaubige Blaetter. Eine exotische Zimmerpflanze.",Helles indirektes Licht,18-27 °C,7 -constants/lexiconBatch2.ts,181,Maedchenauge,Coreopsis tinctoria,flowering|sun,2,"Maedchenauge ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,139,Koriander,Coriandrum sativum,easy|sun,2,Koriander ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 -constants/lexiconBatch2.ts,150,Kosmee,Cosmos bipinnatus,flowering|sun,2,"Kosmee ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,29,Kotyledon,Cotyledon orbiculata,easy|succulent|sun,3,"Kotyledon hat dickfleischige, runde Blaetter mit einem mehligen, weisslichen Belag. Sehr trockenheitsresistent.",Helles bis volles Licht,15-25 °C,14 -constants/lexiconBatch2.ts,26,Moos-Crassula,Crassula muscosa,easy|succulent|sun,3,"Die Moos-Crassula hat dicht aneinandergereihte, winzige gruene Blaetter auf unverzweigten Trieben. Sieht aus wie Moos.",Helles bis volles Licht,15-25 °C,14 -constants/lexiconBatch1.ts,5,Jadepflanze,Crassula ovata,easy|succulent|sun,3,"Die Jadepflanze ist eine langlebige Sukkulente mit dicken, ovalen Blaettern. In Japan gilt sie als Gluecksbringer.",Helles bis volles Licht,15-24 °C,14 -constants/lexiconBatch1.ts,110,Krokus,Crocus vernus,easy|flowering,2,"Der Krokus ist einer der ersten Fruehjahrs­boten mit kelchfoermigen Blueten in Lila, Weiss und Gelb.",Helles bis volles Licht,5-15 °C,7 -constants/lexiconBatch2.ts,39,Cryptanthus,Cryptanthus bivittatus,patterned|high_humidity,2,Cryptanthus ist eine niedrig wachsende Bromelie mit sternfoermigen Rosetten und gemusterten Blaettern. Fuer Terrarien.,Helles indirektes Licht,18-27 °C,7 -constants/lexiconBatch1.ts,53,Ctenanthe,Ctenanthe burle-marxii,patterned|high_humidity,2,Die Ctenanthe hat faszinierend gemusterte Blaetter mit dunkelgruunem Fischgraetenmuster auf hellgruunem Hintergrund.,Indirektes Licht,18-25 °C,5 -constants/lexiconBatch2.ts,94,Gurke,Cucumis sativus,easy|sun,2,"Die Gurke ist eine rankende Gemuese­pflanze mit gruenen, erfrischenden Fruechten. Im Balkonkasten kultivierbar.",Volles Sonnenlicht,18-28 °C,3 -constants/lexiconBatch2.ts,209,Zypresse,Cupressus sempervirens,tree|large|sun,3,Zypresse ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 -constants/lexiconBatch2.ts,74,Kurkuma,Curcuma longa,medicinal|high_humidity,2,Kurkuma ist eine tropische Gewuerzpflanze mit breiten Blaettern und leuchtend gelber Wurzel. Wichtiges Heilgewuerz.,Helles bis volles Licht,20-30 °C,7 -constants/lexiconBatch2.ts,236,String of Bananas,Curio radicans,succulent|hanging|sun,3,String of Bananas ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles bis volles Licht,18-30 C,10 -constants/lexiconBatch2.ts,237,String of Dolphins,Curio x peregrinus,succulent|hanging|sun,3,String of Dolphins ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles bis volles Licht,18-30 C,10 -constants/lexiconBatch2.ts,239,Palmfarn,Cycas revoluta,tree|large|sun,3,Palmfarn ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles bis volles Licht,18-30 C,10 -constants/lexiconBatch1.ts,19,Alpenveilchen,Cyclamen persicum,flowering,1,"Das Alpenveilchen bluet im Herbst und Winter mit eleganten Blueten in Rosa, Rot oder Weiss.",Helles indirektes Licht,12-18 °C,5 -constants/lexiconBatch1.ts,71,Zymbidium,Cymbidium lowianum,flowering,1,"Das Zymbidium ist eine robuste Orchidee mit langen, grassartigen Blaettern und eleganten Bluetenrispen.",Helles Licht,12-24 °C,7 -constants/lexiconBatch2.ts,127,Zitronengras,Cymbopogon citratus,easy|sun,2,Zitronengras ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 -constants/lexiconBatch2.ts,9,Paragraphenpflanze,Cyperus alternifolius,high_humidity,1,"Die Paragraphenpflanze hat lange, grasartige Blaetter, die sternfoermig vom Stiel abstehen. Sie liebt viel Wasser.",Helles bis volles Licht,18-27 °C,3 -constants/lexiconBatch2.ts,68,Dahlie,Dahlia pinnata,flowering|sun,2,Die Dahlie ist eine prachtvolle Sommerblume mit Blueten in allen Groessen und Formen. Sie wird aus Knollen gezogen.,Volles Sonnenlicht,15-25 °C,5 -constants/lexiconBatch2.ts,99,Karotte,Daucus carota,easy,1,Die Karotte ist eine beliebte Gemuese­pflanze mit orangefarbenen Wurzeln. Im tiefen Topf kultivierbar.,Helles bis volles Licht,15-22 °C,5 -constants/lexiconBatch2.ts,215,Flammenbaum,Delonix regia,flowering|tree|large,3,Flammenbaum ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 -constants/lexiconBatch2.ts,153,Rittersporn,Delphinium elatum,flowering|sun,2,"Rittersporn ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch1.ts,70,Dendrobium,Dendrobium nobile,flowering|high_humidity,2,"Das Dendrobium ist eine beliebte Zimmerorchidee mit langen Pseudobulben, die im Winter mit Blueten besetzt werden.",Helles indirektes Licht,15-28 °C,10 -constants/lexiconBatch2.ts,189,Bartnelke,Dianthus barbatus,flowering|sun,2,"Bartnelke ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,146,Nelke,Dianthus caryophyllus,flowering|sun,2,"Nelke ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch1.ts,48,Dieffenbachie,Dieffenbachia seguine,easy|air_purifier|low_light,3,"Die Dieffenbachie ist eine tropische Blattschmuckpflanze mit grossen, gruen-weiss gefleckten Blaettern.",Helles indirektes Licht,18-26 °C,7 -constants/lexiconBatch2.ts,109,Roter Fingerhut,Digitalis purpurea,flowering|medicinal,2,"Der Rote Fingerhut hat hohe Bluetenstaende mit roehrenfoermigen, gepunkteten Blueten in Rosa. Wichtige Arzneipflanze.",Helles bis volles Licht,10-20 °C,7 -constants/lexiconBatch2.ts,77,Venusfliegenfalle,Dionaea muscipula,sun,1,Die Venusfliegenfalle ist eine fleischfressende Pflanze mit klappfallartigen Blaettern. Faengt Insekten.,Volles Sonnenlicht,15-30 °C,5 -constants/lexiconBatch1.ts,101,Dischidia,Dischidia ruscifolia,succulent|hanging,2,"Die Dischidia ist eine epiphytische Haengepflanze mit kleinen, runden Blaettern entlang duenner Ranken.",Helles indirektes Licht,18-27 °C,7 -constants/lexiconBatch1.ts,14,Maisstrauch,Dracaena fragrans,easy|tree|air_purifier|low_light,4,"Der Maisstrauch ist eine robuste Zimmerpflanze mit breiten, gestreiften Blaettern. Gedeiht auch bei wenig Licht.",Helles indirektes Licht,15-25 °C,10 -constants/lexiconBatch1.ts,13,Drachenbaum,Dracaena marginata,easy|tree|air_purifier,3,"Der Drachenbaum ist eine schlanke Zimmerpflanze mit roten, schmalen Blaettern auf langen Staemmen.",Helles indirektes Licht,15-25 °C,10 -constants/lexiconBatch2.ts,80,Sonnentau,Drosera capensis,high_humidity|sun,2,Der Sonnentau faengt Insekten mit klebrigen Tropfen auf seinen Blaettern. Eine faszinierende fleischfressende Pflanze.,Volles Sonnenlicht,15-25 °C,5 -constants/lexiconBatch2.ts,30,Dudleya,Dudleya brittonii,easy|succulent|sun,3,"Dudleya ist eine rosetten­bildende Sukkulente mit silbrig-weissen, mehligen Blaettern. Sehr elegant.",Volles Sonnenlicht,10-25 °C,14 -constants/lexiconBatch1.ts,42,Goldfruchtpalme,Dypsis lutescens,pet_friendly|tree|air_purifier,3,Die Goldfruchtpalme ist eine elegante Zimmerpalme mit gelblich-gruenen Stielen und gefiederten Wedeln.,Helles indirektes Licht,18-27 °C,5 -constants/lexiconBatch1.ts,4,Echeverie,Echeveria elegans,easy|succulent|sun,3,"Die Echeverie bildet symmetrische, rosettenfoermige Sukkulenten mit blaugruenen Blaettern. Pflegeleicht.",Volles Sonnenlicht,15-25 °C,14 -constants/lexiconBatch2.ts,106,Sonnenhut,Echinacea purpurea,flowering|medicinal|sun,3,"Der Sonnenhut ist eine beliebte Heilpflanze mit grossen, pinkfarbenen Blueten. Er staerkt das Immunsystem.",Helles bis volles Licht,15-25 °C,7 -constants/lexiconBatch1.ts,77,Goldene Tonne,Echinocactus grusonii,easy|succulent|sun,3,Die Goldene Tonne ist ein ikonischer kugelfoermiger Kaktus mit goldgelben Stacheln. Waechst langsam aber imposant.,Volles Sonnenlicht,15-35 °C,21 -constants/lexiconBatch1.ts,83,San-Pedro-Kaktus,Echinopsis pachanoi,easy|succulent|sun,3,"Der San-Pedro-Kaktus ist ein schnell wachsender, saeulenfoermiger Kaktus aus den Anden.",Volles Sonnenlicht,10-35 °C,14 -constants/lexiconBatch1.ts,84,Koenigin der Nacht,Epiphyllum oxypetalum,flowering|succulent,2,"Die Koenigin der Nacht bluet nur eine einzige Nacht lang mit riesigen, intensiv duftenden weissen Blueten.",Indirektes Licht,18-27 °C,7 -constants/lexiconBatch1.ts,16,Marmor-Efeutute,Epipremnum aureum Marble Queen,easy|hanging|air_purifier,3,Die Marmor-Efeutute hat cremeweiss-gruen marmorierte Blaetter. Eine dekorative Variante der klassischen Efeutute.,Helles indirektes Licht,15-30 °C,7 -constants/lexiconBatch2.ts,53,Neon-Efeutute,Epipremnum pinnatum Neon,easy|hanging|air_purifier,3,Die Neon-Efeutute hat leuchtend limonengruene Blaetter. Sehr auffaellig und pflegeleicht.,Helles indirektes Licht,15-30 °C,7 -constants/lexiconBatch2.ts,186,Kalifornischer Mohn,Eschscholzia californica,flowering|sun,2,"Kalifornischer Mohn ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,210,Eukalyptus,Eucalyptus globulus,tree|medicinal|sun,3,Eukalyptus ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 -constants/lexiconBatch2.ts,19,Christusdorn,Euphorbia milii,easy|flowering|succulent|sun,4,Der Christusdorn ist eine sukkulente Wolfsmilch mit stacheligen Zweigen und kleinen roten oder gelben Hochblaettern.,Helles bis volles Licht,15-28 °C,10 -constants/lexiconBatch2.ts,20,Weihnachtsstern,Euphorbia pulcherrima,flowering,1,Der Weihnachtsstern ist die klassische Winterpflanze mit leuchtend roten Hochblaettern. Er steht symbolisch fuer Weihnachten.,Helles indirektes Licht,15-22 °C,7 -constants/lexiconBatch1.ts,12,Bleistiftkaktus,Euphorbia tirucalli,easy|succulent|sun,3,"Der Bleistiftkaktus ist eine sukkulente Wolfsmilch mit duennen, zylindrischen Zweigen ohne Blaetter.",Volles Sonnenlicht,18-30 °C,14 -constants/lexiconBatch2.ts,137,Wasabi,Eutrema japonicum,bright_light|high_humidity,2,"Wasabi ist ein seltenes Wuerzkraut, das gleichmaessige Feuchte und eher kuehle Bedingungen bevorzugt.",Helles indirektes Licht,8-20 C,4 -constants/lexiconBatch2.ts,12,Fatsia,Fatsia japonica,easy|low_light,2,"Die Fatsia ist ein dekorativer Zimmerstrauch mit grossen, handfoermigen, glaenzenden Blaettern. Sehr robust.",Helles indirektes Licht,10-20 °C,7 -constants/lexiconBatch1.ts,78,Fass-Kaktus,Ferocactus cylindraceus,easy|succulent|sun,3,"Der Fass-Kaktus ist ein zylindrischer Wuestenkaktus mit langen, roten Stacheln. Sehr langlebig.",Volles Sonnenlicht,15-35 °C,21 -constants/lexiconBatch2.ts,248,Ficus altissima,Ficus altissima,tree|bright_light,2,Ficus altissima ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7 -constants/lexiconBatch1.ts,1,Birkenfeige,Ficus benjamina,tree|air_purifier,2,"Die Birkenfeige ist ein eleganter Zimmerstrauch mit haengenden Aesten und kleinen, glaenzenden Blaettern.",Helles indirektes Licht,16-24 °C,7 -constants/lexiconBatch1.ts,38,Gummibaum,Ficus elastica,easy|tree|air_purifier,3,"Der Gummibaum ist eine imposante Zimmerpflanze mit grossen, glaenzenden, lederartigen Blaettern. Reinigt die Luft.",Helles indirektes Licht,16-24 °C,10 -constants/lexiconBatch1.ts,39,Geigenfeige,Ficus lyrata,tree|large|bright_light,3,"Die Geigenfeige ist ein Trendbaum mit grossen, geigenfoermigen Blaettern. Benoetigt viel Licht.",Helles indirektes Licht,18-27 °C,7 -constants/lexiconBatch2.ts,247,Ficus microcarpa,Ficus microcarpa,easy|tree|bright_light,3,Ficus microcarpa ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7 -constants/lexiconBatch2.ts,116,Bonsai-Feige,Ficus retusa,tree,1,"Die Bonsai-Feige ist eine klassische Bonsai-Art mit kleinen, elliptischen Blaettern. Sehr formbar.",Helles indirektes Licht,16-24 °C,7 -constants/lexiconBatch2.ts,226,Nervenpflanze,Fittonia albivenis,patterned|high_humidity,2,Nervenpflanze ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5 -constants/lexiconBatch2.ts,219,Forsythie,Forsythia x intermedia,flowering|tree|sun,3,Forsythie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 -constants/lexiconBatch2.ts,100,Erdbeere,Fragaria ananassa,easy|pet_friendly|sun,3,"Die Erdbeere ist ein beliebtes Obst fuer Balkon und Terrasse mit aromatischen, roten Fruechten.",Helles bis volles Licht,15-25 °C,3 -constants/lexiconBatch2.ts,169,Freesie,Freesia refracta,flowering|sun,2,"Freesie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch1.ts,33,Fuchsie,Fuchsia hybrida,flowering|hanging,2,"Die Fuchsie haengt mit eleganten, zweifarbigen Blueten wie kleine Ohrringe herab. Ideal fuer Ampeln.",Helles indirektes Licht,14-22 °C,3 -constants/lexiconBatch2.ts,60,Triphylla-Fuchsie,Fuchsia triphylla,flowering|hanging,2,"Die Triphylla-Fuchsie hat lange, roehrenfoermige, orangefarbe Blueten in haengenden Trauben. Sehr exotisch.",Helles indirektes Licht,15-22 °C,3 -constants/lexiconBatch2.ts,196,Kokardenblume,Gaillardia aristata,flowering|sun,2,"Kokardenblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch1.ts,22,Gardenie,Gardenia jasminoides,flowering|high_humidity,2,"Die Gardenie fasziniert mit cremefarbenen, intensiv duftenden Blueten. Anspruchsvoll in der Pflege.",Helles indirektes Licht,18-23 °C,5 -constants/lexiconBatch1.ts,90,Gasteria,Gasteria carinata,easy|succulent|low_light,3,"Die Gasteria ist eine kleine Sukkulente mit zweireihig angeordneten, zungenfoermigen, gefleckten Blaettern.",Helles indirektes Licht,15-25 °C,14 -constants/lexiconBatch2.ts,190,Mittagsgold,Gazania rigens,flowering|sun,2,"Mittagsgold ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch1.ts,32,Blutroter Storchschnabel,Geranium sanguineum,easy|flowering,2,Der Blutrote Storchschnabel ist ein zierlicher Storchschnabel mit intensiv magentafarbenen Blueten.,Helles bis volles Licht,10-25 °C,7 -constants/lexiconBatch1.ts,68,Gerbera,Gerbera jamesonii,flowering|air_purifier|bright_light,3,"Die Gerbera ist eine farbenfrohe Schnittblume mit grossen, sonnenblumenaehnlichen Blueten. Sehr beliebt.",Helles bis volles Licht,15-25 °C,5 -constants/lexiconBatch2.ts,216,Ginkgo,Ginkgo biloba,tree|medicinal|sun,3,Ginkgo ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 -constants/lexiconBatch2.ts,161,Gladiole,Gladiolus hortulanus,flowering|sun,2,"Gladiole ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch1.ts,96,Gloxinie,Gloxinia speciosa,flowering|high_humidity,2,"Die Gloxinie hat grosse, samtartige Blueten in Violett, Rosa oder Weiss mit farbigen Raendern.",Helles indirektes Licht,18-25 °C,5 -constants/lexiconBatch2.ts,240,Calathea lancifolia,Goeppertia insignis,pet_friendly|patterned|high_humidity,3,Calathea lancifolia ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5 -constants/lexiconBatch2.ts,241,Calathea ornata,Goeppertia ornata,pet_friendly|patterned|high_humidity,3,Calathea ornata ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5 -constants/lexiconBatch1.ts,87,Geisterpflanze,Graptopetalum paraguayense,easy|succulent|sun,3,"Die Geisterpflanze hat zartgraue bis perlmutt-rosafarbene, rosettenfoermige Blaetter. Sehr robuste Sukkulente.",Volles Sonnenlicht,15-25 °C,14 -constants/lexiconBatch2.ts,36,Guzmania,Guzmania lingulata,flowering|high_humidity,2,"Die Guzmania ist eine Bromelie mit glänzenden, gruenen Blaettern und einem leuchtend roten, sternfoermigen Bluetenstand.",Helles indirektes Licht,18-27 °C,7 -constants/lexiconBatch1.ts,80,Mond-Kaktus,Gymnocalycium mihanovichii,easy|succulent,2,Der Mond-Kaktus ist eine farbenfrohe Veredelung eines chlorophylllosen Kaktus auf einem gruenen Unterlagekaktus.,Indirektes Licht,15-30 °C,14 -constants/lexiconBatch2.ts,119,Zaubernuss,Hamamelis mollis,flowering|medicinal,2,"Die Zaubernuss bluet im Winter mit fadendunnen, gelben Bluetenkranzeln, die bis -10 Grad standhalten.",Helles bis volles Licht,10-20 °C,10 -constants/lexiconBatch1.ts,6,Zebra-Haworthie,Haworthia fasciata,easy|succulent|low_light,3,Die Zebra-Haworthie ist eine kompakte Sukkulente mit weissen Querstreifen auf dunkelgruenen Blaettern.,Helles indirektes Licht,15-25 °C,14 -constants/lexiconBatch1.ts,37,Efeu,Hedera helix,easy|hanging|air_purifier|low_light,4,"Efeu ist eine robuste Kletter- und Haengepflanze mit charakteristischen, dreilappigen Blaettern. Sehr langlebig.",Wenig bis helles Licht,10-20 °C,7 -constants/lexiconBatch2.ts,83,Heliamphora,Heliamphora nutans,high_humidity,1,Heliamphora ist eine urtuemliche Kannenpflanze aus den Tafelbergen Venezuelas. Sehr dekorativ und selten.,Helles indirektes Licht,15-25 °C,5 -constants/lexiconBatch2.ts,141,Sonnenblume,Helianthus annuus,flowering|sun,2,"Sonnenblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,133,Currykraut,Helichrysum italicum,easy|sun,2,Currykraut ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 -constants/lexiconBatch2.ts,72,Heliconia,Heliconia psittacorum,flowering|bright_light|high_humidity,3,"Die Heliconia hat leuchtend orangefarbe oder rote, bootsfoermige Hochblaetter. Eine exotische Tropenpflanze.",Helles bis volles Licht,20-30 °C,5 -constants/lexiconBatch2.ts,191,Heliotrop,Heliotropium arborescens,flowering|sun,2,"Heliotrop ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,183,Lenzrose,Helleborus orientalis,flowering,1,"Lenzrose ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,182,Taglilie,Hemerocallis fulva,flowering|sun,2,"Taglilie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch1.ts,21,Hibiskus,Hibiscus rosa-sinensis,flowering|bright_light|sun,3,"Der Hibiskus begeistert mit grossen, trompetenfoermigen Blueten in Rot, Orange und Rosa.",Volles Sonnenlicht,18-28 °C,3 -constants/lexiconBatch2.ts,220,Gartenhibiskus,Hibiscus syriacus,flowering|tree|sun,3,Gartenhibiskus ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 -constants/lexiconBatch1.ts,105,Ritterstern,Hippeastrum hybrid,flowering|bright_light,2,"Der Ritterstern beeindruckt im Winter mit riesigen, trompetenfoermigen Blueten in Rot, Pink oder Weiss.",Helles bis volles Licht,18-25 °C,7 -constants/lexiconBatch2.ts,3,Kentia-Palme,Howea forsteriana,pet_friendly|tree|low_light,3,"Die Kentia-Palme ist eine der elegantesten Zimmerpalmen mit langen, herabhängenden Fiederblaettern.",Helles indirektes Licht,18-25 °C,7 -constants/lexiconBatch1.ts,58,Kleine Wachsblume,Hoya bella,flowering|succulent|hanging,3,"Die Kleine Wachsblume traegt zierliche, sternfoermige weisse Blueten mit rosa Mitte. Haengende Sukkulente.",Helles indirektes Licht,18-27 °C,10 -constants/lexiconBatch1.ts,57,Wachsblume,Hoya carnosa,easy|flowering|succulent|hanging,4,"Die Wachsblume ist eine Kletterpflanze mit dicken, wachsartigen Blaettern und sternfoermigen, duftenden Blueten.",Helles indirektes Licht,16-27 °C,10 -constants/lexiconBatch2.ts,159,Hasengloeckchen,Hyacinthoides non-scripta,flowering|sun,2,"Hasengloeckchen ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch1.ts,108,Hyazinthe,Hyacinthus orientalis,easy|flowering,2,"Die Hyazinthe bezaubert mit dichten Bluetenrispen und intensivem Duft in Blau, Rosa, Weiss oder Gelb.",Helles bis volles Licht,10-18 °C,5 -constants/lexiconBatch2.ts,148,Hortensie,Hydrangea macrophylla,flowering|bright_light,2,"Hortensie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Helles bis halbschattiges Licht,8-24 C,4 -constants/lexiconBatch2.ts,105,Johanniskraut,Hypericum perforatum,flowering|medicinal|sun,3,Das Johanniskraut hat leuchtend gelbe Blueten und ist ein wichtiges Heilkraut gegen Depressionen und Stimmungstiefs.,Volles Sonnenlicht,10-25 °C,7 -constants/lexiconBatch2.ts,227,Punktblatt,Hypoestes phyllostachya,patterned|bright_light,2,Punktblatt ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7 -constants/lexiconBatch2.ts,136,Ysop,Hyssopus officinalis,easy|sun,2,Ysop ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 -constants/lexiconBatch2.ts,203,Stechpalme,Ilex aquifolium,tree|sun,2,Stechpalme ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 -constants/lexiconBatch2.ts,176,Gartenbalsamine,Impatiens balsamina,flowering|bright_light,2,"Gartenbalsamine ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,59,Neuguinea-Balsamine,Impatiens hawkeri,easy|flowering,2,"Die Neuguinea-Balsamine hat grosse, leuchtende Blueten und ist sehr bluehfreudig. Ideal fuer Terrassen.",Helles indirektes Licht,18-27 °C,3 -constants/lexiconBatch1.ts,20,Fleissiges Lieschen,Impatiens walleriana,easy|flowering,2,Das Fleissige Lieschen bluet von Fruehling bis Herbst unermudlich in vielen Farben.,Helles indirektes Licht,16-24 °C,2 -constants/lexiconBatch1.ts,64,Suesskartoffel,Ipomoea batatas,easy|hanging|sun,3,"Die Suesskartoffel-Zierpflanze hat dekorative, herzfoermige Blaetter in gruen oder dunkelviolett. Ideal als Haengepflanze.",Volles Sonnenlicht,20-30 °C,5 -constants/lexiconBatch2.ts,156,Prunkwinde,Ipomoea purpurea,flowering|sun,2,"Prunkwinde ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,144,Bart-Iris,Iris germanica,flowering|sun,2,"Bart-Iris ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,211,Jacaranda,Jacaranda mimosifolia,flowering|tree|large,3,Jacaranda ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 -constants/lexiconBatch1.ts,59,Jasmin,Jasminum polyanthum,flowering,1,"Der Jasmin ist eine Kletterpflanze mit intensiv duftenden, weissen Blueten. Er bluet im Winter und Fruehling.",Helles bis volles Licht,10-22 °C,5 -constants/lexiconBatch2.ts,172,Arabischer Jasmin,Jasminum sambac,flowering|bright_light,2,"Arabischer Jasmin ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch1.ts,9,Kalanchoe,Kalanchoe blossfeldiana,easy|flowering|succulent|sun,4,"Die Kalanchoe ist eine beliebte Bluehpflanze mit leuchtenden Blueten in Rot, Orange, Gelb oder Rosa.",Helles bis volles Licht,15-25 °C,10 -constants/lexiconBatch2.ts,22,Brutblatt,Kalanchoe daigremontiana,easy|succulent|sun,3,Das Brutblatt bildet entlang des Blattrandes zahlreiche kleine Jungpflanzen. Eine faszinierende Sukkulente.,Helles bis volles Licht,15-25 °C,14 -constants/lexiconBatch2.ts,21,Kaninchen-Ohren,Kalanchoe tomentosa,easy|succulent|sun,3,"Kaninchen-Ohren haben weisslich-filzige Blaetter mit braunen Raendern, die Kaninchen­ohren aehneln. Sehr dekorativ.",Helles bis volles Licht,15-25 °C,14 -constants/lexiconBatch2.ts,95,Salat,Lactuca sativa,easy,1,Salat ist eine schnell wachsende Blattgemuese­pflanze. Im Topf und Balkonkasten sehr gut zu kultivieren.,Helles bis volles Licht,10-22 °C,3 -constants/lexiconBatch2.ts,197,Traenendes Herz,Lamprocapnos spectabilis,flowering|bright_light,2,"Traenendes Herz ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,64,Wandelroeschen,Lantana camara,flowering|bright_light|sun,3,"Das Wandelroeschen hat kugelige Bluetenkoepfe, die die Farbe von Gelb ueber Orange zu Rot wechseln. Sehr attraktiv.",Volles Sonnenlicht,18-28 °C,5 -constants/lexiconBatch2.ts,158,Duftwicke,Lathyrus odoratus,flowering|sun,2,"Duftwicke ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,121,Lorbeer,Laurus nobilis,easy|sun,2,Lorbeer ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 -constants/lexiconBatch1.ts,23,Echter Lavendel,Lavandula angustifolia,medicinal|bright_light|sun,3,Der Echte Lavendel ist ein aromatischer Halbstrauch mit lilafarbenen Bluetenaehren. Herrlicher Duft.,Volles Sonnenlicht,10-25 °C,10 -constants/lexiconBatch2.ts,180,Bechermalve,Lavatera trimestris,flowering|sun,2,"Bechermalve ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,173,Margerite,Leucanthemum vulgare,flowering|sun,2,"Margerite ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,201,Shasta-Margerite,Leucanthemum x superbum,flowering|sun,2,"Shasta-Margerite ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,126,Liebstoeckel,Levisticum officinale,easy|sun,2,Liebstoeckel ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 -constants/lexiconBatch2.ts,69,Ostertrompete,Lilium longiflorum,flowering|bright_light,2,"Die Ostertrompete hat grosse, weisse, trichterfoermige Blueten mit intensivem Duft. Klassische Osterblume.",Helles bis volles Licht,15-25 °C,5 -constants/lexiconBatch2.ts,23,Lebende Steine,Lithops julii,succulent|sun,2,"Lebende Steine sind faszinierende Mimikry-Sukkulenten, die Kieselsteinen taeuschen aehnlich sehen. Sehr trockenheitsresistent.",Volles Sonnenlicht,10-30 °C,21 -constants/lexiconBatch2.ts,4,Chinesische Fächerpalme,Livistona chinensis,tree|bright_light,2,"Die Chinesische Fächerpalme hat grosse, faecher­foermige Blaetter auf einem einzelnen Stamm. Sehr dekorativ.",Helles bis volles Licht,15-25 °C,7 -constants/lexiconBatch2.ts,62,Duftsteinrich,Lobularia maritima,easy|flowering,2,"Der Duftsteinrich ist ein niedrig wachsendes Pflanzchen mit winzigen, weissen oder lilafarbenen Blueten und suessem Duft.",Helles bis volles Licht,10-22 °C,3 -constants/lexiconBatch2.ts,171,Geissblatt,Lonicera japonica,flowering|bright_light,2,"Geissblatt ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,154,Lupine,Lupinus polyphyllus,flowering|sun,2,"Lupine ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,204,Magnolie,Magnolia grandiflora,flowering|tree|large,3,Magnolie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 -constants/lexiconBatch1.ts,79,Mammillaria,Mammillaria zeilmanniana,easy|flowering|succulent|sun,4,"Die Mammillaria ist ein kompakter, kugelfoermiger Kaktus, der im Fruehling einen Kranz aus rosa Blueten traegt.",Volles Sonnenlicht,15-35 °C,14 -constants/lexiconBatch1.ts,51,Gebet-Pflanze,Maranta leuconeura,pet_friendly|patterned|high_humidity,3,Die Gebet-Pflanze faltet ihre gemusterten Blaetter nachts wie Haende zusammen. Faszinierende rote und gruene Muster.,Indirektes Licht,18-27 °C,5 -constants/lexiconBatch2.ts,102,Zitronenmelisse,Melissa officinalis,easy|medicinal,2,Die Zitronenmelisse ist ein zitronig duftendes Heilkraut. Sie beruhigt die Nerven und foerdert den Schlaf.,Helles bis volles Licht,15-25 °C,5 -constants/lexiconBatch1.ts,26,Gruene Minze,Mentha spicata,easy,1,"Die Gruene Minze ist ein wuchsfreudiges Kuechenkraut mit frischem, minzigem Duft. Fuer Tee und Cocktails.",Helles bis volles Licht,15-25 °C,3 -constants/lexiconBatch2.ts,46,Tueipelfarn (Microsorum),Microsorum punctatum,high_humidity,1,"Microsorum punctatum ist ein tropischer Farn mit langen, ungeteilten, glaenzenden Wedeln. Fuer feuchte Standorte.",Helles indirektes Licht,18-27 °C,7 -constants/lexiconBatch1.ts,75,Stiefmuetterchen-Orchidee,Miltoniopsis roezlii,flowering|high_humidity,2,"Die Stiefmuetterchen-Orchidee hat grosse, flache Blueten. Bevorzugt kuehle Temperaturen und hohe Luftfeuchtigkeit.",Indirektes Licht,15-22 °C,5 -constants/lexiconBatch2.ts,76,Schamkraut,Mimosa pudica,flowering|bright_light,2,"Das Schamkraut faltet seine Blaettchen blitzschnell zusammen, wenn man sie beruehrt. Ein faszinierendes Erlebnis.",Helles bis volles Licht,20-28 °C,5 -constants/lexiconBatch2.ts,179,Indianernessel,Monarda didyma,flowering|sun,2,"Indianernessel ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,47,Monstera adansonii,Monstera adansonii,easy|hanging,2,Monstera adansonii hat herzfoermige Blaetter mit zahlreichen runden Lochern. Eine rankende Zimmerpflanze.,Helles indirektes Licht,18-27 °C,7 -constants/lexiconBatch2.ts,48,Monstera obliqua,Monstera obliqua,patterned|hanging,2,"Monstera obliqua ist eine seltene Monstera-Art mit filigranen Blaettern, die hauptsaechlich aus Lochern bestehen.",Helles indirektes Licht,18-27 °C,7 -constants/lexiconBatch2.ts,2,Bananenpflanze,Musa acuminata,large|high_humidity,2,"Die Bananenpflanze ist eine tropische Staude mit riesigen, glaenzenden Blaettern. Im Zimmer selten fruechttragend.",Helles bis volles Licht,20-30 °C,5 -constants/lexiconBatch1.ts,109,Traubenhyazinthe,Muscari armeniacum,easy|flowering,2,"Die Traubenhyazinthe bildet dichte Trauben aus kleinen, blauen bis violetten Gloeckchen. Zuverlaessige Fruejahrszwiebel.",Helles bis volles Licht,8-18 °C,7 -constants/lexiconBatch2.ts,177,Vergissmeinnicht,Myosotis sylvatica,flowering|sun,2,"Vergissmeinnicht ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch1.ts,106,Osterglocke,Narcissus pseudonarcissus,flowering,1,"Die Osterglocke ist der klassische Fruehjahrsblueher mit leuchtend gelben, trompetenfoermigen Blueten.",Helles bis volles Licht,10-18 °C,5 -constants/lexiconBatch2.ts,199,Nemesie,Nemesia strumosa,flowering|sun,2,"Nemesie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,37,Neoregelia,Neoregelia carolinae,flowering|patterned|bright_light,3,"Die Neoregelia ist eine Bromelie, bei der das Herzblatt zur Bluetzeit leuchtend rot wird. Sehr dekorativ.",Helles bis volles Licht,18-27 °C,7 -constants/lexiconBatch2.ts,79,Kannenpflanze,Nepenthes alata,hanging|high_humidity,2,"Die Kannenpflanze bildet grosse, gefuellte Kannen als Insekten­fallen. Eine faszinierende, tropische Pflanze.",Helles indirektes Licht,20-30 °C,5 -constants/lexiconBatch2.ts,132,Katzenminze,Nepeta cataria,easy|sun,2,Katzenminze ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 -constants/lexiconBatch2.ts,120,Oleander,Nerium oleander,flowering|bright_light|sun,3,"Der Oleander ist ein mediteraner Strauch mit leuchtend roten, rosa oder weissen Blueten. Sehr hitzetolerant.",Volles Sonnenlicht,15-28 °C,7 -constants/lexiconBatch2.ts,193,Ziertabak,Nicotiana alata,flowering|sun,2,"Ziertabak ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch1.ts,25,Basilikum,Ocimum basilicum,easy|medicinal|sun,3,"Basilikum ist das beliebteste Kuechenkraut mit intensiv aromatischen, gruenen Blaettern. Fuer Pesto verwendet.",Volles Sonnenlicht,18-30 °C,2 -constants/lexiconBatch1.ts,74,Tanzerinnen-Orchidee,Oncidium sphacelatum,flowering|high_humidity,2,"Die Tanzerinnen-Orchidee traegt lange Rispen mit Hunderten kleiner, gelb-brauner Blueten. Sehr reichliche Bluetracht.",Helles indirektes Licht,18-27 °C,7 -constants/lexiconBatch1.ts,82,Hasenohren-Kaktus,Opuntia microdasys,easy|succulent|sun,3,"Der Hasenohren-Kaktus hat flache, ovale Triebe mit dichten weissen Glochiden. Klassischer Zimmerkaktus.",Volles Sonnenlicht,10-35 °C,21 -constants/lexiconBatch2.ts,124,Majoran,Origanum majorana,easy|sun,2,Majoran ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 -constants/lexiconBatch1.ts,28,Oregano,Origanum vulgare,easy|medicinal|sun,3,"Oregano ist ein aromatisches Kuechenkraut mit runden, behaarten Blaettern. In mediterraner Kueche beliebt.",Volles Sonnenlicht,15-25 °C,7 -constants/lexiconBatch2.ts,200,Kapmargerite,Osteospermum ecklonis,flowering|sun,2,"Kapmargerite ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch1.ts,54,Kleeblume,Oxalis triangularis,flowering|patterned,2,"Die Kleeblume hat tiefviolette, dreieckige Blaetter und zarte rosa Blueten. Sie faltet die Blaetter bei Dunkelheit.",Helles indirektes Licht,15-24 °C,7 -constants/lexiconBatch2.ts,231,Glueckskastanie,Pachira aquatica,easy|tree|bright_light,3,Glueckskastanie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7 -constants/lexiconBatch1.ts,88,Mondstein-Pflanze,Pachyphytum oviferum,easy|succulent|sun,3,"Die Mondstein-Pflanze hat dicke, ovale Blaetter mit einem pastellrosafarbenen, mehligen Ueberzug.",Volles Sonnenlicht,15-25 °C,14 -constants/lexiconBatch2.ts,143,Pfingstrose,Paeonia lactiflora,flowering|sun,2,"Pfingstrose ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,6,Schraubenbaum,Pandanus veitchii,patterned|bright_light,2,"Der Schraubenbaum hat spiralfoermig angeordnete, gruenweiss gestreifte Blaetter. Sehr dekorativ und exotisch.",Helles bis volles Licht,18-27 °C,7 -constants/lexiconBatch2.ts,185,Mohn,Papaver rhoeas,flowering|sun,2,"Mohn ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch1.ts,63,Passionsblume,Passiflora caerulea,flowering,1,"Die Passionsblume ist eine faszinierende Kletterpflanze mit komplex strukturierten, blau-weissen Blueten.",Helles bis volles Licht,15-27 °C,5 -constants/lexiconBatch1.ts,31,Rosengeranie,Pelargonium graveolens,easy|medicinal|sun,3,Die Rosengeranie ist eine Duftpflanze mit tief eingeschnittenen Blaettern und rosaenlichem Aroma.,Volles Sonnenlicht,15-25 °C,7 -constants/lexiconBatch2.ts,61,Efeu-Geranie,Pelargonium peltatum,easy|flowering|hanging|sun,4,"Die Efeu-Geranie hat efeufoermige, glaenzende Blaetter und bluet den ganzen Sommer in leuchtenden Farben.",Helles bis volles Licht,15-25 °C,5 -constants/lexiconBatch2.ts,174,Stehende Geranie,Pelargonium zonale,flowering|sun,2,"Stehende Geranie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,229,Wassermelonen-Peperomie,Peperomia argyreia,pet_friendly|patterned,2,Wassermelonen-Peperomie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7 -constants/lexiconBatch1.ts,102,Rippenpeperomie,Peperomia caperata,easy|pet_friendly,2,"Die Rippenpeperomie hat tief gerippte, dunkelgruene bis violette Blaetter mit einer samtigen Textur.",Helles indirektes Licht,18-26 °C,10 -constants/lexiconBatch1.ts,103,Spiegelpeperomie,Peperomia obtusifolia,easy|pet_friendly|low_light,3,"Die Spiegelpeperomie hat glaenzende, lederartige, oval-runde Blaetter in tiefem Gruen. Sehr robust.",Helles indirektes Licht,16-26 °C,10 -constants/lexiconBatch2.ts,230,Raindrop-Peperomie,Peperomia polybotrya,easy|pet_friendly,2,Raindrop-Peperomie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7 -constants/lexiconBatch2.ts,134,Shiso,Perilla frutescens,easy|sun,2,Shiso ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 -constants/lexiconBatch1.ts,29,Petersilie,Petroselinum crispum,easy,1,Petersilie ist eines der meistgenutzten Kuechenkraeuter mit frisch-aromatischem Geschmack. Reich an Vitaminen.,Helles Licht,10-25 °C,3 -constants/lexiconBatch1.ts,34,Petunie,Petunia hybrida,easy|pet_friendly|flowering|sun,4,Die Petunie ist eine der beliebtesten Balkonpflanzen mit trichterfoermigen Blueten in unzaehligen Farben.,Volles Sonnenlicht,15-25 °C,2 -constants/lexiconBatch1.ts,69,Schmetterlingsorchidee,Phalaenopsis amabilis,flowering|high_humidity,2,Die Schmetterlingsorchidee ist die bekannteste Zimmerorchidee. Sie bluet bei guter Pflege monatelang.,Helles indirektes Licht,18-28 °C,10 -constants/lexiconBatch2.ts,50,Philodendron bipinnatifidum,Philodendron bipinnatifidum,easy|large,2,"Philodendron bipinnatifidum hat grosse, tief gelappte Blaetter. Er entwickelt einen beeindruckenden, baumfoermigen Wuchs.",Helles indirektes Licht,18-27 °C,7 -constants/lexiconBatch2.ts,51,Roter Philodendron,Philodendron erubescens,easy|hanging,2,"Der Rote Philodendron hat glaenzende, herzfoermige Blaetter, die jung roetrlich erscheinen. Sehr dekorativ.",Helles indirektes Licht,18-27 °C,7 -constants/lexiconBatch2.ts,243,Philodendron Pink Princess,Philodendron erubescens Pink Princess,patterned|bright_light,2,Philodendron Pink Princess ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7 -constants/lexiconBatch2.ts,49,Philodendron gloriosum,Philodendron gloriosum,patterned|large|high_humidity,3,"Philodendron gloriosum hat grosse, samtige, herzfoermige Blaetter mit weissen Rippen. Eine atemberaubende Pflanze.",Helles indirektes Licht,18-27 °C,7 -constants/lexiconBatch1.ts,15,Herzblatt-Philodendron,Philodendron hederaceum,easy|hanging|low_light,3,Der Herzblatt-Philodendron ist eine pflegeleichte Kletter- oder Haengepflanze mit herzfoermigen Blaettern.,Indirektes Licht,18-28 °C,7 -constants/lexiconBatch2.ts,242,Philodendron Brasil,Philodendron hederaceum Brasil,easy|hanging|low_light,3,Philodendron Brasil ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7 -constants/lexiconBatch2.ts,40,Blaues Kanaelfarn,Phlebodium aureum,high_humidity,1,"Der Blaue Kanaelfarn hat wachsartige, blaugruene Wedel und glaenzende Wurzelstaemme. Sehr dekorativ.",Helles indirektes Licht,18-27 °C,7 -constants/lexiconBatch2.ts,165,Flammenblume,Phlox paniculata,flowering|sun,2,"Flammenblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch1.ts,44,Zwergdattelpalme,Phoenix roebelenii,tree|bright_light,2,"Die Zwergdattelpalme ist eine zierliche Palme mit eleganten, gebogenen Fiederblaettern. Tropisches Flair.",Helles bis volles Licht,18-27 °C,7 -constants/lexiconBatch2.ts,8,Goldener Bambus,Phyllostachys aurea,easy|large,2,"Der Goldene Bambus hat elegante, goldgelbe Halme mit engstehenden Knoten. Sehr dekorativ als Sichtschutz.",Helles bis volles Licht,10-30 °C,5 -constants/lexiconBatch2.ts,207,Fichte,Picea abies,tree|large|sun,3,Fichte ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 -constants/lexiconBatch2.ts,228,Aluminium-Pflanze,Pilea cadierei,easy|pet_friendly|patterned,3,Aluminium-Pflanze ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7 -constants/lexiconBatch1.ts,2,Ufopflanze,Pilea peperomioides,easy|pet_friendly,2,"Die Ufopflanze hat unverwechselbare, runde Blaetter auf langen Stielen. Bildet leicht Ableger zum Verschenken.",Helles indirektes Licht,13-30 °C,7 -constants/lexiconBatch2.ts,81,Fettkraut,Pinguicula grandiflora,flowering|high_humidity,2,"Das Fettkraut faengt Insekten mit klebrigen Blaettern. Es bluet mit violetten, sporenartigen Blueten.",Helles indirektes Licht,10-20 °C,5 -constants/lexiconBatch2.ts,206,Kiefer,Pinus sylvestris,tree|large|sun,3,Kiefer ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 -constants/lexiconBatch2.ts,41,Geweihfarn,Platycerium bifurcatum,hanging|high_humidity,2,"Der Geweihfarn hat gespaltene Wedel, die einem Hirschgeweih aehneln. Er ist ein epiphytischer Farn fuer Holz.",Helles indirektes Licht,15-25 °C,7 -constants/lexiconBatch2.ts,152,Buntnessel,Plectranthus scutellarioides,patterned|bright_light,2,"Buntnessel ist eine farbstarke Zierpflanze, die vor allem fuer ihr dekoratives Laub beliebt ist.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch1.ts,61,Bleiwurz,Plumbago auriculata,flowering|bright_light|sun,3,"Die Bleiwurz ist ein halbimmergruener Strauch mit himmelblauen Blueten, der fast das ganze Jahr bluet.",Volles Sonnenlicht,15-27 °C,5 -constants/lexiconBatch2.ts,118,Tempel-Baum,Plumeria rubra,flowering|tree|sun,3,"Der Tempel-Baum hat intensiv duftende, sternfoermige Blueten in Weiss, Gelb oder Rosa. Klassische Tropenblume.",Volles Sonnenlicht,20-30 °C,7 -constants/lexiconBatch2.ts,44,Tueipelfarn,Polypodium vulgare,easy,1,Der Tueipelfarn ist ein heimischer Farn mit gelappten Wedeln und runden Sporenhaeufchen auf der Unterseite.,Helles indirektes Licht,10-20 °C,7 -constants/lexiconBatch2.ts,27,Speckbaum,Portulacaria afra,easy|succulent|sun,3,"Der Speckbaum ist eine sukkulente Pflanze mit roten Stielen und kleinen, runden, glaenzenden Blaettern.",Helles bis volles Licht,15-30 °C,14 -constants/lexiconBatch1.ts,36,Primel,Primula vulgaris,flowering,1,"Die Primel ist einer der ersten Fruehjahrs­boten mit lebhaften Blueten in Gelb, Pink, Rot und Lila.",Helles indirektes Licht,10-18 °C,4 -constants/lexiconBatch2.ts,71,Koenigs-Protea,Protea cynaroides,flowering|large|sun,3,"Die Koenigs-Protea ist die Nationalblume Suedafrikas mit riesigen, imposanten Bluetenkoepfen. Eine echte Besonderheit.",Volles Sonnenlicht,10-25 °C,7 -constants/lexiconBatch2.ts,218,Kirschlorbeer,Prunus laurocerasus,tree|sun,2,Kirschlorbeer ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 -constants/lexiconBatch2.ts,89,Guave,Psidium guajava,tree|sun,2,Die Guave ist ein tropischer Obstbaum mit gelblich-weissen Fruechten. Sie ist reich an Vitamin C.,Volles Sonnenlicht,18-30 °C,7 -constants/lexiconBatch2.ts,88,Granatapfelbaum,Punica granatum,flowering|tree|sun,3,"Der Granatapfelbaum hat leuchtend rote Blueten und rote, essbare Fruechte mit rubinroten Kernen.",Volles Sonnenlicht,15-28 °C,7 -constants/lexiconBatch2.ts,205,Eiche,Quercus robur,tree|large|sun,3,Eiche ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 -constants/lexiconBatch2.ts,162,Ranunkel,Ranunculus asiaticus,flowering|sun,2,"Ranunkel ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,98,Radieschen,Raphanus sativus,easy,1,"Das Radieschen ist ein schnellwachsendes Gemuese mit runden, roten Knollen. Es reift in nur 3-4 Wochen.",Helles bis volles Licht,10-22 °C,2 -constants/lexiconBatch2.ts,52,Mini-Monstera,Rhaphidophora tetrasperma,easy|hanging,2,"Die Mini-Monstera hat monstera­aehnliche, gelochte Blaetter auf einer kompakten, klettternden Pflanze. Sehr trendig.",Helles indirektes Licht,18-27 °C,7 -constants/lexiconBatch1.ts,45,Stab-Palme,Rhapis excelsa,tree|low_light,2,"Die Stab-Palme ist eine elegante Zimmerpalme mit faecher­foermigen Blaettern auf duennen, bambusartigen Staemmen.",Helles indirektes Licht,15-25 °C,7 -constants/lexiconBatch1.ts,85,Korallenkaktus,Rhipsalis baccifera,succulent|hanging,2,"Der Korallenkaktus ist ein epiphytischer Kaktus mit duennen, haengenden Trieben und kleinen weissen Beeren.",Indirektes Licht,18-27 °C,7 -constants/lexiconBatch2.ts,170,Rhododendron,Rhododendron catawbiense,flowering|tree|bright_light,3,"Rhododendron ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch1.ts,91,Japanische Azalee,Rhododendron simsii,flowering,1,"Die Japanische Azalee bluet im Winter und Fruehling ueppig mit leuchtend roten, rosa oder weissen Blueten.",Helles indirektes Licht,10-18 °C,4 -constants/lexiconBatch2.ts,214,Robinie,Robinia pseudoacacia,tree|large|sun,3,Robinie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 -constants/lexiconBatch1.ts,66,Chinesische Rose,Rosa chinensis,flowering|sun,2,Die Chinesische Rose ist eine der Stammarten vieler Gartenrosen und bluet fast ununterbrochen.,Volles Sonnenlicht,15-25 °C,5 -constants/lexiconBatch2.ts,142,Rose,Rosa x hybrida,flowering|bright_light|sun,3,"Rose ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch1.ts,24,Rosmarin,Rosmarinus officinalis,easy|medicinal|sun,3,Rosmarin ist ein aromatisches Kraut mit nadelartigen Blaettern und blauen Blueten. In der Kueche unverzichtbar.,Volles Sonnenlicht,10-25 °C,7 -constants/lexiconBatch2.ts,167,Rudbeckie,Rudbeckia hirta,flowering|sun,2,"Rudbeckie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,130,Sauerampfer,Rumex acetosa,easy|sun,2,Sauerampfer ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 -constants/lexiconBatch1.ts,94,Afrikanisches Veilchen,Saintpaulia ionantha,easy|flowering,2,"Das Afrikanische Veilchen ist eine kleine, kompakte Bluehpflanze mit samtigen Blaettern und violetten Blueten.",Helles indirektes Licht,18-25 °C,7 -constants/lexiconBatch2.ts,113,Silber-Weide,Salix alba,tree|large|medicinal,3,"Die Silber-Weide hat silbrig-glaenzende Blaetter. Weidenrinde enthält Salicylsaeure, die Grundlage von Aspirin.",Helles bis volles Licht,10-25 °C,7 -constants/lexiconBatch2.ts,195,Mehlsalbei,Salvia farinacea,flowering|sun,2,"Mehlsalbei ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,103,Salbei,Salvia officinalis,easy|medicinal|sun,3,Salbei ist ein aromatisches Heilkraut mit silbrig-gruenen Blaettern. Er hat antibakterielle und entzuendungshem­mende Wirkung.,Volles Sonnenlicht,10-25 °C,7 -constants/lexiconBatch2.ts,168,Feuersalbei,Salvia splendens,flowering|sun,2,"Feuersalbei ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,112,Schwarzer Holunder,Sambucus nigra,flowering|tree|medicinal,3,Der Schwarze Holunder hat weisse Doldenbluten und schwarze Beeren. Die Fruechte werden fuer Sirup und Saft verwendet.,Helles bis volles Licht,10-25 °C,7 -constants/lexiconBatch2.ts,17,Zylindrischer Bogenhanf,Sansevieria cylindrica,easy|succulent|sun,3,"Der Zylindrische Bogenhanf hat zylindrische, aufrechte Blaetter, die sich nach oben verjuengen. Sehr pflegeleicht.",Helles bis volles Licht,15-27 °C,14 -constants/lexiconBatch2.ts,78,Purpursonnentau,Sarracenia purpurea,high_humidity|sun,2,Der Purpursonnentau ist eine fleischfressende Kannenpflanze mit purpurroten Kannen. Faengt Insekten.,Volles Sonnenlicht,5-25 °C,3 -constants/lexiconBatch2.ts,123,Bohnenkraut,Satureja hortensis,easy|sun,2,Bohnenkraut ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 -constants/lexiconBatch2.ts,11,Grosse Strahlenaralie,Schefflera actinophylla,easy|tree|large,3,"Die Grosse Strahlenaralie kann grosse, handfoermige Blaetter entwickeln. Sie ist ideal als Zimmerstrauch.",Helles indirektes Licht,18-27 °C,7 -constants/lexiconBatch2.ts,10,Strahlenaralie,Schefflera arboricola,easy|tree|air_purifier,3,"Die Strahlenaralie hat fingerfoermig angeordnete, glaenzende Blaetter auf langen Stielen. Sehr robuste Zimmerpflanze.",Helles indirektes Licht,15-25 °C,7 -constants/lexiconBatch2.ts,235,Falsche Aralie,Schefflera elegantissima,tree|bright_light,2,Falsche Aralie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7 -constants/lexiconBatch1.ts,8,Weihnachtskaktus,Schlumbergera truncata,easy|flowering|succulent,3,"Der Weihnachtskaktus erfreut zur Weihnachtszeit mit leuchtenden Blueten in Rosa, Rot oder Weiss.",Helles indirektes Licht,15-21 °C,7 -constants/lexiconBatch1.ts,55,Satinpothos,Scindapsus pictus,easy|patterned|hanging,3,"Der Satinpothos hat samtig-glaenzende, silbrig gefleckte Blaetter auf langen, haengenden Ranken.",Helles indirektes Licht,18-28 °C,7 -constants/lexiconBatch1.ts,7,Eselschwanz,Sedum morganianum,easy|succulent|hanging|sun,4,"Der Eselschwanz ist eine haengende Sukkulente mit langen Trieben aus dichten, blaugruenen Blaettchen.",Volles Sonnenlicht,15-25 °C,14 -constants/lexiconBatch2.ts,45,Regenbogenmoos,Selaginella uncinata,patterned|high_humidity,2,"Das Regenbogenmoos hat schuppenfoermige Blaetter, die im Licht schillernd irisieren. Dekorativ fuer Terrarien.",Helles indirektes Licht,18-27 °C,5 -constants/lexiconBatch1.ts,100,Perlenschnur-Pflanze,Senecio rowleyanus,easy|succulent|hanging,3,"Die Perlenschnur-Pflanze hat haengende Ranken mit kugelfoermigen, perlenaehnlichen Blaettern. Einzigartige Sukkulente.",Helles bis volles Licht,15-27 °C,14 -constants/lexiconBatch2.ts,28,Blauer Kreuzkraut,Senecio serpens,easy|succulent|sun,3,"Der Blaue Kreuzkraut hat zylindrische, blaublaugruene Blaetter und einen kriechenden Wuchs. Sehr dekorativ.",Helles bis volles Licht,15-25 °C,14 -constants/lexiconBatch2.ts,91,Tomate,Solanum lycopersicum,easy,1,"Die Tomate ist eine beliebte Gemuese- und Balkonpflanze mit roten, saftigen Fruechten. Im Topf kultivierbar.",Volles Sonnenlicht,18-28 °C,3 -constants/lexiconBatch2.ts,93,Aubergine,Solanum melongena,bright_light|sun,2,"Die Aubergine ist eine Gemuese­pflanze mit grossen, violetten Fruechten. Sie benoetigt viel Waerme und Sonne.",Volles Sonnenlicht,20-30 °C,5 -constants/lexiconBatch2.ts,238,Bubikopf,Soleirolia soleirolii,pet_friendly|high_humidity,2,Bubikopf ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,15-24 C,4 -constants/lexiconBatch2.ts,213,Eberesche,Sorbus aucuparia,tree|large|sun,3,Eberesche ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 -constants/lexiconBatch2.ts,96,Spinat,Spinacia oleracea,easy,1,Spinat ist ein naehrstoffreiches Blattgemuese mit dunkelgruenen Blaettern. Reich an Eisen und Vitaminen.,Helles bis volles Licht,10-20 °C,3 -constants/lexiconBatch2.ts,222,Spierstrauch,Spiraea japonica,flowering|tree|sun,3,Spierstrauch ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 -constants/lexiconBatch2.ts,25,Aasblume,Stapelia grandiflora,flowering|succulent|sun,3,"Die Aasblume hat fleischige, gruene Staengel und riesige, sternfoermige Blueten mit aasartigem Duft.",Helles bis volles Licht,18-30 °C,14 -constants/lexiconBatch1.ts,60,Madagaskar-Jasmin,Stephanotis floribunda,flowering,1,"Der Madagaskar-Jasmin hat dicke, glaenzende Blaetter und wachsweisse, intensiv duftende Blueten. Klassische Hochzeitsblume.",Helles indirektes Licht,18-25 °C,7 -constants/lexiconBatch2.ts,131,Stevia,Stevia rebaudiana,easy|sun,2,Stevia ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 -constants/lexiconBatch2.ts,1,Weisse Strelitzie,Strelitzia nicolai,tree|large|bright_light,3,"Die Weisse Strelitzie ist ein beeindruckender Zimmerstrauch mit grossen, blaugruenen Blaettern und weiss-blauen Blueten.",Helles bis volles Licht,18-27 °C,7 -constants/lexiconBatch1.ts,3,Paradiesvogelblume,Strelitzia reginae,flowering|large|sun,3,"Die Paradiesvogelblume beeindruckt mit leuchtend orangefarbenen und blauen Blueten, die einem Vogel aehneln.",Volles Sonnenlicht,18-26 °C,7 -constants/lexiconBatch1.ts,95,Drehfrucht,Streptocarpus hybridus,flowering,1,"Die Drehfrucht ist ein Gesneriengewaechs mit langen, gerippten Blaettern und trichterfoermigen Blueten in Lila oder Rosa.",Helles indirektes Licht,15-22 °C,7 -constants/lexiconBatch1.ts,52,Stromanthe,Stromanthe sanguinea,patterned|high_humidity,2,Die Stromanthe hat dekorative Blaetter mit weissem Muster und leuchtend roter Unterseite. Familie der Marantaceen.,Helles indirektes Licht,18-25 °C,5 -constants/lexiconBatch2.ts,166,Herbstaster,Symphyotrichum novi-belgii,flowering|sun,2,"Herbstaster ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch1.ts,56,Pfeilblatt,Syngonium podophyllum,easy|hanging,2,"Das Pfeilblatt hat charakteristisch pfeilfoermige Blaetter, die sich mit dem Alter weiterentwickeln.",Helles indirektes Licht,16-27 °C,7 -constants/lexiconBatch2.ts,149,Flieder,Syringa vulgaris,flowering|tree|sun,3,"Flieder ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,66,Studentenblume,Tagetes patula,easy|flowering|sun,3,Die Studentenblume ist eine robuste Sommerblume mit orangen oder gelben Blueten. Sie haelt Schadlinge fern.,Volles Sonnenlicht,15-28 °C,3 -constants/lexiconBatch2.ts,244,Philodendron Xanadu,Thaumatophyllum xanadu,bright_light,1,Philodendron Xanadu ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7 -constants/lexiconBatch1.ts,27,Thymian,Thymus vulgaris,easy|medicinal|sun,3,"Thymian ist ein kleiner, aromatischer Strauch mit winzigen Blaettern und rosa Blueten. Wichtiges Kuechenkraut.",Volles Sonnenlicht,10-25 °C,7 -constants/lexiconBatch2.ts,33,Luftpflanze,Tillandsia ionantha,easy,1,Die Luftpflanze ist eine kompakte Bromelie ohne Topferde. Sie nimmt Wasser und Naehrstoffe ueber die Blattschuppen auf.,Helles bis volles Licht,15-30 °C,3 -constants/lexiconBatch2.ts,32,Spanisches Moos,Tillandsia usneoides,easy|hanging,2,"Das Spanische Moos ist eine epiphytische Bromelie ohne Wurzeln, die in der Luft haengt. Es benoetigt nur Feuchtigkeitsbespruehing.",Helles bis volles Licht,15-30 °C,3 -constants/lexiconBatch2.ts,55,Weisse Tradescantia,Tradescantia fluminensis,easy|hanging,2,Die Weisse Tradescantia hat gruene Blaetter mit weisslichen Unterseiten. Sehr robust und schnellwachsend.,Helles indirektes Licht,15-25 °C,5 -constants/lexiconBatch2.ts,54,Lila Tradescantia,Tradescantia pallida,easy|hanging|sun,3,Die Lila Tradescantia hat leuchtend purpurrote Blaetter und ist sehr auffaellig. Sie liebt viel Licht.,Helles bis volles Licht,15-25 °C,5 -constants/lexiconBatch1.ts,17,Zebrakraut,Tradescantia zebrina,easy|patterned|hanging,3,Das Zebrakraut faellt durch seine silbrig-lila gestreiften Blaetter auf. Schnellwachsende Haengepflanze.,Helles indirektes Licht,15-25 °C,5 -constants/lexiconBatch2.ts,151,Kapuzinerkresse,Tropaeolum majus,flowering|sun,2,"Kapuzinerkresse ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch1.ts,107,Tulpe,Tulipa gesneriana,easy|flowering,2,Die Tulpe ist eine der beliebtesten Fruehjahrsblueher mit kelchfoermigen Blueten in unzaehligen Farben.,Helles bis volles Licht,8-18 °C,5 -constants/lexiconBatch2.ts,111,Grosse Brennessel,Urtica dioica,medicinal,1,Die Grosse Brennessel ist eine Heilpflanze mit brennenden Haaren. Die Blaetter sind reich an Vitaminen und Mineralien.,Helles bis volles Licht,10-25 °C,7 -constants/lexiconBatch2.ts,82,Wasserschlauch,Utricularia gibba,high_humidity|sun,2,Der Wasserschlauch ist eine wasserbewohnende fleischfressende Pflanze mit Schlaeuchen als Insekten­fallen.,Helles bis volles Licht,15-25 °C,2 -constants/lexiconBatch2.ts,104,Baldrian,Valeriana officinalis,flowering|medicinal,2,Baldrian ist ein bekanntes Heilkraut mit weissen bis roeslichen Blueten. Die Wurzeln werden zur Schlaffoerderung verwendet.,Helles bis volles Licht,15-25 °C,7 -constants/lexiconBatch1.ts,72,Vanda-Orchidee,Vanda coerulea,flowering|bright_light|high_humidity,3,Die Vanda-Orchidee ist bekannt fuer ihre seltene blaue Bluetenfarbe. Epiphytische Orchidee mit grossen Blueten.,Helles bis volles Licht,20-30 °C,3 -constants/lexiconBatch1.ts,76,Vanille,Vanilla planifolia,flowering|high_humidity,2,"Die Vanille ist eine kletternde Orchidee, aus deren Fruechten das beliebte Gewuerz gewonnen wird.",Helles indirektes Licht,20-30 °C,5 -constants/lexiconBatch2.ts,192,Koenigskerze,Verbascum thapsus,flowering|medicinal|sun,3,"Koenigskerze ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,164,Eisenkraut,Verbena bonariensis,flowering|sun,2,"Eisenkraut ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,198,Hornveilchen,Viola cornuta,flowering|sun,2,"Hornveilchen ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch1.ts,35,Stiefmuetterchen,Viola wittrockiana,easy|flowering,2,Das Stiefmuetterchen ist ein bekannter Fruehjahrsblueher mit charakteristisch gezeichneten Blueten.,Helles bis volles Licht,5-18 °C,3 -constants/lexiconBatch2.ts,35,Flammen-Bromelie,Vriesea splendens,flowering|patterned|high_humidity,3,"Die Flammen-Bromelie hat gebänderte, dunkelgruene Blaetter und einen spektakulaeren, roten Bluetenstand.",Helles indirektes Licht,18-25 °C,7 -constants/lexiconBatch2.ts,5,Mexikanische Fächerpalme,Washingtonia robusta,tree|large|sun,3,"Die Mexikanische Fächerpalme ist eine schlanke, hohe Palme mit faecher­foermigen Blaettern. Sehr hitzetolerant.",Volles Sonnenlicht,15-35 °C,10 -constants/lexiconBatch2.ts,221,Weigelie,Weigela florida,flowering|tree|sun,3,Weigelie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 -constants/lexiconBatch1.ts,65,Chinesischer Blauregen,Wisteria sinensis,flowering|large|sun,3,"Der Chinesische Blauregen ist ein ueppiger Kletterkuenstler mit langen, duftenden Bluetentrauben in Lila.",Volles Sonnenlicht,10-25 °C,7 -constants/lexiconBatch2.ts,246,Yucca aloifolia,Yucca aloifolia,easy|tree|sun,3,Yucca aloifolia ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Volles Sonnenlicht,18-30 C,10 -constants/lexiconBatch1.ts,40,Yucca-Palme,Yucca elephantipes,easy|tree|sun,3,"Die Yucca-Palme ist eine robuste Zimmerpflanze mit starrem, immergruenem Blaetterschopf auf einem dicken Stamm.",Helles bis volles Licht,15-28 °C,14 -constants/lexiconBatch2.ts,70,Calla,Zantedeschia aethiopica,flowering|high_humidity,2,"Die Calla hat elegante, trichterfoermige weisse Hochblaetter und glaenzende, herzfoermige Blaetter. Sehr edel.",Helles indirektes Licht,15-24 °C,7 -constants/lexiconBatch2.ts,75,Ingwer,Zingiber officinale,medicinal|high_humidity,2,Ingwer ist eine tropische Gewuerzpflanze mit aromatischen Knollen. Die Blaetter sind schilfartig.,Helles indirektes Licht,20-30 °C,5 -constants/lexiconBatch2.ts,65,Zinnie,Zinnia elegans,easy|flowering|sun,3,"Die Zinnie ist eine leuchtende Sommerblume mit grossen, dahlienaehnlichen Blueten. Sehr robust und hitzetolerant.",Volles Sonnenlicht,18-30 °C,3 +source_file,source_index,name,botanical_name,all_categories,category_count,description,light,temp,water_interval_days +constants/lexiconBatch2.ts,115,Faecherahorn,Acer palmatum,tree,1,"Der Faecherahorn ist ein japanischer Zierahorn mit feingeschnittenen, faecherfoermigen Blaettern in Gruen oder Rot.",Helles bis volles Licht,10-22 °C,5 +constants/lexiconBatch2.ts,212,Spitzahorn,Acer platanoides,tree|large|sun,3,Spitzahorn ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 +constants/lexiconBatch2.ts,108,Schafgarbe,Achillea millefolium,flowering|medicinal|sun,3,Die Schafgarbe hat weisse oder rosafarbene Bluetenschirme und fein gefiederte Blaetter. Wichtige Heilpflanze.,Volles Sonnenlicht,10-25 °C,7 +constants/lexiconBatch1.ts,86,Wuestenrose,Adenium obesum,flowering|succulent|sun,3,Die Wuestenrose ist eine sukkulente Zimmerpflanze mit dickem Stamm und leuchtend pinken Blueten.,Volles Sonnenlicht,20-35 °C,10 +constants/lexiconBatch2.ts,117,Socotra-Wuestenrose,Adenium socotranum,flowering|succulent|sun,3,"Die Socotra-Wuestenrose ist eine seltene, endemische Art mit einem sehr dicken, knolligen Stamm und rosa Blueten.",Volles Sonnenlicht,20-35 °C,14 +constants/lexiconBatch2.ts,42,Frauenhaarfarn,Adiantum raddianum,high_humidity,1,"Der Frauenhaarfarn hat zarte, feingliedrige Wedel auf schwarzen, draht­aehnlichen Stielen. Liebt Feuchtigkeit.",Helles indirektes Licht,18-27 °C,3 +constants/lexiconBatch2.ts,31,Adromischus,Adromischus cristatus,easy|succulent|sun,3,Adromischus ist eine kompakte Sukkulente mit ungewoehnlich wellenrandigen Blaettern auf kurzen Staengeln.,Helles bis volles Licht,15-25 °C,14 +constants/lexiconBatch2.ts,34,Silbervase,Aechmea fasciata,flowering|patterned,2,Die Silbervase ist eine Bromelie mit silbrig gebänderten Blaettern und einem rosafarbenen Bluetenstand.,Helles indirektes Licht,18-25 °C,10 +constants/lexiconBatch1.ts,10,Schwarze Rose (Aeonium),Aeonium arboreum,succulent|sun,2,"Das Aeonium bildet dekorative, rosettenfoermige Sukkulenten an verzweigten Stielen.",Volles Sonnenlicht,10-25 °C,10 +constants/lexiconBatch1.ts,98,Lippenstiftpflanze,Aeschynanthus radicans,flowering|hanging|high_humidity,3,Die Lippenstiftpflanze hat haengende Triebe mit glaenzenden Blaettern und leuchtend roten Roehrenbluten.,Helles indirektes Licht,18-27 °C,7 +constants/lexiconBatch1.ts,11,Agave,Agave americana,succulent|large|sun,3,"Die Agave ist eine imposante Sukkulente mit steifen, blaugruenen Blaettern mit Stacheln. Sie bluet nur einmal.",Volles Sonnenlicht,10-35 °C,21 +constants/lexiconBatch1.ts,50,Aglaoneme,Aglaonema commutatum,easy|patterned|low_light,3,Die Aglaoneme ist eine dekorative Zimmerpflanze mit silbrig-gruen gemusterten Blaettern. Tolerant gegenueber wenig Licht.,Wenig bis helles Licht,15-26 °C,7 +constants/lexiconBatch2.ts,155,Stockrose,Alcea rosea,flowering|sun,2,"Stockrose ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch1.ts,30,Schnittlauch,Allium schoenoprasum,easy,1,Schnittlauch ist ein beliebtes Kuechenkraut mit roehrenfoermigen Blaettern und lila Blueten.,Helles bis volles Licht,10-25 °C,3 +constants/lexiconBatch2.ts,135,Schnittknoblauch,Allium tuberosum,easy|sun,2,Schnittknoblauch ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 +constants/lexiconBatch1.ts,46,Amazona-Taro,Alocasia amazonica,patterned|large|high_humidity,3,"Der Amazona-Taro besticht mit dunkelgruenen, pfeilfoermigen Blaettern mit markant weissen Rippen.",Indirektes Licht,18-27 °C,5 +constants/lexiconBatch2.ts,225,Alocasia zebrina,Alocasia zebrina,bright_light|high_humidity,2,Alocasia zebrina ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5 +constants/lexiconBatch1.ts,89,Kap-Aloe,Aloe arborescens,easy|succulent|medicinal|sun,4,"Die Kap-Aloe ist eine strauchige Aloe mit schmalen, gezaehnten Blaettern und leuchtend roten Bluetenaehren im Winter.",Volles Sonnenlicht,10-30 °C,14 +constants/lexiconBatch2.ts,18,Kap-Aloe (ferox),Aloe ferox,succulent|large|medicinal|sun,4,"Aloe ferox ist eine grosse, imposante Aloe mit stachligen, blaugruenen Blaettern und leuchtend roten Bluetenaehren.",Volles Sonnenlicht,10-30 °C,14 +constants/lexiconBatch2.ts,128,Zitronenverbene,Aloysia citrodora,easy|sun,2,Zitronenverbene ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 +constants/lexiconBatch2.ts,73,Muschelingwer,Alpinia zerumbet,flowering|large|high_humidity,3,"Der Muschelingwer hat lange, elegante Blaetter und haengende Bluetenrispen mit weiss-rosa Bluetchen.",Helles bis volles Licht,20-30 °C,5 +constants/lexiconBatch2.ts,194,Fuchsschwanz,Amaranthus caudatus,flowering|sun,2,"Fuchsschwanz ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,163,Anemone,Anemone coronaria,flowering|sun,2,"Anemone ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,140,Dill,Anethum graveolens,easy|sun,2,Dill ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 +constants/lexiconBatch2.ts,125,Kerbel,Anthriscus cerefolium,easy|sun,2,Kerbel ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 +constants/lexiconBatch2.ts,233,Samt-Anthurie,Anthurium clarinervium,patterned|high_humidity,2,Samt-Anthurie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5 +constants/lexiconBatch2.ts,234,Kristall-Anthurie,Anthurium crystallinum,patterned|high_humidity,2,Kristall-Anthurie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5 +constants/lexiconBatch2.ts,147,Loewenmaeulchen,Antirrhinum majus,flowering|sun,2,"Loewenmaeulchen ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,232,Norfolk-Tanne,Araucaria heterophylla,tree|bright_light,2,Norfolk-Tanne ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7 +constants/lexiconBatch2.ts,107,Arnika,Arnica montana,flowering|medicinal|sun,3,Arnika ist eine bekannte Heilpflanze aus den Alpen mit goldgelben Korbbluten. Sie wird fuer Muskeln und Gelenke verwendet.,Volles Sonnenlicht,10-20 °C,7 +constants/lexiconBatch2.ts,110,Wermut,Artemisia absinthium,medicinal|sun,2,"Wermut ist ein stark aromatisches Heilkraut mit silbrig-gruenen, tief eingeschnittenen Blaettern. Fuer Kraeuterlikoere.",Volles Sonnenlicht,10-25 °C,14 +constants/lexiconBatch2.ts,122,Estragon,Artemisia dracunculus,easy|sun,2,Estragon ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 +constants/lexiconBatch2.ts,178,Seidenpflanze,Asclepias tuberosa,flowering|sun,2,"Seidenpflanze ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,16,Schusterpflanze,Aspidistra elatior,easy|low_light,2,"Die Schusterpflanze ist eine extrem robuste Zimmerpflanze mit langen, dunkelgruenen Blaettern. Vertraegt tiefe Temperaturen.",Wenig bis helles Licht,10-20 °C,14 +constants/lexiconBatch2.ts,43,Vogelnest-Farn,Asplenium nidus,easy|low_light|high_humidity,3,"Der Vogelnest-Farn hat ganzrandige, glaenzende Wedel, die eine Nestform bilden. Sehr dekorativ und robust.",Helles indirektes Licht,18-27 °C,5 +constants/lexiconBatch2.ts,13,Japanische Aucube,Aucuba japonica,easy|low_light,2,"Die Japanische Aucube hat glaenzende, gruene oder gelbgefleckte Blaetter. Sehr schattenvertraeglich.",Wenig bis helles Licht,10-20 °C,7 +constants/lexiconBatch1.ts,92,Indische Azalee,Azalea indica,flowering,1,"Die Indische Azalee ist ein beliebter Zierstrauch mit grossen, auffaelligen Blueten in Rosa- und Rottönen.",Helles indirektes Licht,10-20 °C,4 +constants/lexiconBatch2.ts,7,Bambusrohr,Bambusa vulgaris,easy|large,2,Das Bambusrohr ist eine schnell wachsende Bambusart mit gelbgruenen Halmen. Sehr dekorativ und vielseitig nutzbar.,Helles bis volles Licht,15-30 °C,5 +constants/lexiconBatch1.ts,41,Pferdeschwanzpalme,Beaucarnea recurvata,easy|succulent|tree|sun,4,"Die Pferdeschwanzpalme hat einen verdickten Stammbasis als Wasserspeicher und lange, schmale Blaetter.",Volles Sonnenlicht,15-30 °C,21 +constants/lexiconBatch2.ts,57,Forellen-Begonie,Begonia maculata,patterned|high_humidity,2,Die Forellen-Begonie hat olivgruene Blaetter mit silbernen Punkten und einer roten Unterseite. Atemberaubend.,Helles indirektes Licht,18-27 °C,7 +constants/lexiconBatch1.ts,18,Koenigsbegonie,Begonia rex,patterned|high_humidity,2,"Die Koenigsbegonie beeindruckt mit prachtvoll gemusterten Blaettern in Silber, Rot und Gruen.",Indirektes Licht,18-25 °C,5 +constants/lexiconBatch2.ts,175,Eisbegonie,Begonia semperflorens-cultorum,flowering|bright_light,2,"Eisbegonie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,58,Knollen-Begonie,Begonia tuberhybrida,flowering|high_humidity,2,"Die Knollen-Begonie hat riesige, rosenaehnliche Blueten in leuchtendem Rot, Orange, Gelb oder Weiss.",Helles indirektes Licht,15-22 °C,5 +constants/lexiconBatch2.ts,145,Gaensebluemchen,Bellis perennis,flowering|sun,2,"Gaensebluemchen ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,97,Mangold,Beta vulgaris,easy,1,"Mangold ist ein farbenfrohes Blattgemuese mit bunten Stielen in Rot, Gelb, Orange und Weiss.",Helles bis volles Licht,10-25 °C,3 +constants/lexiconBatch2.ts,114,Hange-Birke,Betula pendula,tree|large|medicinal,3,Die Haenge-Birke hat charakteristisch weisse Rinde und haengende Zweige. Die Blaetter werden in der Heilkunde genutzt.,Volles Sonnenlicht,10-25 °C,7 +constants/lexiconBatch2.ts,38,Billbergia,Billbergia nutans,easy|flowering,2,"Die Billbergia ist eine robuste Bromelie mit schmalen, gruenen Blaettern und hängenden, blauen und gruenen Blueten.",Helles indirektes Licht,15-25 °C,7 +constants/lexiconBatch2.ts,129,Borretsch,Borago officinalis,easy|sun,2,Borretsch ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 +constants/lexiconBatch1.ts,62,Bougainvillea,Bougainvillea spectabilis,flowering|bright_light|sun,3,"Die Bougainvillea ist eine rankenreiche Kletterpflanze mit leuchtend farbigen Hochblaettern in Rot, Orange oder Pink.",Volles Sonnenlicht,18-30 °C,5 +constants/lexiconBatch2.ts,223,Schmetterlingsflieder,Buddleja davidii,flowering|tree|sun,3,Schmetterlingsflieder ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 +constants/lexiconBatch2.ts,202,Buchsbaum,Buxus sempervirens,tree|sun,2,Buchsbaum ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 +constants/lexiconBatch1.ts,49,Buntblatt,Caladium bicolor,patterned|high_humidity,2,"Das Buntblatt beeindruckt mit transparenten, bunt gemusterten Blaettern in Pink, Rot, Weiss und Gruen.",Indirektes Licht,20-30 °C,5 +constants/lexiconBatch2.ts,187,Ringelblume,Calendula officinalis,flowering|medicinal|sun,3,"Ringelblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,63,Calibrachoa,Calibrachoa hybrida,easy|flowering|hanging|sun,4,"Calibrachoa ist eine petunienaehnliche Haengepflanze mit unzaehligen, kleinen Trichterbluten in allen Farben.",Volles Sonnenlicht,15-25 °C,2 +constants/lexiconBatch2.ts,56,Callisia,Callisia repens,easy|hanging,2,"Callisia repens ist ein kleines, kriechendes Kraut mit winzigen, gruenen Blaettern. Ideal fuer haengende Behaelter.",Helles indirektes Licht,15-25 °C,5 +constants/lexiconBatch1.ts,93,Kamelie,Camellia japonica,flowering,1,Die Kamelie ist ein eleganter Zierstrauch mit glaenzenden Blaettern und rosenaehnlichen Blueten von Januar bis April.,Helles indirektes Licht,7-18 °C,5 +constants/lexiconBatch2.ts,85,Teestrauch,Camellia sinensis,flowering,1,"Der Teestrauch ist die Pflanze, aus deren Blaettern Tee gewonnen wird. Er hat weisse Blueten und glaenzende Blaetter.",Helles indirektes Licht,15-22 °C,7 +constants/lexiconBatch2.ts,184,Trompetenwinde,Campsis radicans,flowering|bright_light,2,"Trompetenwinde ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,67,Blumenschilfrohr,Canna indica,flowering|large|sun,3,"Das Blumenschilfrohr hat grosse, tropisch wirkende Blaetter und auffaellige Blueten in Rot, Orange oder Gelb.",Volles Sonnenlicht,18-28 °C,5 +constants/lexiconBatch2.ts,92,Chili,Capsicum annuum,easy|medicinal|sun,3,"Chili ist eine beliebte Gemuese- und Zierpflanze mit leuchtenden, roten oder orangen Fruechten. Im Topf kultivierbar.",Volles Sonnenlicht,20-30 °C,4 +constants/lexiconBatch2.ts,90,Papaya,Carica papaya,large|sun,2,"Die Papaya ist eine tropische Fruchtpflanze mit grossen, gelappten Blaettern und orangen Fruechten.",Volles Sonnenlicht,20-35 °C,5 +constants/lexiconBatch2.ts,217,Trompetenbaum,Catalpa bignonioides,tree|large|sun,3,Trompetenbaum ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 +constants/lexiconBatch1.ts,73,Cattleya-Orchidee,Cattleya labiata,flowering|high_humidity,2,"Die Cattleya ist die Koenigin der Orchideen mit ueppigen, duftenden Blueten in Lila, Rosa und Weiss.",Helles indirektes Licht,18-28 °C,7 +constants/lexiconBatch2.ts,208,Zeder,Cedrus libani,tree|large|sun,3,Zeder ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 +constants/lexiconBatch2.ts,188,Kornblume,Centaurea cyanus,flowering|sun,2,"Kornblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch1.ts,81,Peruanischer Fackelkaktus,Cereus peruvianus,easy|succulent|large|sun,4,"Der Peruanische Fackelkaktus ist ein saeulenfoermiger Kaktus, der im Innenraum bis zu 2 m hoch werden kann.",Volles Sonnenlicht,15-35 °C,21 +constants/lexiconBatch1.ts,99,Herzkette,Ceropegia woodii,easy|succulent|patterned|hanging,4,"Die Herzkette hat duenne, haengende Ranken mit herzfoermigen, silbergrau gemusterten Blaettchen.",Helles indirektes Licht,15-27 °C,14 +constants/lexiconBatch1.ts,43,Bergpalme,Chamaedorea elegans,easy|pet_friendly|tree|air_purifier|low_light,5,Die Bergpalme ist eine kompakte Zimmerpalme fuer schattigere Standorte. Ideal fuer dunkle Innenraeume.,Wenig bis helles Licht,15-25 °C,7 +constants/lexiconBatch2.ts,138,Roemische Kamille,Chamaemelum nobile,easy|medicinal|sun,3,Roemische Kamille ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 +constants/lexiconBatch2.ts,101,Kamille,Chamomilla recutita,easy|medicinal|sun,3,"Die Kamille ist ein beliebtes Heilkraut mit kleinen, weiss-gelben Blueten. Das aetherische Oel wirkt beruhigend.",Volles Sonnenlicht,15-25 °C,5 +constants/lexiconBatch1.ts,67,Chrysantheme,Chrysanthemum indicum,flowering,1,"Die Chrysantheme ist die klassische Herbstblume mit ueppigen, dichten Blueten in vielen Farben.",Helles bis volles Licht,12-22 °C,4 +constants/lexiconBatch2.ts,86,Zitronenbaum,Citrus limon,tree|sun,2,"Der Zitronenbaum ist ein kleiner, immergruener Baum mit weissen, duftenden Blueten und gelben Fruechten.",Volles Sonnenlicht,18-28 °C,5 +constants/lexiconBatch2.ts,87,Orangenbaum,Citrus sinensis,tree|sun,2,"Der Orangenbaum ist ein kleiner, immergruener Baum mit weissen Blueten und orangen Fruechten.",Volles Sonnenlicht,18-28 °C,5 +constants/lexiconBatch2.ts,157,Clematis,Clematis viticella,flowering|bright_light,2,"Clematis ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch1.ts,104,Riemenblatt,Clivia miniata,flowering,1,Das Riemenblatt ist eine dekorative Zimmerpflanze mit leuchtend orangefarbenen Blueten im Fruehling.,Helles indirektes Licht,15-24 °C,10 +constants/lexiconBatch2.ts,224,Kroton,Codiaeum variegatum,patterned|bright_light,2,Kroton ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7 +constants/lexiconBatch2.ts,84,Kaffeestrauch,Coffea arabica,easy,1,"Der Kaffeestrauch hat glaenzende, dunkelgruene Blaetter und entwickelt rote Kaffe­ekirschen. Kann im Topf gehalten werden.",Helles indirektes Licht,18-25 °C,7 +constants/lexiconBatch2.ts,245,Kaffeepflanze arabica nana,Coffea arabica Nana,bright_light,1,Kaffeepflanze arabica nana ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7 +constants/lexiconBatch1.ts,47,Taro,Colocasia esculenta,large|high_humidity,2,"Der Taro ist eine tropische Pflanze mit grossen, herzfoermigen Blaettern. Die Knollen sind Nahrungsquelle.",Helles indirektes Licht,18-30 °C,3 +constants/lexiconBatch1.ts,97,Columnea,Columnea gloriosa,flowering|hanging|high_humidity,3,"Die Columnea ist eine haengende Zimmerpflanze mit kleinen, behaarten Blaettern und leuchtend roten, roehrenfoermigen Blueten.",Helles indirektes Licht,18-25 °C,7 +constants/lexiconBatch2.ts,24,Konophytum,Conophytum calculus,succulent|sun,2,"Das Konophytum ist eine sehr kompakte Sukkulente, die zwei Blaetter zu einer kugelfoermigen Form verschmilzt.",Volles Sonnenlicht,10-25 °C,21 +constants/lexiconBatch2.ts,160,Maigloeckchen,Convallaria majalis,flowering|medicinal,2,"Maigloeckchen ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,14,Keulenlilie,Cordyline australis,easy|tree|sun,3,"Die Keulenlilie hat lange, schmale, gruene oder rotbraune Blaetter in einem dekorativen Schopf.",Helles bis volles Licht,10-25 °C,7 +constants/lexiconBatch2.ts,15,Tiroler Keulenlilie,Cordyline fruticosa,easy,1,"Die Tiroler Keulenlilie hat leuchtend rote, gruene oder buntlaubige Blaetter. Eine exotische Zimmerpflanze.",Helles indirektes Licht,18-27 °C,7 +constants/lexiconBatch2.ts,181,Maedchenauge,Coreopsis tinctoria,flowering|sun,2,"Maedchenauge ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,139,Koriander,Coriandrum sativum,easy|sun,2,Koriander ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 +constants/lexiconBatch2.ts,150,Kosmee,Cosmos bipinnatus,flowering|sun,2,"Kosmee ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,29,Kotyledon,Cotyledon orbiculata,easy|succulent|sun,3,"Kotyledon hat dickfleischige, runde Blaetter mit einem mehligen, weisslichen Belag. Sehr trockenheitsresistent.",Helles bis volles Licht,15-25 °C,14 +constants/lexiconBatch2.ts,26,Moos-Crassula,Crassula muscosa,easy|succulent|sun,3,"Die Moos-Crassula hat dicht aneinandergereihte, winzige gruene Blaetter auf unverzweigten Trieben. Sieht aus wie Moos.",Helles bis volles Licht,15-25 °C,14 +constants/lexiconBatch1.ts,5,Jadepflanze,Crassula ovata,easy|succulent|sun,3,"Die Jadepflanze ist eine langlebige Sukkulente mit dicken, ovalen Blaettern. In Japan gilt sie als Gluecksbringer.",Helles bis volles Licht,15-24 °C,14 +constants/lexiconBatch1.ts,110,Krokus,Crocus vernus,easy|flowering,2,"Der Krokus ist einer der ersten Fruehjahrs­boten mit kelchfoermigen Blueten in Lila, Weiss und Gelb.",Helles bis volles Licht,5-15 °C,7 +constants/lexiconBatch2.ts,39,Cryptanthus,Cryptanthus bivittatus,patterned|high_humidity,2,Cryptanthus ist eine niedrig wachsende Bromelie mit sternfoermigen Rosetten und gemusterten Blaettern. Fuer Terrarien.,Helles indirektes Licht,18-27 °C,7 +constants/lexiconBatch1.ts,53,Ctenanthe,Ctenanthe burle-marxii,patterned|high_humidity,2,Die Ctenanthe hat faszinierend gemusterte Blaetter mit dunkelgruunem Fischgraetenmuster auf hellgruunem Hintergrund.,Indirektes Licht,18-25 °C,5 +constants/lexiconBatch2.ts,94,Gurke,Cucumis sativus,easy|sun,2,"Die Gurke ist eine rankende Gemuese­pflanze mit gruenen, erfrischenden Fruechten. Im Balkonkasten kultivierbar.",Volles Sonnenlicht,18-28 °C,3 +constants/lexiconBatch2.ts,209,Zypresse,Cupressus sempervirens,tree|large|sun,3,Zypresse ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 +constants/lexiconBatch2.ts,74,Kurkuma,Curcuma longa,medicinal|high_humidity,2,Kurkuma ist eine tropische Gewuerzpflanze mit breiten Blaettern und leuchtend gelber Wurzel. Wichtiges Heilgewuerz.,Helles bis volles Licht,20-30 °C,7 +constants/lexiconBatch2.ts,236,String of Bananas,Curio radicans,succulent|hanging|sun,3,String of Bananas ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles bis volles Licht,18-30 C,10 +constants/lexiconBatch2.ts,237,String of Dolphins,Curio x peregrinus,succulent|hanging|sun,3,String of Dolphins ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles bis volles Licht,18-30 C,10 +constants/lexiconBatch2.ts,239,Palmfarn,Cycas revoluta,tree|large|sun,3,Palmfarn ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles bis volles Licht,18-30 C,10 +constants/lexiconBatch1.ts,19,Alpenveilchen,Cyclamen persicum,flowering,1,"Das Alpenveilchen bluet im Herbst und Winter mit eleganten Blueten in Rosa, Rot oder Weiss.",Helles indirektes Licht,12-18 °C,5 +constants/lexiconBatch1.ts,71,Zymbidium,Cymbidium lowianum,flowering,1,"Das Zymbidium ist eine robuste Orchidee mit langen, grassartigen Blaettern und eleganten Bluetenrispen.",Helles Licht,12-24 °C,7 +constants/lexiconBatch2.ts,127,Zitronengras,Cymbopogon citratus,easy|sun,2,Zitronengras ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 +constants/lexiconBatch2.ts,9,Paragraphenpflanze,Cyperus alternifolius,high_humidity,1,"Die Paragraphenpflanze hat lange, grasartige Blaetter, die sternfoermig vom Stiel abstehen. Sie liebt viel Wasser.",Helles bis volles Licht,18-27 °C,3 +constants/lexiconBatch2.ts,68,Dahlie,Dahlia pinnata,flowering|sun,2,Die Dahlie ist eine prachtvolle Sommerblume mit Blueten in allen Groessen und Formen. Sie wird aus Knollen gezogen.,Volles Sonnenlicht,15-25 °C,5 +constants/lexiconBatch2.ts,99,Karotte,Daucus carota,easy,1,Die Karotte ist eine beliebte Gemuese­pflanze mit orangefarbenen Wurzeln. Im tiefen Topf kultivierbar.,Helles bis volles Licht,15-22 °C,5 +constants/lexiconBatch2.ts,215,Flammenbaum,Delonix regia,flowering|tree|large,3,Flammenbaum ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 +constants/lexiconBatch2.ts,153,Rittersporn,Delphinium elatum,flowering|sun,2,"Rittersporn ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch1.ts,70,Dendrobium,Dendrobium nobile,flowering|high_humidity,2,"Das Dendrobium ist eine beliebte Zimmerorchidee mit langen Pseudobulben, die im Winter mit Blueten besetzt werden.",Helles indirektes Licht,15-28 °C,10 +constants/lexiconBatch2.ts,189,Bartnelke,Dianthus barbatus,flowering|sun,2,"Bartnelke ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,146,Nelke,Dianthus caryophyllus,flowering|sun,2,"Nelke ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch1.ts,48,Dieffenbachie,Dieffenbachia seguine,easy|air_purifier|low_light,3,"Die Dieffenbachie ist eine tropische Blattschmuckpflanze mit grossen, gruen-weiss gefleckten Blaettern.",Helles indirektes Licht,18-26 °C,7 +constants/lexiconBatch2.ts,109,Roter Fingerhut,Digitalis purpurea,flowering|medicinal,2,"Der Rote Fingerhut hat hohe Bluetenstaende mit roehrenfoermigen, gepunkteten Blueten in Rosa. Wichtige Arzneipflanze.",Helles bis volles Licht,10-20 °C,7 +constants/lexiconBatch2.ts,77,Venusfliegenfalle,Dionaea muscipula,sun,1,Die Venusfliegenfalle ist eine fleischfressende Pflanze mit klappfallartigen Blaettern. Faengt Insekten.,Volles Sonnenlicht,15-30 °C,5 +constants/lexiconBatch1.ts,101,Dischidia,Dischidia ruscifolia,succulent|hanging,2,"Die Dischidia ist eine epiphytische Haengepflanze mit kleinen, runden Blaettern entlang duenner Ranken.",Helles indirektes Licht,18-27 °C,7 +constants/lexiconBatch1.ts,14,Maisstrauch,Dracaena fragrans,easy|tree|air_purifier|low_light,4,"Der Maisstrauch ist eine robuste Zimmerpflanze mit breiten, gestreiften Blaettern. Gedeiht auch bei wenig Licht.",Helles indirektes Licht,15-25 °C,10 +constants/lexiconBatch1.ts,13,Drachenbaum,Dracaena marginata,easy|tree|air_purifier,3,"Der Drachenbaum ist eine schlanke Zimmerpflanze mit roten, schmalen Blaettern auf langen Staemmen.",Helles indirektes Licht,15-25 °C,10 +constants/lexiconBatch2.ts,80,Sonnentau,Drosera capensis,high_humidity|sun,2,Der Sonnentau faengt Insekten mit klebrigen Tropfen auf seinen Blaettern. Eine faszinierende fleischfressende Pflanze.,Volles Sonnenlicht,15-25 °C,5 +constants/lexiconBatch2.ts,30,Dudleya,Dudleya brittonii,easy|succulent|sun,3,"Dudleya ist eine rosetten­bildende Sukkulente mit silbrig-weissen, mehligen Blaettern. Sehr elegant.",Volles Sonnenlicht,10-25 °C,14 +constants/lexiconBatch1.ts,42,Goldfruchtpalme,Dypsis lutescens,pet_friendly|tree|air_purifier,3,Die Goldfruchtpalme ist eine elegante Zimmerpalme mit gelblich-gruenen Stielen und gefiederten Wedeln.,Helles indirektes Licht,18-27 °C,5 +constants/lexiconBatch1.ts,4,Echeverie,Echeveria elegans,easy|succulent|sun,3,"Die Echeverie bildet symmetrische, rosettenfoermige Sukkulenten mit blaugruenen Blaettern. Pflegeleicht.",Volles Sonnenlicht,15-25 °C,14 +constants/lexiconBatch2.ts,106,Sonnenhut,Echinacea purpurea,flowering|medicinal|sun,3,"Der Sonnenhut ist eine beliebte Heilpflanze mit grossen, pinkfarbenen Blueten. Er staerkt das Immunsystem.",Helles bis volles Licht,15-25 °C,7 +constants/lexiconBatch1.ts,77,Goldene Tonne,Echinocactus grusonii,easy|succulent|sun,3,Die Goldene Tonne ist ein ikonischer kugelfoermiger Kaktus mit goldgelben Stacheln. Waechst langsam aber imposant.,Volles Sonnenlicht,15-35 °C,21 +constants/lexiconBatch1.ts,83,San-Pedro-Kaktus,Echinopsis pachanoi,easy|succulent|sun,3,"Der San-Pedro-Kaktus ist ein schnell wachsender, saeulenfoermiger Kaktus aus den Anden.",Volles Sonnenlicht,10-35 °C,14 +constants/lexiconBatch1.ts,84,Koenigin der Nacht,Epiphyllum oxypetalum,flowering|succulent,2,"Die Koenigin der Nacht bluet nur eine einzige Nacht lang mit riesigen, intensiv duftenden weissen Blueten.",Indirektes Licht,18-27 °C,7 +constants/lexiconBatch1.ts,16,Marmor-Efeutute,Epipremnum aureum Marble Queen,easy|hanging|air_purifier,3,Die Marmor-Efeutute hat cremeweiss-gruen marmorierte Blaetter. Eine dekorative Variante der klassischen Efeutute.,Helles indirektes Licht,15-30 °C,7 +constants/lexiconBatch2.ts,53,Neon-Efeutute,Epipremnum pinnatum Neon,easy|hanging|air_purifier,3,Die Neon-Efeutute hat leuchtend limonengruene Blaetter. Sehr auffaellig und pflegeleicht.,Helles indirektes Licht,15-30 °C,7 +constants/lexiconBatch2.ts,186,Kalifornischer Mohn,Eschscholzia californica,flowering|sun,2,"Kalifornischer Mohn ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,210,Eukalyptus,Eucalyptus globulus,tree|medicinal|sun,3,Eukalyptus ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 +constants/lexiconBatch2.ts,19,Christusdorn,Euphorbia milii,easy|flowering|succulent|sun,4,Der Christusdorn ist eine sukkulente Wolfsmilch mit stacheligen Zweigen und kleinen roten oder gelben Hochblaettern.,Helles bis volles Licht,15-28 °C,10 +constants/lexiconBatch2.ts,20,Weihnachtsstern,Euphorbia pulcherrima,flowering,1,Der Weihnachtsstern ist die klassische Winterpflanze mit leuchtend roten Hochblaettern. Er steht symbolisch fuer Weihnachten.,Helles indirektes Licht,15-22 °C,7 +constants/lexiconBatch1.ts,12,Bleistiftkaktus,Euphorbia tirucalli,easy|succulent|sun,3,"Der Bleistiftkaktus ist eine sukkulente Wolfsmilch mit duennen, zylindrischen Zweigen ohne Blaetter.",Volles Sonnenlicht,18-30 °C,14 +constants/lexiconBatch2.ts,137,Wasabi,Eutrema japonicum,bright_light|high_humidity,2,"Wasabi ist ein seltenes Wuerzkraut, das gleichmaessige Feuchte und eher kuehle Bedingungen bevorzugt.",Helles indirektes Licht,8-20 C,4 +constants/lexiconBatch2.ts,12,Fatsia,Fatsia japonica,easy|low_light,2,"Die Fatsia ist ein dekorativer Zimmerstrauch mit grossen, handfoermigen, glaenzenden Blaettern. Sehr robust.",Helles indirektes Licht,10-20 °C,7 +constants/lexiconBatch1.ts,78,Fass-Kaktus,Ferocactus cylindraceus,easy|succulent|sun,3,"Der Fass-Kaktus ist ein zylindrischer Wuestenkaktus mit langen, roten Stacheln. Sehr langlebig.",Volles Sonnenlicht,15-35 °C,21 +constants/lexiconBatch2.ts,248,Ficus altissima,Ficus altissima,tree|bright_light,2,Ficus altissima ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7 +constants/lexiconBatch1.ts,1,Birkenfeige,Ficus benjamina,tree|air_purifier,2,"Die Birkenfeige ist ein eleganter Zimmerstrauch mit haengenden Aesten und kleinen, glaenzenden Blaettern.",Helles indirektes Licht,16-24 °C,7 +constants/lexiconBatch1.ts,38,Gummibaum,Ficus elastica,easy|tree|air_purifier,3,"Der Gummibaum ist eine imposante Zimmerpflanze mit grossen, glaenzenden, lederartigen Blaettern. Reinigt die Luft.",Helles indirektes Licht,16-24 °C,10 +constants/lexiconBatch1.ts,39,Geigenfeige,Ficus lyrata,tree|large|bright_light,3,"Die Geigenfeige ist ein Trendbaum mit grossen, geigenfoermigen Blaettern. Benoetigt viel Licht.",Helles indirektes Licht,18-27 °C,7 +constants/lexiconBatch2.ts,247,Ficus microcarpa,Ficus microcarpa,easy|tree|bright_light,3,Ficus microcarpa ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7 +constants/lexiconBatch2.ts,116,Bonsai-Feige,Ficus retusa,tree,1,"Die Bonsai-Feige ist eine klassische Bonsai-Art mit kleinen, elliptischen Blaettern. Sehr formbar.",Helles indirektes Licht,16-24 °C,7 +constants/lexiconBatch2.ts,226,Nervenpflanze,Fittonia albivenis,patterned|high_humidity,2,Nervenpflanze ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5 +constants/lexiconBatch2.ts,219,Forsythie,Forsythia x intermedia,flowering|tree|sun,3,Forsythie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 +constants/lexiconBatch2.ts,100,Erdbeere,Fragaria ananassa,easy|pet_friendly|sun,3,"Die Erdbeere ist ein beliebtes Obst fuer Balkon und Terrasse mit aromatischen, roten Fruechten.",Helles bis volles Licht,15-25 °C,3 +constants/lexiconBatch2.ts,169,Freesie,Freesia refracta,flowering|sun,2,"Freesie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch1.ts,33,Fuchsie,Fuchsia hybrida,flowering|hanging,2,"Die Fuchsie haengt mit eleganten, zweifarbigen Blueten wie kleine Ohrringe herab. Ideal fuer Ampeln.",Helles indirektes Licht,14-22 °C,3 +constants/lexiconBatch2.ts,60,Triphylla-Fuchsie,Fuchsia triphylla,flowering|hanging,2,"Die Triphylla-Fuchsie hat lange, roehrenfoermige, orangefarbe Blueten in haengenden Trauben. Sehr exotisch.",Helles indirektes Licht,15-22 °C,3 +constants/lexiconBatch2.ts,196,Kokardenblume,Gaillardia aristata,flowering|sun,2,"Kokardenblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch1.ts,22,Gardenie,Gardenia jasminoides,flowering|high_humidity,2,"Die Gardenie fasziniert mit cremefarbenen, intensiv duftenden Blueten. Anspruchsvoll in der Pflege.",Helles indirektes Licht,18-23 °C,5 +constants/lexiconBatch1.ts,90,Gasteria,Gasteria carinata,easy|succulent|low_light,3,"Die Gasteria ist eine kleine Sukkulente mit zweireihig angeordneten, zungenfoermigen, gefleckten Blaettern.",Helles indirektes Licht,15-25 °C,14 +constants/lexiconBatch2.ts,190,Mittagsgold,Gazania rigens,flowering|sun,2,"Mittagsgold ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch1.ts,32,Blutroter Storchschnabel,Geranium sanguineum,easy|flowering,2,Der Blutrote Storchschnabel ist ein zierlicher Storchschnabel mit intensiv magentafarbenen Blueten.,Helles bis volles Licht,10-25 °C,7 +constants/lexiconBatch1.ts,68,Gerbera,Gerbera jamesonii,flowering|air_purifier|bright_light,3,"Die Gerbera ist eine farbenfrohe Schnittblume mit grossen, sonnenblumenaehnlichen Blueten. Sehr beliebt.",Helles bis volles Licht,15-25 °C,5 +constants/lexiconBatch2.ts,216,Ginkgo,Ginkgo biloba,tree|medicinal|sun,3,Ginkgo ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 +constants/lexiconBatch2.ts,161,Gladiole,Gladiolus hortulanus,flowering|sun,2,"Gladiole ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch1.ts,96,Gloxinie,Gloxinia speciosa,flowering|high_humidity,2,"Die Gloxinie hat grosse, samtartige Blueten in Violett, Rosa oder Weiss mit farbigen Raendern.",Helles indirektes Licht,18-25 °C,5 +constants/lexiconBatch2.ts,240,Calathea lancifolia,Goeppertia insignis,pet_friendly|patterned|high_humidity,3,Calathea lancifolia ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5 +constants/lexiconBatch2.ts,241,Calathea ornata,Goeppertia ornata,pet_friendly|patterned|high_humidity,3,Calathea ornata ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5 +constants/lexiconBatch1.ts,87,Geisterpflanze,Graptopetalum paraguayense,easy|succulent|sun,3,"Die Geisterpflanze hat zartgraue bis perlmutt-rosafarbene, rosettenfoermige Blaetter. Sehr robuste Sukkulente.",Volles Sonnenlicht,15-25 °C,14 +constants/lexiconBatch2.ts,36,Guzmania,Guzmania lingulata,flowering|high_humidity,2,"Die Guzmania ist eine Bromelie mit glänzenden, gruenen Blaettern und einem leuchtend roten, sternfoermigen Bluetenstand.",Helles indirektes Licht,18-27 °C,7 +constants/lexiconBatch1.ts,80,Mond-Kaktus,Gymnocalycium mihanovichii,easy|succulent,2,Der Mond-Kaktus ist eine farbenfrohe Veredelung eines chlorophylllosen Kaktus auf einem gruenen Unterlagekaktus.,Indirektes Licht,15-30 °C,14 +constants/lexiconBatch2.ts,119,Zaubernuss,Hamamelis mollis,flowering|medicinal,2,"Die Zaubernuss bluet im Winter mit fadendunnen, gelben Bluetenkranzeln, die bis -10 Grad standhalten.",Helles bis volles Licht,10-20 °C,10 +constants/lexiconBatch1.ts,6,Zebra-Haworthie,Haworthia fasciata,easy|succulent|low_light,3,Die Zebra-Haworthie ist eine kompakte Sukkulente mit weissen Querstreifen auf dunkelgruenen Blaettern.,Helles indirektes Licht,15-25 °C,14 +constants/lexiconBatch1.ts,37,Efeu,Hedera helix,easy|hanging|air_purifier|low_light,4,"Efeu ist eine robuste Kletter- und Haengepflanze mit charakteristischen, dreilappigen Blaettern. Sehr langlebig.",Wenig bis helles Licht,10-20 °C,7 +constants/lexiconBatch2.ts,83,Heliamphora,Heliamphora nutans,high_humidity,1,Heliamphora ist eine urtuemliche Kannenpflanze aus den Tafelbergen Venezuelas. Sehr dekorativ und selten.,Helles indirektes Licht,15-25 °C,5 +constants/lexiconBatch2.ts,141,Sonnenblume,Helianthus annuus,flowering|sun,2,"Sonnenblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,133,Currykraut,Helichrysum italicum,easy|sun,2,Currykraut ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 +constants/lexiconBatch2.ts,72,Heliconia,Heliconia psittacorum,flowering|bright_light|high_humidity,3,"Die Heliconia hat leuchtend orangefarbe oder rote, bootsfoermige Hochblaetter. Eine exotische Tropenpflanze.",Helles bis volles Licht,20-30 °C,5 +constants/lexiconBatch2.ts,191,Heliotrop,Heliotropium arborescens,flowering|sun,2,"Heliotrop ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,183,Lenzrose,Helleborus orientalis,flowering,1,"Lenzrose ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,182,Taglilie,Hemerocallis fulva,flowering|sun,2,"Taglilie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch1.ts,21,Hibiskus,Hibiscus rosa-sinensis,flowering|bright_light|sun,3,"Der Hibiskus begeistert mit grossen, trompetenfoermigen Blueten in Rot, Orange und Rosa.",Volles Sonnenlicht,18-28 °C,3 +constants/lexiconBatch2.ts,220,Gartenhibiskus,Hibiscus syriacus,flowering|tree|sun,3,Gartenhibiskus ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 +constants/lexiconBatch1.ts,105,Ritterstern,Hippeastrum hybrid,flowering|bright_light,2,"Der Ritterstern beeindruckt im Winter mit riesigen, trompetenfoermigen Blueten in Rot, Pink oder Weiss.",Helles bis volles Licht,18-25 °C,7 +constants/lexiconBatch2.ts,3,Kentia-Palme,Howea forsteriana,pet_friendly|tree|low_light,3,"Die Kentia-Palme ist eine der elegantesten Zimmerpalmen mit langen, herabhängenden Fiederblaettern.",Helles indirektes Licht,18-25 °C,7 +constants/lexiconBatch1.ts,58,Kleine Wachsblume,Hoya bella,flowering|succulent|hanging,3,"Die Kleine Wachsblume traegt zierliche, sternfoermige weisse Blueten mit rosa Mitte. Haengende Sukkulente.",Helles indirektes Licht,18-27 °C,10 +constants/lexiconBatch1.ts,57,Wachsblume,Hoya carnosa,easy|flowering|succulent|hanging,4,"Die Wachsblume ist eine Kletterpflanze mit dicken, wachsartigen Blaettern und sternfoermigen, duftenden Blueten.",Helles indirektes Licht,16-27 °C,10 +constants/lexiconBatch2.ts,159,Hasengloeckchen,Hyacinthoides non-scripta,flowering|sun,2,"Hasengloeckchen ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch1.ts,108,Hyazinthe,Hyacinthus orientalis,easy|flowering,2,"Die Hyazinthe bezaubert mit dichten Bluetenrispen und intensivem Duft in Blau, Rosa, Weiss oder Gelb.",Helles bis volles Licht,10-18 °C,5 +constants/lexiconBatch2.ts,148,Hortensie,Hydrangea macrophylla,flowering|bright_light,2,"Hortensie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Helles bis halbschattiges Licht,8-24 C,4 +constants/lexiconBatch2.ts,105,Johanniskraut,Hypericum perforatum,flowering|medicinal|sun,3,Das Johanniskraut hat leuchtend gelbe Blueten und ist ein wichtiges Heilkraut gegen Depressionen und Stimmungstiefs.,Volles Sonnenlicht,10-25 °C,7 +constants/lexiconBatch2.ts,227,Punktblatt,Hypoestes phyllostachya,patterned|bright_light,2,Punktblatt ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7 +constants/lexiconBatch2.ts,136,Ysop,Hyssopus officinalis,easy|sun,2,Ysop ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 +constants/lexiconBatch2.ts,203,Stechpalme,Ilex aquifolium,tree|sun,2,Stechpalme ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 +constants/lexiconBatch2.ts,176,Gartenbalsamine,Impatiens balsamina,flowering|bright_light,2,"Gartenbalsamine ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,59,Neuguinea-Balsamine,Impatiens hawkeri,easy|flowering,2,"Die Neuguinea-Balsamine hat grosse, leuchtende Blueten und ist sehr bluehfreudig. Ideal fuer Terrassen.",Helles indirektes Licht,18-27 °C,3 +constants/lexiconBatch1.ts,20,Fleissiges Lieschen,Impatiens walleriana,easy|flowering,2,Das Fleissige Lieschen bluet von Fruehling bis Herbst unermudlich in vielen Farben.,Helles indirektes Licht,16-24 °C,2 +constants/lexiconBatch1.ts,64,Suesskartoffel,Ipomoea batatas,easy|hanging|sun,3,"Die Suesskartoffel-Zierpflanze hat dekorative, herzfoermige Blaetter in gruen oder dunkelviolett. Ideal als Haengepflanze.",Volles Sonnenlicht,20-30 °C,5 +constants/lexiconBatch2.ts,156,Prunkwinde,Ipomoea purpurea,flowering|sun,2,"Prunkwinde ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,144,Bart-Iris,Iris germanica,flowering|sun,2,"Bart-Iris ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,211,Jacaranda,Jacaranda mimosifolia,flowering|tree|large,3,Jacaranda ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 +constants/lexiconBatch1.ts,59,Jasmin,Jasminum polyanthum,flowering,1,"Der Jasmin ist eine Kletterpflanze mit intensiv duftenden, weissen Blueten. Er bluet im Winter und Fruehling.",Helles bis volles Licht,10-22 °C,5 +constants/lexiconBatch2.ts,172,Arabischer Jasmin,Jasminum sambac,flowering|bright_light,2,"Arabischer Jasmin ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch1.ts,9,Kalanchoe,Kalanchoe blossfeldiana,easy|flowering|succulent|sun,4,"Die Kalanchoe ist eine beliebte Bluehpflanze mit leuchtenden Blueten in Rot, Orange, Gelb oder Rosa.",Helles bis volles Licht,15-25 °C,10 +constants/lexiconBatch2.ts,22,Brutblatt,Kalanchoe daigremontiana,easy|succulent|sun,3,Das Brutblatt bildet entlang des Blattrandes zahlreiche kleine Jungpflanzen. Eine faszinierende Sukkulente.,Helles bis volles Licht,15-25 °C,14 +constants/lexiconBatch2.ts,21,Kaninchen-Ohren,Kalanchoe tomentosa,easy|succulent|sun,3,"Kaninchen-Ohren haben weisslich-filzige Blaetter mit braunen Raendern, die Kaninchen­ohren aehneln. Sehr dekorativ.",Helles bis volles Licht,15-25 °C,14 +constants/lexiconBatch2.ts,95,Salat,Lactuca sativa,easy,1,Salat ist eine schnell wachsende Blattgemuese­pflanze. Im Topf und Balkonkasten sehr gut zu kultivieren.,Helles bis volles Licht,10-22 °C,3 +constants/lexiconBatch2.ts,197,Traenendes Herz,Lamprocapnos spectabilis,flowering|bright_light,2,"Traenendes Herz ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,64,Wandelroeschen,Lantana camara,flowering|bright_light|sun,3,"Das Wandelroeschen hat kugelige Bluetenkoepfe, die die Farbe von Gelb ueber Orange zu Rot wechseln. Sehr attraktiv.",Volles Sonnenlicht,18-28 °C,5 +constants/lexiconBatch2.ts,158,Duftwicke,Lathyrus odoratus,flowering|sun,2,"Duftwicke ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,121,Lorbeer,Laurus nobilis,easy|sun,2,Lorbeer ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 +constants/lexiconBatch1.ts,23,Echter Lavendel,Lavandula angustifolia,medicinal|bright_light|sun,3,Der Echte Lavendel ist ein aromatischer Halbstrauch mit lilafarbenen Bluetenaehren. Herrlicher Duft.,Volles Sonnenlicht,10-25 °C,10 +constants/lexiconBatch2.ts,180,Bechermalve,Lavatera trimestris,flowering|sun,2,"Bechermalve ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,173,Margerite,Leucanthemum vulgare,flowering|sun,2,"Margerite ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,201,Shasta-Margerite,Leucanthemum x superbum,flowering|sun,2,"Shasta-Margerite ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,126,Liebstoeckel,Levisticum officinale,easy|sun,2,Liebstoeckel ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 +constants/lexiconBatch2.ts,69,Ostertrompete,Lilium longiflorum,flowering|bright_light,2,"Die Ostertrompete hat grosse, weisse, trichterfoermige Blueten mit intensivem Duft. Klassische Osterblume.",Helles bis volles Licht,15-25 °C,5 +constants/lexiconBatch2.ts,23,Lebende Steine,Lithops julii,succulent|sun,2,"Lebende Steine sind faszinierende Mimikry-Sukkulenten, die Kieselsteinen taeuschen aehnlich sehen. Sehr trockenheitsresistent.",Volles Sonnenlicht,10-30 °C,21 +constants/lexiconBatch2.ts,4,Chinesische Fächerpalme,Livistona chinensis,tree|bright_light,2,"Die Chinesische Fächerpalme hat grosse, faecher­foermige Blaetter auf einem einzelnen Stamm. Sehr dekorativ.",Helles bis volles Licht,15-25 °C,7 +constants/lexiconBatch2.ts,62,Duftsteinrich,Lobularia maritima,easy|flowering,2,"Der Duftsteinrich ist ein niedrig wachsendes Pflanzchen mit winzigen, weissen oder lilafarbenen Blueten und suessem Duft.",Helles bis volles Licht,10-22 °C,3 +constants/lexiconBatch2.ts,171,Geissblatt,Lonicera japonica,flowering|bright_light,2,"Geissblatt ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,154,Lupine,Lupinus polyphyllus,flowering|sun,2,"Lupine ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,204,Magnolie,Magnolia grandiflora,flowering|tree|large,3,Magnolie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 +constants/lexiconBatch1.ts,79,Mammillaria,Mammillaria zeilmanniana,easy|flowering|succulent|sun,4,"Die Mammillaria ist ein kompakter, kugelfoermiger Kaktus, der im Fruehling einen Kranz aus rosa Blueten traegt.",Volles Sonnenlicht,15-35 °C,14 +constants/lexiconBatch1.ts,51,Gebet-Pflanze,Maranta leuconeura,pet_friendly|patterned|high_humidity,3,Die Gebet-Pflanze faltet ihre gemusterten Blaetter nachts wie Haende zusammen. Faszinierende rote und gruene Muster.,Indirektes Licht,18-27 °C,5 +constants/lexiconBatch2.ts,102,Zitronenmelisse,Melissa officinalis,easy|medicinal,2,Die Zitronenmelisse ist ein zitronig duftendes Heilkraut. Sie beruhigt die Nerven und foerdert den Schlaf.,Helles bis volles Licht,15-25 °C,5 +constants/lexiconBatch1.ts,26,Gruene Minze,Mentha spicata,easy,1,"Die Gruene Minze ist ein wuchsfreudiges Kuechenkraut mit frischem, minzigem Duft. Fuer Tee und Cocktails.",Helles bis volles Licht,15-25 °C,3 +constants/lexiconBatch2.ts,46,Tueipelfarn (Microsorum),Microsorum punctatum,high_humidity,1,"Microsorum punctatum ist ein tropischer Farn mit langen, ungeteilten, glaenzenden Wedeln. Fuer feuchte Standorte.",Helles indirektes Licht,18-27 °C,7 +constants/lexiconBatch1.ts,75,Stiefmuetterchen-Orchidee,Miltoniopsis roezlii,flowering|high_humidity,2,"Die Stiefmuetterchen-Orchidee hat grosse, flache Blueten. Bevorzugt kuehle Temperaturen und hohe Luftfeuchtigkeit.",Indirektes Licht,15-22 °C,5 +constants/lexiconBatch2.ts,76,Schamkraut,Mimosa pudica,flowering|bright_light,2,"Das Schamkraut faltet seine Blaettchen blitzschnell zusammen, wenn man sie beruehrt. Ein faszinierendes Erlebnis.",Helles bis volles Licht,20-28 °C,5 +constants/lexiconBatch2.ts,179,Indianernessel,Monarda didyma,flowering|sun,2,"Indianernessel ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,47,Monstera adansonii,Monstera adansonii,easy|hanging,2,Monstera adansonii hat herzfoermige Blaetter mit zahlreichen runden Lochern. Eine rankende Zimmerpflanze.,Helles indirektes Licht,18-27 °C,7 +constants/lexiconBatch2.ts,48,Monstera obliqua,Monstera obliqua,patterned|hanging,2,"Monstera obliqua ist eine seltene Monstera-Art mit filigranen Blaettern, die hauptsaechlich aus Lochern bestehen.",Helles indirektes Licht,18-27 °C,7 +constants/lexiconBatch2.ts,2,Bananenpflanze,Musa acuminata,large|high_humidity,2,"Die Bananenpflanze ist eine tropische Staude mit riesigen, glaenzenden Blaettern. Im Zimmer selten fruechttragend.",Helles bis volles Licht,20-30 °C,5 +constants/lexiconBatch1.ts,109,Traubenhyazinthe,Muscari armeniacum,easy|flowering,2,"Die Traubenhyazinthe bildet dichte Trauben aus kleinen, blauen bis violetten Gloeckchen. Zuverlaessige Fruejahrszwiebel.",Helles bis volles Licht,8-18 °C,7 +constants/lexiconBatch2.ts,177,Vergissmeinnicht,Myosotis sylvatica,flowering|sun,2,"Vergissmeinnicht ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch1.ts,106,Osterglocke,Narcissus pseudonarcissus,flowering,1,"Die Osterglocke ist der klassische Fruehjahrsblueher mit leuchtend gelben, trompetenfoermigen Blueten.",Helles bis volles Licht,10-18 °C,5 +constants/lexiconBatch2.ts,199,Nemesie,Nemesia strumosa,flowering|sun,2,"Nemesie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,37,Neoregelia,Neoregelia carolinae,flowering|patterned|bright_light,3,"Die Neoregelia ist eine Bromelie, bei der das Herzblatt zur Bluetzeit leuchtend rot wird. Sehr dekorativ.",Helles bis volles Licht,18-27 °C,7 +constants/lexiconBatch2.ts,79,Kannenpflanze,Nepenthes alata,hanging|high_humidity,2,"Die Kannenpflanze bildet grosse, gefuellte Kannen als Insekten­fallen. Eine faszinierende, tropische Pflanze.",Helles indirektes Licht,20-30 °C,5 +constants/lexiconBatch2.ts,132,Katzenminze,Nepeta cataria,easy|sun,2,Katzenminze ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 +constants/lexiconBatch2.ts,120,Oleander,Nerium oleander,flowering|bright_light|sun,3,"Der Oleander ist ein mediteraner Strauch mit leuchtend roten, rosa oder weissen Blueten. Sehr hitzetolerant.",Volles Sonnenlicht,15-28 °C,7 +constants/lexiconBatch2.ts,193,Ziertabak,Nicotiana alata,flowering|sun,2,"Ziertabak ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch1.ts,25,Basilikum,Ocimum basilicum,easy|medicinal|sun,3,"Basilikum ist das beliebteste Kuechenkraut mit intensiv aromatischen, gruenen Blaettern. Fuer Pesto verwendet.",Volles Sonnenlicht,18-30 °C,2 +constants/lexiconBatch1.ts,74,Tanzerinnen-Orchidee,Oncidium sphacelatum,flowering|high_humidity,2,"Die Tanzerinnen-Orchidee traegt lange Rispen mit Hunderten kleiner, gelb-brauner Blueten. Sehr reichliche Bluetracht.",Helles indirektes Licht,18-27 °C,7 +constants/lexiconBatch1.ts,82,Hasenohren-Kaktus,Opuntia microdasys,easy|succulent|sun,3,"Der Hasenohren-Kaktus hat flache, ovale Triebe mit dichten weissen Glochiden. Klassischer Zimmerkaktus.",Volles Sonnenlicht,10-35 °C,21 +constants/lexiconBatch2.ts,124,Majoran,Origanum majorana,easy|sun,2,Majoran ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 +constants/lexiconBatch1.ts,28,Oregano,Origanum vulgare,easy|medicinal|sun,3,"Oregano ist ein aromatisches Kuechenkraut mit runden, behaarten Blaettern. In mediterraner Kueche beliebt.",Volles Sonnenlicht,15-25 °C,7 +constants/lexiconBatch2.ts,200,Kapmargerite,Osteospermum ecklonis,flowering|sun,2,"Kapmargerite ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch1.ts,54,Kleeblume,Oxalis triangularis,flowering|patterned,2,"Die Kleeblume hat tiefviolette, dreieckige Blaetter und zarte rosa Blueten. Sie faltet die Blaetter bei Dunkelheit.",Helles indirektes Licht,15-24 °C,7 +constants/lexiconBatch2.ts,231,Glueckskastanie,Pachira aquatica,easy|tree|bright_light,3,Glueckskastanie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7 +constants/lexiconBatch1.ts,88,Mondstein-Pflanze,Pachyphytum oviferum,easy|succulent|sun,3,"Die Mondstein-Pflanze hat dicke, ovale Blaetter mit einem pastellrosafarbenen, mehligen Ueberzug.",Volles Sonnenlicht,15-25 °C,14 +constants/lexiconBatch2.ts,143,Pfingstrose,Paeonia lactiflora,flowering|sun,2,"Pfingstrose ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,6,Schraubenbaum,Pandanus veitchii,patterned|bright_light,2,"Der Schraubenbaum hat spiralfoermig angeordnete, gruenweiss gestreifte Blaetter. Sehr dekorativ und exotisch.",Helles bis volles Licht,18-27 °C,7 +constants/lexiconBatch2.ts,185,Mohn,Papaver rhoeas,flowering|sun,2,"Mohn ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch1.ts,63,Passionsblume,Passiflora caerulea,flowering,1,"Die Passionsblume ist eine faszinierende Kletterpflanze mit komplex strukturierten, blau-weissen Blueten.",Helles bis volles Licht,15-27 °C,5 +constants/lexiconBatch1.ts,31,Rosengeranie,Pelargonium graveolens,easy|medicinal|sun,3,Die Rosengeranie ist eine Duftpflanze mit tief eingeschnittenen Blaettern und rosaenlichem Aroma.,Volles Sonnenlicht,15-25 °C,7 +constants/lexiconBatch2.ts,61,Efeu-Geranie,Pelargonium peltatum,easy|flowering|hanging|sun,4,"Die Efeu-Geranie hat efeufoermige, glaenzende Blaetter und bluet den ganzen Sommer in leuchtenden Farben.",Helles bis volles Licht,15-25 °C,5 +constants/lexiconBatch2.ts,174,Stehende Geranie,Pelargonium zonale,flowering|sun,2,"Stehende Geranie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,229,Wassermelonen-Peperomie,Peperomia argyreia,pet_friendly|patterned,2,Wassermelonen-Peperomie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7 +constants/lexiconBatch1.ts,102,Rippenpeperomie,Peperomia caperata,easy|pet_friendly,2,"Die Rippenpeperomie hat tief gerippte, dunkelgruene bis violette Blaetter mit einer samtigen Textur.",Helles indirektes Licht,18-26 °C,10 +constants/lexiconBatch1.ts,103,Spiegelpeperomie,Peperomia obtusifolia,easy|pet_friendly|low_light,3,"Die Spiegelpeperomie hat glaenzende, lederartige, oval-runde Blaetter in tiefem Gruen. Sehr robust.",Helles indirektes Licht,16-26 °C,10 +constants/lexiconBatch2.ts,230,Raindrop-Peperomie,Peperomia polybotrya,easy|pet_friendly,2,Raindrop-Peperomie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7 +constants/lexiconBatch2.ts,134,Shiso,Perilla frutescens,easy|sun,2,Shiso ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 +constants/lexiconBatch1.ts,29,Petersilie,Petroselinum crispum,easy,1,Petersilie ist eines der meistgenutzten Kuechenkraeuter mit frisch-aromatischem Geschmack. Reich an Vitaminen.,Helles Licht,10-25 °C,3 +constants/lexiconBatch1.ts,34,Petunie,Petunia hybrida,easy|pet_friendly|flowering|sun,4,Die Petunie ist eine der beliebtesten Balkonpflanzen mit trichterfoermigen Blueten in unzaehligen Farben.,Volles Sonnenlicht,15-25 °C,2 +constants/lexiconBatch1.ts,69,Schmetterlingsorchidee,Phalaenopsis amabilis,flowering|high_humidity,2,Die Schmetterlingsorchidee ist die bekannteste Zimmerorchidee. Sie bluet bei guter Pflege monatelang.,Helles indirektes Licht,18-28 °C,10 +constants/lexiconBatch2.ts,50,Philodendron bipinnatifidum,Philodendron bipinnatifidum,easy|large,2,"Philodendron bipinnatifidum hat grosse, tief gelappte Blaetter. Er entwickelt einen beeindruckenden, baumfoermigen Wuchs.",Helles indirektes Licht,18-27 °C,7 +constants/lexiconBatch2.ts,51,Roter Philodendron,Philodendron erubescens,easy|hanging,2,"Der Rote Philodendron hat glaenzende, herzfoermige Blaetter, die jung roetrlich erscheinen. Sehr dekorativ.",Helles indirektes Licht,18-27 °C,7 +constants/lexiconBatch2.ts,243,Philodendron Pink Princess,Philodendron erubescens Pink Princess,patterned|bright_light,2,Philodendron Pink Princess ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7 +constants/lexiconBatch2.ts,49,Philodendron gloriosum,Philodendron gloriosum,patterned|large|high_humidity,3,"Philodendron gloriosum hat grosse, samtige, herzfoermige Blaetter mit weissen Rippen. Eine atemberaubende Pflanze.",Helles indirektes Licht,18-27 °C,7 +constants/lexiconBatch1.ts,15,Herzblatt-Philodendron,Philodendron hederaceum,easy|hanging|low_light,3,Der Herzblatt-Philodendron ist eine pflegeleichte Kletter- oder Haengepflanze mit herzfoermigen Blaettern.,Indirektes Licht,18-28 °C,7 +constants/lexiconBatch2.ts,242,Philodendron Brasil,Philodendron hederaceum Brasil,easy|hanging|low_light,3,Philodendron Brasil ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7 +constants/lexiconBatch2.ts,40,Blaues Kanaelfarn,Phlebodium aureum,high_humidity,1,"Der Blaue Kanaelfarn hat wachsartige, blaugruene Wedel und glaenzende Wurzelstaemme. Sehr dekorativ.",Helles indirektes Licht,18-27 °C,7 +constants/lexiconBatch2.ts,165,Flammenblume,Phlox paniculata,flowering|sun,2,"Flammenblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch1.ts,44,Zwergdattelpalme,Phoenix roebelenii,tree|bright_light,2,"Die Zwergdattelpalme ist eine zierliche Palme mit eleganten, gebogenen Fiederblaettern. Tropisches Flair.",Helles bis volles Licht,18-27 °C,7 +constants/lexiconBatch2.ts,8,Goldener Bambus,Phyllostachys aurea,easy|large,2,"Der Goldene Bambus hat elegante, goldgelbe Halme mit engstehenden Knoten. Sehr dekorativ als Sichtschutz.",Helles bis volles Licht,10-30 °C,5 +constants/lexiconBatch2.ts,207,Fichte,Picea abies,tree|large|sun,3,Fichte ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 +constants/lexiconBatch2.ts,228,Aluminium-Pflanze,Pilea cadierei,easy|pet_friendly|patterned,3,Aluminium-Pflanze ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7 +constants/lexiconBatch1.ts,2,Ufopflanze,Pilea peperomioides,easy|pet_friendly,2,"Die Ufopflanze hat unverwechselbare, runde Blaetter auf langen Stielen. Bildet leicht Ableger zum Verschenken.",Helles indirektes Licht,13-30 °C,7 +constants/lexiconBatch2.ts,81,Fettkraut,Pinguicula grandiflora,flowering|high_humidity,2,"Das Fettkraut faengt Insekten mit klebrigen Blaettern. Es bluet mit violetten, sporenartigen Blueten.",Helles indirektes Licht,10-20 °C,5 +constants/lexiconBatch2.ts,206,Kiefer,Pinus sylvestris,tree|large|sun,3,Kiefer ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 +constants/lexiconBatch2.ts,41,Geweihfarn,Platycerium bifurcatum,hanging|high_humidity,2,"Der Geweihfarn hat gespaltene Wedel, die einem Hirschgeweih aehneln. Er ist ein epiphytischer Farn fuer Holz.",Helles indirektes Licht,15-25 °C,7 +constants/lexiconBatch2.ts,152,Buntnessel,Plectranthus scutellarioides,patterned|bright_light,2,"Buntnessel ist eine farbstarke Zierpflanze, die vor allem fuer ihr dekoratives Laub beliebt ist.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch1.ts,61,Bleiwurz,Plumbago auriculata,flowering|bright_light|sun,3,"Die Bleiwurz ist ein halbimmergruener Strauch mit himmelblauen Blueten, der fast das ganze Jahr bluet.",Volles Sonnenlicht,15-27 °C,5 +constants/lexiconBatch2.ts,118,Tempel-Baum,Plumeria rubra,flowering|tree|sun,3,"Der Tempel-Baum hat intensiv duftende, sternfoermige Blueten in Weiss, Gelb oder Rosa. Klassische Tropenblume.",Volles Sonnenlicht,20-30 °C,7 +constants/lexiconBatch2.ts,44,Tueipelfarn,Polypodium vulgare,easy,1,Der Tueipelfarn ist ein heimischer Farn mit gelappten Wedeln und runden Sporenhaeufchen auf der Unterseite.,Helles indirektes Licht,10-20 °C,7 +constants/lexiconBatch2.ts,27,Speckbaum,Portulacaria afra,easy|succulent|sun,3,"Der Speckbaum ist eine sukkulente Pflanze mit roten Stielen und kleinen, runden, glaenzenden Blaettern.",Helles bis volles Licht,15-30 °C,14 +constants/lexiconBatch1.ts,36,Primel,Primula vulgaris,flowering,1,"Die Primel ist einer der ersten Fruehjahrs­boten mit lebhaften Blueten in Gelb, Pink, Rot und Lila.",Helles indirektes Licht,10-18 °C,4 +constants/lexiconBatch2.ts,71,Koenigs-Protea,Protea cynaroides,flowering|large|sun,3,"Die Koenigs-Protea ist die Nationalblume Suedafrikas mit riesigen, imposanten Bluetenkoepfen. Eine echte Besonderheit.",Volles Sonnenlicht,10-25 °C,7 +constants/lexiconBatch2.ts,218,Kirschlorbeer,Prunus laurocerasus,tree|sun,2,Kirschlorbeer ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 +constants/lexiconBatch2.ts,89,Guave,Psidium guajava,tree|sun,2,Die Guave ist ein tropischer Obstbaum mit gelblich-weissen Fruechten. Sie ist reich an Vitamin C.,Volles Sonnenlicht,18-30 °C,7 +constants/lexiconBatch2.ts,88,Granatapfelbaum,Punica granatum,flowering|tree|sun,3,"Der Granatapfelbaum hat leuchtend rote Blueten und rote, essbare Fruechte mit rubinroten Kernen.",Volles Sonnenlicht,15-28 °C,7 +constants/lexiconBatch2.ts,205,Eiche,Quercus robur,tree|large|sun,3,Eiche ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 +constants/lexiconBatch2.ts,162,Ranunkel,Ranunculus asiaticus,flowering|sun,2,"Ranunkel ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,98,Radieschen,Raphanus sativus,easy,1,"Das Radieschen ist ein schnellwachsendes Gemuese mit runden, roten Knollen. Es reift in nur 3-4 Wochen.",Helles bis volles Licht,10-22 °C,2 +constants/lexiconBatch2.ts,52,Mini-Monstera,Rhaphidophora tetrasperma,easy|hanging,2,"Die Mini-Monstera hat monstera­aehnliche, gelochte Blaetter auf einer kompakten, klettternden Pflanze. Sehr trendig.",Helles indirektes Licht,18-27 °C,7 +constants/lexiconBatch1.ts,45,Stab-Palme,Rhapis excelsa,tree|low_light,2,"Die Stab-Palme ist eine elegante Zimmerpalme mit faecher­foermigen Blaettern auf duennen, bambusartigen Staemmen.",Helles indirektes Licht,15-25 °C,7 +constants/lexiconBatch1.ts,85,Korallenkaktus,Rhipsalis baccifera,succulent|hanging,2,"Der Korallenkaktus ist ein epiphytischer Kaktus mit duennen, haengenden Trieben und kleinen weissen Beeren.",Indirektes Licht,18-27 °C,7 +constants/lexiconBatch2.ts,170,Rhododendron,Rhododendron catawbiense,flowering|tree|bright_light,3,"Rhododendron ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch1.ts,91,Japanische Azalee,Rhododendron simsii,flowering,1,"Die Japanische Azalee bluet im Winter und Fruehling ueppig mit leuchtend roten, rosa oder weissen Blueten.",Helles indirektes Licht,10-18 °C,4 +constants/lexiconBatch2.ts,214,Robinie,Robinia pseudoacacia,tree|large|sun,3,Robinie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 +constants/lexiconBatch1.ts,66,Chinesische Rose,Rosa chinensis,flowering|sun,2,Die Chinesische Rose ist eine der Stammarten vieler Gartenrosen und bluet fast ununterbrochen.,Volles Sonnenlicht,15-25 °C,5 +constants/lexiconBatch2.ts,142,Rose,Rosa x hybrida,flowering|bright_light|sun,3,"Rose ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch1.ts,24,Rosmarin,Rosmarinus officinalis,easy|medicinal|sun,3,Rosmarin ist ein aromatisches Kraut mit nadelartigen Blaettern und blauen Blueten. In der Kueche unverzichtbar.,Volles Sonnenlicht,10-25 °C,7 +constants/lexiconBatch2.ts,167,Rudbeckie,Rudbeckia hirta,flowering|sun,2,"Rudbeckie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,130,Sauerampfer,Rumex acetosa,easy|sun,2,Sauerampfer ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 +constants/lexiconBatch1.ts,94,Afrikanisches Veilchen,Saintpaulia ionantha,easy|flowering,2,"Das Afrikanische Veilchen ist eine kleine, kompakte Bluehpflanze mit samtigen Blaettern und violetten Blueten.",Helles indirektes Licht,18-25 °C,7 +constants/lexiconBatch2.ts,113,Silber-Weide,Salix alba,tree|large|medicinal,3,"Die Silber-Weide hat silbrig-glaenzende Blaetter. Weidenrinde enthält Salicylsaeure, die Grundlage von Aspirin.",Helles bis volles Licht,10-25 °C,7 +constants/lexiconBatch2.ts,195,Mehlsalbei,Salvia farinacea,flowering|sun,2,"Mehlsalbei ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,103,Salbei,Salvia officinalis,easy|medicinal|sun,3,Salbei ist ein aromatisches Heilkraut mit silbrig-gruenen Blaettern. Er hat antibakterielle und entzuendungshem­mende Wirkung.,Volles Sonnenlicht,10-25 °C,7 +constants/lexiconBatch2.ts,168,Feuersalbei,Salvia splendens,flowering|sun,2,"Feuersalbei ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,112,Schwarzer Holunder,Sambucus nigra,flowering|tree|medicinal,3,Der Schwarze Holunder hat weisse Doldenbluten und schwarze Beeren. Die Fruechte werden fuer Sirup und Saft verwendet.,Helles bis volles Licht,10-25 °C,7 +constants/lexiconBatch2.ts,17,Zylindrischer Bogenhanf,Sansevieria cylindrica,easy|succulent|sun,3,"Der Zylindrische Bogenhanf hat zylindrische, aufrechte Blaetter, die sich nach oben verjuengen. Sehr pflegeleicht.",Helles bis volles Licht,15-27 °C,14 +constants/lexiconBatch2.ts,78,Purpursonnentau,Sarracenia purpurea,high_humidity|sun,2,Der Purpursonnentau ist eine fleischfressende Kannenpflanze mit purpurroten Kannen. Faengt Insekten.,Volles Sonnenlicht,5-25 °C,3 +constants/lexiconBatch2.ts,123,Bohnenkraut,Satureja hortensis,easy|sun,2,Bohnenkraut ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 +constants/lexiconBatch2.ts,11,Grosse Strahlenaralie,Schefflera actinophylla,easy|tree|large,3,"Die Grosse Strahlenaralie kann grosse, handfoermige Blaetter entwickeln. Sie ist ideal als Zimmerstrauch.",Helles indirektes Licht,18-27 °C,7 +constants/lexiconBatch2.ts,10,Strahlenaralie,Schefflera arboricola,easy|tree|air_purifier,3,"Die Strahlenaralie hat fingerfoermig angeordnete, glaenzende Blaetter auf langen Stielen. Sehr robuste Zimmerpflanze.",Helles indirektes Licht,15-25 °C,7 +constants/lexiconBatch2.ts,235,Falsche Aralie,Schefflera elegantissima,tree|bright_light,2,Falsche Aralie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7 +constants/lexiconBatch1.ts,8,Weihnachtskaktus,Schlumbergera truncata,easy|flowering|succulent,3,"Der Weihnachtskaktus erfreut zur Weihnachtszeit mit leuchtenden Blueten in Rosa, Rot oder Weiss.",Helles indirektes Licht,15-21 °C,7 +constants/lexiconBatch1.ts,55,Satinpothos,Scindapsus pictus,easy|patterned|hanging,3,"Der Satinpothos hat samtig-glaenzende, silbrig gefleckte Blaetter auf langen, haengenden Ranken.",Helles indirektes Licht,18-28 °C,7 +constants/lexiconBatch1.ts,7,Eselschwanz,Sedum morganianum,easy|succulent|hanging|sun,4,"Der Eselschwanz ist eine haengende Sukkulente mit langen Trieben aus dichten, blaugruenen Blaettchen.",Volles Sonnenlicht,15-25 °C,14 +constants/lexiconBatch2.ts,45,Regenbogenmoos,Selaginella uncinata,patterned|high_humidity,2,"Das Regenbogenmoos hat schuppenfoermige Blaetter, die im Licht schillernd irisieren. Dekorativ fuer Terrarien.",Helles indirektes Licht,18-27 °C,5 +constants/lexiconBatch1.ts,100,Perlenschnur-Pflanze,Senecio rowleyanus,easy|succulent|hanging,3,"Die Perlenschnur-Pflanze hat haengende Ranken mit kugelfoermigen, perlenaehnlichen Blaettern. Einzigartige Sukkulente.",Helles bis volles Licht,15-27 °C,14 +constants/lexiconBatch2.ts,28,Blauer Kreuzkraut,Senecio serpens,easy|succulent|sun,3,"Der Blaue Kreuzkraut hat zylindrische, blaublaugruene Blaetter und einen kriechenden Wuchs. Sehr dekorativ.",Helles bis volles Licht,15-25 °C,14 +constants/lexiconBatch2.ts,91,Tomate,Solanum lycopersicum,easy,1,"Die Tomate ist eine beliebte Gemuese- und Balkonpflanze mit roten, saftigen Fruechten. Im Topf kultivierbar.",Volles Sonnenlicht,18-28 °C,3 +constants/lexiconBatch2.ts,93,Aubergine,Solanum melongena,bright_light|sun,2,"Die Aubergine ist eine Gemuese­pflanze mit grossen, violetten Fruechten. Sie benoetigt viel Waerme und Sonne.",Volles Sonnenlicht,20-30 °C,5 +constants/lexiconBatch2.ts,238,Bubikopf,Soleirolia soleirolii,pet_friendly|high_humidity,2,Bubikopf ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,15-24 C,4 +constants/lexiconBatch2.ts,213,Eberesche,Sorbus aucuparia,tree|large|sun,3,Eberesche ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 +constants/lexiconBatch2.ts,96,Spinat,Spinacia oleracea,easy,1,Spinat ist ein naehrstoffreiches Blattgemuese mit dunkelgruenen Blaettern. Reich an Eisen und Vitaminen.,Helles bis volles Licht,10-20 °C,3 +constants/lexiconBatch2.ts,222,Spierstrauch,Spiraea japonica,flowering|tree|sun,3,Spierstrauch ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 +constants/lexiconBatch2.ts,25,Aasblume,Stapelia grandiflora,flowering|succulent|sun,3,"Die Aasblume hat fleischige, gruene Staengel und riesige, sternfoermige Blueten mit aasartigem Duft.",Helles bis volles Licht,18-30 °C,14 +constants/lexiconBatch1.ts,60,Madagaskar-Jasmin,Stephanotis floribunda,flowering,1,"Der Madagaskar-Jasmin hat dicke, glaenzende Blaetter und wachsweisse, intensiv duftende Blueten. Klassische Hochzeitsblume.",Helles indirektes Licht,18-25 °C,7 +constants/lexiconBatch2.ts,131,Stevia,Stevia rebaudiana,easy|sun,2,Stevia ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 +constants/lexiconBatch2.ts,1,Weisse Strelitzie,Strelitzia nicolai,tree|large|bright_light,3,"Die Weisse Strelitzie ist ein beeindruckender Zimmerstrauch mit grossen, blaugruenen Blaettern und weiss-blauen Blueten.",Helles bis volles Licht,18-27 °C,7 +constants/lexiconBatch1.ts,3,Paradiesvogelblume,Strelitzia reginae,flowering|large|sun,3,"Die Paradiesvogelblume beeindruckt mit leuchtend orangefarbenen und blauen Blueten, die einem Vogel aehneln.",Volles Sonnenlicht,18-26 °C,7 +constants/lexiconBatch1.ts,95,Drehfrucht,Streptocarpus hybridus,flowering,1,"Die Drehfrucht ist ein Gesneriengewaechs mit langen, gerippten Blaettern und trichterfoermigen Blueten in Lila oder Rosa.",Helles indirektes Licht,15-22 °C,7 +constants/lexiconBatch1.ts,52,Stromanthe,Stromanthe sanguinea,patterned|high_humidity,2,Die Stromanthe hat dekorative Blaetter mit weissem Muster und leuchtend roter Unterseite. Familie der Marantaceen.,Helles indirektes Licht,18-25 °C,5 +constants/lexiconBatch2.ts,166,Herbstaster,Symphyotrichum novi-belgii,flowering|sun,2,"Herbstaster ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch1.ts,56,Pfeilblatt,Syngonium podophyllum,easy|hanging,2,"Das Pfeilblatt hat charakteristisch pfeilfoermige Blaetter, die sich mit dem Alter weiterentwickeln.",Helles indirektes Licht,16-27 °C,7 +constants/lexiconBatch2.ts,149,Flieder,Syringa vulgaris,flowering|tree|sun,3,"Flieder ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,66,Studentenblume,Tagetes patula,easy|flowering|sun,3,Die Studentenblume ist eine robuste Sommerblume mit orangen oder gelben Blueten. Sie haelt Schadlinge fern.,Volles Sonnenlicht,15-28 °C,3 +constants/lexiconBatch2.ts,244,Philodendron Xanadu,Thaumatophyllum xanadu,bright_light,1,Philodendron Xanadu ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7 +constants/lexiconBatch1.ts,27,Thymian,Thymus vulgaris,easy|medicinal|sun,3,"Thymian ist ein kleiner, aromatischer Strauch mit winzigen Blaettern und rosa Blueten. Wichtiges Kuechenkraut.",Volles Sonnenlicht,10-25 °C,7 +constants/lexiconBatch2.ts,33,Luftpflanze,Tillandsia ionantha,easy,1,Die Luftpflanze ist eine kompakte Bromelie ohne Topferde. Sie nimmt Wasser und Naehrstoffe ueber die Blattschuppen auf.,Helles bis volles Licht,15-30 °C,3 +constants/lexiconBatch2.ts,32,Spanisches Moos,Tillandsia usneoides,easy|hanging,2,"Das Spanische Moos ist eine epiphytische Bromelie ohne Wurzeln, die in der Luft haengt. Es benoetigt nur Feuchtigkeitsbespruehing.",Helles bis volles Licht,15-30 °C,3 +constants/lexiconBatch2.ts,55,Weisse Tradescantia,Tradescantia fluminensis,easy|hanging,2,Die Weisse Tradescantia hat gruene Blaetter mit weisslichen Unterseiten. Sehr robust und schnellwachsend.,Helles indirektes Licht,15-25 °C,5 +constants/lexiconBatch2.ts,54,Lila Tradescantia,Tradescantia pallida,easy|hanging|sun,3,Die Lila Tradescantia hat leuchtend purpurrote Blaetter und ist sehr auffaellig. Sie liebt viel Licht.,Helles bis volles Licht,15-25 °C,5 +constants/lexiconBatch1.ts,17,Zebrakraut,Tradescantia zebrina,easy|patterned|hanging,3,Das Zebrakraut faellt durch seine silbrig-lila gestreiften Blaetter auf. Schnellwachsende Haengepflanze.,Helles indirektes Licht,15-25 °C,5 +constants/lexiconBatch2.ts,151,Kapuzinerkresse,Tropaeolum majus,flowering|sun,2,"Kapuzinerkresse ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch1.ts,107,Tulpe,Tulipa gesneriana,easy|flowering,2,Die Tulpe ist eine der beliebtesten Fruehjahrsblueher mit kelchfoermigen Blueten in unzaehligen Farben.,Helles bis volles Licht,8-18 °C,5 +constants/lexiconBatch2.ts,111,Grosse Brennessel,Urtica dioica,medicinal,1,Die Grosse Brennessel ist eine Heilpflanze mit brennenden Haaren. Die Blaetter sind reich an Vitaminen und Mineralien.,Helles bis volles Licht,10-25 °C,7 +constants/lexiconBatch2.ts,82,Wasserschlauch,Utricularia gibba,high_humidity|sun,2,Der Wasserschlauch ist eine wasserbewohnende fleischfressende Pflanze mit Schlaeuchen als Insekten­fallen.,Helles bis volles Licht,15-25 °C,2 +constants/lexiconBatch2.ts,104,Baldrian,Valeriana officinalis,flowering|medicinal,2,Baldrian ist ein bekanntes Heilkraut mit weissen bis roeslichen Blueten. Die Wurzeln werden zur Schlaffoerderung verwendet.,Helles bis volles Licht,15-25 °C,7 +constants/lexiconBatch1.ts,72,Vanda-Orchidee,Vanda coerulea,flowering|bright_light|high_humidity,3,Die Vanda-Orchidee ist bekannt fuer ihre seltene blaue Bluetenfarbe. Epiphytische Orchidee mit grossen Blueten.,Helles bis volles Licht,20-30 °C,3 +constants/lexiconBatch1.ts,76,Vanille,Vanilla planifolia,flowering|high_humidity,2,"Die Vanille ist eine kletternde Orchidee, aus deren Fruechten das beliebte Gewuerz gewonnen wird.",Helles indirektes Licht,20-30 °C,5 +constants/lexiconBatch2.ts,192,Koenigskerze,Verbascum thapsus,flowering|medicinal|sun,3,"Koenigskerze ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,164,Eisenkraut,Verbena bonariensis,flowering|sun,2,"Eisenkraut ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,198,Hornveilchen,Viola cornuta,flowering|sun,2,"Hornveilchen ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch1.ts,35,Stiefmuetterchen,Viola wittrockiana,easy|flowering,2,Das Stiefmuetterchen ist ein bekannter Fruehjahrsblueher mit charakteristisch gezeichneten Blueten.,Helles bis volles Licht,5-18 °C,3 +constants/lexiconBatch2.ts,35,Flammen-Bromelie,Vriesea splendens,flowering|patterned|high_humidity,3,"Die Flammen-Bromelie hat gebänderte, dunkelgruene Blaetter und einen spektakulaeren, roten Bluetenstand.",Helles indirektes Licht,18-25 °C,7 +constants/lexiconBatch2.ts,5,Mexikanische Fächerpalme,Washingtonia robusta,tree|large|sun,3,"Die Mexikanische Fächerpalme ist eine schlanke, hohe Palme mit faecher­foermigen Blaettern. Sehr hitzetolerant.",Volles Sonnenlicht,15-35 °C,10 +constants/lexiconBatch2.ts,221,Weigelie,Weigela florida,flowering|tree|sun,3,Weigelie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 +constants/lexiconBatch1.ts,65,Chinesischer Blauregen,Wisteria sinensis,flowering|large|sun,3,"Der Chinesische Blauregen ist ein ueppiger Kletterkuenstler mit langen, duftenden Bluetentrauben in Lila.",Volles Sonnenlicht,10-25 °C,7 +constants/lexiconBatch2.ts,246,Yucca aloifolia,Yucca aloifolia,easy|tree|sun,3,Yucca aloifolia ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Volles Sonnenlicht,18-30 C,10 +constants/lexiconBatch1.ts,40,Yucca-Palme,Yucca elephantipes,easy|tree|sun,3,"Die Yucca-Palme ist eine robuste Zimmerpflanze mit starrem, immergruenem Blaetterschopf auf einem dicken Stamm.",Helles bis volles Licht,15-28 °C,14 +constants/lexiconBatch2.ts,70,Calla,Zantedeschia aethiopica,flowering|high_humidity,2,"Die Calla hat elegante, trichterfoermige weisse Hochblaetter und glaenzende, herzfoermige Blaetter. Sehr edel.",Helles indirektes Licht,15-24 °C,7 +constants/lexiconBatch2.ts,75,Ingwer,Zingiber officinale,medicinal|high_humidity,2,Ingwer ist eine tropische Gewuerzpflanze mit aromatischen Knollen. Die Blaetter sind schilfartig.,Helles indirektes Licht,20-30 °C,5 +constants/lexiconBatch2.ts,65,Zinnie,Zinnia elegans,easy|flowering|sun,3,"Die Zinnie ist eine leuchtende Sommerblume mit grossen, dahlienaehnlichen Blueten. Sehr robust und hitzetolerant.",Volles Sonnenlicht,18-30 °C,3 diff --git a/app.json b/app.json index 4e26e50..518da96 100644 --- a/app.json +++ b/app.json @@ -1,71 +1,71 @@ -{ - "expo": { - "name": "GreenLens", - "slug": "greenlens", - "version": "2.1.4", - "orientation": "portrait", - "icon": "./assets/icon.png", - "userInterfaceStyle": "automatic", - "scheme": "greenlens", - "splash": { - "image": "./assets/transparent.png", - "resizeMode": "contain", - "backgroundColor": "#111813" - }, - "assetBundlePatterns": [ - "**/*" - ], - "ios": { - "supportsTablet": true, - "bundleIdentifier": "com.greenlens.app", - "buildNumber": "35", - "infoPlist": { - "NSCameraUsageDescription": "GreenLens needs camera access to identify plants.", - "NSPhotoLibraryUsageDescription": "GreenLens needs photo library access to identify plants from your gallery.", - "ITSAppUsesNonExemptEncryption": false - } - }, - "android": { - "adaptiveIcon": { - "foregroundImage": "./assets/adaptive-icon.png", - "backgroundColor": "#111813" - }, - "package": "com.greenlens.app", - "versionCode": 2, - "permissions": [ - "android.permission.CAMERA", - "android.permission.RECORD_AUDIO" - ] - }, - "runtimeVersion": { - "policy": "appVersion" - }, - "updates": { - "url": "https://u.expo.dev/f0c92b2e-a952-4cfe-9754-7d7222b76969" - }, - "plugins": [ - "expo-dev-client", - "expo-router", - "expo-camera", - "expo-image-picker", - "expo-secure-store", - "expo-asset", - "expo-font", - "expo-notifications", - [ - "expo-splash-screen", - { - "image": "./assets/transparent.png", - "imageWidth": 160, - "backgroundColor": "#111813" - } - ] - ], - "extra": { - "router": {}, - "eas": { - "projectId": "f0c92b2e-a952-4cfe-9754-7d7222b76969" - } - } - } +{ + "expo": { + "name": "GreenLens", + "slug": "greenlens", + "version": "2.1.5", + "orientation": "portrait", + "icon": "./assets/icon.png", + "userInterfaceStyle": "automatic", + "scheme": "greenlens", + "splash": { + "image": "./assets/transparent.png", + "resizeMode": "contain", + "backgroundColor": "#111813" + }, + "assetBundlePatterns": [ + "**/*" + ], + "ios": { + "supportsTablet": true, + "bundleIdentifier": "com.greenlens.app", + "buildNumber": "35", + "infoPlist": { + "NSCameraUsageDescription": "GreenLens needs camera access to identify plants.", + "NSPhotoLibraryUsageDescription": "GreenLens needs photo library access to identify plants from your gallery.", + "ITSAppUsesNonExemptEncryption": false + } + }, + "android": { + "adaptiveIcon": { + "foregroundImage": "./assets/adaptive-icon.png", + "backgroundColor": "#111813" + }, + "package": "com.greenlens.app", + "versionCode": 2, + "permissions": [ + "android.permission.CAMERA", + "android.permission.RECORD_AUDIO" + ] + }, + "runtimeVersion": { + "policy": "appVersion" + }, + "updates": { + "url": "https://u.expo.dev/f0c92b2e-a952-4cfe-9754-7d7222b76969" + }, + "plugins": [ + "expo-dev-client", + "expo-router", + "expo-camera", + "expo-image-picker", + "expo-secure-store", + "expo-asset", + "expo-font", + "expo-notifications", + [ + "expo-splash-screen", + { + "image": "./assets/transparent.png", + "imageWidth": 160, + "backgroundColor": "#111813" + } + ] + ], + "extra": { + "router": {}, + "eas": { + "projectId": "f0c92b2e-a952-4cfe-9754-7d7222b76969" + } + } + } } \ No newline at end of file diff --git a/app/(tabs)/_layout.tsx b/app/(tabs)/_layout.tsx index 02089c9..7677d16 100644 --- a/app/(tabs)/_layout.tsx +++ b/app/(tabs)/_layout.tsx @@ -1,58 +1,58 @@ -import { Tabs } from 'expo-router'; -import { Ionicons } from '@expo/vector-icons'; -import { useApp } from '../../context/AppContext'; -import { useColors } from '../../constants/Colors'; - -export default function TabLayout() { - const { isDarkMode, colorPalette, t } = useApp(); - const colors = useColors(isDarkMode, colorPalette); - - return ( - - ( - - ), - }} - /> - ( - - ), - }} - /> - ( - - ), - }} - /> - - ); -} +import { Tabs } from 'expo-router'; +import { Ionicons } from '@expo/vector-icons'; +import { useApp } from '../../context/AppContext'; +import { useColors } from '../../constants/Colors'; + +export default function TabLayout() { + const { isDarkMode, colorPalette, t } = useApp(); + const colors = useColors(isDarkMode, colorPalette); + + return ( + + ( + + ), + }} + /> + ( + + ), + }} + /> + ( + + ), + }} + /> + + ); +} diff --git a/app/(tabs)/index.tsx b/app/(tabs)/index.tsx index cb56020..b2332e2 100644 --- a/app/(tabs)/index.tsx +++ b/app/(tabs)/index.tsx @@ -1,846 +1,846 @@ -import React, { useMemo, useState, useRef, useEffect } from 'react'; -import { - ActivityIndicator, - Alert, - Image, - ScrollView, - StyleSheet, - Text, - TouchableOpacity, - View, - Dimensions, -} from 'react-native'; -import { SafeAreaView, useSafeAreaInsets } from 'react-native-safe-area-context'; -import { useRouter } from 'expo-router'; -import { Ionicons } from '@expo/vector-icons'; -import AsyncStorage from '@react-native-async-storage/async-storage'; -import { useApp } from '../../context/AppContext'; -import { useColors } from '../../constants/Colors'; -import { ThemeBackdrop } from '../../components/ThemeBackdrop'; -import { SafeImage } from '../../components/SafeImage'; -import { Plant } from '../../types'; -import { useCoachMarks } from '../../context/CoachMarksContext'; - -const { width: SCREEN_W, height: SCREEN_H } = Dimensions.get('window'); - -type FilterKey = 'all' | 'today' | 'week' | 'healthy' | 'dormant'; - -const DAY_MS = 24 * 60 * 60 * 1000; -const CONTENT_BOTTOM_PADDING = 12; -const FAB_BOTTOM_OFFSET = 16; - -function OnboardingChecklist({ plantsCount, colors, router, t }: { plantsCount: number; colors: any; router: any; t: any }) { - const checklist = [ - { id: 'scan', label: t.stepScan, completed: plantsCount > 0, icon: 'camera-outline', route: '/scanner' }, - { id: 'lexicon', label: t.stepLexicon, completed: false, icon: 'search-outline', route: '/lexicon' }, - { id: 'theme', label: t.stepTheme, completed: false, icon: 'color-palette-outline', route: '/profile/preferences' }, - ]; - - return ( - - {t.nextStepsTitle} - - {checklist.map((item) => ( - { - if (item.id === 'theme') { - router.push('/profile/preferences'); - } else if (item.id === 'scan') { - router.push('/scanner'); - } else if (item.id === 'lexicon') { - router.push('/lexicon'); - } else { - router.push(item.route); - } - }} - disabled={item.completed} - > - - - - - {item.label} - - {!item.completed && } - - ))} - - - ); -} - -const getDaysUntilWatering = (plant: Plant): number => { - const lastWateredTs = new Date(plant.lastWatered).getTime(); - if (Number.isNaN(lastWateredTs)) return 0; - - const dueTs = lastWateredTs + (plant.careInfo.waterIntervalDays * DAY_MS); - const remainingMs = dueTs - Date.now(); - if (remainingMs <= 0) return 0; - - return Math.ceil(remainingMs / DAY_MS); -}; - -export default function HomeScreen() { - const { - plants, - isLoadingPlants, - profileImageUri, - profileName, - billingSummary, - isLoadingBilling, - language, - t, - isDarkMode, - colorPalette, - } = useApp(); - const colors = useColors(isDarkMode, colorPalette); - const router = useRouter(); - const insets = useSafeAreaInsets(); - const [activeFilter, setActiveFilter] = useState('all'); - const { registerLayout, startTour } = useCoachMarks(); - const fabRef = useRef(null); - - // Tour nach Registrierung starten - useEffect(() => { - const checkTour = async () => { - const flag = await AsyncStorage.getItem('greenlens_show_tour'); - if (flag !== 'true') return; - await AsyncStorage.removeItem('greenlens_show_tour'); - - // 1 Sekunde warten, dann Tour starten - setTimeout(() => { - // Tab-Positionen approximieren (gleichmäßig verteilt) - const tabBarBottom = SCREEN_H - 85; - const tabW = SCREEN_W / 3; - registerLayout('tab_search', { x: tabW, y: tabBarBottom + 8, width: tabW, height: 52 }); - registerLayout('tab_profile', { x: tabW * 2, y: tabBarBottom + 8, width: tabW, height: 52 }); - - startTour([ - { - elementKey: 'fab', - title: t.tourFabTitle, - description: t.tourFabDesc, - tooltipSide: 'above', - }, - { - elementKey: 'tab_search', - title: t.tourSearchTitle, - description: t.tourSearchDesc, - tooltipSide: 'above', - }, - { - elementKey: 'tab_profile', - title: t.tourProfileTitle, - description: t.tourProfileDesc, - tooltipSide: 'above', - }, - ]); - }, 1000); - }; - checkTour(); - }, []); - - const copy = t; - const greetingText = useMemo(() => { - const hour = new Date().getHours(); - if (hour < 12) return copy.greetingMorning; - if (hour < 18) return copy.greetingAfternoon; - return copy.greetingEvening; - }, [copy.greetingAfternoon, copy.greetingEvening, copy.greetingMorning]); - const creditsText = useMemo(() => { - if (isLoadingBilling && !billingSummary) { - return '...'; - } - if (!billingSummary) { - return `-- ${copy.creditsLabel}`; - } - return `${billingSummary.credits.available} ${copy.creditsLabel}`; - }, [billingSummary, copy.creditsLabel, isLoadingBilling]); - - const thirstyCount = useMemo( - () => plants.filter(plant => getDaysUntilWatering(plant) === 0).length, - [plants] - ); - const dueTodayPlants = useMemo( - () => plants.filter(plant => getDaysUntilWatering(plant) === 0), - [plants] - ); - - const filteredPlants = useMemo(() => { - return plants.filter((plant) => { - if (activeFilter === 'all') return true; - - const daysUntil = getDaysUntilWatering(plant); - - if (activeFilter === 'today') return daysUntil === 0; - if (activeFilter === 'week') return daysUntil <= 7; - if (activeFilter === 'healthy') return daysUntil >= 2; - return plant.careInfo.waterIntervalDays >= 14; - }); - }, [plants, activeFilter]); - - const chips: Array<{ key: FilterKey; label: string }> = [ - { key: 'all', label: copy.all }, - { key: 'today', label: copy.today }, - { key: 'week', label: copy.week }, - { key: 'healthy', label: copy.healthy }, - { key: 'dormant', label: copy.dormant }, - ]; - - const handleBellPress = () => { - setActiveFilter('today'); - - if (dueTodayPlants.length === 0) { - Alert.alert(copy.reminderTitle, copy.reminderNone); - return; - } - - const previewNames = dueTodayPlants - .slice(0, 6) - .map((plant) => `- ${plant.name}`) - .join('\n'); - const remainingCount = dueTodayPlants.length - 6; - const remainingText = remainingCount > 0 - ? `\n+ ${remainingCount} ${copy.more}` - : ''; - - Alert.alert( - copy.reminderTitle, - `${copy.reminderDue.replace('{0}', dueTodayPlants.length.toString())}\n\n${previewNames}${remainingText}` - ); - }; - - if (isLoadingPlants) { - return ( - - - - - ); - } - - return ( - - - - - - - - {profileImageUri ? ( - - ) : ( - - )} - - - {greetingText} - - - {profileName || ''} - - - - {creditsText} - - - - - - - - - - - - - - - {copy.needsWaterToday} - - - - {copy.plantsThirsty.replace('{0}', thirstyCount.toString())} - - - - {copy.viewSchedule} - - - - - - - {plants.length === 0 && ( - - )} - - - {chips.map(chip => ( - setActiveFilter(chip.key)} - activeOpacity={0.85} - > - - {chip.label} - - - ))} - - - - {copy.collectionTitle} - - - {copy.collectionCount.replace('{0}', filteredPlants.length.toString())} - - - - - {filteredPlants.length === 0 ? ( - - - - - - {plants.length === 0 ? copy.emptyCollectionTitle : copy.noneInFilter} - - - {plants.length === 0 ? copy.emptyCollectionHint : copy.noneInFilter} - - {plants.length === 0 && ( - router.push('/scanner')} - activeOpacity={0.86} - > - - {copy.scanFirstPlant} - - )} - - ) : ( - filteredPlants.map((plant) => { - const daysUntil = getDaysUntilWatering(plant); - const thirsty = daysUntil === 0; - const nextWaterText = thirsty - ? copy.today - : t.inXDays.replace('{0}', daysUntil.toString()); - - return ( - router.push(`/plant/${plant.id}`)} - > - - - - - - - - - {plant.name} - - - {plant.botanicalName} - - - - - - - - - {thirsty ? copy.thirsty : copy.healthyStatus} - - - - - - {copy.nextWaterLabel}: {nextWaterText} - - - - - - ); - }) - )} - - - router.push('/scanner')} - onLayout={() => { - fabRef.current?.measureInWindow((x, y, width, height) => { - registerLayout('fab', { x, y, width, height }); - }); - }} - > - - - - ); -} - -const styles = StyleSheet.create({ - container: { - flex: 1, - }, - loadingContainer: { - flex: 1, - alignItems: 'center', - justifyContent: 'center', - }, - content: { - paddingHorizontal: 24, - paddingTop: 14, - }, - header: { - flexDirection: 'row', - justifyContent: 'space-between', - alignItems: 'center', - marginBottom: 26, - }, - headerLeft: { - flexDirection: 'row', - alignItems: 'center', - gap: 12, - flex: 1, - }, - headerTextBlock: { - flex: 1, - minWidth: 0, - }, - avatarWrap: { - width: 48, - height: 48, - borderRadius: 16, - alignItems: 'center', - justifyContent: 'center', - overflow: 'hidden', - }, - avatarImage: { - width: '100%', - height: '100%', - }, - greetingText: { - fontSize: 13, - fontWeight: '600', - }, - nameRow: { - marginTop: 1, - flexDirection: 'row', - alignItems: 'center', - gap: 8, - minWidth: 0, - }, - nameText: { - fontSize: 21, - fontWeight: '700', - letterSpacing: 0.1, - flexShrink: 1, - }, - creditsPill: { - borderRadius: 999, - borderWidth: 1, - paddingHorizontal: 8, - paddingVertical: 3, - }, - creditsText: { - fontSize: 10, - fontWeight: '700', - letterSpacing: 0.3, - textTransform: 'uppercase', - }, - bellBtn: { - width: 46, - height: 46, - borderRadius: 16, - borderWidth: 1, - alignItems: 'center', - justifyContent: 'center', - shadowOpacity: 0.08, - shadowRadius: 8, - shadowOffset: { width: 0, height: 2 }, - elevation: 2, - }, - priorityCard: { - borderRadius: 32, - padding: 24, - marginBottom: 20, - overflow: 'hidden', - }, - priorityLabelRow: { - flexDirection: 'row', - alignItems: 'center', - gap: 6, - marginBottom: 8, - }, - priorityLabel: { - fontSize: 10, - fontWeight: '700', - textTransform: 'uppercase', - letterSpacing: 0.9, - }, - priorityTitle: { - fontSize: 29, - fontWeight: '700', - lineHeight: 36, - maxWidth: 260, - marginBottom: 14, - }, - priorityButton: { - alignSelf: 'flex-start', - borderRadius: 16, - borderWidth: 1, - paddingHorizontal: 16, - paddingVertical: 10, - flexDirection: 'row', - alignItems: 'center', - gap: 6, - }, - priorityButtonText: { - fontSize: 13, - fontWeight: '700', - }, - priorityBgIcon: { - position: 'absolute', - right: -18, - bottom: -22, - }, - filterRow: { - gap: 10, - paddingVertical: 2, - paddingRight: 4, - marginBottom: 16, - }, - collectionHeader: { - flexDirection: 'row', - justifyContent: 'space-between', - alignItems: 'center', - marginBottom: 12, - }, - collectionTitle: { - fontSize: 19, - fontWeight: '700', - letterSpacing: 0.2, - }, - collectionCountPill: { - borderRadius: 999, - borderWidth: 1, - paddingHorizontal: 10, - paddingVertical: 4, - }, - collectionCountText: { - fontSize: 11, - fontWeight: '700', - textTransform: 'uppercase', - letterSpacing: 0.4, - }, - filterChip: { - paddingHorizontal: 22, - paddingVertical: 10, - borderRadius: 16, - borderWidth: 1, - }, - filterChipActive: { - paddingHorizontal: 22, - paddingVertical: 10, - borderRadius: 16, - shadowOpacity: 0.24, - shadowRadius: 10, - shadowOffset: { width: 0, height: 3 }, - elevation: 3, - }, - filterText: { - fontSize: 13, - fontWeight: '700', - }, - filterTextActive: { - fontSize: 13, - fontWeight: '700', - }, - plantCard: { - borderRadius: 30, - borderWidth: 1, - padding: 15, - flexDirection: 'row', - alignItems: 'flex-start', - gap: 14, - marginBottom: 14, - shadowOpacity: 0.1, - shadowRadius: 12, - shadowOffset: { width: 0, height: 4 }, - elevation: 3, - }, - plantImageWrap: { - borderWidth: 1, - borderRadius: 20, - overflow: 'hidden', - }, - plantImage: { - width: 98, - height: 98, - borderRadius: 20, - }, - plantBody: { - flex: 1, - paddingTop: 2, - }, - plantHeadRow: { - flexDirection: 'row', - alignItems: 'flex-start', - justifyContent: 'space-between', - marginBottom: 8, - gap: 8, - }, - plantTitleCol: { - flex: 1, - minWidth: 0, - }, - plantName: { - fontWeight: '700', - fontSize: 19, - letterSpacing: 0.15, - }, - botanicalName: { - fontSize: 12.5, - fontStyle: 'italic', - fontWeight: '500', - marginTop: 2, - opacity: 0.95, - }, - metaRow: { - flexDirection: 'row', - alignItems: 'center', - gap: 8, - flexWrap: 'wrap', - }, - statusThirsty: { - borderRadius: 20, - paddingHorizontal: 10, - paddingVertical: 4, - }, - statusHealthy: { - borderRadius: 20, - paddingHorizontal: 10, - paddingVertical: 4, - }, - statusThirstyText: { - fontSize: 10, - fontWeight: '800', - textTransform: 'uppercase', - letterSpacing: 0.4, - }, - statusHealthyText: { - fontSize: 10, - fontWeight: '800', - textTransform: 'uppercase', - letterSpacing: 0.4, - }, - waterMeta: { - fontSize: 10, - fontWeight: '700', - textTransform: 'uppercase', - letterSpacing: 0.4, - }, - nextWaterPill: { - borderRadius: 999, - borderWidth: 1, - paddingHorizontal: 9, - paddingVertical: 4, - flexDirection: 'row', - alignItems: 'center', - gap: 4, - }, - emptyState: { - borderRadius: 24, - borderWidth: 1, - paddingVertical: 32, - paddingHorizontal: 22, - alignItems: 'center', - gap: 10, - }, - emptyIconWrap: { - width: 56, - height: 56, - borderRadius: 18, - alignItems: 'center', - justifyContent: 'center', - }, - emptyTitle: { - fontSize: 18, - fontWeight: '700', - textAlign: 'center', - }, - emptyText: { - fontSize: 13, - fontWeight: '500', - textAlign: 'center', - lineHeight: 20, - }, - emptyCta: { - marginTop: 8, - borderRadius: 999, - paddingHorizontal: 16, - paddingVertical: 10, - flexDirection: 'row', - alignItems: 'center', - gap: 8, - shadowOpacity: 0.3, - shadowRadius: 10, - shadowOffset: { width: 0, height: 4 }, - elevation: 4, - }, - emptyCtaText: { - fontSize: 13, - fontWeight: '700', - }, - fab: { - position: 'absolute', - right: 24, - width: 66, - height: 66, - borderRadius: 33, - borderWidth: 4, - alignItems: 'center', - justifyContent: 'center', - shadowOpacity: 0.38, - shadowRadius: 14, - shadowOffset: { width: 0, height: 5 }, - elevation: 9, - }, - checklistCard: { - borderRadius: 24, - borderWidth: 1, - padding: 20, - marginBottom: 20, - }, - checklistTitle: { - fontSize: 16, - fontWeight: '700', - marginBottom: 16, - }, - checklistGrid: { - gap: 12, - }, - checklistItem: { - flexDirection: 'row', - alignItems: 'center', - gap: 12, - }, - checkIcon: { - width: 32, - height: 32, - borderRadius: 16, - justifyContent: 'center', - alignItems: 'center', - }, - checklistText: { - flex: 1, - fontSize: 14, - fontWeight: '500', - }, -}); +import React, { useMemo, useState, useRef, useEffect } from 'react'; +import { + ActivityIndicator, + Alert, + Image, + ScrollView, + StyleSheet, + Text, + TouchableOpacity, + View, + Dimensions, +} from 'react-native'; +import { SafeAreaView, useSafeAreaInsets } from 'react-native-safe-area-context'; +import { useRouter } from 'expo-router'; +import { Ionicons } from '@expo/vector-icons'; +import AsyncStorage from '@react-native-async-storage/async-storage'; +import { useApp } from '../../context/AppContext'; +import { useColors } from '../../constants/Colors'; +import { ThemeBackdrop } from '../../components/ThemeBackdrop'; +import { SafeImage } from '../../components/SafeImage'; +import { Plant } from '../../types'; +import { useCoachMarks } from '../../context/CoachMarksContext'; + +const { width: SCREEN_W, height: SCREEN_H } = Dimensions.get('window'); + +type FilterKey = 'all' | 'today' | 'week' | 'healthy' | 'dormant'; + +const DAY_MS = 24 * 60 * 60 * 1000; +const CONTENT_BOTTOM_PADDING = 12; +const FAB_BOTTOM_OFFSET = 16; + +function OnboardingChecklist({ plantsCount, colors, router, t }: { plantsCount: number; colors: any; router: any; t: any }) { + const checklist = [ + { id: 'scan', label: t.stepScan, completed: plantsCount > 0, icon: 'camera-outline', route: '/scanner' }, + { id: 'lexicon', label: t.stepLexicon, completed: false, icon: 'search-outline', route: '/lexicon' }, + { id: 'theme', label: t.stepTheme, completed: false, icon: 'color-palette-outline', route: '/profile/preferences' }, + ]; + + return ( + + {t.nextStepsTitle} + + {checklist.map((item) => ( + { + if (item.id === 'theme') { + router.push('/profile/preferences'); + } else if (item.id === 'scan') { + router.push('/scanner'); + } else if (item.id === 'lexicon') { + router.push('/lexicon'); + } else { + router.push(item.route); + } + }} + disabled={item.completed} + > + + + + + {item.label} + + {!item.completed && } + + ))} + + + ); +} + +const getDaysUntilWatering = (plant: Plant): number => { + const lastWateredTs = new Date(plant.lastWatered).getTime(); + if (Number.isNaN(lastWateredTs)) return 0; + + const dueTs = lastWateredTs + (plant.careInfo.waterIntervalDays * DAY_MS); + const remainingMs = dueTs - Date.now(); + if (remainingMs <= 0) return 0; + + return Math.ceil(remainingMs / DAY_MS); +}; + +export default function HomeScreen() { + const { + plants, + isLoadingPlants, + profileImageUri, + profileName, + billingSummary, + isLoadingBilling, + language, + t, + isDarkMode, + colorPalette, + } = useApp(); + const colors = useColors(isDarkMode, colorPalette); + const router = useRouter(); + const insets = useSafeAreaInsets(); + const [activeFilter, setActiveFilter] = useState('all'); + const { registerLayout, startTour } = useCoachMarks(); + const fabRef = useRef(null); + + // Tour nach Registrierung starten + useEffect(() => { + const checkTour = async () => { + const flag = await AsyncStorage.getItem('greenlens_show_tour'); + if (flag !== 'true') return; + await AsyncStorage.removeItem('greenlens_show_tour'); + + // 1 Sekunde warten, dann Tour starten + setTimeout(() => { + // Tab-Positionen approximieren (gleichmäßig verteilt) + const tabBarBottom = SCREEN_H - 85; + const tabW = SCREEN_W / 3; + registerLayout('tab_search', { x: tabW, y: tabBarBottom + 8, width: tabW, height: 52 }); + registerLayout('tab_profile', { x: tabW * 2, y: tabBarBottom + 8, width: tabW, height: 52 }); + + startTour([ + { + elementKey: 'fab', + title: t.tourFabTitle, + description: t.tourFabDesc, + tooltipSide: 'above', + }, + { + elementKey: 'tab_search', + title: t.tourSearchTitle, + description: t.tourSearchDesc, + tooltipSide: 'above', + }, + { + elementKey: 'tab_profile', + title: t.tourProfileTitle, + description: t.tourProfileDesc, + tooltipSide: 'above', + }, + ]); + }, 1000); + }; + checkTour(); + }, []); + + const copy = t; + const greetingText = useMemo(() => { + const hour = new Date().getHours(); + if (hour < 12) return copy.greetingMorning; + if (hour < 18) return copy.greetingAfternoon; + return copy.greetingEvening; + }, [copy.greetingAfternoon, copy.greetingEvening, copy.greetingMorning]); + const creditsText = useMemo(() => { + if (isLoadingBilling && !billingSummary) { + return '...'; + } + if (!billingSummary) { + return `-- ${copy.creditsLabel}`; + } + return `${billingSummary.credits.available} ${copy.creditsLabel}`; + }, [billingSummary, copy.creditsLabel, isLoadingBilling]); + + const thirstyCount = useMemo( + () => plants.filter(plant => getDaysUntilWatering(plant) === 0).length, + [plants] + ); + const dueTodayPlants = useMemo( + () => plants.filter(plant => getDaysUntilWatering(plant) === 0), + [plants] + ); + + const filteredPlants = useMemo(() => { + return plants.filter((plant) => { + if (activeFilter === 'all') return true; + + const daysUntil = getDaysUntilWatering(plant); + + if (activeFilter === 'today') return daysUntil === 0; + if (activeFilter === 'week') return daysUntil <= 7; + if (activeFilter === 'healthy') return daysUntil >= 2; + return plant.careInfo.waterIntervalDays >= 14; + }); + }, [plants, activeFilter]); + + const chips: Array<{ key: FilterKey; label: string }> = [ + { key: 'all', label: copy.all }, + { key: 'today', label: copy.today }, + { key: 'week', label: copy.week }, + { key: 'healthy', label: copy.healthy }, + { key: 'dormant', label: copy.dormant }, + ]; + + const handleBellPress = () => { + setActiveFilter('today'); + + if (dueTodayPlants.length === 0) { + Alert.alert(copy.reminderTitle, copy.reminderNone); + return; + } + + const previewNames = dueTodayPlants + .slice(0, 6) + .map((plant) => `- ${plant.name}`) + .join('\n'); + const remainingCount = dueTodayPlants.length - 6; + const remainingText = remainingCount > 0 + ? `\n+ ${remainingCount} ${copy.more}` + : ''; + + Alert.alert( + copy.reminderTitle, + `${copy.reminderDue.replace('{0}', dueTodayPlants.length.toString())}\n\n${previewNames}${remainingText}` + ); + }; + + if (isLoadingPlants) { + return ( + + + + + ); + } + + return ( + + + + + + + + {profileImageUri ? ( + + ) : ( + + )} + + + {greetingText} + + + {profileName || ''} + + + + {creditsText} + + + + + + + + + + + + + + + {copy.needsWaterToday} + + + + {copy.plantsThirsty.replace('{0}', thirstyCount.toString())} + + + + {copy.viewSchedule} + + + + + + + {plants.length === 0 && ( + + )} + + + {chips.map(chip => ( + setActiveFilter(chip.key)} + activeOpacity={0.85} + > + + {chip.label} + + + ))} + + + + {copy.collectionTitle} + + + {copy.collectionCount.replace('{0}', filteredPlants.length.toString())} + + + + + {filteredPlants.length === 0 ? ( + + + + + + {plants.length === 0 ? copy.emptyCollectionTitle : copy.noneInFilter} + + + {plants.length === 0 ? copy.emptyCollectionHint : copy.noneInFilter} + + {plants.length === 0 && ( + router.push('/scanner')} + activeOpacity={0.86} + > + + {copy.scanFirstPlant} + + )} + + ) : ( + filteredPlants.map((plant) => { + const daysUntil = getDaysUntilWatering(plant); + const thirsty = daysUntil === 0; + const nextWaterText = thirsty + ? copy.today + : t.inXDays.replace('{0}', daysUntil.toString()); + + return ( + router.push(`/plant/${plant.id}`)} + > + + + + + + + + + {plant.name} + + + {plant.botanicalName} + + + + + + + + + {thirsty ? copy.thirsty : copy.healthyStatus} + + + + + + {copy.nextWaterLabel}: {nextWaterText} + + + + + + ); + }) + )} + + + router.push('/scanner')} + onLayout={() => { + fabRef.current?.measureInWindow((x, y, width, height) => { + registerLayout('fab', { x, y, width, height }); + }); + }} + > + + + + ); +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + }, + loadingContainer: { + flex: 1, + alignItems: 'center', + justifyContent: 'center', + }, + content: { + paddingHorizontal: 24, + paddingTop: 14, + }, + header: { + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + marginBottom: 26, + }, + headerLeft: { + flexDirection: 'row', + alignItems: 'center', + gap: 12, + flex: 1, + }, + headerTextBlock: { + flex: 1, + minWidth: 0, + }, + avatarWrap: { + width: 48, + height: 48, + borderRadius: 16, + alignItems: 'center', + justifyContent: 'center', + overflow: 'hidden', + }, + avatarImage: { + width: '100%', + height: '100%', + }, + greetingText: { + fontSize: 13, + fontWeight: '600', + }, + nameRow: { + marginTop: 1, + flexDirection: 'row', + alignItems: 'center', + gap: 8, + minWidth: 0, + }, + nameText: { + fontSize: 21, + fontWeight: '700', + letterSpacing: 0.1, + flexShrink: 1, + }, + creditsPill: { + borderRadius: 999, + borderWidth: 1, + paddingHorizontal: 8, + paddingVertical: 3, + }, + creditsText: { + fontSize: 10, + fontWeight: '700', + letterSpacing: 0.3, + textTransform: 'uppercase', + }, + bellBtn: { + width: 46, + height: 46, + borderRadius: 16, + borderWidth: 1, + alignItems: 'center', + justifyContent: 'center', + shadowOpacity: 0.08, + shadowRadius: 8, + shadowOffset: { width: 0, height: 2 }, + elevation: 2, + }, + priorityCard: { + borderRadius: 32, + padding: 24, + marginBottom: 20, + overflow: 'hidden', + }, + priorityLabelRow: { + flexDirection: 'row', + alignItems: 'center', + gap: 6, + marginBottom: 8, + }, + priorityLabel: { + fontSize: 10, + fontWeight: '700', + textTransform: 'uppercase', + letterSpacing: 0.9, + }, + priorityTitle: { + fontSize: 29, + fontWeight: '700', + lineHeight: 36, + maxWidth: 260, + marginBottom: 14, + }, + priorityButton: { + alignSelf: 'flex-start', + borderRadius: 16, + borderWidth: 1, + paddingHorizontal: 16, + paddingVertical: 10, + flexDirection: 'row', + alignItems: 'center', + gap: 6, + }, + priorityButtonText: { + fontSize: 13, + fontWeight: '700', + }, + priorityBgIcon: { + position: 'absolute', + right: -18, + bottom: -22, + }, + filterRow: { + gap: 10, + paddingVertical: 2, + paddingRight: 4, + marginBottom: 16, + }, + collectionHeader: { + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + marginBottom: 12, + }, + collectionTitle: { + fontSize: 19, + fontWeight: '700', + letterSpacing: 0.2, + }, + collectionCountPill: { + borderRadius: 999, + borderWidth: 1, + paddingHorizontal: 10, + paddingVertical: 4, + }, + collectionCountText: { + fontSize: 11, + fontWeight: '700', + textTransform: 'uppercase', + letterSpacing: 0.4, + }, + filterChip: { + paddingHorizontal: 22, + paddingVertical: 10, + borderRadius: 16, + borderWidth: 1, + }, + filterChipActive: { + paddingHorizontal: 22, + paddingVertical: 10, + borderRadius: 16, + shadowOpacity: 0.24, + shadowRadius: 10, + shadowOffset: { width: 0, height: 3 }, + elevation: 3, + }, + filterText: { + fontSize: 13, + fontWeight: '700', + }, + filterTextActive: { + fontSize: 13, + fontWeight: '700', + }, + plantCard: { + borderRadius: 30, + borderWidth: 1, + padding: 15, + flexDirection: 'row', + alignItems: 'flex-start', + gap: 14, + marginBottom: 14, + shadowOpacity: 0.1, + shadowRadius: 12, + shadowOffset: { width: 0, height: 4 }, + elevation: 3, + }, + plantImageWrap: { + borderWidth: 1, + borderRadius: 20, + overflow: 'hidden', + }, + plantImage: { + width: 98, + height: 98, + borderRadius: 20, + }, + plantBody: { + flex: 1, + paddingTop: 2, + }, + plantHeadRow: { + flexDirection: 'row', + alignItems: 'flex-start', + justifyContent: 'space-between', + marginBottom: 8, + gap: 8, + }, + plantTitleCol: { + flex: 1, + minWidth: 0, + }, + plantName: { + fontWeight: '700', + fontSize: 19, + letterSpacing: 0.15, + }, + botanicalName: { + fontSize: 12.5, + fontStyle: 'italic', + fontWeight: '500', + marginTop: 2, + opacity: 0.95, + }, + metaRow: { + flexDirection: 'row', + alignItems: 'center', + gap: 8, + flexWrap: 'wrap', + }, + statusThirsty: { + borderRadius: 20, + paddingHorizontal: 10, + paddingVertical: 4, + }, + statusHealthy: { + borderRadius: 20, + paddingHorizontal: 10, + paddingVertical: 4, + }, + statusThirstyText: { + fontSize: 10, + fontWeight: '800', + textTransform: 'uppercase', + letterSpacing: 0.4, + }, + statusHealthyText: { + fontSize: 10, + fontWeight: '800', + textTransform: 'uppercase', + letterSpacing: 0.4, + }, + waterMeta: { + fontSize: 10, + fontWeight: '700', + textTransform: 'uppercase', + letterSpacing: 0.4, + }, + nextWaterPill: { + borderRadius: 999, + borderWidth: 1, + paddingHorizontal: 9, + paddingVertical: 4, + flexDirection: 'row', + alignItems: 'center', + gap: 4, + }, + emptyState: { + borderRadius: 24, + borderWidth: 1, + paddingVertical: 32, + paddingHorizontal: 22, + alignItems: 'center', + gap: 10, + }, + emptyIconWrap: { + width: 56, + height: 56, + borderRadius: 18, + alignItems: 'center', + justifyContent: 'center', + }, + emptyTitle: { + fontSize: 18, + fontWeight: '700', + textAlign: 'center', + }, + emptyText: { + fontSize: 13, + fontWeight: '500', + textAlign: 'center', + lineHeight: 20, + }, + emptyCta: { + marginTop: 8, + borderRadius: 999, + paddingHorizontal: 16, + paddingVertical: 10, + flexDirection: 'row', + alignItems: 'center', + gap: 8, + shadowOpacity: 0.3, + shadowRadius: 10, + shadowOffset: { width: 0, height: 4 }, + elevation: 4, + }, + emptyCtaText: { + fontSize: 13, + fontWeight: '700', + }, + fab: { + position: 'absolute', + right: 24, + width: 66, + height: 66, + borderRadius: 33, + borderWidth: 4, + alignItems: 'center', + justifyContent: 'center', + shadowOpacity: 0.38, + shadowRadius: 14, + shadowOffset: { width: 0, height: 5 }, + elevation: 9, + }, + checklistCard: { + borderRadius: 24, + borderWidth: 1, + padding: 20, + marginBottom: 20, + }, + checklistTitle: { + fontSize: 16, + fontWeight: '700', + marginBottom: 16, + }, + checklistGrid: { + gap: 12, + }, + checklistItem: { + flexDirection: 'row', + alignItems: 'center', + gap: 12, + }, + checkIcon: { + width: 32, + height: 32, + borderRadius: 16, + justifyContent: 'center', + alignItems: 'center', + }, + checklistText: { + flex: 1, + fontSize: 14, + fontWeight: '500', + }, +}); diff --git a/app/(tabs)/profile.tsx b/app/(tabs)/profile.tsx index be07f7d..1b61271 100644 --- a/app/(tabs)/profile.tsx +++ b/app/(tabs)/profile.tsx @@ -1,526 +1,526 @@ -import React, { useState, useEffect, useMemo } from 'react'; -import { - View, - Text, - StyleSheet, - TouchableOpacity, - ScrollView, - Image, - Alert, - TextInput, - Keyboard, -} from 'react-native'; -import { SafeAreaView } from 'react-native-safe-area-context'; -import { Ionicons } from '@expo/vector-icons'; -import * as ImagePicker from 'expo-image-picker'; -import { useRouter } from 'expo-router'; -import { useApp } from '../../context/AppContext'; -import { useColors } from '../../constants/Colors'; -import { ThemeBackdrop } from '../../components/ThemeBackdrop'; -import { Language } from '../../types'; - -const DAY_MS = 24 * 60 * 60 * 1000; - -const getDaysUntilWatering = (lastWatered: string, intervalDays: number): number => { - const lastWateredTs = new Date(lastWatered).getTime(); - if (Number.isNaN(lastWateredTs)) return 0; - const dueTs = lastWateredTs + (intervalDays * DAY_MS); - const remainingMs = dueTs - Date.now(); - if (remainingMs <= 0) return 0; - return Math.ceil(remainingMs / DAY_MS); -}; - -const getProfileCopy = (language: Language) => { - if (language === 'de') { - return { - overviewLabel: 'Überblick', - statPlants: 'Pflanzen', - statDueToday: 'Heute fällig', - statReminders: 'Erinnerungen an', - account: 'Account', - changePhoto: 'Foto ändern', - removePhoto: 'Foto entfernen', - nameLabel: 'Name', - namePlaceholder: 'Dein Name', - saveName: 'Name speichern', - photoErrorTitle: 'Fehler', - photoErrorMessage: 'Profilfoto konnte nicht geladen werden.', - nameErrorTitle: 'Name fehlt', - nameErrorMessage: 'Bitte gib einen Namen ein.', - menuSettings: 'Einstellungen', - menuBilling: 'Abo & Credits', - menuData: 'Daten & Datenschutz', - logout: 'Abmelden', - logoutConfirmTitle: 'Abmelden?', - logoutConfirmMessage: 'Möchtest du dich wirklich abmelden?', - logoutConfirmBtn: 'Abmelden', - }; - } - if (language === 'es') { - return { - overviewLabel: 'Resumen', - statPlants: 'Plantas', - statDueToday: 'Vencen hoy', - statReminders: 'Recordatorios', - account: 'Cuenta', - changePhoto: 'Cambiar foto', - removePhoto: 'Eliminar foto', - nameLabel: 'Nombre', - namePlaceholder: 'Tu nombre', - saveName: 'Guardar nombre', - photoErrorTitle: 'Error', - photoErrorMessage: 'No se pudo cargar la foto.', - nameErrorTitle: 'Falta nombre', - nameErrorMessage: 'Por favor ingresa un nombre.', - menuSettings: 'Ajustes', - menuBilling: 'Suscripción y Créditos', - menuData: 'Datos y Privacidad', - logout: 'Cerrar sesión', - logoutConfirmTitle: '¿Cerrar sesión?', - logoutConfirmMessage: '¿Realmente quieres cerrar sesión?', - logoutConfirmBtn: 'Cerrar sesión', - }; - } - return { - overviewLabel: 'Overview', - statPlants: 'Plants', - statDueToday: 'Due today', - statReminders: 'Reminders on', - account: 'Account', - changePhoto: 'Change photo', - removePhoto: 'Remove photo', - nameLabel: 'Name', - namePlaceholder: 'Your name', - saveName: 'Save name', - photoErrorTitle: 'Error', - photoErrorMessage: 'Could not load profile photo.', - nameErrorTitle: 'Name missing', - nameErrorMessage: 'Please enter a name.', - menuSettings: 'Preferences', - menuBilling: 'Billing & Credits', - menuData: 'Data & Privacy', - logout: 'Sign Out', - logoutConfirmTitle: 'Sign out?', - logoutConfirmMessage: 'Do you really want to sign out?', - logoutConfirmBtn: 'Sign Out', - }; -}; - -export default function ProfileScreen() { - const { - plants, - language, - t, - isDarkMode, - colorPalette, - profileImageUri, - setProfileImage, - profileName, - setProfileName, - signOut, - } = useApp(); - - const router = useRouter(); - const colors = useColors(isDarkMode, colorPalette); - - const [isUpdatingImage, setIsUpdatingImage] = useState(false); - const [isSavingName, setIsSavingName] = useState(false); - const [draftName, setDraftName] = useState(profileName); - - const copy = useMemo(() => getProfileCopy(language), [language]); - - useEffect(() => { - setDraftName(profileName); - }, [profileName]); - - const normalizedDraftName = draftName.trim(); - const canSaveName = normalizedDraftName.length > 0 && normalizedDraftName !== profileName; - - const dueTodayCount = useMemo( - () => plants.filter(plant => getDaysUntilWatering(plant.lastWatered, plant.careInfo.waterIntervalDays) === 0).length, - [plants] - ); - - const remindersEnabledCount = useMemo( - () => plants.filter(plant => Boolean(plant.notificationsEnabled)).length, - [plants] - ); - - const handlePickProfileImage = async () => { - if (isUpdatingImage) return; - - setIsUpdatingImage(true); - try { - const result = await ImagePicker.launchImageLibraryAsync({ - mediaTypes: ['images'], - quality: 0.85, - base64: true, - }); - - if (!result.canceled && result.assets[0]) { - const asset = result.assets[0]; - const imageUri = asset.base64 - ? `data:image/jpeg;base64,${asset.base64}` - : asset.uri; - await setProfileImage(imageUri); - } - } catch (error) { - console.error('Failed to pick profile image', error); - Alert.alert(copy.photoErrorTitle, copy.photoErrorMessage); - } finally { - setIsUpdatingImage(false); - } - }; - - const handleRemovePhoto = async () => { - await setProfileImage(null); - }; - - const handleSaveName = async () => { - if (!normalizedDraftName) { - Alert.alert(copy.nameErrorTitle, copy.nameErrorMessage); - return; - } - - if (!canSaveName) { - Keyboard.dismiss(); - return; - } - - setIsSavingName(true); - try { - await setProfileName(normalizedDraftName); - Keyboard.dismiss(); - } finally { - setIsSavingName(false); - } - }; - - const menuItems = [ - { label: copy.menuSettings, icon: 'settings-outline', route: '/profile/preferences' as any }, - { label: copy.menuBilling, icon: 'card-outline', route: '/profile/billing' as any }, - { label: copy.menuData, icon: 'shield-checkmark-outline', route: '/profile/data' as any }, - ]; - - return ( - - - - - {t.tabProfile} - - - {copy.overviewLabel} - - {[ - { label: copy.statPlants, value: plants.length.toString() }, - { label: copy.statDueToday, value: dueTodayCount.toString() }, - { label: copy.statReminders, value: remindersEnabledCount.toString() }, - ].map((item) => ( - - {item.value} - {item.label} - - ))} - - - - - {copy.account} - - - - {profileImageUri ? ( - - ) : ( - - )} - - - - {profileName} - - {plants.length} {copy.statPlants} - - - - - - - - {isUpdatingImage ? '...' : copy.changePhoto} - - - - {profileImageUri ? ( - - - {copy.removePhoto} - - - ) : null} - - - {copy.nameLabel} - - - - - {isSavingName ? '...' : copy.saveName} - - - - - - - {menuItems.map((item, idx) => ( - router.push(item.route)} - activeOpacity={0.7} - > - - - {item.label} - - - - ))} - - {/* Logout */} - { - Alert.alert(copy.logoutConfirmTitle, copy.logoutConfirmMessage, [ - { text: t.cancel, style: 'cancel' }, - { - text: copy.logoutConfirmBtn, - style: 'destructive', - onPress: async () => { - await signOut(); - router.replace('/auth/login'); - }, - }, - ]); - }} - > - - {copy.logout} - - - - - - ); -} - -const styles = StyleSheet.create({ - container: { - flex: 1, - paddingHorizontal: 20, - }, - scrollContent: { - paddingBottom: 20, - }, - title: { - marginTop: 14, - marginBottom: 14, - fontSize: 28, - fontWeight: '700', - }, - card: { - borderWidth: 1, - borderRadius: 18, - padding: 14, - marginBottom: 12, - gap: 10, - }, - accountCard: { - marginBottom: 14, - }, - logoutBtn: { - flexDirection: 'row', - alignItems: 'center', - justifyContent: 'center', - gap: 8, - borderRadius: 14, - borderWidth: 1, - paddingVertical: 14, - marginBottom: 12, - }, - logoutText: { - fontSize: 15, - fontWeight: '600', - }, - cardTitle: { - fontSize: 15, - fontWeight: '700', - }, - statsRow: { - flexDirection: 'row', - gap: 8, - }, - statCard: { - flex: 1, - borderWidth: 1, - borderRadius: 12, - paddingVertical: 12, - paddingHorizontal: 8, - alignItems: 'center', - justifyContent: 'center', - gap: 2, - }, - statValue: { - fontSize: 22, - lineHeight: 24, - fontWeight: '700', - }, - statLabel: { - fontSize: 11, - fontWeight: '600', - textAlign: 'center', - }, - accountRow: { - flexDirection: 'row', - alignItems: 'center', - gap: 12, - }, - accountMeta: { - flex: 1, - gap: 3, - }, - currentName: { - fontSize: 18, - fontWeight: '700', - }, - plantsCount: { - fontSize: 13, - fontWeight: '600', - }, - avatarFrame: { - width: 74, - height: 74, - borderRadius: 22, - alignItems: 'center', - justifyContent: 'center', - overflow: 'hidden', - }, - avatarImage: { - width: '100%', - height: '100%', - }, - photoButtons: { - flexDirection: 'row', - gap: 8, - }, - photoActionBtn: { - borderRadius: 10, - paddingVertical: 10, - paddingHorizontal: 12, - }, - photoSecondaryBtn: { - borderWidth: 1, - }, - photoActionText: { - fontSize: 12, - fontWeight: '700', - }, - photoSecondaryText: { - fontSize: 12, - fontWeight: '700', - }, - fieldLabel: { - marginTop: 2, - fontSize: 12, - fontWeight: '600', - }, - nameRow: { - flexDirection: 'row', - gap: 8, - alignItems: 'center', - }, - nameInput: { - flex: 1, - borderWidth: 1, - borderRadius: 12, - paddingHorizontal: 12, - paddingVertical: 10, - fontSize: 14, - fontWeight: '500', - }, - saveNameBtn: { - borderWidth: 1, - borderRadius: 12, - paddingHorizontal: 12, - paddingVertical: 10, - }, - saveNameText: { - fontSize: 12, - fontWeight: '700', - }, - menuItem: { - flexDirection: 'row', - justifyContent: 'space-between', - alignItems: 'center', - paddingVertical: 16, - paddingHorizontal: 14, - }, - menuItemLeft: { - flexDirection: 'row', - alignItems: 'center', - gap: 12, - }, - menuItemText: { - fontSize: 16, - fontWeight: '500', - } -}); +import React, { useState, useEffect, useMemo } from 'react'; +import { + View, + Text, + StyleSheet, + TouchableOpacity, + ScrollView, + Image, + Alert, + TextInput, + Keyboard, +} from 'react-native'; +import { SafeAreaView } from 'react-native-safe-area-context'; +import { Ionicons } from '@expo/vector-icons'; +import * as ImagePicker from 'expo-image-picker'; +import { useRouter } from 'expo-router'; +import { useApp } from '../../context/AppContext'; +import { useColors } from '../../constants/Colors'; +import { ThemeBackdrop } from '../../components/ThemeBackdrop'; +import { Language } from '../../types'; + +const DAY_MS = 24 * 60 * 60 * 1000; + +const getDaysUntilWatering = (lastWatered: string, intervalDays: number): number => { + const lastWateredTs = new Date(lastWatered).getTime(); + if (Number.isNaN(lastWateredTs)) return 0; + const dueTs = lastWateredTs + (intervalDays * DAY_MS); + const remainingMs = dueTs - Date.now(); + if (remainingMs <= 0) return 0; + return Math.ceil(remainingMs / DAY_MS); +}; + +const getProfileCopy = (language: Language) => { + if (language === 'de') { + return { + overviewLabel: 'Überblick', + statPlants: 'Pflanzen', + statDueToday: 'Heute fällig', + statReminders: 'Erinnerungen an', + account: 'Account', + changePhoto: 'Foto ändern', + removePhoto: 'Foto entfernen', + nameLabel: 'Name', + namePlaceholder: 'Dein Name', + saveName: 'Name speichern', + photoErrorTitle: 'Fehler', + photoErrorMessage: 'Profilfoto konnte nicht geladen werden.', + nameErrorTitle: 'Name fehlt', + nameErrorMessage: 'Bitte gib einen Namen ein.', + menuSettings: 'Einstellungen', + menuBilling: 'Abo & Credits', + menuData: 'Daten & Datenschutz', + logout: 'Abmelden', + logoutConfirmTitle: 'Abmelden?', + logoutConfirmMessage: 'Möchtest du dich wirklich abmelden?', + logoutConfirmBtn: 'Abmelden', + }; + } + if (language === 'es') { + return { + overviewLabel: 'Resumen', + statPlants: 'Plantas', + statDueToday: 'Vencen hoy', + statReminders: 'Recordatorios', + account: 'Cuenta', + changePhoto: 'Cambiar foto', + removePhoto: 'Eliminar foto', + nameLabel: 'Nombre', + namePlaceholder: 'Tu nombre', + saveName: 'Guardar nombre', + photoErrorTitle: 'Error', + photoErrorMessage: 'No se pudo cargar la foto.', + nameErrorTitle: 'Falta nombre', + nameErrorMessage: 'Por favor ingresa un nombre.', + menuSettings: 'Ajustes', + menuBilling: 'Suscripción y Créditos', + menuData: 'Datos y Privacidad', + logout: 'Cerrar sesión', + logoutConfirmTitle: '¿Cerrar sesión?', + logoutConfirmMessage: '¿Realmente quieres cerrar sesión?', + logoutConfirmBtn: 'Cerrar sesión', + }; + } + return { + overviewLabel: 'Overview', + statPlants: 'Plants', + statDueToday: 'Due today', + statReminders: 'Reminders on', + account: 'Account', + changePhoto: 'Change photo', + removePhoto: 'Remove photo', + nameLabel: 'Name', + namePlaceholder: 'Your name', + saveName: 'Save name', + photoErrorTitle: 'Error', + photoErrorMessage: 'Could not load profile photo.', + nameErrorTitle: 'Name missing', + nameErrorMessage: 'Please enter a name.', + menuSettings: 'Preferences', + menuBilling: 'Billing & Credits', + menuData: 'Data & Privacy', + logout: 'Sign Out', + logoutConfirmTitle: 'Sign out?', + logoutConfirmMessage: 'Do you really want to sign out?', + logoutConfirmBtn: 'Sign Out', + }; +}; + +export default function ProfileScreen() { + const { + plants, + language, + t, + isDarkMode, + colorPalette, + profileImageUri, + setProfileImage, + profileName, + setProfileName, + signOut, + } = useApp(); + + const router = useRouter(); + const colors = useColors(isDarkMode, colorPalette); + + const [isUpdatingImage, setIsUpdatingImage] = useState(false); + const [isSavingName, setIsSavingName] = useState(false); + const [draftName, setDraftName] = useState(profileName); + + const copy = useMemo(() => getProfileCopy(language), [language]); + + useEffect(() => { + setDraftName(profileName); + }, [profileName]); + + const normalizedDraftName = draftName.trim(); + const canSaveName = normalizedDraftName.length > 0 && normalizedDraftName !== profileName; + + const dueTodayCount = useMemo( + () => plants.filter(plant => getDaysUntilWatering(plant.lastWatered, plant.careInfo.waterIntervalDays) === 0).length, + [plants] + ); + + const remindersEnabledCount = useMemo( + () => plants.filter(plant => Boolean(plant.notificationsEnabled)).length, + [plants] + ); + + const handlePickProfileImage = async () => { + if (isUpdatingImage) return; + + setIsUpdatingImage(true); + try { + const result = await ImagePicker.launchImageLibraryAsync({ + mediaTypes: ['images'], + quality: 0.85, + base64: true, + }); + + if (!result.canceled && result.assets[0]) { + const asset = result.assets[0]; + const imageUri = asset.base64 + ? `data:image/jpeg;base64,${asset.base64}` + : asset.uri; + await setProfileImage(imageUri); + } + } catch (error) { + console.error('Failed to pick profile image', error); + Alert.alert(copy.photoErrorTitle, copy.photoErrorMessage); + } finally { + setIsUpdatingImage(false); + } + }; + + const handleRemovePhoto = async () => { + await setProfileImage(null); + }; + + const handleSaveName = async () => { + if (!normalizedDraftName) { + Alert.alert(copy.nameErrorTitle, copy.nameErrorMessage); + return; + } + + if (!canSaveName) { + Keyboard.dismiss(); + return; + } + + setIsSavingName(true); + try { + await setProfileName(normalizedDraftName); + Keyboard.dismiss(); + } finally { + setIsSavingName(false); + } + }; + + const menuItems = [ + { label: copy.menuSettings, icon: 'settings-outline', route: '/profile/preferences' as any }, + { label: copy.menuBilling, icon: 'card-outline', route: '/profile/billing' as any }, + { label: copy.menuData, icon: 'shield-checkmark-outline', route: '/profile/data' as any }, + ]; + + return ( + + + + + {t.tabProfile} + + + {copy.overviewLabel} + + {[ + { label: copy.statPlants, value: plants.length.toString() }, + { label: copy.statDueToday, value: dueTodayCount.toString() }, + { label: copy.statReminders, value: remindersEnabledCount.toString() }, + ].map((item) => ( + + {item.value} + {item.label} + + ))} + + + + + {copy.account} + + + + {profileImageUri ? ( + + ) : ( + + )} + + + + {profileName} + + {plants.length} {copy.statPlants} + + + + + + + + {isUpdatingImage ? '...' : copy.changePhoto} + + + + {profileImageUri ? ( + + + {copy.removePhoto} + + + ) : null} + + + {copy.nameLabel} + + + + + {isSavingName ? '...' : copy.saveName} + + + + + + + {menuItems.map((item, idx) => ( + router.push(item.route)} + activeOpacity={0.7} + > + + + {item.label} + + + + ))} + + {/* Logout */} + { + Alert.alert(copy.logoutConfirmTitle, copy.logoutConfirmMessage, [ + { text: t.cancel, style: 'cancel' }, + { + text: copy.logoutConfirmBtn, + style: 'destructive', + onPress: async () => { + await signOut(); + router.replace('/auth/login'); + }, + }, + ]); + }} + > + + {copy.logout} + + + + + + ); +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + paddingHorizontal: 20, + }, + scrollContent: { + paddingBottom: 20, + }, + title: { + marginTop: 14, + marginBottom: 14, + fontSize: 28, + fontWeight: '700', + }, + card: { + borderWidth: 1, + borderRadius: 18, + padding: 14, + marginBottom: 12, + gap: 10, + }, + accountCard: { + marginBottom: 14, + }, + logoutBtn: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'center', + gap: 8, + borderRadius: 14, + borderWidth: 1, + paddingVertical: 14, + marginBottom: 12, + }, + logoutText: { + fontSize: 15, + fontWeight: '600', + }, + cardTitle: { + fontSize: 15, + fontWeight: '700', + }, + statsRow: { + flexDirection: 'row', + gap: 8, + }, + statCard: { + flex: 1, + borderWidth: 1, + borderRadius: 12, + paddingVertical: 12, + paddingHorizontal: 8, + alignItems: 'center', + justifyContent: 'center', + gap: 2, + }, + statValue: { + fontSize: 22, + lineHeight: 24, + fontWeight: '700', + }, + statLabel: { + fontSize: 11, + fontWeight: '600', + textAlign: 'center', + }, + accountRow: { + flexDirection: 'row', + alignItems: 'center', + gap: 12, + }, + accountMeta: { + flex: 1, + gap: 3, + }, + currentName: { + fontSize: 18, + fontWeight: '700', + }, + plantsCount: { + fontSize: 13, + fontWeight: '600', + }, + avatarFrame: { + width: 74, + height: 74, + borderRadius: 22, + alignItems: 'center', + justifyContent: 'center', + overflow: 'hidden', + }, + avatarImage: { + width: '100%', + height: '100%', + }, + photoButtons: { + flexDirection: 'row', + gap: 8, + }, + photoActionBtn: { + borderRadius: 10, + paddingVertical: 10, + paddingHorizontal: 12, + }, + photoSecondaryBtn: { + borderWidth: 1, + }, + photoActionText: { + fontSize: 12, + fontWeight: '700', + }, + photoSecondaryText: { + fontSize: 12, + fontWeight: '700', + }, + fieldLabel: { + marginTop: 2, + fontSize: 12, + fontWeight: '600', + }, + nameRow: { + flexDirection: 'row', + gap: 8, + alignItems: 'center', + }, + nameInput: { + flex: 1, + borderWidth: 1, + borderRadius: 12, + paddingHorizontal: 12, + paddingVertical: 10, + fontSize: 14, + fontWeight: '500', + }, + saveNameBtn: { + borderWidth: 1, + borderRadius: 12, + paddingHorizontal: 12, + paddingVertical: 10, + }, + saveNameText: { + fontSize: 12, + fontWeight: '700', + }, + menuItem: { + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + paddingVertical: 16, + paddingHorizontal: 14, + }, + menuItemLeft: { + flexDirection: 'row', + alignItems: 'center', + gap: 12, + }, + menuItemText: { + fontSize: 16, + fontWeight: '500', + } +}); diff --git a/app/(tabs)/search.tsx b/app/(tabs)/search.tsx index 12a1d9e..b11cec7 100644 --- a/app/(tabs)/search.tsx +++ b/app/(tabs)/search.tsx @@ -1,613 +1,613 @@ -import React, { useEffect, useMemo, useState } from 'react'; -import { - Dimensions, - FlatList, - ScrollView, - StyleSheet, - Text, - TextInput, - TouchableOpacity, - View, -} from 'react-native'; -import { SafeAreaView } from 'react-native-safe-area-context'; -import { useRouter } from 'expo-router'; -import { Ionicons } from '@expo/vector-icons'; -import { useApp } from '../../context/AppContext'; -import { useColors } from '../../constants/Colors'; -import { Plant } from '../../types'; -import { PlantCard } from '../../components/PlantCard'; -import { ThemeBackdrop } from '../../components/ThemeBackdrop'; -import { - DatabaseEntry, - PlantDatabaseService, - SemanticSearchStatus, -} from '../../services/plantDatabaseService'; -import { normalizeSearchText, rankHybridEntries } from '../../utils/hybridSearch'; - -const { width } = Dimensions.get('window'); -const CARD_GAP = 12; -const CARD_WIDTH = (width - 40 - CARD_GAP) / 2; -const SEARCH_DEBOUNCE_MS = 250; -const SEMANTIC_SEARCH_CREDIT_COST = 2; - -const getBillingCopy = (language: 'de' | 'en' | 'es') => { - if (language === 'de') { - return { - creditsLabel: 'Credits', - deepSearchCost: `Deep Search kostet ${SEMANTIC_SEARCH_CREDIT_COST} Credits`, - insufficientCredits: 'Nicht genug Credits fuer AI Deep Search.', - managePlan: 'Plan verwalten', - }; - } - - if (language === 'es') { - return { - creditsLabel: 'Creditos', - deepSearchCost: `Deep Search cuesta ${SEMANTIC_SEARCH_CREDIT_COST} creditos`, - insufficientCredits: 'No tienes creditos suficientes para AI Deep Search.', - managePlan: 'Gestionar plan', - }; - } - - return { - creditsLabel: 'Credits', - deepSearchCost: `Deep Search costs ${SEMANTIC_SEARCH_CREDIT_COST} credits`, - insufficientCredits: 'Not enough credits for AI Deep Search.', - managePlan: 'Manage plan', - }; -}; - -const parseColor = (value: string) => { - if (value.startsWith('#')) { - const cleaned = value.replace('#', ''); - const normalized = cleaned.length === 3 - ? cleaned.split('').map((c) => `${c}${c}`).join('') - : cleaned; - const int = Number.parseInt(normalized, 16); - return { - r: (int >> 16) & 255, - g: (int >> 8) & 255, - b: int & 255, - }; - } - - const match = value.match(/rgba?\(([^)]+)\)/i); - if (!match) return { r: 255, g: 255, b: 255 }; - const parts = match[1].split(',').map((part) => part.trim()); - return { - r: Number.parseFloat(parts[0]) || 255, - g: Number.parseFloat(parts[1]) || 255, - b: Number.parseFloat(parts[2]) || 255, - }; -}; - -const blendColors = (baseColor: string, tintColor: string, tintWeight: number) => { - const base = parseColor(baseColor); - const tint = parseColor(tintColor); - const weight = Math.max(0, Math.min(1, tintWeight)); - const r = Math.round(base.r + (tint.r - base.r) * weight); - const g = Math.round(base.g + (tint.g - base.g) * weight); - const b = Math.round(base.b + (tint.b - base.b) * weight); - return `rgb(${r}, ${g}, ${b})`; -}; - -const relativeLuminance = (value: string) => { - const { r, g, b } = parseColor(value); - const [nr, ng, nb] = [r, g, b].map((channel) => { - const normalized = channel / 255; - return normalized <= 0.03928 - ? normalized / 12.92 - : ((normalized + 0.055) / 1.055) ** 2.4; - }); - return 0.2126 * nr + 0.7152 * ng + 0.0722 * nb; -}; - -const contrastRatio = (a: string, b: string) => { - const l1 = relativeLuminance(a); - const l2 = relativeLuminance(b); - const lighter = Math.max(l1, l2); - const darker = Math.min(l1, l2); - return (lighter + 0.05) / (darker + 0.05); -}; - -const pickBestTextColor = (bgColor: string, candidates: string[]) => { - let best = candidates[0]; - let bestRatio = contrastRatio(bgColor, best); - for (let i = 1; i < candidates.length; i += 1) { - const ratio = contrastRatio(bgColor, candidates[i]); - if (ratio > bestRatio) { - best = candidates[i]; - bestRatio = ratio; - } - } - return best; -}; - -const chunkIntoRows = (items: T[], size = 2): T[][] => { - const rows: T[][] = []; - for (let i = 0; i < items.length; i += size) { - rows.push(items.slice(i, i + size)); - } - return rows; -}; - -export default function SearchScreen() { - const { - plants, - isDarkMode, - colorPalette, - t, - language, - billingSummary, - refreshBillingSummary, - } = useApp(); - const colors = useColors(isDarkMode, colorPalette); - const router = useRouter(); - const billingCopy = getBillingCopy(language); - const availableCredits = billingSummary?.credits.available ?? 0; - - const [searchQuery, setSearchQuery] = useState(''); - const [debouncedQuery, setDebouncedQuery] = useState(''); - const [isDeepSearching, setIsDeepSearching] = useState(false); - const [aiStatus, setAiStatus] = useState('idle'); - const [aiResults, setAiResults] = useState([]); - - useEffect(() => { - const timer = setTimeout(() => { - setDebouncedQuery(searchQuery.trim()); - }, SEARCH_DEBOUNCE_MS); - - return () => clearTimeout(timer); - }, [searchQuery]); - - useEffect(() => { - setAiStatus('idle'); - setAiResults([]); - }, [debouncedQuery, language]); - - useEffect(() => { - refreshBillingSummary(); - }, [refreshBillingSummary]); - - const getCategoryBackground = (baseTint: string, accent: string) => { - return isDarkMode ? baseTint : blendColors(baseTint, accent, 0.2); - }; - - const getCategoryTextColor = (bgColor: string, accent: string) => { - const tintedDark = blendColors(accent, '#000000', 0.58); - const tintedLight = blendColors(accent, '#ffffff', 0.64); - return pickBestTextColor(bgColor, [ - isDarkMode ? tintedLight : tintedDark, - colors.text, - colors.textOnImage, - ]); - }; - - const categories = [ - { id: 'easy', name: t.catCareEasy, bg: getCategoryBackground(colors.successTint, colors.success), accent: colors.success }, - { id: 'low_light', name: t.catLowLight, bg: getCategoryBackground(colors.infoTint, colors.info), accent: colors.info }, - { id: 'bright_light', name: t.catBrightLight, bg: getCategoryBackground(colors.primaryTint, colors.primaryDark), accent: colors.primaryDark }, - { id: 'sun', name: t.catSun, bg: getCategoryBackground(colors.warningTint, colors.warning), accent: colors.warning }, - { id: 'pet_friendly', name: t.catPetFriendly, bg: getCategoryBackground(colors.dangerTint, colors.danger), accent: colors.danger }, - { id: 'air_purifier', name: t.catAirPurifier, bg: getCategoryBackground(colors.primaryTint, colors.primary), accent: colors.primary }, - { id: 'high_humidity', name: t.catHighHumidity, bg: getCategoryBackground(colors.infoTint, colors.info), accent: colors.info }, - { id: 'hanging', name: t.catHanging, bg: getCategoryBackground(colors.successTint, colors.success), accent: colors.success }, - { id: 'patterned', name: t.catPatterned, bg: getCategoryBackground(colors.dangerTint, colors.primaryDark), accent: colors.primaryDark }, - { id: 'flowering', name: t.catFlowering, bg: getCategoryBackground(colors.primaryTint, colors.primaryDark), accent: colors.primaryDark }, - { id: 'succulent', name: t.catSucculents, bg: getCategoryBackground(colors.warningTint, colors.warning), accent: colors.warning }, - { id: 'tree', name: t.catTree, bg: getCategoryBackground(colors.surfaceStrong, colors.textSecondary), accent: colors.textSecondary }, - { id: 'large', name: t.catLarge, bg: getCategoryBackground(colors.surface, colors.textMuted), accent: colors.textMuted }, - { id: 'medicinal', name: t.catMedicinal, bg: getCategoryBackground(colors.successTint, colors.success), accent: colors.success }, - ]; - - const normalizedQuery = normalizeSearchText(debouncedQuery); - const isResultMode = Boolean(normalizedQuery); - - const localResults = useMemo(() => { - if (!normalizedQuery) { - return [] as Plant[]; - } - - return rankHybridEntries(plants, normalizedQuery, 30) - .map((entry) => entry.entry); - }, [plants, normalizedQuery]); - - const [lexiconResults, setLexiconResults] = useState([]); - - useEffect(() => { - if (!normalizedQuery) { - setLexiconResults([]); - return; - } - let isCancelled = false; - PlantDatabaseService.searchPlants(normalizedQuery, language, { - limit: 30, - }).then((results) => { - if (!isCancelled) setLexiconResults(results); - }).catch(console.error); - - return () => { - isCancelled = true; - }; - }, [normalizedQuery, language]); - - const filteredAiResults = aiResults; - - const showAiSection = aiStatus !== 'idle' || filteredAiResults.length > 0; - const canRunDeepSearch = ( - searchQuery.trim().length >= 3 && - !isDeepSearching && - availableCredits >= SEMANTIC_SEARCH_CREDIT_COST - ); - - const handleDeepSearch = async () => { - const query = searchQuery.trim(); - if (query.length < 3) return; - if (availableCredits < SEMANTIC_SEARCH_CREDIT_COST) { - setAiStatus('insufficient_credits'); - setAiResults([]); - return; - } - - setIsDeepSearching(true); - setAiStatus('loading'); - setAiResults([]); - - try { - const response = await PlantDatabaseService.semanticSearchDetailed(query, language); - setAiStatus(response.status); - setAiResults(response.results); - } catch (error) { - console.error('Deep search failed', error); - setAiStatus('provider_error'); - setAiResults([]); - } finally { - setIsDeepSearching(false); - await refreshBillingSummary(); - } - }; - - const openCategoryLexicon = (categoryId: string, categoryName: string) => { - router.push({ - pathname: '/lexicon', - params: { - categoryId, - categoryLabel: encodeURIComponent(categoryName), - }, - }); - }; - - const clearAll = () => { - setSearchQuery(''); - setDebouncedQuery(''); - setAiStatus('idle'); - setAiResults([]); - }; - - const openLexiconDetail = (entry: DatabaseEntry) => { - router.push({ - pathname: '/lexicon', - params: { detail: encodeURIComponent(JSON.stringify(entry)) }, - }); - }; - - const renderGrid = ( - items: Array, - type: 'local' | 'lexicon' | 'ai', - ) => { - const rows = chunkIntoRows(items, 2); - - return ( - - {rows.map((row, rowIndex) => ( - - {row.map((item, itemIndex) => ( - - { - if (type === 'local' && 'id' in item) { - router.push(`/plant/${item.id}`); - return; - } - openLexiconDetail(item as DatabaseEntry); - }} - t={t} - isDark={isDarkMode} - colorPalette={colorPalette} - /> - - ))} - {row.length === 1 ? : null} - - ))} - - ); - }; - - const aiStatusText = (() => { - if (aiStatus === 'loading') return t.searchAiLoading; - if (aiStatus === 'timeout') return t.searchAiUnavailable; - if (aiStatus === 'provider_error') return t.searchAiUnavailable; - if (aiStatus === 'insufficient_credits') return billingCopy.insufficientCredits; - if (aiStatus === 'no_results') return t.searchAiNoResults; - return null; - })(); - - const SectionTitle = ({ label, count }: { label: string; count: number }) => ( - - {label} - {count} - - ); - - return ( - - - - {t.searchTitle} - - - - - {searchQuery ? ( - - - - ) : null} - - - item.id} - style={styles.chipsList} - showsHorizontalScrollIndicator={false} - contentContainerStyle={styles.chipsContent} - renderItem={({ item }) => { - return ( - openCategoryLexicon(item.id, item.name)} - activeOpacity={0.8} - > - - {item.name} - - - ); - }} - /> - - {searchQuery.trim().length >= 3 ? ( - - - - - {isDeepSearching ? t.searchAiLoading : t.searchDeepAction} - - - - - - {billingCopy.creditsLabel}: {availableCredits} - - - {billingCopy.deepSearchCost} - - - - ) : null} - - {isResultMode ? ( - - - {localResults.length > 0 ? ( - renderGrid(localResults, 'local') - ) : ( - {t.searchNoLocalResults} - )} - - - {lexiconResults.length > 0 ? ( - renderGrid(lexiconResults, 'lexicon') - ) : ( - {t.searchNoLexiconResults} - )} - - {showAiSection ? ( - - - {aiStatus === 'loading' ? ( - - - {aiStatusText} - - ) : filteredAiResults.length > 0 ? ( - renderGrid(filteredAiResults, 'ai') - ) : aiStatusText ? ( - - {aiStatusText} - {aiStatus === 'insufficient_credits' ? ( - router.push('/(tabs)/profile')} - activeOpacity={0.85} - > - {billingCopy.managePlan} - - ) : null} - - ) : null} - - ) : null} - - ) : ( - - router.push('/lexicon')} - > - - {t.lexiconTitle} - {t.lexiconDesc} - - {t.browseLexicon} - - - - )} - - ); -} - -const styles = StyleSheet.create({ - container: { flex: 1, paddingHorizontal: 20 }, - title: { fontSize: 23, fontWeight: '700', letterSpacing: 0.2, marginTop: 12, marginBottom: 16 }, - searchBar: { - flexDirection: 'row', - alignItems: 'center', - borderWidth: 1, - borderRadius: 16, - paddingHorizontal: 14, - paddingVertical: 10, - gap: 10, - shadowOffset: { width: 0, height: 2 }, - shadowOpacity: 0.14, - shadowRadius: 8, - elevation: 2, - }, - searchInput: { flex: 1, fontSize: 15 }, - chipsList: { marginTop: 10, height: 50, maxHeight: 50 }, - chipsContent: { gap: 8, paddingRight: 4, paddingVertical: 1, alignItems: 'center' }, - catChip: { - height: 40, - paddingHorizontal: 14, - paddingVertical: 0, - borderRadius: 20, - justifyContent: 'center', - alignItems: 'center', - borderWidth: 1, - }, - catChipText: { - fontSize: 12.5, - lineHeight: 18, - fontWeight: '700', - includeFontPadding: false, - }, - deepSearchBtn: { - marginTop: 12, - flexDirection: 'row', - alignItems: 'center', - alignSelf: 'flex-start', - gap: 8, - paddingHorizontal: 11, - paddingVertical: 6, - borderRadius: 10, - borderWidth: 1, - shadowOffset: { width: 0, height: 2 }, - shadowOpacity: 0.16, - shadowRadius: 6, - elevation: 2, - }, - deepSearchWrap: { - marginTop: 12, - gap: 6, - alignSelf: 'flex-start', - }, - deepSearchText: { fontSize: 12, fontWeight: '700' }, - creditMetaRow: { - gap: 1, - marginLeft: 2, - }, - creditMetaText: { - fontSize: 11, - fontWeight: '600', - }, - results: { marginTop: 14 }, - resultsContent: { paddingBottom: 110 }, - sectionHeader: { - marginBottom: 10, - flexDirection: 'row', - justifyContent: 'space-between', - alignItems: 'center', - }, - sectionTitle: { fontSize: 15, fontWeight: '600' }, - sectionCount: { fontSize: 13, fontWeight: '500' }, - grid: { marginBottom: 18 }, - gridRow: { - flexDirection: 'row', - justifyContent: 'space-between', - marginBottom: CARD_GAP, - }, - cardWrapper: { width: CARD_WIDTH }, - cardSpacer: { width: CARD_WIDTH }, - emptyText: { marginBottom: 18, fontSize: 14, lineHeight: 20 }, - aiSection: { marginTop: 2 }, - aiStatusBlock: { marginBottom: 18 }, - aiLoadingRow: { flexDirection: 'row', alignItems: 'center', gap: 8, marginBottom: 18 }, - aiStatusText: { fontSize: 13, fontWeight: '500' }, - managePlanBtn: { - alignSelf: 'flex-start', - borderWidth: 1, - borderRadius: 10, - paddingHorizontal: 10, - paddingVertical: 6, - marginTop: -8, - }, - managePlanText: { fontSize: 12, fontWeight: '700' }, - discoveryContent: { paddingTop: 16, paddingBottom: 120 }, - lexiconBanner: { - marginTop: 8, - padding: 18, - borderRadius: 18, - gap: 4, - }, - lexiconTitle: { fontSize: 18, fontWeight: '700' }, - lexiconDesc: { fontSize: 12 }, - lexiconBadge: { - marginTop: 8, - paddingHorizontal: 12, - paddingVertical: 5, - borderRadius: 20, - alignSelf: 'flex-start', - }, - lexiconBadgeText: { fontSize: 11, fontWeight: '700' }, -}); +import React, { useEffect, useMemo, useState } from 'react'; +import { + Dimensions, + FlatList, + ScrollView, + StyleSheet, + Text, + TextInput, + TouchableOpacity, + View, +} from 'react-native'; +import { SafeAreaView } from 'react-native-safe-area-context'; +import { useRouter } from 'expo-router'; +import { Ionicons } from '@expo/vector-icons'; +import { useApp } from '../../context/AppContext'; +import { useColors } from '../../constants/Colors'; +import { Plant } from '../../types'; +import { PlantCard } from '../../components/PlantCard'; +import { ThemeBackdrop } from '../../components/ThemeBackdrop'; +import { + DatabaseEntry, + PlantDatabaseService, + SemanticSearchStatus, +} from '../../services/plantDatabaseService'; +import { normalizeSearchText, rankHybridEntries } from '../../utils/hybridSearch'; + +const { width } = Dimensions.get('window'); +const CARD_GAP = 12; +const CARD_WIDTH = (width - 40 - CARD_GAP) / 2; +const SEARCH_DEBOUNCE_MS = 250; +const SEMANTIC_SEARCH_CREDIT_COST = 2; + +const getBillingCopy = (language: 'de' | 'en' | 'es') => { + if (language === 'de') { + return { + creditsLabel: 'Credits', + deepSearchCost: `Deep Search kostet ${SEMANTIC_SEARCH_CREDIT_COST} Credits`, + insufficientCredits: 'Nicht genug Credits fuer AI Deep Search.', + managePlan: 'Plan verwalten', + }; + } + + if (language === 'es') { + return { + creditsLabel: 'Creditos', + deepSearchCost: `Deep Search cuesta ${SEMANTIC_SEARCH_CREDIT_COST} creditos`, + insufficientCredits: 'No tienes creditos suficientes para AI Deep Search.', + managePlan: 'Gestionar plan', + }; + } + + return { + creditsLabel: 'Credits', + deepSearchCost: `Deep Search costs ${SEMANTIC_SEARCH_CREDIT_COST} credits`, + insufficientCredits: 'Not enough credits for AI Deep Search.', + managePlan: 'Manage plan', + }; +}; + +const parseColor = (value: string) => { + if (value.startsWith('#')) { + const cleaned = value.replace('#', ''); + const normalized = cleaned.length === 3 + ? cleaned.split('').map((c) => `${c}${c}`).join('') + : cleaned; + const int = Number.parseInt(normalized, 16); + return { + r: (int >> 16) & 255, + g: (int >> 8) & 255, + b: int & 255, + }; + } + + const match = value.match(/rgba?\(([^)]+)\)/i); + if (!match) return { r: 255, g: 255, b: 255 }; + const parts = match[1].split(',').map((part) => part.trim()); + return { + r: Number.parseFloat(parts[0]) || 255, + g: Number.parseFloat(parts[1]) || 255, + b: Number.parseFloat(parts[2]) || 255, + }; +}; + +const blendColors = (baseColor: string, tintColor: string, tintWeight: number) => { + const base = parseColor(baseColor); + const tint = parseColor(tintColor); + const weight = Math.max(0, Math.min(1, tintWeight)); + const r = Math.round(base.r + (tint.r - base.r) * weight); + const g = Math.round(base.g + (tint.g - base.g) * weight); + const b = Math.round(base.b + (tint.b - base.b) * weight); + return `rgb(${r}, ${g}, ${b})`; +}; + +const relativeLuminance = (value: string) => { + const { r, g, b } = parseColor(value); + const [nr, ng, nb] = [r, g, b].map((channel) => { + const normalized = channel / 255; + return normalized <= 0.03928 + ? normalized / 12.92 + : ((normalized + 0.055) / 1.055) ** 2.4; + }); + return 0.2126 * nr + 0.7152 * ng + 0.0722 * nb; +}; + +const contrastRatio = (a: string, b: string) => { + const l1 = relativeLuminance(a); + const l2 = relativeLuminance(b); + const lighter = Math.max(l1, l2); + const darker = Math.min(l1, l2); + return (lighter + 0.05) / (darker + 0.05); +}; + +const pickBestTextColor = (bgColor: string, candidates: string[]) => { + let best = candidates[0]; + let bestRatio = contrastRatio(bgColor, best); + for (let i = 1; i < candidates.length; i += 1) { + const ratio = contrastRatio(bgColor, candidates[i]); + if (ratio > bestRatio) { + best = candidates[i]; + bestRatio = ratio; + } + } + return best; +}; + +const chunkIntoRows = (items: T[], size = 2): T[][] => { + const rows: T[][] = []; + for (let i = 0; i < items.length; i += size) { + rows.push(items.slice(i, i + size)); + } + return rows; +}; + +export default function SearchScreen() { + const { + plants, + isDarkMode, + colorPalette, + t, + language, + billingSummary, + refreshBillingSummary, + } = useApp(); + const colors = useColors(isDarkMode, colorPalette); + const router = useRouter(); + const billingCopy = getBillingCopy(language); + const availableCredits = billingSummary?.credits.available ?? 0; + + const [searchQuery, setSearchQuery] = useState(''); + const [debouncedQuery, setDebouncedQuery] = useState(''); + const [isDeepSearching, setIsDeepSearching] = useState(false); + const [aiStatus, setAiStatus] = useState('idle'); + const [aiResults, setAiResults] = useState([]); + + useEffect(() => { + const timer = setTimeout(() => { + setDebouncedQuery(searchQuery.trim()); + }, SEARCH_DEBOUNCE_MS); + + return () => clearTimeout(timer); + }, [searchQuery]); + + useEffect(() => { + setAiStatus('idle'); + setAiResults([]); + }, [debouncedQuery, language]); + + useEffect(() => { + refreshBillingSummary(); + }, [refreshBillingSummary]); + + const getCategoryBackground = (baseTint: string, accent: string) => { + return isDarkMode ? baseTint : blendColors(baseTint, accent, 0.2); + }; + + const getCategoryTextColor = (bgColor: string, accent: string) => { + const tintedDark = blendColors(accent, '#000000', 0.58); + const tintedLight = blendColors(accent, '#ffffff', 0.64); + return pickBestTextColor(bgColor, [ + isDarkMode ? tintedLight : tintedDark, + colors.text, + colors.textOnImage, + ]); + }; + + const categories = [ + { id: 'easy', name: t.catCareEasy, bg: getCategoryBackground(colors.successTint, colors.success), accent: colors.success }, + { id: 'low_light', name: t.catLowLight, bg: getCategoryBackground(colors.infoTint, colors.info), accent: colors.info }, + { id: 'bright_light', name: t.catBrightLight, bg: getCategoryBackground(colors.primaryTint, colors.primaryDark), accent: colors.primaryDark }, + { id: 'sun', name: t.catSun, bg: getCategoryBackground(colors.warningTint, colors.warning), accent: colors.warning }, + { id: 'pet_friendly', name: t.catPetFriendly, bg: getCategoryBackground(colors.dangerTint, colors.danger), accent: colors.danger }, + { id: 'air_purifier', name: t.catAirPurifier, bg: getCategoryBackground(colors.primaryTint, colors.primary), accent: colors.primary }, + { id: 'high_humidity', name: t.catHighHumidity, bg: getCategoryBackground(colors.infoTint, colors.info), accent: colors.info }, + { id: 'hanging', name: t.catHanging, bg: getCategoryBackground(colors.successTint, colors.success), accent: colors.success }, + { id: 'patterned', name: t.catPatterned, bg: getCategoryBackground(colors.dangerTint, colors.primaryDark), accent: colors.primaryDark }, + { id: 'flowering', name: t.catFlowering, bg: getCategoryBackground(colors.primaryTint, colors.primaryDark), accent: colors.primaryDark }, + { id: 'succulent', name: t.catSucculents, bg: getCategoryBackground(colors.warningTint, colors.warning), accent: colors.warning }, + { id: 'tree', name: t.catTree, bg: getCategoryBackground(colors.surfaceStrong, colors.textSecondary), accent: colors.textSecondary }, + { id: 'large', name: t.catLarge, bg: getCategoryBackground(colors.surface, colors.textMuted), accent: colors.textMuted }, + { id: 'medicinal', name: t.catMedicinal, bg: getCategoryBackground(colors.successTint, colors.success), accent: colors.success }, + ]; + + const normalizedQuery = normalizeSearchText(debouncedQuery); + const isResultMode = Boolean(normalizedQuery); + + const localResults = useMemo(() => { + if (!normalizedQuery) { + return [] as Plant[]; + } + + return rankHybridEntries(plants, normalizedQuery, 30) + .map((entry) => entry.entry); + }, [plants, normalizedQuery]); + + const [lexiconResults, setLexiconResults] = useState([]); + + useEffect(() => { + if (!normalizedQuery) { + setLexiconResults([]); + return; + } + let isCancelled = false; + PlantDatabaseService.searchPlants(normalizedQuery, language, { + limit: 30, + }).then((results) => { + if (!isCancelled) setLexiconResults(results); + }).catch(console.error); + + return () => { + isCancelled = true; + }; + }, [normalizedQuery, language]); + + const filteredAiResults = aiResults; + + const showAiSection = aiStatus !== 'idle' || filteredAiResults.length > 0; + const canRunDeepSearch = ( + searchQuery.trim().length >= 3 && + !isDeepSearching && + availableCredits >= SEMANTIC_SEARCH_CREDIT_COST + ); + + const handleDeepSearch = async () => { + const query = searchQuery.trim(); + if (query.length < 3) return; + if (availableCredits < SEMANTIC_SEARCH_CREDIT_COST) { + setAiStatus('insufficient_credits'); + setAiResults([]); + return; + } + + setIsDeepSearching(true); + setAiStatus('loading'); + setAiResults([]); + + try { + const response = await PlantDatabaseService.semanticSearchDetailed(query, language); + setAiStatus(response.status); + setAiResults(response.results); + } catch (error) { + console.error('Deep search failed', error); + setAiStatus('provider_error'); + setAiResults([]); + } finally { + setIsDeepSearching(false); + await refreshBillingSummary(); + } + }; + + const openCategoryLexicon = (categoryId: string, categoryName: string) => { + router.push({ + pathname: '/lexicon', + params: { + categoryId, + categoryLabel: encodeURIComponent(categoryName), + }, + }); + }; + + const clearAll = () => { + setSearchQuery(''); + setDebouncedQuery(''); + setAiStatus('idle'); + setAiResults([]); + }; + + const openLexiconDetail = (entry: DatabaseEntry) => { + router.push({ + pathname: '/lexicon', + params: { detail: encodeURIComponent(JSON.stringify(entry)) }, + }); + }; + + const renderGrid = ( + items: Array, + type: 'local' | 'lexicon' | 'ai', + ) => { + const rows = chunkIntoRows(items, 2); + + return ( + + {rows.map((row, rowIndex) => ( + + {row.map((item, itemIndex) => ( + + { + if (type === 'local' && 'id' in item) { + router.push(`/plant/${item.id}`); + return; + } + openLexiconDetail(item as DatabaseEntry); + }} + t={t} + isDark={isDarkMode} + colorPalette={colorPalette} + /> + + ))} + {row.length === 1 ? : null} + + ))} + + ); + }; + + const aiStatusText = (() => { + if (aiStatus === 'loading') return t.searchAiLoading; + if (aiStatus === 'timeout') return t.searchAiUnavailable; + if (aiStatus === 'provider_error') return t.searchAiUnavailable; + if (aiStatus === 'insufficient_credits') return billingCopy.insufficientCredits; + if (aiStatus === 'no_results') return t.searchAiNoResults; + return null; + })(); + + const SectionTitle = ({ label, count }: { label: string; count: number }) => ( + + {label} + {count} + + ); + + return ( + + + + {t.searchTitle} + + + + + {searchQuery ? ( + + + + ) : null} + + + item.id} + style={styles.chipsList} + showsHorizontalScrollIndicator={false} + contentContainerStyle={styles.chipsContent} + renderItem={({ item }) => { + return ( + openCategoryLexicon(item.id, item.name)} + activeOpacity={0.8} + > + + {item.name} + + + ); + }} + /> + + {searchQuery.trim().length >= 3 ? ( + + + + + {isDeepSearching ? t.searchAiLoading : t.searchDeepAction} + + + + + + {billingCopy.creditsLabel}: {availableCredits} + + + {billingCopy.deepSearchCost} + + + + ) : null} + + {isResultMode ? ( + + + {localResults.length > 0 ? ( + renderGrid(localResults, 'local') + ) : ( + {t.searchNoLocalResults} + )} + + + {lexiconResults.length > 0 ? ( + renderGrid(lexiconResults, 'lexicon') + ) : ( + {t.searchNoLexiconResults} + )} + + {showAiSection ? ( + + + {aiStatus === 'loading' ? ( + + + {aiStatusText} + + ) : filteredAiResults.length > 0 ? ( + renderGrid(filteredAiResults, 'ai') + ) : aiStatusText ? ( + + {aiStatusText} + {aiStatus === 'insufficient_credits' ? ( + router.push('/(tabs)/profile')} + activeOpacity={0.85} + > + {billingCopy.managePlan} + + ) : null} + + ) : null} + + ) : null} + + ) : ( + + router.push('/lexicon')} + > + + {t.lexiconTitle} + {t.lexiconDesc} + + {t.browseLexicon} + + + + )} + + ); +} + +const styles = StyleSheet.create({ + container: { flex: 1, paddingHorizontal: 20 }, + title: { fontSize: 23, fontWeight: '700', letterSpacing: 0.2, marginTop: 12, marginBottom: 16 }, + searchBar: { + flexDirection: 'row', + alignItems: 'center', + borderWidth: 1, + borderRadius: 16, + paddingHorizontal: 14, + paddingVertical: 10, + gap: 10, + shadowOffset: { width: 0, height: 2 }, + shadowOpacity: 0.14, + shadowRadius: 8, + elevation: 2, + }, + searchInput: { flex: 1, fontSize: 15 }, + chipsList: { marginTop: 10, height: 50, maxHeight: 50 }, + chipsContent: { gap: 8, paddingRight: 4, paddingVertical: 1, alignItems: 'center' }, + catChip: { + height: 40, + paddingHorizontal: 14, + paddingVertical: 0, + borderRadius: 20, + justifyContent: 'center', + alignItems: 'center', + borderWidth: 1, + }, + catChipText: { + fontSize: 12.5, + lineHeight: 18, + fontWeight: '700', + includeFontPadding: false, + }, + deepSearchBtn: { + marginTop: 12, + flexDirection: 'row', + alignItems: 'center', + alignSelf: 'flex-start', + gap: 8, + paddingHorizontal: 11, + paddingVertical: 6, + borderRadius: 10, + borderWidth: 1, + shadowOffset: { width: 0, height: 2 }, + shadowOpacity: 0.16, + shadowRadius: 6, + elevation: 2, + }, + deepSearchWrap: { + marginTop: 12, + gap: 6, + alignSelf: 'flex-start', + }, + deepSearchText: { fontSize: 12, fontWeight: '700' }, + creditMetaRow: { + gap: 1, + marginLeft: 2, + }, + creditMetaText: { + fontSize: 11, + fontWeight: '600', + }, + results: { marginTop: 14 }, + resultsContent: { paddingBottom: 110 }, + sectionHeader: { + marginBottom: 10, + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + }, + sectionTitle: { fontSize: 15, fontWeight: '600' }, + sectionCount: { fontSize: 13, fontWeight: '500' }, + grid: { marginBottom: 18 }, + gridRow: { + flexDirection: 'row', + justifyContent: 'space-between', + marginBottom: CARD_GAP, + }, + cardWrapper: { width: CARD_WIDTH }, + cardSpacer: { width: CARD_WIDTH }, + emptyText: { marginBottom: 18, fontSize: 14, lineHeight: 20 }, + aiSection: { marginTop: 2 }, + aiStatusBlock: { marginBottom: 18 }, + aiLoadingRow: { flexDirection: 'row', alignItems: 'center', gap: 8, marginBottom: 18 }, + aiStatusText: { fontSize: 13, fontWeight: '500' }, + managePlanBtn: { + alignSelf: 'flex-start', + borderWidth: 1, + borderRadius: 10, + paddingHorizontal: 10, + paddingVertical: 6, + marginTop: -8, + }, + managePlanText: { fontSize: 12, fontWeight: '700' }, + discoveryContent: { paddingTop: 16, paddingBottom: 120 }, + lexiconBanner: { + marginTop: 8, + padding: 18, + borderRadius: 18, + gap: 4, + }, + lexiconTitle: { fontSize: 18, fontWeight: '700' }, + lexiconDesc: { fontSize: 12 }, + lexiconBadge: { + marginTop: 8, + paddingHorizontal: 12, + paddingVertical: 5, + borderRadius: 20, + alignSelf: 'flex-start', + }, + lexiconBadgeText: { fontSize: 11, fontWeight: '700' }, +}); diff --git a/app/_layout.tsx b/app/_layout.tsx index 1e5da9a..a013d34 100644 --- a/app/_layout.tsx +++ b/app/_layout.tsx @@ -1,204 +1,238 @@ -import { useEffect, useRef, useState } from 'react'; -import { Animated, Easing, Image, StyleSheet, Text, View } from 'react-native'; -import { Redirect, Stack, usePathname } from 'expo-router'; -import { StatusBar } from 'expo-status-bar'; -import AsyncStorage from '@react-native-async-storage/async-storage'; -import Purchases, { LOG_LEVEL } from 'react-native-purchases'; -import { Platform } from 'react-native'; -import Constants from 'expo-constants'; -import { AppProvider, useApp } from '../context/AppContext'; -import { CoachMarksProvider } from '../context/CoachMarksContext'; -import { CoachMarksOverlay } from '../components/CoachMarksOverlay'; -import { useColors } from '../constants/Colors'; -import { initDatabase, AppMetaDb } from '../services/database'; -import * as SecureStore from 'expo-secure-store'; -import * as SplashScreen from 'expo-splash-screen'; -import { AuthService } from '../services/authService'; -import { PostHogProvider, usePostHog } from 'posthog-react-native'; - -// Prevent the splash screen from auto-hiding before asset loading is complete. -SplashScreen.preventAutoHideAsync().catch(() => { }); - -const POSTHOG_API_KEY = process.env.EXPO_PUBLIC_POSTHOG_API_KEY || 'phc_FX6HRgx9NSpS5moxjMF6xyc37yMwjoeu6TbWUqNNKlk'; -const SECURE_INSTALL_MARKER = 'greenlens_install_v1'; - -const ensureInstallConsistency = async (): Promise => { - try { - const sqliteMarker = AppMetaDb.get('install_marker_v2'); - const secureMarker = await SecureStore.getItemAsync(SECURE_INSTALL_MARKER).catch(() => null); - - if (sqliteMarker === '1' && secureMarker === '1') { - return false; // Alles gut, keine Neuinstallation - } - - if (sqliteMarker === '1' || secureMarker === '1') { - // Teilweise vorhanden -> heilen, nicht löschen - AppMetaDb.set('install_marker_v2', '1'); - await SecureStore.setItemAsync(SECURE_INSTALL_MARKER, '1'); - return false; - } - - // Fresh Install: Alles zurücksetzen - await AuthService.logout(); - await AsyncStorage.removeItem('greenlens_show_tour'); - AppMetaDb.set('install_marker_v2', '1'); - await SecureStore.setItemAsync(SECURE_INSTALL_MARKER, '1'); - return true; - } catch (error) { - console.error('Failed to initialize install marker', error); - return false; - } -}; - - -import { AnimatedSplashScreen } from '../components/AnimatedSplashScreen'; - +import { useEffect, useRef, useState } from 'react'; +import { Animated, Easing, Image, StyleSheet, Text, View } from 'react-native'; +import { Redirect, Stack, usePathname } from 'expo-router'; +import { StatusBar } from 'expo-status-bar'; +import AsyncStorage from '@react-native-async-storage/async-storage'; +import Purchases, { LOG_LEVEL } from 'react-native-purchases'; +import { Platform } from 'react-native'; +import Constants from 'expo-constants'; +import { AppProvider, useApp } from '../context/AppContext'; +import { CoachMarksProvider } from '../context/CoachMarksContext'; +import { CoachMarksOverlay } from '../components/CoachMarksOverlay'; +import { useColors } from '../constants/Colors'; +import { initDatabase, AppMetaDb } from '../services/database'; +import * as SecureStore from 'expo-secure-store'; +import * as SplashScreen from 'expo-splash-screen'; +import { AuthService } from '../services/authService'; +import { PostHogProvider, usePostHog } from 'posthog-react-native'; + +// Prevent the splash screen from auto-hiding before asset loading is complete. +SplashScreen.preventAutoHideAsync().catch(() => { }); + +const POSTHOG_API_KEY = process.env.EXPO_PUBLIC_POSTHOG_API_KEY || 'phc_FX6HRgx9NSpS5moxjMF6xyc37yMwjoeu6TbWUqNNKlk'; +const SECURE_INSTALL_MARKER = 'greenlens_install_v1'; + +const ensureInstallConsistency = async (): Promise => { + try { + const sqliteMarker = AppMetaDb.get('install_marker_v2'); + const secureMarker = await SecureStore.getItemAsync(SECURE_INSTALL_MARKER).catch(() => null); + + if (sqliteMarker === '1' && secureMarker === '1') { + return false; // Alles gut, keine Neuinstallation + } + + if (sqliteMarker === '1' || secureMarker === '1') { + // Teilweise vorhanden -> heilen, nicht löschen + AppMetaDb.set('install_marker_v2', '1'); + await SecureStore.setItemAsync(SECURE_INSTALL_MARKER, '1'); + return false; + } + + // Fresh Install: Alles zurücksetzen + await AuthService.logout(); + await AsyncStorage.removeItem('greenlens_show_tour'); + AppMetaDb.set('install_marker_v2', '1'); + await SecureStore.setItemAsync(SECURE_INSTALL_MARKER, '1'); + return true; + } catch (error) { + console.error('Failed to initialize install marker', error); + return false; + } +}; + + +import { AnimatedSplashScreen } from '../components/AnimatedSplashScreen'; + function RootLayoutInner() { - const { isDarkMode, colorPalette, signOut, session, isInitializing, isLoadingPlants } = useApp(); + const { isDarkMode, colorPalette, signOut, session, isInitializing, isLoadingPlants, syncRevenueCatState } = useApp(); const colors = useColors(isDarkMode, colorPalette); const pathname = usePathname(); const [installCheckDone, setInstallCheckDone] = useState(false); const [splashAnimationComplete, setSplashAnimationComplete] = useState(false); + const [revenueCatReady, setRevenueCatReady] = useState(Constants.appOwnership === 'expo'); const posthog = usePostHog(); - - useEffect(() => { - // RevenueCat requires native store access — not available in Expo Go - const isExpoGo = Constants.appOwnership === 'expo'; - if (isExpoGo) { - console.log('[RevenueCat] Skipping configure: running in Expo Go'); - return; - } - - Purchases.setLogLevel(LOG_LEVEL.VERBOSE); - const iosApiKey = process.env.EXPO_PUBLIC_REVENUECAT_IOS_API_KEY || 'appl_hrSpsuUuVstbHhYIDnOqYxPOnmR'; + + useEffect(() => { + // RevenueCat requires native store access — not available in Expo Go + const isExpoGo = Constants.appOwnership === 'expo'; + if (isExpoGo) { + console.log('[RevenueCat] Skipping configure: running in Expo Go'); + return; + } + + Purchases.setLogLevel(LOG_LEVEL.VERBOSE); + const iosApiKey = process.env.EXPO_PUBLIC_REVENUECAT_IOS_API_KEY || 'appl_hrSpsuUuVstbHhYIDnOqYxPOnmR'; const androidApiKey = process.env.EXPO_PUBLIC_REVENUECAT_ANDROID_API_KEY || 'goog_placeholder'; if (Platform.OS === 'ios') { Purchases.configure({ apiKey: iosApiKey }); } else if (Platform.OS === 'android') { Purchases.configure({ apiKey: androidApiKey }); } + setRevenueCatReady(true); }, []); useEffect(() => { - if (session?.serverUserId) { - posthog.identify(session.serverUserId, { - email: session.email, - name: session.name, - }); - } else if (session === null) { - posthog.reset(); + const isExpoGo = Constants.appOwnership === 'expo'; + if (isExpoGo || !revenueCatReady) { + return; } - }, [session, posthog]); - useEffect(() => { + let cancelled = false; (async () => { - const didResetSessionForFreshInstall = await ensureInstallConsistency(); - if (didResetSessionForFreshInstall) { - await signOut(); + try { + if (session?.serverUserId) { + await Purchases.logIn(session.serverUserId); + const customerInfo = await Purchases.getCustomerInfo(); + if (!cancelled) { + await syncRevenueCatState(customerInfo as any); + } + } else { + await Purchases.logOut(); + } + } catch (error) { + console.error('Failed to align RevenueCat identity', error); } - setInstallCheckDone(true); })(); - }, [signOut]); - const isAppReady = installCheckDone && !isInitializing && !isLoadingPlants; - - let content = null; - - if (isAppReady) { - if (!session) { - // Only redirect if we are not already on an auth-related page or the scanner - const isAuthPage = pathname.includes('onboarding') || pathname.includes('auth/') || pathname.includes('scanner'); - if (!isAuthPage) { - content = ; - } else { - content = ( - - - - - - - ); - } - } else { - content = ( - <> - - - - - - - - - - - - - - - ); - } - } - - return ( - <> - - {content} - {!splashAnimationComplete && ( - setSplashAnimationComplete(true)} - /> - )} - - ); -} - -export default function RootLayout() { - initDatabase(); - - return ( - - - - - - - - ); -} + return () => { + cancelled = true; + }; + }, [revenueCatReady, session?.serverUserId, syncRevenueCatState]); + + useEffect(() => { + if (session?.serverUserId) { + posthog.identify(session.serverUserId, { + email: session.email, + name: session.name, + }); + } else if (session === null) { + posthog.reset(); + } + }, [session, posthog]); + + useEffect(() => { + (async () => { + const didResetSessionForFreshInstall = await ensureInstallConsistency(); + if (didResetSessionForFreshInstall) { + await signOut(); + } + setInstallCheckDone(true); + })(); + }, [signOut]); + + const isAppReady = installCheckDone && !isInitializing && !isLoadingPlants; + + let content = null; + + if (isAppReady) { + if (!session) { + // Only redirect if we are not already on an auth-related page or the scanner + const isAuthPage = pathname.includes('onboarding') || pathname.includes('auth/') || pathname.includes('scanner') || pathname.includes('profile/billing'); + if (!isAuthPage) { + content = ; + } else { + content = ( + + + + + + + + ); + } + } else { + content = ( + <> + + + + + + + + + + + + + + + ); + } + } + + return ( + <> + + {content} + {!splashAnimationComplete && ( + setSplashAnimationComplete(true)} + /> + )} + + ); +} + +export default function RootLayout() { + initDatabase(); + + return ( + + + + + + + + ); +} diff --git a/app/auth/login.tsx b/app/auth/login.tsx index 818d3ef..9661169 100644 --- a/app/auth/login.tsx +++ b/app/auth/login.tsx @@ -1,288 +1,288 @@ -import React, { useState } from 'react'; -import { - View, - Text, - TextInput, - TouchableOpacity, - StyleSheet, - KeyboardAvoidingView, - Platform, - ActivityIndicator, - ScrollView, - Image, -} from 'react-native'; -import { Ionicons } from '@expo/vector-icons'; -import { router } from 'expo-router'; -import { useApp } from '../../context/AppContext'; -import { useColors } from '../../constants/Colors'; -import { ThemeBackdrop } from '../../components/ThemeBackdrop'; -import { AuthService } from '../../services/authService'; - -export default function LoginScreen() { - const { isDarkMode, colorPalette, hydrateSession } = useApp(); - const colors = useColors(isDarkMode, colorPalette); - - const [email, setEmail] = useState(''); - const [password, setPassword] = useState(''); - const [showPassword, setShowPassword] = useState(false); - const [loading, setLoading] = useState(false); - const [error, setError] = useState(null); - - const handleLogin = async () => { - if (!email.trim() || !password) { - setError('Bitte alle Felder ausfüllen.'); - return; - } - setLoading(true); - setError(null); - try { - const session = await AuthService.login(email, password); - await hydrateSession(session); - router.replace('/(tabs)'); - } catch (e: any) { - if (e.message === 'USER_NOT_FOUND') { - setError('Kein Konto mit dieser E-Mail gefunden.'); - } else if (e.message === 'WRONG_PASSWORD') { - setError('Falsches Passwort.'); - } else if (e.message === 'BACKEND_URL_MISSING') { - setError('Backend-URL fehlt. Bitte EXPO_PUBLIC_BACKEND_URL konfigurieren.'); - } else if (e.message === 'NETWORK_ERROR') { - setError('Server nicht erreichbar. Bitte versuche es erneut.'); - } else { - setError('Anmeldung fehlgeschlagen. Bitte versuche es erneut.'); - } - } finally { - setLoading(false); - } - }; - - return ( - - - - {/* Logo / Header */} - - - GreenLens - - Willkommen zurück - - - - {/* Card */} - - {/* Email */} - - E-Mail - - - - - - - {/* Password */} - - Passwort - - - - setShowPassword((v) => !v)} style={styles.eyeBtn}> - - - - - - {/* Error */} - {error && ( - - - {error} - - )} - - {/* Login Button */} - - {loading ? ( - - ) : ( - Anmelden - )} - - - - {/* Divider */} - - - oder - - - - {/* Sign Up Link */} - router.replace('/auth/signup')} - activeOpacity={0.82} - > - - Noch kein Konto?{' '} - Registrieren - - - - - ); -} - -const styles = StyleSheet.create({ - flex: { flex: 1 }, - scroll: { - flexGrow: 1, - justifyContent: 'center', - paddingHorizontal: 24, - paddingVertical: 48, - }, - header: { - alignItems: 'center', - marginBottom: 32, - }, - logoIcon: { - width: 56, - height: 56, - borderRadius: 14, - marginBottom: 16, - }, - appName: { - fontSize: 30, - fontWeight: '700', - letterSpacing: -0.5, - marginBottom: 6, - }, - subtitle: { - fontSize: 15, - fontWeight: '400', - }, - card: { - borderRadius: 20, - borderWidth: 1, - padding: 24, - gap: 16, - shadowOffset: { width: 0, height: 4 }, - shadowOpacity: 1, - shadowRadius: 12, - elevation: 4, - }, - fieldGroup: { - gap: 6, - }, - label: { - fontSize: 13, - fontWeight: '500', - marginLeft: 2, - }, - inputRow: { - flexDirection: 'row', - alignItems: 'center', - borderWidth: 1, - borderRadius: 12, - paddingHorizontal: 14, - height: 50, - }, - inputIcon: { - marginRight: 10, - }, - input: { - flex: 1, - fontSize: 15, - height: 50, - }, - eyeBtn: { - padding: 4, - marginLeft: 6, - }, - errorBox: { - flexDirection: 'row', - alignItems: 'center', - gap: 6, - borderRadius: 10, - paddingHorizontal: 12, - paddingVertical: 10, - }, - errorText: { - fontSize: 13, - flex: 1, - }, - primaryBtn: { - height: 52, - borderRadius: 14, - justifyContent: 'center', - alignItems: 'center', - marginTop: 4, - }, - primaryBtnText: { - fontSize: 16, - fontWeight: '600', - }, - dividerRow: { - flexDirection: 'row', - alignItems: 'center', - marginVertical: 20, - gap: 12, - }, - dividerLine: { - flex: 1, - height: 1, - }, - dividerText: { - fontSize: 13, - }, - secondaryBtn: { - height: 52, - borderRadius: 14, - borderWidth: 1, - justifyContent: 'center', - alignItems: 'center', - }, - secondaryBtnText: { - fontSize: 15, - }, -}); +import React, { useState } from 'react'; +import { + View, + Text, + TextInput, + TouchableOpacity, + StyleSheet, + KeyboardAvoidingView, + Platform, + ActivityIndicator, + ScrollView, + Image, +} from 'react-native'; +import { Ionicons } from '@expo/vector-icons'; +import { router } from 'expo-router'; +import { useApp } from '../../context/AppContext'; +import { useColors } from '../../constants/Colors'; +import { ThemeBackdrop } from '../../components/ThemeBackdrop'; +import { AuthService } from '../../services/authService'; + +export default function LoginScreen() { + const { isDarkMode, colorPalette, hydrateSession, t } = useApp(); + const colors = useColors(isDarkMode, colorPalette); + + const [email, setEmail] = useState(''); + const [password, setPassword] = useState(''); + const [showPassword, setShowPassword] = useState(false); + const [loading, setLoading] = useState(false); + const [error, setError] = useState(null); + + const handleLogin = async () => { + if (!email.trim() || !password) { + setError(t.errFillAllFields); + return; + } + setLoading(true); + setError(null); + try { + const session = await AuthService.login(email, password); + await hydrateSession(session); + router.replace('/(tabs)'); + } catch (e: any) { + if (e.message === 'USER_NOT_FOUND') { + setError(t.errUserNotFound); + } else if (e.message === 'WRONG_PASSWORD') { + setError(t.errWrongPassword); + } else if (e.message === 'BACKEND_URL_MISSING') { + setError(t.errNetworkError); + } else if (e.message === 'NETWORK_ERROR') { + setError(t.errNetworkError); + } else { + setError(t.errLoginFailed); + } + } finally { + setLoading(false); + } + }; + + return ( + + + + {/* Logo / Header */} + + + GreenLens + + {t.welcomeBack} + + + + {/* Card */} + + {/* Email */} + + E-Mail + + + + + + + {/* Password */} + + {t.passwordLabel} + + + + setShowPassword((v) => !v)} style={styles.eyeBtn}> + + + + + + {/* Error */} + {error && ( + + + {error} + + )} + + {/* Login Button */} + + {loading ? ( + + ) : ( + {t.onboardingLogin} + )} + + + + {/* Divider */} + + + {t.orDivider} + + + + {/* Sign Up Link */} + router.replace('/auth/signup')} + activeOpacity={0.82} + > + + {t.noAccountYet}{' '} + {t.onboardingRegister} + + + + + ); +} + +const styles = StyleSheet.create({ + flex: { flex: 1 }, + scroll: { + flexGrow: 1, + justifyContent: 'center', + paddingHorizontal: 24, + paddingVertical: 48, + }, + header: { + alignItems: 'center', + marginBottom: 32, + }, + logoIcon: { + width: 56, + height: 56, + borderRadius: 14, + marginBottom: 16, + }, + appName: { + fontSize: 30, + fontWeight: '700', + letterSpacing: -0.5, + marginBottom: 6, + }, + subtitle: { + fontSize: 15, + fontWeight: '400', + }, + card: { + borderRadius: 20, + borderWidth: 1, + padding: 24, + gap: 16, + shadowOffset: { width: 0, height: 4 }, + shadowOpacity: 1, + shadowRadius: 12, + elevation: 4, + }, + fieldGroup: { + gap: 6, + }, + label: { + fontSize: 13, + fontWeight: '500', + marginLeft: 2, + }, + inputRow: { + flexDirection: 'row', + alignItems: 'center', + borderWidth: 1, + borderRadius: 12, + paddingHorizontal: 14, + height: 50, + }, + inputIcon: { + marginRight: 10, + }, + input: { + flex: 1, + fontSize: 15, + height: 50, + }, + eyeBtn: { + padding: 4, + marginLeft: 6, + }, + errorBox: { + flexDirection: 'row', + alignItems: 'center', + gap: 6, + borderRadius: 10, + paddingHorizontal: 12, + paddingVertical: 10, + }, + errorText: { + fontSize: 13, + flex: 1, + }, + primaryBtn: { + height: 52, + borderRadius: 14, + justifyContent: 'center', + alignItems: 'center', + marginTop: 4, + }, + primaryBtnText: { + fontSize: 16, + fontWeight: '600', + }, + dividerRow: { + flexDirection: 'row', + alignItems: 'center', + marginVertical: 20, + gap: 12, + }, + dividerLine: { + flex: 1, + height: 1, + }, + dividerText: { + fontSize: 13, + }, + secondaryBtn: { + height: 52, + borderRadius: 14, + borderWidth: 1, + justifyContent: 'center', + alignItems: 'center', + }, + secondaryBtnText: { + fontSize: 15, + }, +}); diff --git a/app/auth/signup.tsx b/app/auth/signup.tsx index 4c144e5..e3ce556 100644 --- a/app/auth/signup.tsx +++ b/app/auth/signup.tsx @@ -1,420 +1,420 @@ -import React, { useState } from 'react'; -import { - View, - Text, - TextInput, - TouchableOpacity, - StyleSheet, - KeyboardAvoidingView, - Platform, - ActivityIndicator, - ScrollView, - Image, -} from 'react-native'; -import { Ionicons } from '@expo/vector-icons'; -import { router } from 'expo-router'; -import { useApp } from '../../context/AppContext'; -import { useColors } from '../../constants/Colors'; -import { ThemeBackdrop } from '../../components/ThemeBackdrop'; -import { AuthService } from '../../services/authService'; -import AsyncStorage from '@react-native-async-storage/async-storage'; - -export default function SignupScreen() { - const { isDarkMode, colorPalette, hydrateSession, getPendingPlant } = useApp(); - const colors = useColors(isDarkMode, colorPalette); - const pendingPlant = getPendingPlant(); - - const [name, setName] = useState(''); - const [email, setEmail] = useState(''); - const [password, setPassword] = useState(''); - const [passwordConfirm, setPasswordConfirm] = useState(''); - const [showPassword, setShowPassword] = useState(false); - const [showPasswordConfirm, setShowPasswordConfirm] = useState(false); - const [loading, setLoading] = useState(false); - const [error, setError] = useState(null); - - const validate = (): string | null => { - if (!name.trim()) return 'Bitte gib deinen Namen ein.'; - if (!email.trim() || !email.includes('@')) return 'Bitte gib eine gültige E-Mail ein.'; - if (password.length < 6) return 'Das Passwort muss mindestens 6 Zeichen haben.'; - if (password !== passwordConfirm) return 'Die Passwörter stimmen nicht überein.'; - return null; - }; - - const handleSignup = async () => { - const validationError = validate(); - if (validationError) { - setError(validationError); - return; - } - setLoading(true); - setError(null); - try { - const session = await AuthService.signUp(email, name, password); - await hydrateSession(session); - // Flag setzen: Tour beim nächsten App-Öffnen anzeigen - await AsyncStorage.setItem('greenlens_show_tour', 'true'); - router.replace('/(tabs)'); - } catch (e: any) { - if (e.message === 'EMAIL_TAKEN') { - setError('Diese E-Mail ist bereits registriert.'); - } else if (e.message === 'BACKEND_URL_MISSING') { - setError('Backend-URL fehlt. Bitte EXPO_PUBLIC_BACKEND_URL konfigurieren.'); - } else if (e.message === 'NETWORK_ERROR') { - setError('Server nicht erreichbar. Bitte versuche es erneut.'); - } else if (e.message === 'SERVER_ERROR') { - setError('Server-Fehler. Bitte versuche es später erneut.'); - } else if (e.message === 'AUTH_ERROR') { - setError('Registrierung fehlgeschlagen. Bitte versuche es erneut.'); - } else { - setError(`Fehler (${e.message}). Bitte versuche es erneut.`); - } - } finally { - setLoading(false); - } - }; - - return ( - - - - {/* Header */} - - router.back()} - > - - - - GreenLens - - Konto erstellen - - - - {/* Pending Plant Hint */} - {pendingPlant && ( - - - - Deine gescannte Pflanze ({pendingPlant.result.name}) wird nach der Registrierung automatisch in deinem Profil gespeichert. - - - )} - - {/* Card */} - - {/* Name */} - - Name - - - - - - - {/* Email */} - - E-Mail - - - - - - - {/* Password */} - - Passwort - - - - setShowPassword((v) => !v)} style={styles.eyeBtn}> - - - - - - {/* Password Confirm */} - - Passwort bestätigen - - - - setShowPasswordConfirm((v) => !v)} style={styles.eyeBtn}> - - - - - - {/* Password strength hint */} - {password.length > 0 && ( - - {[1, 2, 3, 4].map((level) => ( - = level * 3 - ? level <= 1 - ? colors.danger - : level === 2 - ? colors.warning - : colors.success - : colors.border, - }, - ]} - /> - ))} - - {password.length < 4 - ? 'Zu kurz' - : password.length < 7 - ? 'Schwach' - : password.length < 10 - ? 'Mittel' - : 'Stark'} - - - )} - - {/* Error */} - {error && ( - - - {error} - - )} - - {/* Signup Button */} - - {loading ? ( - - ) : ( - Registrieren - )} - - - - {/* Login link */} - router.replace('/auth/login')}> - - Bereits ein Konto?{' '} - Anmelden - - - - - ); -} - -const styles = StyleSheet.create({ - flex: { flex: 1 }, - scroll: { - flexGrow: 1, - justifyContent: 'center', - paddingHorizontal: 24, - paddingVertical: 48, - }, - header: { - alignItems: 'center', - marginBottom: 32, - }, - backBtn: { - position: 'absolute', - left: 0, - top: 0, - width: 40, - height: 40, - borderRadius: 20, - borderWidth: 1, - justifyContent: 'center', - alignItems: 'center', - }, - logoIcon: { - width: 56, - height: 56, - borderRadius: 14, - marginBottom: 16, - }, - appName: { - fontSize: 30, - fontWeight: '700', - letterSpacing: -0.5, - marginBottom: 6, - }, - subtitle: { - fontSize: 15, - fontWeight: '400', - }, - card: { - borderRadius: 20, - borderWidth: 1, - padding: 24, - gap: 14, - shadowOffset: { width: 0, height: 4 }, - shadowOpacity: 1, - shadowRadius: 12, - elevation: 4, - }, - fieldGroup: { - gap: 6, - }, - label: { - fontSize: 13, - fontWeight: '500', - marginLeft: 2, - }, - inputRow: { - flexDirection: 'row', - alignItems: 'center', - borderWidth: 1, - borderRadius: 12, - paddingHorizontal: 14, - height: 50, - }, - inputIcon: { - marginRight: 10, - }, - input: { - flex: 1, - fontSize: 15, - height: 50, - }, - eyeBtn: { - padding: 4, - marginLeft: 6, - }, - strengthRow: { - flexDirection: 'row', - alignItems: 'center', - gap: 4, - marginTop: -4, - }, - strengthBar: { - flex: 1, - height: 3, - borderRadius: 2, - }, - strengthText: { - fontSize: 11, - marginLeft: 4, - width: 40, - }, - errorBox: { - flexDirection: 'row', - alignItems: 'center', - gap: 6, - borderRadius: 10, - paddingHorizontal: 12, - paddingVertical: 10, - }, - errorText: { - fontSize: 13, - flex: 1, - }, - primaryBtn: { - height: 52, - borderRadius: 14, - justifyContent: 'center', - alignItems: 'center', - marginTop: 4, - }, - primaryBtnText: { - fontSize: 16, - fontWeight: '600', - }, - loginLink: { - alignItems: 'center', - marginTop: 24, - paddingVertical: 8, - }, - loginLinkText: { - fontSize: 15, - }, - pendingHint: { - flexDirection: 'row', - alignItems: 'center', - padding: 16, - borderRadius: 16, - borderWidth: 1, - marginBottom: 20, - gap: 12, - }, - pendingHintText: { - flex: 1, - fontSize: 13, - fontWeight: '600', - lineHeight: 18, - }, -}); +import React, { useState } from 'react'; +import { + View, + Text, + TextInput, + TouchableOpacity, + StyleSheet, + KeyboardAvoidingView, + Platform, + ActivityIndicator, + ScrollView, + Image, +} from 'react-native'; +import { Ionicons } from '@expo/vector-icons'; +import { router } from 'expo-router'; +import { useApp } from '../../context/AppContext'; +import { useColors } from '../../constants/Colors'; +import { ThemeBackdrop } from '../../components/ThemeBackdrop'; +import { AuthService } from '../../services/authService'; +import AsyncStorage from '@react-native-async-storage/async-storage'; + +export default function SignupScreen() { + const { isDarkMode, colorPalette, hydrateSession, getPendingPlant, t } = useApp(); + const colors = useColors(isDarkMode, colorPalette); + const pendingPlant = getPendingPlant(); + + const [name, setName] = useState(''); + const [email, setEmail] = useState(''); + const [password, setPassword] = useState(''); + const [passwordConfirm, setPasswordConfirm] = useState(''); + const [showPassword, setShowPassword] = useState(false); + const [showPasswordConfirm, setShowPasswordConfirm] = useState(false); + const [loading, setLoading] = useState(false); + const [error, setError] = useState(null); + + const validate = (): string | null => { + if (!name.trim()) return t.errNameRequired; + if (!email.trim() || !email.includes('@')) return t.errEmailInvalid; + if (password.length < 6) return t.errPasswordShort; + if (password !== passwordConfirm) return t.errPasswordMismatch; + return null; + }; + + const handleSignup = async () => { + const validationError = validate(); + if (validationError) { + setError(validationError); + return; + } + setLoading(true); + setError(null); + try { + const session = await AuthService.signUp(email, name, password); + await hydrateSession(session); + // Flag setzen: Tour beim nächsten App-Öffnen anzeigen + await AsyncStorage.setItem('greenlens_show_tour', 'true'); + router.replace('/(tabs)'); + } catch (e: any) { + if (e.message === 'EMAIL_TAKEN') { + setError(t.errEmailTaken); + } else if (e.message === 'BACKEND_URL_MISSING') { + setError(t.errNetworkError); + } else if (e.message === 'NETWORK_ERROR') { + setError(t.errNetworkError); + } else if (e.message === 'SERVER_ERROR') { + setError(t.errServerError); + } else if (e.message === 'AUTH_ERROR') { + setError(t.errAuthError); + } else { + setError(t.errAuthError); + } + } finally { + setLoading(false); + } + }; + + return ( + + + + {/* Header */} + + router.back()} + > + + + + GreenLens + + {t.createAccount} + + + + {/* Pending Plant Hint */} + {pendingPlant && ( + + + + {t.pendingPlantHint.replace('{0}', pendingPlant.result.name)} + + + )} + + {/* Card */} + + {/* Name */} + + Name + + + + + + + {/* Email */} + + E-Mail + + + + + + + {/* Password */} + + {t.passwordLabel} + + + + setShowPassword((v) => !v)} style={styles.eyeBtn}> + + + + + + {/* Password Confirm */} + + {t.confirmPasswordLabel} + + + + setShowPasswordConfirm((v) => !v)} style={styles.eyeBtn}> + + + + + + {/* Password strength hint */} + {password.length > 0 && ( + + {[1, 2, 3, 4].map((level) => ( + = level * 3 + ? level <= 1 + ? colors.danger + : level === 2 + ? colors.warning + : colors.success + : colors.border, + }, + ]} + /> + ))} + + {password.length < 4 + ? t.strengthTooShort + : password.length < 7 + ? t.strengthWeak + : password.length < 10 + ? t.strengthMedium + : t.strengthStrong} + + + )} + + {/* Error */} + {error && ( + + + {error} + + )} + + {/* Signup Button */} + + {loading ? ( + + ) : ( + {t.onboardingRegister} + )} + + + + {/* Login link */} + router.replace('/auth/login')}> + + {t.alreadyHaveAccount}{' '} + {t.onboardingLogin} + + + + + ); +} + +const styles = StyleSheet.create({ + flex: { flex: 1 }, + scroll: { + flexGrow: 1, + justifyContent: 'center', + paddingHorizontal: 24, + paddingVertical: 48, + }, + header: { + alignItems: 'center', + marginBottom: 32, + }, + backBtn: { + position: 'absolute', + left: 0, + top: 0, + width: 40, + height: 40, + borderRadius: 20, + borderWidth: 1, + justifyContent: 'center', + alignItems: 'center', + }, + logoIcon: { + width: 56, + height: 56, + borderRadius: 14, + marginBottom: 16, + }, + appName: { + fontSize: 30, + fontWeight: '700', + letterSpacing: -0.5, + marginBottom: 6, + }, + subtitle: { + fontSize: 15, + fontWeight: '400', + }, + card: { + borderRadius: 20, + borderWidth: 1, + padding: 24, + gap: 14, + shadowOffset: { width: 0, height: 4 }, + shadowOpacity: 1, + shadowRadius: 12, + elevation: 4, + }, + fieldGroup: { + gap: 6, + }, + label: { + fontSize: 13, + fontWeight: '500', + marginLeft: 2, + }, + inputRow: { + flexDirection: 'row', + alignItems: 'center', + borderWidth: 1, + borderRadius: 12, + paddingHorizontal: 14, + height: 50, + }, + inputIcon: { + marginRight: 10, + }, + input: { + flex: 1, + fontSize: 15, + height: 50, + }, + eyeBtn: { + padding: 4, + marginLeft: 6, + }, + strengthRow: { + flexDirection: 'row', + alignItems: 'center', + gap: 4, + marginTop: -4, + }, + strengthBar: { + flex: 1, + height: 3, + borderRadius: 2, + }, + strengthText: { + fontSize: 11, + marginLeft: 4, + width: 40, + }, + errorBox: { + flexDirection: 'row', + alignItems: 'center', + gap: 6, + borderRadius: 10, + paddingHorizontal: 12, + paddingVertical: 10, + }, + errorText: { + fontSize: 13, + flex: 1, + }, + primaryBtn: { + height: 52, + borderRadius: 14, + justifyContent: 'center', + alignItems: 'center', + marginTop: 4, + }, + primaryBtnText: { + fontSize: 16, + fontWeight: '600', + }, + loginLink: { + alignItems: 'center', + marginTop: 24, + paddingVertical: 8, + }, + loginLinkText: { + fontSize: 15, + }, + pendingHint: { + flexDirection: 'row', + alignItems: 'center', + padding: 16, + borderRadius: 16, + borderWidth: 1, + marginBottom: 20, + gap: 12, + }, + pendingHintText: { + flex: 1, + fontSize: 13, + fontWeight: '600', + lineHeight: 18, + }, +}); diff --git a/app/lexicon.tsx b/app/lexicon.tsx index 928580f..7aa1c36 100644 --- a/app/lexicon.tsx +++ b/app/lexicon.tsx @@ -1,451 +1,451 @@ -import React, { useState } from 'react'; -import { - View, Text, StyleSheet, TextInput, FlatList, TouchableOpacity, Platform, StatusBar, ScrollView, ActivityIndicator, -} from 'react-native'; -import { SafeAreaView, useSafeAreaInsets } from 'react-native-safe-area-context'; -import { useRouter, useLocalSearchParams } from 'expo-router'; -import { Ionicons } from '@expo/vector-icons'; -import { useApp } from '../context/AppContext'; -import { useColors } from '../constants/Colors'; -import { PlantDatabaseService } from '../services/plantDatabaseService'; -import { IdentificationResult } from '../types'; -import { DatabaseEntry } from '../services/plantDatabaseService'; -import { ResultCard } from '../components/ResultCard'; -import { ThemeBackdrop } from '../components/ThemeBackdrop'; -import { SafeImage } from '../components/SafeImage'; -import { resolveImageUri } from '../utils/imageUri'; - -export default function LexiconScreen() { - const { isDarkMode, colorPalette, language, t, savePlant, getLexiconSearchHistory, saveLexiconSearchQuery, clearLexiconSearchHistory } = useApp(); - const colors = useColors(isDarkMode, colorPalette); - const insets = useSafeAreaInsets(); - const router = useRouter(); - const params = useLocalSearchParams(); - const categoryIdParam = Array.isArray(params.categoryId) ? params.categoryId[0] : params.categoryId; - const categoryLabelParam = Array.isArray(params.categoryLabel) ? params.categoryLabel[0] : params.categoryLabel; - - const decodeParam = (value?: string | string[]) => { - if (!value || typeof value !== 'string') return ''; - try { - return decodeURIComponent(value); - } catch { - return value; - } - }; - - const initialCategoryId = typeof categoryIdParam === 'string' ? categoryIdParam : null; - const initialCategoryLabel = decodeParam(categoryLabelParam); - const topInsetFallback = Platform.OS === 'android' ? (StatusBar.currentHeight || 0) : 20; - const topInset = insets.top > 0 ? insets.top : topInsetFallback; - - const [searchQuery, setSearchQuery] = useState(initialCategoryLabel); - const [activeCategoryId, setActiveCategoryId] = useState(initialCategoryId); - const [selectedItem, setSelectedItem] = useState<(IdentificationResult & { imageUri: string }) | null>(null); - const [isAiSearching, setIsAiSearching] = useState(false); - const [aiResults, setAiResults] = useState(null); - const [searchErrorMessage, setSearchErrorMessage] = useState(null); - const [searchHistory, setSearchHistory] = useState([]); - - const detailParam = Array.isArray(params.detail) ? params.detail[0] : params.detail; - const openedWithDetail = Boolean(detailParam); - - React.useEffect(() => { - if (detailParam) { - try { - const rawParam = detailParam; - const decoded = decodeURIComponent(rawParam as string); - const detail = JSON.parse(decoded); - setSelectedItem(detail); - } catch (e) { - try { - const fallbackRaw = detailParam; - const detail = JSON.parse(fallbackRaw as string); - setSelectedItem(detail); - } catch (fallbackError) { - console.error('Failed to parse plant detail', fallbackError); - } - } - } - }, [detailParam]); - - React.useEffect(() => { - setActiveCategoryId(initialCategoryId); - setSearchQuery(initialCategoryLabel); - }, [initialCategoryId, initialCategoryLabel]); - - React.useEffect(() => { - const loadHistory = async () => { - const history = getLexiconSearchHistory(); - setSearchHistory(history); - }; - loadHistory(); - }, []); - - const handleResultClose = () => { - if (openedWithDetail) { - router.back(); - return; - } - setSelectedItem(null); - }; - - const normalizeText = (value: string): string => ( - value - .toLowerCase() - .normalize('NFD') - .replace(/[\u0300-\u036f]/g, '') - .trim() - .replace(/\s+/g, ' ') - ); - - const effectiveSearchQuery = searchQuery; - const [lexiconPlants, setLexiconPlants] = useState([]); - - React.useEffect(() => { - if (aiResults) { - setLexiconPlants(aiResults); - return; - } - - let isCancelled = false; - PlantDatabaseService.searchPlants(effectiveSearchQuery, language, { - category: activeCategoryId, - limit: 500, - }).then(results => { - if (!isCancelled) setLexiconPlants(results); - }).catch(console.error); - - return () => { - isCancelled = true; - }; - }, [aiResults, effectiveSearchQuery, language, activeCategoryId]); - - const handleAiSearch = async () => { - const query = searchQuery.trim(); - if (!query) return; - - setIsAiSearching(true); - setAiResults(null); - setSearchErrorMessage(null); - try { - const response = await PlantDatabaseService.semanticSearchDetailed(query, language); - - if (response.status === 'success') { - setAiResults(response.results); - saveLexiconSearchQuery(query); - setSearchHistory(getLexiconSearchHistory()); - } else if (response.status === 'insufficient_credits') { - setSearchErrorMessage((t as any).errorNoCredits || 'Nicht genügend Guthaben für KI-Suche.'); - } else if (response.status === 'no_results') { - setSearchErrorMessage((t as any).noResultsFound || 'Keine Ergebnisse gefunden.'); - setAiResults([]); - } else { - setSearchErrorMessage((t as any).errorTryAgain || 'Fehler bei der Suche. Bitte später erneut versuchen.'); - } - } catch (error) { - console.error('AI Search failed', error); - setSearchErrorMessage((t as any).errorGeneral || 'Etwas ist schiefgelaufen.'); - } finally { - setIsAiSearching(false); - } - }; - - const handleSearchSubmit = async () => { - const query = searchQuery.trim(); - if (!query) return; - - saveLexiconSearchQuery(query); - setSearchHistory(getLexiconSearchHistory()); - }; - - const handleHistorySelect = (query: string) => { - setActiveCategoryId(null); - setSearchQuery(query); - }; - - const handleClearHistory = () => { - clearLexiconSearchHistory(); - setSearchHistory([]); - }; - - const showSearchHistory = searchQuery.trim().length === 0 && !activeCategoryId && searchHistory.length > 0; - - if (selectedItem) { - return ( - { - savePlant(selectedItem, resolveImageUri(selectedItem.imageUri)); - router.back(); - }} - onClose={handleResultClose} - t={t} - isDark={isDarkMode} - colorPalette={colorPalette} - /> - ); - } - - return ( - - - - {/* Header */} - - router.back()} style={styles.backBtn}> - - - {t.lexiconTitle} - - - {/* Search */} - - - - - {(searchQuery || activeCategoryId) ? ( - { - setSearchQuery(''); - setActiveCategoryId(null); - setAiResults(null); - }} - hitSlop={8} - > - - - ) : null} - - - - {/* AI Search Trigger block removed */} - - {searchErrorMessage && ( - - - - {searchErrorMessage} - - - )} - - {aiResults && ( - - { - setAiResults(null); - setSearchErrorMessage(null); - }} - > - - - {(t as any).clearAiResults || 'KI-Ergebnisse löschen'} - - - - )} - - {showSearchHistory ? ( - - - {t.searchHistory} - - {t.clearHistory} - - - - - {searchHistory.map((item, index) => ( - handleHistorySelect(item)} - activeOpacity={0.8} - > - - - {item} - - - ))} - - - ) : null} - - {/* Grid */} - i.toString()} - contentContainerStyle={styles.grid} - columnWrapperStyle={styles.gridRow} - showsVerticalScrollIndicator={false} - initialNumToRender={12} - maxToRenderPerBatch={6} - windowSize={3} - ListEmptyComponent={ - - {t.noResults} - - } - renderItem={({ item }) => ( - setSelectedItem(item as any)} - > - - - - {item.name} - - - {item.botanicalName} - - - - )} - /> - - ); -} - -const styles = StyleSheet.create({ - container: { flex: 1, overflow: 'hidden' }, - header: { - flexDirection: 'row', - alignItems: 'center', - paddingHorizontal: 20, - paddingBottom: 16, - borderBottomWidth: 1, - gap: 14, - }, - backBtn: { marginLeft: -8, padding: 4 }, - title: { fontSize: 19, fontWeight: '700', letterSpacing: 0.2 }, - searchBar: { - flexDirection: 'row', - alignItems: 'center', - borderWidth: 1, - borderRadius: 16, - paddingHorizontal: 14, - paddingVertical: 10, - gap: 10, - shadowOffset: { width: 0, height: 2 }, - shadowOpacity: 0.14, - shadowRadius: 8, - elevation: 2, - }, - searchInput: { flex: 1, fontSize: 15 }, - historySection: { paddingHorizontal: 20, paddingTop: 12, paddingBottom: 8 }, - historyHeader: { - flexDirection: 'row', - justifyContent: 'space-between', - alignItems: 'center', - marginBottom: 8, - }, - historyTitle: { - fontSize: 11, - fontWeight: '700', - letterSpacing: 0.8, - textTransform: 'uppercase', - }, - clearHistoryText: { fontSize: 12, fontWeight: '700' }, - historyContent: { gap: 8, paddingRight: 20 }, - historyChip: { - flexDirection: 'row', - alignItems: 'center', - gap: 6, - borderWidth: 1, - borderRadius: 16, - paddingHorizontal: 10, - paddingVertical: 8, - }, - historyChipText: { fontSize: 12, fontWeight: '600' }, - grid: { padding: 20, paddingBottom: 40 }, - gridRow: { gap: 10, marginBottom: 10 }, - card: { - flex: 1, - borderRadius: 18, - borderWidth: 1, - overflow: 'hidden', - shadowOffset: { width: 0, height: 2 }, - shadowOpacity: 0.14, - shadowRadius: 6, - elevation: 2, - }, - cardImage: { width: '100%', aspectRatio: 1, resizeMode: 'cover' }, - cardContent: { padding: 8 }, - cardName: { fontSize: 12, fontWeight: '700' }, - cardBotanical: { fontSize: 9, fontStyle: 'italic' }, - empty: { paddingVertical: 40, alignItems: 'center' }, - aiSearchBtn: { - flexDirection: 'row', - alignItems: 'center', - justifyContent: 'center', - paddingVertical: 12, - paddingHorizontal: 16, - borderRadius: 14, - borderWidth: 1, - borderStyle: 'dashed', - gap: 10, - }, - aiSearchText: { - fontSize: 14, - fontWeight: '600', - }, - errorBox: { - flexDirection: 'row', - alignItems: 'center', - padding: 12, - borderRadius: 12, - gap: 10, - }, - errorText: { - fontSize: 14, - fontWeight: '500', - flex: 1, - }, - clearAiResultsBtn: { - flexDirection: 'row', - alignItems: 'center', - alignSelf: 'flex-start', - paddingVertical: 6, - paddingHorizontal: 12, - borderRadius: 20, - gap: 6, - }, -}); +import React, { useState } from 'react'; +import { + View, Text, StyleSheet, TextInput, FlatList, TouchableOpacity, Platform, StatusBar, ScrollView, ActivityIndicator, +} from 'react-native'; +import { SafeAreaView, useSafeAreaInsets } from 'react-native-safe-area-context'; +import { useRouter, useLocalSearchParams } from 'expo-router'; +import { Ionicons } from '@expo/vector-icons'; +import { useApp } from '../context/AppContext'; +import { useColors } from '../constants/Colors'; +import { PlantDatabaseService } from '../services/plantDatabaseService'; +import { IdentificationResult } from '../types'; +import { DatabaseEntry } from '../services/plantDatabaseService'; +import { ResultCard } from '../components/ResultCard'; +import { ThemeBackdrop } from '../components/ThemeBackdrop'; +import { SafeImage } from '../components/SafeImage'; +import { resolveImageUri } from '../utils/imageUri'; + +export default function LexiconScreen() { + const { isDarkMode, colorPalette, language, t, savePlant, getLexiconSearchHistory, saveLexiconSearchQuery, clearLexiconSearchHistory } = useApp(); + const colors = useColors(isDarkMode, colorPalette); + const insets = useSafeAreaInsets(); + const router = useRouter(); + const params = useLocalSearchParams(); + const categoryIdParam = Array.isArray(params.categoryId) ? params.categoryId[0] : params.categoryId; + const categoryLabelParam = Array.isArray(params.categoryLabel) ? params.categoryLabel[0] : params.categoryLabel; + + const decodeParam = (value?: string | string[]) => { + if (!value || typeof value !== 'string') return ''; + try { + return decodeURIComponent(value); + } catch { + return value; + } + }; + + const initialCategoryId = typeof categoryIdParam === 'string' ? categoryIdParam : null; + const initialCategoryLabel = decodeParam(categoryLabelParam); + const topInsetFallback = Platform.OS === 'android' ? (StatusBar.currentHeight || 0) : 20; + const topInset = insets.top > 0 ? insets.top : topInsetFallback; + + const [searchQuery, setSearchQuery] = useState(initialCategoryLabel); + const [activeCategoryId, setActiveCategoryId] = useState(initialCategoryId); + const [selectedItem, setSelectedItem] = useState<(IdentificationResult & { imageUri: string }) | null>(null); + const [isAiSearching, setIsAiSearching] = useState(false); + const [aiResults, setAiResults] = useState(null); + const [searchErrorMessage, setSearchErrorMessage] = useState(null); + const [searchHistory, setSearchHistory] = useState([]); + + const detailParam = Array.isArray(params.detail) ? params.detail[0] : params.detail; + const openedWithDetail = Boolean(detailParam); + + React.useEffect(() => { + if (detailParam) { + try { + const rawParam = detailParam; + const decoded = decodeURIComponent(rawParam as string); + const detail = JSON.parse(decoded); + setSelectedItem(detail); + } catch (e) { + try { + const fallbackRaw = detailParam; + const detail = JSON.parse(fallbackRaw as string); + setSelectedItem(detail); + } catch (fallbackError) { + console.error('Failed to parse plant detail', fallbackError); + } + } + } + }, [detailParam]); + + React.useEffect(() => { + setActiveCategoryId(initialCategoryId); + setSearchQuery(initialCategoryLabel); + }, [initialCategoryId, initialCategoryLabel]); + + React.useEffect(() => { + const loadHistory = async () => { + const history = getLexiconSearchHistory(); + setSearchHistory(history); + }; + loadHistory(); + }, []); + + const handleResultClose = () => { + if (openedWithDetail) { + router.back(); + return; + } + setSelectedItem(null); + }; + + const normalizeText = (value: string): string => ( + value + .toLowerCase() + .normalize('NFD') + .replace(/[\u0300-\u036f]/g, '') + .trim() + .replace(/\s+/g, ' ') + ); + + const effectiveSearchQuery = searchQuery; + const [lexiconPlants, setLexiconPlants] = useState([]); + + React.useEffect(() => { + if (aiResults) { + setLexiconPlants(aiResults); + return; + } + + let isCancelled = false; + PlantDatabaseService.searchPlants(effectiveSearchQuery, language, { + category: activeCategoryId, + limit: 500, + }).then(results => { + if (!isCancelled) setLexiconPlants(results); + }).catch(console.error); + + return () => { + isCancelled = true; + }; + }, [aiResults, effectiveSearchQuery, language, activeCategoryId]); + + const handleAiSearch = async () => { + const query = searchQuery.trim(); + if (!query) return; + + setIsAiSearching(true); + setAiResults(null); + setSearchErrorMessage(null); + try { + const response = await PlantDatabaseService.semanticSearchDetailed(query, language); + + if (response.status === 'success') { + setAiResults(response.results); + saveLexiconSearchQuery(query); + setSearchHistory(getLexiconSearchHistory()); + } else if (response.status === 'insufficient_credits') { + setSearchErrorMessage((t as any).errorNoCredits || 'Nicht genügend Guthaben für KI-Suche.'); + } else if (response.status === 'no_results') { + setSearchErrorMessage((t as any).noResultsFound || 'Keine Ergebnisse gefunden.'); + setAiResults([]); + } else { + setSearchErrorMessage((t as any).errorTryAgain || 'Fehler bei der Suche. Bitte später erneut versuchen.'); + } + } catch (error) { + console.error('AI Search failed', error); + setSearchErrorMessage((t as any).errorGeneral || 'Etwas ist schiefgelaufen.'); + } finally { + setIsAiSearching(false); + } + }; + + const handleSearchSubmit = async () => { + const query = searchQuery.trim(); + if (!query) return; + + saveLexiconSearchQuery(query); + setSearchHistory(getLexiconSearchHistory()); + }; + + const handleHistorySelect = (query: string) => { + setActiveCategoryId(null); + setSearchQuery(query); + }; + + const handleClearHistory = () => { + clearLexiconSearchHistory(); + setSearchHistory([]); + }; + + const showSearchHistory = searchQuery.trim().length === 0 && !activeCategoryId && searchHistory.length > 0; + + if (selectedItem) { + return ( + { + savePlant(selectedItem, resolveImageUri(selectedItem.imageUri)); + router.back(); + }} + onClose={handleResultClose} + t={t} + isDark={isDarkMode} + colorPalette={colorPalette} + /> + ); + } + + return ( + + + + {/* Header */} + + router.back()} style={styles.backBtn}> + + + {t.lexiconTitle} + + + {/* Search */} + + + + + {(searchQuery || activeCategoryId) ? ( + { + setSearchQuery(''); + setActiveCategoryId(null); + setAiResults(null); + }} + hitSlop={8} + > + + + ) : null} + + + + {/* AI Search Trigger block removed */} + + {searchErrorMessage && ( + + + + {searchErrorMessage} + + + )} + + {aiResults && ( + + { + setAiResults(null); + setSearchErrorMessage(null); + }} + > + + + {(t as any).clearAiResults || 'KI-Ergebnisse löschen'} + + + + )} + + {showSearchHistory ? ( + + + {t.searchHistory} + + {t.clearHistory} + + + + + {searchHistory.map((item, index) => ( + handleHistorySelect(item)} + activeOpacity={0.8} + > + + + {item} + + + ))} + + + ) : null} + + {/* Grid */} + i.toString()} + contentContainerStyle={styles.grid} + columnWrapperStyle={styles.gridRow} + showsVerticalScrollIndicator={false} + initialNumToRender={12} + maxToRenderPerBatch={6} + windowSize={3} + ListEmptyComponent={ + + {t.noResults} + + } + renderItem={({ item }) => ( + setSelectedItem(item as any)} + > + + + + {item.name} + + + {item.botanicalName} + + + + )} + /> + + ); +} + +const styles = StyleSheet.create({ + container: { flex: 1, overflow: 'hidden' }, + header: { + flexDirection: 'row', + alignItems: 'center', + paddingHorizontal: 20, + paddingBottom: 16, + borderBottomWidth: 1, + gap: 14, + }, + backBtn: { marginLeft: -8, padding: 4 }, + title: { fontSize: 19, fontWeight: '700', letterSpacing: 0.2 }, + searchBar: { + flexDirection: 'row', + alignItems: 'center', + borderWidth: 1, + borderRadius: 16, + paddingHorizontal: 14, + paddingVertical: 10, + gap: 10, + shadowOffset: { width: 0, height: 2 }, + shadowOpacity: 0.14, + shadowRadius: 8, + elevation: 2, + }, + searchInput: { flex: 1, fontSize: 15 }, + historySection: { paddingHorizontal: 20, paddingTop: 12, paddingBottom: 8 }, + historyHeader: { + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + marginBottom: 8, + }, + historyTitle: { + fontSize: 11, + fontWeight: '700', + letterSpacing: 0.8, + textTransform: 'uppercase', + }, + clearHistoryText: { fontSize: 12, fontWeight: '700' }, + historyContent: { gap: 8, paddingRight: 20 }, + historyChip: { + flexDirection: 'row', + alignItems: 'center', + gap: 6, + borderWidth: 1, + borderRadius: 16, + paddingHorizontal: 10, + paddingVertical: 8, + }, + historyChipText: { fontSize: 12, fontWeight: '600' }, + grid: { padding: 20, paddingBottom: 40 }, + gridRow: { gap: 10, marginBottom: 10 }, + card: { + flex: 1, + borderRadius: 18, + borderWidth: 1, + overflow: 'hidden', + shadowOffset: { width: 0, height: 2 }, + shadowOpacity: 0.14, + shadowRadius: 6, + elevation: 2, + }, + cardImage: { width: '100%', aspectRatio: 1, resizeMode: 'cover' }, + cardContent: { padding: 8 }, + cardName: { fontSize: 12, fontWeight: '700' }, + cardBotanical: { fontSize: 9, fontStyle: 'italic' }, + empty: { paddingVertical: 40, alignItems: 'center' }, + aiSearchBtn: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'center', + paddingVertical: 12, + paddingHorizontal: 16, + borderRadius: 14, + borderWidth: 1, + borderStyle: 'dashed', + gap: 10, + }, + aiSearchText: { + fontSize: 14, + fontWeight: '600', + }, + errorBox: { + flexDirection: 'row', + alignItems: 'center', + padding: 12, + borderRadius: 12, + gap: 10, + }, + errorText: { + fontSize: 14, + fontWeight: '500', + flex: 1, + }, + clearAiResultsBtn: { + flexDirection: 'row', + alignItems: 'center', + alignSelf: 'flex-start', + paddingVertical: 6, + paddingHorizontal: 12, + borderRadius: 20, + gap: 6, + }, +}); diff --git a/app/onboarding.tsx b/app/onboarding.tsx index fa9531d..3e966e3 100644 --- a/app/onboarding.tsx +++ b/app/onboarding.tsx @@ -1,254 +1,278 @@ -import React, { useEffect, useRef } from 'react'; -import { - View, - Text, - StyleSheet, - TouchableOpacity, - Animated, - Dimensions, - Image, -} from 'react-native'; -import { Ionicons } from '@expo/vector-icons'; -import { router } from 'expo-router'; -import { useApp } from '../context/AppContext'; -import { useColors } from '../constants/Colors'; -import { ThemeBackdrop } from '../components/ThemeBackdrop'; - -const { height: SCREEN_H, width: SCREEN_W } = Dimensions.get('window'); - -export default function OnboardingScreen() { - const { isDarkMode, colorPalette, t } = useApp(); - const colors = useColors(isDarkMode, colorPalette); - - const FEATURES = [ - { icon: 'camera-outline' as const, label: t.onboardingFeatureScan }, - { icon: 'notifications-outline' as const, label: t.onboardingFeatureReminder }, - { icon: 'book-outline' as const, label: t.onboardingFeatureLexicon }, - ]; - - // Entrance animations - const logoAnim = useRef(new Animated.Value(0)).current; - const logoScale = useRef(new Animated.Value(0.85)).current; - const featuresAnim = useRef(new Animated.Value(0)).current; - const buttonsAnim = useRef(new Animated.Value(0)).current; - const featureAnims = useRef(FEATURES.map(() => new Animated.Value(0))).current; - - useEffect(() => { - Animated.sequence([ - Animated.parallel([ - Animated.timing(logoAnim, { toValue: 1, duration: 700, useNativeDriver: true }), - Animated.spring(logoScale, { toValue: 1, tension: 50, friction: 8, useNativeDriver: true }), - ]), - Animated.stagger(100, featureAnims.map(anim => - Animated.timing(anim, { toValue: 1, duration: 400, useNativeDriver: true }) - )), - Animated.timing(buttonsAnim, { toValue: 1, duration: 400, useNativeDriver: true }), - ]).start(); - }, []); - - return ( - - - - {/* Logo-Bereich */} - - - - - - GreenLens - - {t.onboardingTagline} - - - - {/* Feature-Liste */} - - {FEATURES.map((feat, i) => ( - - - - - {feat.label} - - ))} - - - {/* Buttons */} - - router.push('/scanner')} - activeOpacity={0.85} - > - - - {t.onboardingScanBtn} - - - - - router.push('/auth/signup')} - activeOpacity={0.82} - > - - {t.onboardingRegister} - - - - router.push('/auth/login')} - activeOpacity={0.82} - > - - {t.onboardingLogin} - - - - - - {t.onboardingDisclaimer} - - - - ); -} - -const styles = StyleSheet.create({ - container: { - flex: 1, - paddingHorizontal: 32, - paddingTop: SCREEN_H * 0.12, - paddingBottom: 40, - }, - heroSection: { - alignItems: 'center', - marginBottom: 40, - }, - iconContainer: { - width: 120, - height: 120, - borderRadius: 28, - backgroundColor: '#fff', - elevation: 8, - shadowOffset: { width: 0, height: 4 }, - shadowOpacity: 0.15, - shadowRadius: 12, - marginBottom: 24, - overflow: 'hidden', - }, - appIcon: { - width: '100%', - height: '100%', - }, - appName: { - fontSize: 40, - fontWeight: '900', - letterSpacing: -1.5, - marginBottom: 4, - }, - tagline: { - fontSize: 17, - fontWeight: '500', - opacity: 0.8, - }, - featuresSection: { - gap: 12, - flex: 1, - justifyContent: 'center', - }, - featureRow: { - flexDirection: 'row', - alignItems: 'center', - gap: 16, - paddingHorizontal: 20, - paddingVertical: 16, - borderRadius: 20, - borderWidth: 1, - }, - featureIcon: { - width: 44, - height: 44, - borderRadius: 14, - justifyContent: 'center', - alignItems: 'center', - }, - featureText: { - flex: 1, - fontSize: 15, - fontWeight: '600', - letterSpacing: 0.1, - }, - buttonsSection: { - gap: 16, - marginTop: 20, - }, - primaryBtn: { - height: 58, - borderRadius: 20, - flexDirection: 'row', - justifyContent: 'center', - alignItems: 'center', - gap: 12, - elevation: 4, - shadowColor: '#000', - shadowOffset: { width: 0, height: 2 }, - shadowOpacity: 0.1, - shadowRadius: 4, - }, - primaryBtnText: { - fontSize: 17, - fontWeight: '700', - }, - authActions: { - flexDirection: 'row', - gap: 12, - }, - secondaryBtn: { - flex: 1, - height: 54, - borderRadius: 20, - borderWidth: 1.5, - justifyContent: 'center', - alignItems: 'center', - }, - secondaryBtnText: { - fontSize: 15, - fontWeight: '600', - }, - disclaimer: { - fontSize: 12, - textAlign: 'center', - opacity: 0.6, - marginTop: 8, - }, -}); - +import React, { useEffect, useRef } from 'react'; +import { + View, + Text, + StyleSheet, + TouchableOpacity, + Animated, + Dimensions, + Image, +} from 'react-native'; +import { Ionicons } from '@expo/vector-icons'; +import { router } from 'expo-router'; +import { useApp } from '../context/AppContext'; +import { useColors } from '../constants/Colors'; +import { ThemeBackdrop } from '../components/ThemeBackdrop'; + +const { height: SCREEN_H, width: SCREEN_W } = Dimensions.get('window'); + +export default function OnboardingScreen() { + const { isDarkMode, colorPalette, t } = useApp(); + const colors = useColors(isDarkMode, colorPalette); + + const FEATURES = [ + { icon: 'camera-outline' as const, label: t.onboardingFeatureScan }, + { icon: 'notifications-outline' as const, label: t.onboardingFeatureReminder }, + { icon: 'book-outline' as const, label: t.onboardingFeatureLexicon }, + ]; + + // Entrance animations + const logoAnim = useRef(new Animated.Value(0)).current; + const logoScale = useRef(new Animated.Value(0.85)).current; + const featuresAnim = useRef(new Animated.Value(0)).current; + const buttonsAnim = useRef(new Animated.Value(0)).current; + const featureAnims = useRef(FEATURES.map(() => new Animated.Value(0))).current; + + useEffect(() => { + Animated.sequence([ + Animated.parallel([ + Animated.timing(logoAnim, { toValue: 1, duration: 700, useNativeDriver: true }), + Animated.spring(logoScale, { toValue: 1, tension: 50, friction: 8, useNativeDriver: true }), + ]), + Animated.stagger(100, featureAnims.map(anim => + Animated.timing(anim, { toValue: 1, duration: 400, useNativeDriver: true }) + )), + Animated.timing(buttonsAnim, { toValue: 1, duration: 400, useNativeDriver: true }), + ]).start(); + }, []); + + return ( + + + + {/* Logo-Bereich */} + + + + + + GreenLens + + {t.onboardingTagline} + + + + {/* Feature-Liste */} + + {FEATURES.map((feat, i) => ( + + + + + {feat.label} + + ))} + + + {/* Buttons */} + + router.push('/scanner')} + activeOpacity={0.85} + > + + + {t.onboardingScanBtn} + + + + + router.push('/auth/signup')} + activeOpacity={0.82} + > + + {t.onboardingRegister} + + + + router.push('/auth/login')} + activeOpacity={0.82} + > + + {t.onboardingLogin} + + + + + router.push('/profile/billing')} + activeOpacity={0.82} + > + + + View Subscription Plans & Pricing + + + + + {t.onboardingDisclaimer} + + + + ); +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + paddingHorizontal: 32, + paddingTop: SCREEN_H * 0.12, + paddingBottom: 40, + }, + heroSection: { + alignItems: 'center', + marginBottom: 40, + }, + iconContainer: { + width: 120, + height: 120, + borderRadius: 28, + backgroundColor: '#fff', + elevation: 8, + shadowOffset: { width: 0, height: 4 }, + shadowOpacity: 0.15, + shadowRadius: 12, + marginBottom: 24, + overflow: 'hidden', + }, + appIcon: { + width: '100%', + height: '100%', + }, + appName: { + fontSize: 40, + fontWeight: '900', + letterSpacing: -1.5, + marginBottom: 4, + }, + tagline: { + fontSize: 17, + fontWeight: '500', + opacity: 0.8, + }, + featuresSection: { + gap: 8, + flex: 1, + justifyContent: 'center', + }, + featureRow: { + flexDirection: 'row', + alignItems: 'center', + gap: 12, + paddingHorizontal: 16, + paddingVertical: 10, + borderRadius: 16, + borderWidth: 1, + }, + featureIcon: { + width: 36, + height: 36, + borderRadius: 10, + justifyContent: 'center', + alignItems: 'center', + }, + featureText: { + flex: 1, + fontSize: 13, + fontWeight: '600', + letterSpacing: 0.1, + }, + buttonsSection: { + gap: 16, + marginTop: 20, + }, + primaryBtn: { + height: 58, + borderRadius: 20, + flexDirection: 'row', + justifyContent: 'center', + alignItems: 'center', + gap: 12, + elevation: 4, + shadowColor: '#000', + shadowOffset: { width: 0, height: 2 }, + shadowOpacity: 0.1, + shadowRadius: 4, + }, + primaryBtnText: { + fontSize: 17, + fontWeight: '700', + }, + authActions: { + flexDirection: 'row', + gap: 12, + }, + secondaryBtn: { + flex: 1, + height: 54, + borderRadius: 20, + borderWidth: 1.5, + justifyContent: 'center', + alignItems: 'center', + }, + secondaryBtnText: { + fontSize: 15, + fontWeight: '600', + }, + plansBtn: { + height: 48, + borderRadius: 16, + borderWidth: 1.5, + flexDirection: 'row', + justifyContent: 'center', + alignItems: 'center', + gap: 8, + }, + plansBtnText: { + fontSize: 14, + fontWeight: '600', + }, + disclaimer: { + fontSize: 12, + textAlign: 'center', + opacity: 0.6, + marginTop: 8, + }, +}); + diff --git a/app/plant/[id].tsx b/app/plant/[id].tsx index 7baa340..d9171c5 100644 --- a/app/plant/[id].tsx +++ b/app/plant/[id].tsx @@ -1,1443 +1,1443 @@ -import React, { useMemo, useState } from 'react'; -import { - View, - Text, - StyleSheet, - ScrollView, - TouchableOpacity, - Modal, - Alert, - Share, -} from 'react-native'; -import { useLocalSearchParams, useRouter } from 'expo-router'; -import { Ionicons } from '@expo/vector-icons'; -import * as Haptics from 'expo-haptics'; -import * as ImagePicker from 'expo-image-picker'; -import { useApp } from '../../context/AppContext'; -import { useColors } from '../../constants/Colors'; -import { requestPermissions, scheduleWateringReminder, cancelReminder } from '../../services/notificationService'; -import { SafeImage } from '../../components/SafeImage'; - -const parseColorToRgb = (input: string) => { - const color = input.trim(); - if (color.startsWith('#')) { - const hex = color.slice(1); - const normalized = hex.length === 3 - ? hex.split('').map((char) => `${char}${char}`).join('') - : hex; - if (normalized.length === 6) { - return { - r: Number.parseInt(normalized.slice(0, 2), 16), - g: Number.parseInt(normalized.slice(2, 4), 16), - b: Number.parseInt(normalized.slice(4, 6), 16), - }; - } - } - - const rgbMatch = color.match(/rgba?\((\d+),\s*(\d+),\s*(\d+)/i); - if (rgbMatch) { - return { - r: Number.parseInt(rgbMatch[1], 10), - g: Number.parseInt(rgbMatch[2], 10), - b: Number.parseInt(rgbMatch[3], 10), - }; - } - - return { r: 127, g: 127, b: 127 }; -}; - -const getReadableTextColor = (background: string, dark: string, light: string) => { - const { r, g, b } = parseColorToRgb(background); - const luminance = (0.2126 * r + 0.7152 * g + 0.0722 * b) / 255; - return luminance > 0.58 ? dark : light; -}; - -const HEALTH_CHECK_CREDIT_COST = 2; - -const getHealthCopy = (language: 'de' | 'en' | 'es') => { - if (language === 'de') { - return { - title: 'Health Check', - action: 'Neues Foto + Health-Check', - running: 'Neues Foto wird analysiert...', - cost: `Kosten: ${HEALTH_CHECK_CREDIT_COST} Credits`, - creditsLabel: 'Credits', - managePlan: 'Plan verwalten', - noCreditsTitle: 'Nicht genug Credits', - noCreditsMessage: `Du brauchst ${HEALTH_CHECK_CREDIT_COST} Credits fuer den Health-Check.`, - insufficientInline: 'Nicht genug Credits fuer den Health-Check.', - timeoutInline: 'Health-Check Timeout. Bitte erneut versuchen.', - providerInline: 'Health-Check ist gerade nicht verfuegbar.', - issuesTitle: 'Moegliche Ursachen', - actionsTitle: 'Sofortmassnahmen', - planTitle: '7-Tage-Plan', - scoreLabel: 'Gesundheits-Score', - healthy: 'Stabil', - watch: 'Beobachten', - critical: 'Kritisch', - lastCheck: 'Zuletzt geprueft', - }; - } - - if (language === 'es') { - return { - title: 'Health Check', - action: 'Foto nuevo + Health-check', - running: 'Analizando foto nueva...', - cost: `Costo: ${HEALTH_CHECK_CREDIT_COST} creditos`, - creditsLabel: 'Creditos', - managePlan: 'Gestionar plan', - noCreditsTitle: 'Creditos insuficientes', - noCreditsMessage: `Necesitas ${HEALTH_CHECK_CREDIT_COST} creditos para el health-check.`, - insufficientInline: 'No hay creditos suficientes para el health-check.', - timeoutInline: 'Health-check agotado por tiempo. Intenta de nuevo.', - providerInline: 'Health-check no disponible ahora.', - issuesTitle: 'Posibles causas', - actionsTitle: 'Acciones inmediatas', - planTitle: 'Plan de 7 dias', - scoreLabel: 'Puntaje de salud', - healthy: 'Estable', - watch: 'Observar', - critical: 'Critico', - lastCheck: 'Ultima revision', - }; - } - - return { - title: 'Health Check', - action: 'New Photo + Health Check', - running: 'Analyzing new photo...', - cost: `Cost: ${HEALTH_CHECK_CREDIT_COST} credits`, - creditsLabel: 'Credits', - managePlan: 'Manage plan', - noCreditsTitle: 'Not enough credits', - noCreditsMessage: `You need ${HEALTH_CHECK_CREDIT_COST} credits for the health check.`, - insufficientInline: 'Not enough credits for the health check.', - timeoutInline: 'Health check timed out. Please try again.', - providerInline: 'Health check is unavailable right now.', - issuesTitle: 'Likely issues', - actionsTitle: 'Actions now', - planTitle: '7-day plan', - scoreLabel: 'Health score', - healthy: 'Stable', - watch: 'Watch', - critical: 'Critical', - lastCheck: 'Last checked', - }; -}; - -export default function PlantDetailScreen() { - const { id } = useLocalSearchParams<{ id: string }>(); - const { - plants, - isDarkMode, - colorPalette, - language, - t, - deletePlant, - updatePlant, - billingSummary, - } = useApp(); - const colors = useColors(isDarkMode, colorPalette); - const router = useRouter(); - const [showDeleteConfirm, setShowDeleteConfirm] = useState(false); - const [fullscreenImage, setFullscreenImage] = useState(null); - const [healthStatus, setHealthStatus] = useState<'idle' | 'insufficient_credits'>('idle'); - const [paywallVisible, setPaywallVisible] = useState(false); - - const plant = plants.find((item) => item.id === id); - if (!plant) { - return ( - - Plant not found - - ); - } - - const localeMap: Record = { de: 'de-DE', en: 'en-US', es: 'es-ES' }; - const locale = localeMap[language] || 'de-DE'; - const healthCopy = getHealthCopy(language); - const availableCredits = billingSummary?.credits.available ?? 0; - - const formattedWateredDate = new Date(plant.lastWatered).toLocaleDateString(locale); - - const lastWateredObj = new Date(plant.lastWatered); - const nextWateringDate = new Date(lastWateredObj); - nextWateringDate.setDate(lastWateredObj.getDate() + plant.careInfo.waterIntervalDays); - const formattedNextWatering = nextWateringDate.toLocaleDateString(locale, { - weekday: 'short', - day: 'numeric', - month: 'short', - }); - - const lastWateredText = t.lastWateredDate.replace('{0}', formattedWateredDate); - const isWateredToday = new Date(plant.lastWatered).toDateString() === new Date().toDateString(); - const daysSinceWatered = Math.max( - 0, - Math.floor((Date.now() - lastWateredObj.getTime()) / (1000 * 60 * 60 * 24)) - ); - - const nextWaterLabel = language === 'de' - ? 'Nächstes Gießen' - : language === 'es' - ? 'Proximo riego' - : 'Next water'; - - const wateredAgoText = language === 'de' - ? `Zuletzt vor ${daysSinceWatered} ${daysSinceWatered === 1 ? 'Tag' : 'Tagen'}` - : language === 'es' - ? `Ultimo riego hace ${daysSinceWatered} ${daysSinceWatered === 1 ? 'dia' : 'dias'}` - : `Last watered ${daysSinceWatered} ${daysSinceWatered === 1 ? 'day' : 'days'} ago`; - - const textOnPage = getReadableTextColor(colors.pageBase, colors.primaryDark, colors.textOnImage); - const textOnSurface = getReadableTextColor(colors.surface, colors.primaryDark, colors.textOnImage); - const textOnHeroButton = getReadableTextColor(colors.heroButton, colors.primaryDark, colors.textOnImage); - const textOnPrimaryAction = getReadableTextColor(colors.primaryDark, '#ffffff', '#111111'); - const textOnAiBadge = getReadableTextColor(colors.primarySoft, colors.primaryDark, colors.textOnImage); - const latestHealthCheck = useMemo(() => { - if (!plant.healthChecks || plant.healthChecks.length === 0) return null; - return plant.healthChecks[0]; - }, [plant.healthChecks]); - const healthStatusInlineText = (() => { - if (healthStatus === 'insufficient_credits') return healthCopy.insufficientInline; - if (healthStatus === 'idle' && availableCredits < HEALTH_CHECK_CREDIT_COST) return healthCopy.insufficientInline; - return ''; - })(); - const healthStateColor = (() => { - if (healthStatus === 'insufficient_credits') return colors.warning; - return colors.textMuted; - })(); - const latestStatusText = latestHealthCheck - ? ( - latestHealthCheck.status === 'healthy' - ? healthCopy.healthy - : latestHealthCheck.status === 'watch' - ? healthCopy.watch - : healthCopy.critical - ) - : ''; - const latestStatusBg = latestHealthCheck - ? ( - latestHealthCheck.status === 'healthy' - ? colors.successSoft - : latestHealthCheck.status === 'watch' - ? colors.warningSoft - : colors.dangerSoft - ) - : colors.surfaceMuted; - const latestStatusColor = latestHealthCheck - ? ( - latestHealthCheck.status === 'healthy' - ? colors.success - : latestHealthCheck.status === 'watch' - ? colors.warning - : colors.danger - ) - : colors.textMuted; - - const timelineEntries = useMemo(() => { - const history = plant.wateringHistory && plant.wateringHistory.length > 0 - ? plant.wateringHistory - : [plant.lastWatered]; - return history.slice(0, 5); - }, [plant.lastWatered, plant.wateringHistory]); - const hasEnoughHealthCredits = availableCredits >= HEALTH_CHECK_CREDIT_COST; - const canRunHealthCheck = true; - - const handleWater = async () => { - await Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Medium); - const now = new Date().toISOString(); - const currentHistory = plant.wateringHistory || []; - const newHistory = [now, ...currentHistory].slice(0, 10); - updatePlant({ ...plant, lastWatered: now, wateringHistory: newHistory }); - }; - - const handleShare = async () => { - try { - await Share.share({ - message: `Check out my plant: ${plant.name} (${plant.botanicalName}) - identified with GreenLens!`, - }); - } catch (error: any) { - Alert.alert('Error', error.message); - } - }; - - const handleDelete = () => { - deletePlant(plant.id); - router.back(); - }; - - const handleAddPhoto = async () => { - const result = await ImagePicker.launchImageLibraryAsync({ - mediaTypes: ['images'], - quality: 0.8, - }); - - if (!result.canceled && result.assets[0]) { - const currentGallery = plant.gallery || []; - updatePlant({ ...plant, gallery: [...currentGallery, result.assets[0].uri] }); - } - }; - - const handleHealthCheck = async () => { - if (availableCredits < HEALTH_CHECK_CREDIT_COST) { - setPaywallVisible(true); - return; - } - - if (healthStatus !== 'idle') { - setHealthStatus('idle'); - } - - router.push({ - pathname: '/scanner', - params: { mode: 'health', plantId: plant.id }, - }); - }; - - return ( - - - - - - - - - router.back()} - > - - - - - - - - - - {plant.name} - {plant.botanicalName} - - - - - - - - - {nextWaterLabel} - - - {formattedNextWatering} - - - {isWateredToday ? lastWateredText : wateredAgoText} - - - - - - - {isWateredToday ? t.watered : t.waterNow} - - - - - - {[ - { - icon: 'water' as const, - label: t.water, - value: `${plant.careInfo.waterIntervalDays} ${t.days}`, - iconColor: colors.info, - iconBg: colors.infoSoft, - }, - { - icon: 'sunny' as const, - label: t.light, - value: plant.careInfo.light, - iconColor: colors.warning, - iconBg: colors.warningSoft, - }, - { - icon: 'thermometer' as const, - label: t.temp, - value: plant.careInfo.temp, - iconColor: colors.success, - iconBg: colors.successSoft, - }, - ].map((item) => ( - - - - - {item.label} - - {item.value} - - - ))} - - - - - - - - - Smart Reminders - - {t.reminderDesc} - - - - - { - if (!plant.notificationsEnabled) { - const granted = await requestPermissions(); - if (!granted) { - Alert.alert(t.reminder, t.reminderPermissionNeeded); - return; - } - await scheduleWateringReminder(plant); - } else { - await cancelReminder(plant.id); - } - updatePlant({ ...plant, notificationsEnabled: !plant.notificationsEnabled }); - }} - > - - - - - - - {t.wateringHistory} - - - - - {timelineEntries.length === 0 ? ( - - - {t.noHistory} - - ) : ( - timelineEntries.map((dateStr, index) => ( - - - - {index < timelineEntries.length - 1 && ( - - )} - - - - - - {new Date(dateStr).toLocaleDateString(locale, { - day: '2-digit', - month: 'short', - year: 'numeric', - })} - - - {index === 0 ? t.watered : t.waterNow} - - - - {new Date(dateStr).toLocaleTimeString(locale, { - hour: '2-digit', - minute: '2-digit', - })} - - - - )) - )} - - - - - - {t.galleryTitle} - - - {t.addPhoto} - - - - {(!plant.gallery || plant.gallery.length === 0) ? ( - - - {t.noPhotos} - - ) : ( - - {plant.gallery.map((uri, index) => ( - setFullscreenImage(uri)}> - - - ))} - - )} - - - - - {t.aboutPlant} - - AI - - - - - {plant.description || t.noDescription} - - - - - - - {healthCopy.title} - {healthCopy.cost} - - - - - {healthCopy.action} - - - - - - - {healthCopy.creditsLabel}: {availableCredits} - - - {healthCopy.cost} - - - - {healthStatusInlineText ? ( - - - {healthStatusInlineText} - - {healthStatus === 'insufficient_credits' || (healthStatus === 'idle' && !hasEnoughHealthCredits) ? ( - router.push('/(tabs)/profile')} - > - {healthCopy.managePlan} - - ) : null} - - ) : null} - - - {latestHealthCheck ? ( - - - - {healthCopy.scoreLabel} - - {latestHealthCheck.overallHealthScore}/100 - - - - {latestStatusText} - - - - - {healthCopy.lastCheck}: {new Date(latestHealthCheck.generatedAt).toLocaleString(locale)} - - - - {healthCopy.issuesTitle} - {latestHealthCheck.likelyIssues.map((issue, index) => ( - - - {issue.title} - - {Math.round(issue.confidence * 100)}% - - - - {issue.details} - - - ))} - - - - {healthCopy.actionsTitle} - {latestHealthCheck.actionsNow.map((item, index) => ( - - - {item} - - ))} - - - - {healthCopy.planTitle} - {latestHealthCheck.plan7Days.map((item, index) => ( - - - {item} - - ))} - - - ) : null} - - - setShowDeleteConfirm(true)}> - - {t.delete} - - - - - - - - - - - {t.deleteConfirmTitle} - {t.deleteConfirmMessage} - - - setShowDeleteConfirm(false)} - > - {t.cancel} - - - {t.confirm} - - - - - - - - - {fullscreenImage && } - setFullscreenImage(null)}> - - - - - - {/* Health Check Paywall Modal */} - setPaywallVisible(false)}> - - - - - - - setPaywallVisible(false)} style={styles.paywallClose}> - - - - - KI-Pflanzendoktor freischalten - - Nutze fortschrittliche KI, um Probleme zu erkennen, bevor sie deine Pflanze gefährden. - - - - {[ - { icon: 'search', title: 'Präzise Diagnose', desc: 'Erkennt Schädlinge, Krankheiten und Nährstoffmangel.' }, - { icon: 'medkit', title: 'Rettungspläne', desc: 'Schritt-für-Schritt Anleitungen zur Genesung.' }, - { icon: 'infinite', title: 'Mehr Scans', desc: 'Erhalte 120 Credits jeden Monat mit GreenLens Pro.' }, - ].map((feat, i) => ( - - - - - - {feat.title} - {feat.desc} - - - ))} - - - { - setPaywallVisible(false); - router.push('/profile/billing'); - }} - > - Jetzt upgraden - - - - setPaywallVisible(false)} - > - Vielleicht später - - - - - - ); -} - -const styles = StyleSheet.create({ - container: { flex: 1 }, - scrollContent: { paddingBottom: 120 }, - hero: { - height: 450, - position: 'relative', - }, - heroImage: { - width: '100%', - height: '100%', - resizeMode: 'cover', - }, - heroShade: { - ...StyleSheet.absoluteFillObject, - opacity: 0.18, - }, - heroBaseFade: { - position: 'absolute', - left: 0, - right: 0, - bottom: 0, - height: 172, - opacity: 0.95, - borderTopLeftRadius: 28, - borderTopRightRadius: 28, - }, - topActions: { - position: 'absolute', - top: 58, - left: 22, - right: 22, - flexDirection: 'row', - justifyContent: 'space-between', - alignItems: 'center', - }, - floatingAction: { - width: 44, - height: 44, - borderRadius: 14, - borderWidth: 1, - justifyContent: 'center', - alignItems: 'center', - shadowColor: '#000', - shadowOffset: { width: 0, height: 4 }, - shadowOpacity: 0.15, - shadowRadius: 10, - elevation: 5, - }, - heroTitleWrap: { - position: 'absolute', - left: 24, - right: 24, - bottom: 74, - }, - heroName: { - fontSize: 36, - lineHeight: 40, - fontWeight: '700', - marginBottom: 6, - }, - heroBotanical: { - fontSize: 16, - fontStyle: 'italic', - fontWeight: '600', - opacity: 0.72, - }, - content: { - marginTop: -46, - paddingHorizontal: 16, - gap: 20, - }, - waterCard: { - borderRadius: 28, - borderWidth: 1, - paddingHorizontal: 16, - paddingVertical: 14, - flexDirection: 'row', - alignItems: 'center', - gap: 12, - shadowColor: '#000', - shadowOffset: { width: 0, height: 8 }, - shadowOpacity: 0.08, - shadowRadius: 16, - elevation: 4, - }, - waterInfo: { - flex: 1, - gap: 2, - }, - waterHeadline: { - flexDirection: 'row', - alignItems: 'center', - gap: 6, - }, - waterLabel: { - fontSize: 11, - textTransform: 'uppercase', - letterSpacing: 0.8, - fontWeight: '700', - }, - waterValue: { - fontSize: 15, - lineHeight: 19, - fontWeight: '700', - }, - waterMeta: { - fontSize: 12, - fontWeight: '500', - }, - waterButton: { - borderRadius: 16, - paddingHorizontal: 20, - paddingVertical: 13, - flexDirection: 'row', - alignItems: 'center', - gap: 6, - }, - waterButtonText: { - fontSize: 16, - fontWeight: '700', - }, - careGrid: { - flexDirection: 'row', - gap: 10, - }, - careCard: { - flex: 1, - borderRadius: 22, - borderWidth: 1, - alignItems: 'center', - justifyContent: 'center', - paddingHorizontal: 8, - paddingVertical: 16, - gap: 6, - }, - careIconWrap: { - width: 34, - height: 34, - borderRadius: 17, - alignItems: 'center', - justifyContent: 'center', - }, - careLabel: { - fontSize: 10, - fontWeight: '700', - textTransform: 'uppercase', - letterSpacing: 0.5, - }, - careValue: { - width: '100%', - fontSize: 12, - lineHeight: 15, - fontWeight: '700', - textAlign: 'center', - flexShrink: 1, - }, - reminderCard: { - borderRadius: 24, - borderWidth: 1, - paddingHorizontal: 14, - paddingVertical: 12, - flexDirection: 'row', - justifyContent: 'space-between', - alignItems: 'center', - gap: 12, - }, - reminderInfoRow: { - flexDirection: 'row', - alignItems: 'center', - gap: 10, - flex: 1, - }, - reminderIconWrap: { - width: 40, - height: 40, - borderRadius: 13, - justifyContent: 'center', - alignItems: 'center', - }, - reminderTitle: { - fontSize: 14, - fontWeight: '700', - }, - reminderSubtitle: { - fontSize: 10, - marginTop: 1, - }, - toggleTrack: { - width: 54, - height: 30, - borderRadius: 999, - justifyContent: 'center', - position: 'relative', - }, - toggleThumb: { - position: 'absolute', - width: 22, - height: 22, - borderRadius: 11, - backgroundColor: '#ffffff', - }, - summarySection: { - gap: 8, - }, - summaryHeader: { - flexDirection: 'row', - alignItems: 'center', - justifyContent: 'space-between', - }, - aiBadge: { - borderRadius: 999, - paddingHorizontal: 10, - paddingVertical: 4, - }, - aiBadgeText: { - fontSize: 10, - fontWeight: '700', - letterSpacing: 0.6, - }, - summaryCard: { - borderRadius: 22, - borderWidth: 1, - padding: 16, - }, - summaryText: { - fontSize: 14, - lineHeight: 22, - }, - healthActionCard: { - borderRadius: 22, - borderWidth: 1, - padding: 14, - gap: 10, - }, - healthActionRow: { - flexDirection: 'row', - gap: 10, - alignItems: 'center', - }, - healthActionInfo: { - flex: 1, - }, - healthActionTitle: { - fontSize: 14, - fontWeight: '700', - }, - healthActionMeta: { - fontSize: 11, - marginTop: 2, - }, - healthActionBtn: { - borderRadius: 14, - borderWidth: 1, - paddingHorizontal: 12, - paddingVertical: 10, - flexDirection: 'row', - alignItems: 'center', - gap: 6, - }, - healthActionBtnText: { - fontSize: 12, - fontWeight: '700', - }, - healthMetaRow: { - flexDirection: 'row', - justifyContent: 'space-between', - alignItems: 'center', - }, - healthMetaText: { - fontSize: 12, - fontWeight: '500', - }, - healthInlineWrap: { - gap: 8, - }, - healthInlineText: { - fontSize: 12, - fontWeight: '600', - }, - healthPlanButton: { - alignSelf: 'flex-start', - borderWidth: 1, - borderRadius: 12, - paddingHorizontal: 10, - paddingVertical: 7, - }, - healthPlanButtonText: { - fontSize: 12, - fontWeight: '700', - }, - healthResultCard: { - borderRadius: 22, - borderWidth: 1, - padding: 14, - gap: 12, - }, - healthResultHead: { - flexDirection: 'row', - justifyContent: 'space-between', - alignItems: 'center', - }, - healthResultTitle: { - fontSize: 11, - textTransform: 'uppercase', - letterSpacing: 0.5, - fontWeight: '700', - }, - healthResultScore: { - fontSize: 26, - lineHeight: 30, - fontWeight: '800', - marginTop: 2, - }, - healthStatusBadge: { - borderRadius: 999, - paddingHorizontal: 10, - paddingVertical: 5, - }, - healthStatusBadgeText: { - fontSize: 11, - fontWeight: '700', - }, - healthTimestamp: { - fontSize: 11, - }, - healthListBlock: { - gap: 8, - }, - healthListTitle: { - fontSize: 13, - fontWeight: '700', - }, - healthIssueWrap: { - gap: 3, - }, - healthIssueHead: { - flexDirection: 'row', - justifyContent: 'space-between', - alignItems: 'center', - gap: 8, - }, - healthIssueTitle: { - fontSize: 13, - fontWeight: '600', - flex: 1, - }, - healthIssueConfidence: { - fontSize: 11, - fontWeight: '700', - }, - healthIssueDetails: { - fontSize: 12, - lineHeight: 18, - }, - healthBulletRow: { - flexDirection: 'row', - alignItems: 'flex-start', - gap: 8, - }, - healthBulletDot: { - width: 7, - height: 7, - borderRadius: 4, - marginTop: 5, - }, - healthBulletText: { - flex: 1, - fontSize: 12, - lineHeight: 18, - }, - sectionHeaderRow: { - flexDirection: 'row', - justifyContent: 'space-between', - alignItems: 'center', - marginBottom: 10, - marginTop: 4, - }, - sectionTitle: { - fontSize: 18, - fontWeight: '700', - }, - timelineCard: { - borderRadius: 22, - borderWidth: 1, - paddingHorizontal: 14, - paddingTop: 16, - paddingBottom: 10, - gap: 4, - }, - historyEmpty: { - width: '100%', - alignItems: 'center', - justifyContent: 'center', - gap: 8, - minHeight: 96, - paddingVertical: 20, - }, - historyEmptyText: { - fontSize: 13, - textAlign: 'center', - }, - timelineRow: { - flexDirection: 'row', - alignItems: 'flex-start', - gap: 10, - }, - timelineMarkerColumn: { - width: 20, - alignItems: 'center', - }, - timelineDot: { - width: 11, - height: 11, - borderRadius: 6, - borderWidth: 2, - }, - timelineLine: { - width: 2, - flex: 1, - marginTop: 3, - minHeight: 26, - borderRadius: 2, - }, - timelineContent: { - flex: 1, - paddingBottom: 14, - }, - timelineTopRow: { - flexDirection: 'row', - justifyContent: 'space-between', - alignItems: 'center', - gap: 10, - }, - timelineDate: { - fontSize: 14, - fontWeight: '700', - }, - timelineType: { - fontSize: 10, - textTransform: 'uppercase', - letterSpacing: 0.45, - fontWeight: '600', - }, - timelineTime: { - fontSize: 12, - marginTop: 3, - }, - galleryHeader: { - flexDirection: 'row', - justifyContent: 'space-between', - alignItems: 'center', - marginBottom: 12, - }, - addPhotoBtn: { - flexDirection: 'row', - alignItems: 'center', - gap: 5, - borderWidth: 1, - borderRadius: 18, - paddingHorizontal: 10, - paddingVertical: 6, - }, - addPhotoBtnText: { - fontSize: 13, - fontWeight: '600', - }, - galleryEmpty: { - borderRadius: 18, - borderWidth: 1, - paddingVertical: 22, - alignItems: 'center', - justifyContent: 'center', - gap: 8, - }, - galleryScroll: { - marginBottom: 2, - }, - galleryContent: { - gap: 12, - paddingRight: 20, - }, - galleryThumb: { - width: 96, - height: 96, - borderRadius: 18, - }, - deleteAction: { - alignSelf: 'center', - marginTop: 4, - marginBottom: 12, - flexDirection: 'row', - alignItems: 'center', - gap: 6, - paddingHorizontal: 8, - paddingVertical: 6, - }, - deleteActionText: { - fontSize: 13, - fontWeight: '600', - }, - modalOverlay: { - flex: 1, - justifyContent: 'center', - alignItems: 'center', - padding: 24, - }, - modalCard: { - width: '100%', - maxWidth: 340, - borderRadius: 24, - padding: 22, - }, - modalIcon: { - width: 48, - height: 48, - borderRadius: 24, - justifyContent: 'center', - alignItems: 'center', - alignSelf: 'center', - marginBottom: 14, - }, - modalTitle: { - fontSize: 18, - fontWeight: '700', - textAlign: 'center', - marginBottom: 8, - }, - modalMessage: { - fontSize: 13, - lineHeight: 20, - textAlign: 'center', - marginBottom: 20, - }, - modalActions: { - flexDirection: 'row', - gap: 10, - }, - modalButton: { - flex: 1, - paddingVertical: 14, - borderRadius: 14, - alignItems: 'center', - }, - modalButtonText: { - fontSize: 13, - fontWeight: '700', - }, - fullscreenOverlay: { - flex: 1, - backgroundColor: '#000000ee', - justifyContent: 'center', - alignItems: 'center', - }, - fullscreenImage: { - width: '90%', - height: '72%', - resizeMode: 'contain', - }, - fullscreenClose: { - position: 'absolute', - top: 56, - right: 20, - backgroundColor: '#00000088', - borderRadius: 20, - padding: 8, - }, - paywallOverlay: { - flex: 1, - backgroundColor: '#000000aa', - justifyContent: 'flex-end', - }, - paywallContent: { - borderTopLeftRadius: 32, - borderTopRightRadius: 32, - padding: 24, - paddingBottom: 48, - borderTopWidth: 1, - }, - paywallHeader: { - flexDirection: 'row', - justifyContent: 'space-between', - alignItems: 'flex-start', - marginBottom: 20, - }, - paywallIconWrap: { - width: 64, - height: 64, - borderRadius: 20, - justifyContent: 'center', - alignItems: 'center', - }, - paywallClose: { - padding: 4, - }, - paywallTitle: { - fontSize: 24, - fontWeight: '800', - marginBottom: 8, - letterSpacing: 0.2, - }, - paywallSubtitle: { - fontSize: 15, - lineHeight: 22, - marginBottom: 28, - }, - paywallFeatures: { - gap: 18, - marginBottom: 32, - }, - paywallFeatureRow: { - flexDirection: 'row', - gap: 14, - alignItems: 'center', - }, - paywallFeatureIcon: { - width: 38, - height: 38, - borderRadius: 12, - justifyContent: 'center', - alignItems: 'center', - }, - paywallFeatureTitle: { - fontSize: 15, - fontWeight: '700', - marginBottom: 2, - }, - paywallFeatureDesc: { - fontSize: 13, - lineHeight: 18, - }, - paywallPrimaryBtn: { - borderRadius: 18, - paddingVertical: 16, - flexDirection: 'row', - alignItems: 'center', - justifyContent: 'center', - gap: 8, - shadowOpacity: 0.2, - shadowRadius: 10, - shadowOffset: { width: 0, height: 4 }, - elevation: 4, - }, - paywallPrimaryBtnText: { - fontSize: 17, - fontWeight: '700', - }, - paywallSecondaryBtn: { - marginTop: 12, - paddingVertical: 12, - alignItems: 'center', - }, - paywallSecondaryBtnText: { - fontSize: 14, - fontWeight: '600', - }, -}); +import React, { useMemo, useState } from 'react'; +import { + View, + Text, + StyleSheet, + ScrollView, + TouchableOpacity, + Modal, + Alert, + Share, +} from 'react-native'; +import { useLocalSearchParams, useRouter } from 'expo-router'; +import { Ionicons } from '@expo/vector-icons'; +import * as Haptics from 'expo-haptics'; +import * as ImagePicker from 'expo-image-picker'; +import { useApp } from '../../context/AppContext'; +import { useColors } from '../../constants/Colors'; +import { requestPermissions, scheduleWateringReminder, cancelReminder } from '../../services/notificationService'; +import { SafeImage } from '../../components/SafeImage'; + +const parseColorToRgb = (input: string) => { + const color = input.trim(); + if (color.startsWith('#')) { + const hex = color.slice(1); + const normalized = hex.length === 3 + ? hex.split('').map((char) => `${char}${char}`).join('') + : hex; + if (normalized.length === 6) { + return { + r: Number.parseInt(normalized.slice(0, 2), 16), + g: Number.parseInt(normalized.slice(2, 4), 16), + b: Number.parseInt(normalized.slice(4, 6), 16), + }; + } + } + + const rgbMatch = color.match(/rgba?\((\d+),\s*(\d+),\s*(\d+)/i); + if (rgbMatch) { + return { + r: Number.parseInt(rgbMatch[1], 10), + g: Number.parseInt(rgbMatch[2], 10), + b: Number.parseInt(rgbMatch[3], 10), + }; + } + + return { r: 127, g: 127, b: 127 }; +}; + +const getReadableTextColor = (background: string, dark: string, light: string) => { + const { r, g, b } = parseColorToRgb(background); + const luminance = (0.2126 * r + 0.7152 * g + 0.0722 * b) / 255; + return luminance > 0.58 ? dark : light; +}; + +const HEALTH_CHECK_CREDIT_COST = 2; + +const getHealthCopy = (language: 'de' | 'en' | 'es') => { + if (language === 'de') { + return { + title: 'Health Check', + action: 'Neues Foto + Health-Check', + running: 'Neues Foto wird analysiert...', + cost: `Kosten: ${HEALTH_CHECK_CREDIT_COST} Credits`, + creditsLabel: 'Credits', + managePlan: 'Plan verwalten', + noCreditsTitle: 'Nicht genug Credits', + noCreditsMessage: `Du brauchst ${HEALTH_CHECK_CREDIT_COST} Credits fuer den Health-Check.`, + insufficientInline: 'Nicht genug Credits fuer den Health-Check.', + timeoutInline: 'Health-Check Timeout. Bitte erneut versuchen.', + providerInline: 'Health-Check ist gerade nicht verfuegbar.', + issuesTitle: 'Moegliche Ursachen', + actionsTitle: 'Sofortmassnahmen', + planTitle: '7-Tage-Plan', + scoreLabel: 'Gesundheits-Score', + healthy: 'Stabil', + watch: 'Beobachten', + critical: 'Kritisch', + lastCheck: 'Zuletzt geprueft', + }; + } + + if (language === 'es') { + return { + title: 'Health Check', + action: 'Foto nuevo + Health-check', + running: 'Analizando foto nueva...', + cost: `Costo: ${HEALTH_CHECK_CREDIT_COST} creditos`, + creditsLabel: 'Creditos', + managePlan: 'Gestionar plan', + noCreditsTitle: 'Creditos insuficientes', + noCreditsMessage: `Necesitas ${HEALTH_CHECK_CREDIT_COST} creditos para el health-check.`, + insufficientInline: 'No hay creditos suficientes para el health-check.', + timeoutInline: 'Health-check agotado por tiempo. Intenta de nuevo.', + providerInline: 'Health-check no disponible ahora.', + issuesTitle: 'Posibles causas', + actionsTitle: 'Acciones inmediatas', + planTitle: 'Plan de 7 dias', + scoreLabel: 'Puntaje de salud', + healthy: 'Estable', + watch: 'Observar', + critical: 'Critico', + lastCheck: 'Ultima revision', + }; + } + + return { + title: 'Health Check', + action: 'New Photo + Health Check', + running: 'Analyzing new photo...', + cost: `Cost: ${HEALTH_CHECK_CREDIT_COST} credits`, + creditsLabel: 'Credits', + managePlan: 'Manage plan', + noCreditsTitle: 'Not enough credits', + noCreditsMessage: `You need ${HEALTH_CHECK_CREDIT_COST} credits for the health check.`, + insufficientInline: 'Not enough credits for the health check.', + timeoutInline: 'Health check timed out. Please try again.', + providerInline: 'Health check is unavailable right now.', + issuesTitle: 'Likely issues', + actionsTitle: 'Actions now', + planTitle: '7-day plan', + scoreLabel: 'Health score', + healthy: 'Stable', + watch: 'Watch', + critical: 'Critical', + lastCheck: 'Last checked', + }; +}; + +export default function PlantDetailScreen() { + const { id } = useLocalSearchParams<{ id: string }>(); + const { + plants, + isDarkMode, + colorPalette, + language, + t, + deletePlant, + updatePlant, + billingSummary, + } = useApp(); + const colors = useColors(isDarkMode, colorPalette); + const router = useRouter(); + const [showDeleteConfirm, setShowDeleteConfirm] = useState(false); + const [fullscreenImage, setFullscreenImage] = useState(null); + const [healthStatus, setHealthStatus] = useState<'idle' | 'insufficient_credits'>('idle'); + const [paywallVisible, setPaywallVisible] = useState(false); + + const plant = plants.find((item) => item.id === id); + if (!plant) { + return ( + + Plant not found + + ); + } + + const localeMap: Record = { de: 'de-DE', en: 'en-US', es: 'es-ES' }; + const locale = localeMap[language] || 'de-DE'; + const healthCopy = getHealthCopy(language); + const availableCredits = billingSummary?.credits.available ?? 0; + + const formattedWateredDate = new Date(plant.lastWatered).toLocaleDateString(locale); + + const lastWateredObj = new Date(plant.lastWatered); + const nextWateringDate = new Date(lastWateredObj); + nextWateringDate.setDate(lastWateredObj.getDate() + plant.careInfo.waterIntervalDays); + const formattedNextWatering = nextWateringDate.toLocaleDateString(locale, { + weekday: 'short', + day: 'numeric', + month: 'short', + }); + + const lastWateredText = t.lastWateredDate.replace('{0}', formattedWateredDate); + const isWateredToday = new Date(plant.lastWatered).toDateString() === new Date().toDateString(); + const daysSinceWatered = Math.max( + 0, + Math.floor((Date.now() - lastWateredObj.getTime()) / (1000 * 60 * 60 * 24)) + ); + + const nextWaterLabel = language === 'de' + ? 'Nächstes Gießen' + : language === 'es' + ? 'Proximo riego' + : 'Next water'; + + const wateredAgoText = language === 'de' + ? `Zuletzt vor ${daysSinceWatered} ${daysSinceWatered === 1 ? 'Tag' : 'Tagen'}` + : language === 'es' + ? `Ultimo riego hace ${daysSinceWatered} ${daysSinceWatered === 1 ? 'dia' : 'dias'}` + : `Last watered ${daysSinceWatered} ${daysSinceWatered === 1 ? 'day' : 'days'} ago`; + + const textOnPage = getReadableTextColor(colors.pageBase, colors.primaryDark, colors.textOnImage); + const textOnSurface = getReadableTextColor(colors.surface, colors.primaryDark, colors.textOnImage); + const textOnHeroButton = getReadableTextColor(colors.heroButton, colors.primaryDark, colors.textOnImage); + const textOnPrimaryAction = getReadableTextColor(colors.primaryDark, '#ffffff', '#111111'); + const textOnAiBadge = getReadableTextColor(colors.primarySoft, colors.primaryDark, colors.textOnImage); + const latestHealthCheck = useMemo(() => { + if (!plant.healthChecks || plant.healthChecks.length === 0) return null; + return plant.healthChecks[0]; + }, [plant.healthChecks]); + const healthStatusInlineText = (() => { + if (healthStatus === 'insufficient_credits') return healthCopy.insufficientInline; + if (healthStatus === 'idle' && availableCredits < HEALTH_CHECK_CREDIT_COST) return healthCopy.insufficientInline; + return ''; + })(); + const healthStateColor = (() => { + if (healthStatus === 'insufficient_credits') return colors.warning; + return colors.textMuted; + })(); + const latestStatusText = latestHealthCheck + ? ( + latestHealthCheck.status === 'healthy' + ? healthCopy.healthy + : latestHealthCheck.status === 'watch' + ? healthCopy.watch + : healthCopy.critical + ) + : ''; + const latestStatusBg = latestHealthCheck + ? ( + latestHealthCheck.status === 'healthy' + ? colors.successSoft + : latestHealthCheck.status === 'watch' + ? colors.warningSoft + : colors.dangerSoft + ) + : colors.surfaceMuted; + const latestStatusColor = latestHealthCheck + ? ( + latestHealthCheck.status === 'healthy' + ? colors.success + : latestHealthCheck.status === 'watch' + ? colors.warning + : colors.danger + ) + : colors.textMuted; + + const timelineEntries = useMemo(() => { + const history = plant.wateringHistory && plant.wateringHistory.length > 0 + ? plant.wateringHistory + : [plant.lastWatered]; + return history.slice(0, 5); + }, [plant.lastWatered, plant.wateringHistory]); + const hasEnoughHealthCredits = availableCredits >= HEALTH_CHECK_CREDIT_COST; + const canRunHealthCheck = true; + + const handleWater = async () => { + await Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Medium); + const now = new Date().toISOString(); + const currentHistory = plant.wateringHistory || []; + const newHistory = [now, ...currentHistory].slice(0, 10); + updatePlant({ ...plant, lastWatered: now, wateringHistory: newHistory }); + }; + + const handleShare = async () => { + try { + await Share.share({ + message: `Check out my plant: ${plant.name} (${plant.botanicalName}) - identified with GreenLens!`, + }); + } catch (error: any) { + Alert.alert('Error', error.message); + } + }; + + const handleDelete = () => { + deletePlant(plant.id); + router.back(); + }; + + const handleAddPhoto = async () => { + const result = await ImagePicker.launchImageLibraryAsync({ + mediaTypes: ['images'], + quality: 0.8, + }); + + if (!result.canceled && result.assets[0]) { + const currentGallery = plant.gallery || []; + updatePlant({ ...plant, gallery: [...currentGallery, result.assets[0].uri] }); + } + }; + + const handleHealthCheck = async () => { + if (availableCredits < HEALTH_CHECK_CREDIT_COST) { + setPaywallVisible(true); + return; + } + + if (healthStatus !== 'idle') { + setHealthStatus('idle'); + } + + router.push({ + pathname: '/scanner', + params: { mode: 'health', plantId: plant.id }, + }); + }; + + return ( + + + + + + + + + router.back()} + > + + + + + + + + + + {plant.name} + {plant.botanicalName} + + + + + + + + + {nextWaterLabel} + + + {formattedNextWatering} + + + {isWateredToday ? lastWateredText : wateredAgoText} + + + + + + + {isWateredToday ? t.watered : t.waterNow} + + + + + + {[ + { + icon: 'water' as const, + label: t.water, + value: `${plant.careInfo.waterIntervalDays} ${t.days}`, + iconColor: colors.info, + iconBg: colors.infoSoft, + }, + { + icon: 'sunny' as const, + label: t.light, + value: plant.careInfo.light, + iconColor: colors.warning, + iconBg: colors.warningSoft, + }, + { + icon: 'thermometer' as const, + label: t.temp, + value: plant.careInfo.temp, + iconColor: colors.success, + iconBg: colors.successSoft, + }, + ].map((item) => ( + + + + + {item.label} + + {item.value} + + + ))} + + + + + + + + + Smart Reminders + + {t.reminderDesc} + + + + + { + if (!plant.notificationsEnabled) { + const granted = await requestPermissions(); + if (!granted) { + Alert.alert(t.reminder, t.reminderPermissionNeeded); + return; + } + await scheduleWateringReminder(plant); + } else { + await cancelReminder(plant.id); + } + updatePlant({ ...plant, notificationsEnabled: !plant.notificationsEnabled }); + }} + > + + + + + + + {t.wateringHistory} + + + + + {timelineEntries.length === 0 ? ( + + + {t.noHistory} + + ) : ( + timelineEntries.map((dateStr, index) => ( + + + + {index < timelineEntries.length - 1 && ( + + )} + + + + + + {new Date(dateStr).toLocaleDateString(locale, { + day: '2-digit', + month: 'short', + year: 'numeric', + })} + + + {index === 0 ? t.watered : t.waterNow} + + + + {new Date(dateStr).toLocaleTimeString(locale, { + hour: '2-digit', + minute: '2-digit', + })} + + + + )) + )} + + + + + + {t.galleryTitle} + + + {t.addPhoto} + + + + {(!plant.gallery || plant.gallery.length === 0) ? ( + + + {t.noPhotos} + + ) : ( + + {plant.gallery.map((uri, index) => ( + setFullscreenImage(uri)}> + + + ))} + + )} + + + + + {t.aboutPlant} + + AI + + + + + {plant.description || t.noDescription} + + + + + + + {healthCopy.title} + {healthCopy.cost} + + + + + {healthCopy.action} + + + + + + + {healthCopy.creditsLabel}: {availableCredits} + + + {healthCopy.cost} + + + + {healthStatusInlineText ? ( + + + {healthStatusInlineText} + + {healthStatus === 'insufficient_credits' || (healthStatus === 'idle' && !hasEnoughHealthCredits) ? ( + router.push('/(tabs)/profile')} + > + {healthCopy.managePlan} + + ) : null} + + ) : null} + + + {latestHealthCheck ? ( + + + + {healthCopy.scoreLabel} + + {latestHealthCheck.overallHealthScore}/100 + + + + {latestStatusText} + + + + + {healthCopy.lastCheck}: {new Date(latestHealthCheck.generatedAt).toLocaleString(locale)} + + + + {healthCopy.issuesTitle} + {latestHealthCheck.likelyIssues.map((issue, index) => ( + + + {issue.title} + + {Math.round(issue.confidence * 100)}% + + + + {issue.details} + + + ))} + + + + {healthCopy.actionsTitle} + {latestHealthCheck.actionsNow.map((item, index) => ( + + + {item} + + ))} + + + + {healthCopy.planTitle} + {latestHealthCheck.plan7Days.map((item, index) => ( + + + {item} + + ))} + + + ) : null} + + + setShowDeleteConfirm(true)}> + + {t.delete} + + + + + + + + + + + {t.deleteConfirmTitle} + {t.deleteConfirmMessage} + + + setShowDeleteConfirm(false)} + > + {t.cancel} + + + {t.confirm} + + + + + + + + + {fullscreenImage && } + setFullscreenImage(null)}> + + + + + + {/* Health Check Paywall Modal */} + setPaywallVisible(false)}> + + + + + + + setPaywallVisible(false)} style={styles.paywallClose}> + + + + + KI-Pflanzendoktor freischalten + + Nutze fortschrittliche KI, um Probleme zu erkennen, bevor sie deine Pflanze gefährden. + + + + {[ + { icon: 'search', title: 'Präzise Diagnose', desc: 'Erkennt Schädlinge, Krankheiten und Nährstoffmangel.' }, + { icon: 'medkit', title: 'Rettungspläne', desc: 'Schritt-für-Schritt Anleitungen zur Genesung.' }, + { icon: 'infinite', title: 'Mehr Scans', desc: 'Erhalte 120 Credits jeden Monat mit GreenLens Pro.' }, + ].map((feat, i) => ( + + + + + + {feat.title} + {feat.desc} + + + ))} + + + { + setPaywallVisible(false); + router.push('/profile/billing'); + }} + > + Jetzt upgraden + + + + setPaywallVisible(false)} + > + Vielleicht später + + + + + + ); +} + +const styles = StyleSheet.create({ + container: { flex: 1 }, + scrollContent: { paddingBottom: 120 }, + hero: { + height: 450, + position: 'relative', + }, + heroImage: { + width: '100%', + height: '100%', + resizeMode: 'cover', + }, + heroShade: { + ...StyleSheet.absoluteFillObject, + opacity: 0.18, + }, + heroBaseFade: { + position: 'absolute', + left: 0, + right: 0, + bottom: 0, + height: 172, + opacity: 0.95, + borderTopLeftRadius: 28, + borderTopRightRadius: 28, + }, + topActions: { + position: 'absolute', + top: 58, + left: 22, + right: 22, + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + }, + floatingAction: { + width: 44, + height: 44, + borderRadius: 14, + borderWidth: 1, + justifyContent: 'center', + alignItems: 'center', + shadowColor: '#000', + shadowOffset: { width: 0, height: 4 }, + shadowOpacity: 0.15, + shadowRadius: 10, + elevation: 5, + }, + heroTitleWrap: { + position: 'absolute', + left: 24, + right: 24, + bottom: 74, + }, + heroName: { + fontSize: 36, + lineHeight: 40, + fontWeight: '700', + marginBottom: 6, + }, + heroBotanical: { + fontSize: 16, + fontStyle: 'italic', + fontWeight: '600', + opacity: 0.72, + }, + content: { + marginTop: -46, + paddingHorizontal: 16, + gap: 20, + }, + waterCard: { + borderRadius: 28, + borderWidth: 1, + paddingHorizontal: 16, + paddingVertical: 14, + flexDirection: 'row', + alignItems: 'center', + gap: 12, + shadowColor: '#000', + shadowOffset: { width: 0, height: 8 }, + shadowOpacity: 0.08, + shadowRadius: 16, + elevation: 4, + }, + waterInfo: { + flex: 1, + gap: 2, + }, + waterHeadline: { + flexDirection: 'row', + alignItems: 'center', + gap: 6, + }, + waterLabel: { + fontSize: 11, + textTransform: 'uppercase', + letterSpacing: 0.8, + fontWeight: '700', + }, + waterValue: { + fontSize: 15, + lineHeight: 19, + fontWeight: '700', + }, + waterMeta: { + fontSize: 12, + fontWeight: '500', + }, + waterButton: { + borderRadius: 16, + paddingHorizontal: 20, + paddingVertical: 13, + flexDirection: 'row', + alignItems: 'center', + gap: 6, + }, + waterButtonText: { + fontSize: 16, + fontWeight: '700', + }, + careGrid: { + flexDirection: 'row', + gap: 10, + }, + careCard: { + flex: 1, + borderRadius: 22, + borderWidth: 1, + alignItems: 'center', + justifyContent: 'center', + paddingHorizontal: 8, + paddingVertical: 16, + gap: 6, + }, + careIconWrap: { + width: 34, + height: 34, + borderRadius: 17, + alignItems: 'center', + justifyContent: 'center', + }, + careLabel: { + fontSize: 10, + fontWeight: '700', + textTransform: 'uppercase', + letterSpacing: 0.5, + }, + careValue: { + width: '100%', + fontSize: 12, + lineHeight: 15, + fontWeight: '700', + textAlign: 'center', + flexShrink: 1, + }, + reminderCard: { + borderRadius: 24, + borderWidth: 1, + paddingHorizontal: 14, + paddingVertical: 12, + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + gap: 12, + }, + reminderInfoRow: { + flexDirection: 'row', + alignItems: 'center', + gap: 10, + flex: 1, + }, + reminderIconWrap: { + width: 40, + height: 40, + borderRadius: 13, + justifyContent: 'center', + alignItems: 'center', + }, + reminderTitle: { + fontSize: 14, + fontWeight: '700', + }, + reminderSubtitle: { + fontSize: 10, + marginTop: 1, + }, + toggleTrack: { + width: 54, + height: 30, + borderRadius: 999, + justifyContent: 'center', + position: 'relative', + }, + toggleThumb: { + position: 'absolute', + width: 22, + height: 22, + borderRadius: 11, + backgroundColor: '#ffffff', + }, + summarySection: { + gap: 8, + }, + summaryHeader: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-between', + }, + aiBadge: { + borderRadius: 999, + paddingHorizontal: 10, + paddingVertical: 4, + }, + aiBadgeText: { + fontSize: 10, + fontWeight: '700', + letterSpacing: 0.6, + }, + summaryCard: { + borderRadius: 22, + borderWidth: 1, + padding: 16, + }, + summaryText: { + fontSize: 14, + lineHeight: 22, + }, + healthActionCard: { + borderRadius: 22, + borderWidth: 1, + padding: 14, + gap: 10, + }, + healthActionRow: { + flexDirection: 'row', + gap: 10, + alignItems: 'center', + }, + healthActionInfo: { + flex: 1, + }, + healthActionTitle: { + fontSize: 14, + fontWeight: '700', + }, + healthActionMeta: { + fontSize: 11, + marginTop: 2, + }, + healthActionBtn: { + borderRadius: 14, + borderWidth: 1, + paddingHorizontal: 12, + paddingVertical: 10, + flexDirection: 'row', + alignItems: 'center', + gap: 6, + }, + healthActionBtnText: { + fontSize: 12, + fontWeight: '700', + }, + healthMetaRow: { + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + }, + healthMetaText: { + fontSize: 12, + fontWeight: '500', + }, + healthInlineWrap: { + gap: 8, + }, + healthInlineText: { + fontSize: 12, + fontWeight: '600', + }, + healthPlanButton: { + alignSelf: 'flex-start', + borderWidth: 1, + borderRadius: 12, + paddingHorizontal: 10, + paddingVertical: 7, + }, + healthPlanButtonText: { + fontSize: 12, + fontWeight: '700', + }, + healthResultCard: { + borderRadius: 22, + borderWidth: 1, + padding: 14, + gap: 12, + }, + healthResultHead: { + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + }, + healthResultTitle: { + fontSize: 11, + textTransform: 'uppercase', + letterSpacing: 0.5, + fontWeight: '700', + }, + healthResultScore: { + fontSize: 26, + lineHeight: 30, + fontWeight: '800', + marginTop: 2, + }, + healthStatusBadge: { + borderRadius: 999, + paddingHorizontal: 10, + paddingVertical: 5, + }, + healthStatusBadgeText: { + fontSize: 11, + fontWeight: '700', + }, + healthTimestamp: { + fontSize: 11, + }, + healthListBlock: { + gap: 8, + }, + healthListTitle: { + fontSize: 13, + fontWeight: '700', + }, + healthIssueWrap: { + gap: 3, + }, + healthIssueHead: { + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + gap: 8, + }, + healthIssueTitle: { + fontSize: 13, + fontWeight: '600', + flex: 1, + }, + healthIssueConfidence: { + fontSize: 11, + fontWeight: '700', + }, + healthIssueDetails: { + fontSize: 12, + lineHeight: 18, + }, + healthBulletRow: { + flexDirection: 'row', + alignItems: 'flex-start', + gap: 8, + }, + healthBulletDot: { + width: 7, + height: 7, + borderRadius: 4, + marginTop: 5, + }, + healthBulletText: { + flex: 1, + fontSize: 12, + lineHeight: 18, + }, + sectionHeaderRow: { + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + marginBottom: 10, + marginTop: 4, + }, + sectionTitle: { + fontSize: 18, + fontWeight: '700', + }, + timelineCard: { + borderRadius: 22, + borderWidth: 1, + paddingHorizontal: 14, + paddingTop: 16, + paddingBottom: 10, + gap: 4, + }, + historyEmpty: { + width: '100%', + alignItems: 'center', + justifyContent: 'center', + gap: 8, + minHeight: 96, + paddingVertical: 20, + }, + historyEmptyText: { + fontSize: 13, + textAlign: 'center', + }, + timelineRow: { + flexDirection: 'row', + alignItems: 'flex-start', + gap: 10, + }, + timelineMarkerColumn: { + width: 20, + alignItems: 'center', + }, + timelineDot: { + width: 11, + height: 11, + borderRadius: 6, + borderWidth: 2, + }, + timelineLine: { + width: 2, + flex: 1, + marginTop: 3, + minHeight: 26, + borderRadius: 2, + }, + timelineContent: { + flex: 1, + paddingBottom: 14, + }, + timelineTopRow: { + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + gap: 10, + }, + timelineDate: { + fontSize: 14, + fontWeight: '700', + }, + timelineType: { + fontSize: 10, + textTransform: 'uppercase', + letterSpacing: 0.45, + fontWeight: '600', + }, + timelineTime: { + fontSize: 12, + marginTop: 3, + }, + galleryHeader: { + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + marginBottom: 12, + }, + addPhotoBtn: { + flexDirection: 'row', + alignItems: 'center', + gap: 5, + borderWidth: 1, + borderRadius: 18, + paddingHorizontal: 10, + paddingVertical: 6, + }, + addPhotoBtnText: { + fontSize: 13, + fontWeight: '600', + }, + galleryEmpty: { + borderRadius: 18, + borderWidth: 1, + paddingVertical: 22, + alignItems: 'center', + justifyContent: 'center', + gap: 8, + }, + galleryScroll: { + marginBottom: 2, + }, + galleryContent: { + gap: 12, + paddingRight: 20, + }, + galleryThumb: { + width: 96, + height: 96, + borderRadius: 18, + }, + deleteAction: { + alignSelf: 'center', + marginTop: 4, + marginBottom: 12, + flexDirection: 'row', + alignItems: 'center', + gap: 6, + paddingHorizontal: 8, + paddingVertical: 6, + }, + deleteActionText: { + fontSize: 13, + fontWeight: '600', + }, + modalOverlay: { + flex: 1, + justifyContent: 'center', + alignItems: 'center', + padding: 24, + }, + modalCard: { + width: '100%', + maxWidth: 340, + borderRadius: 24, + padding: 22, + }, + modalIcon: { + width: 48, + height: 48, + borderRadius: 24, + justifyContent: 'center', + alignItems: 'center', + alignSelf: 'center', + marginBottom: 14, + }, + modalTitle: { + fontSize: 18, + fontWeight: '700', + textAlign: 'center', + marginBottom: 8, + }, + modalMessage: { + fontSize: 13, + lineHeight: 20, + textAlign: 'center', + marginBottom: 20, + }, + modalActions: { + flexDirection: 'row', + gap: 10, + }, + modalButton: { + flex: 1, + paddingVertical: 14, + borderRadius: 14, + alignItems: 'center', + }, + modalButtonText: { + fontSize: 13, + fontWeight: '700', + }, + fullscreenOverlay: { + flex: 1, + backgroundColor: '#000000ee', + justifyContent: 'center', + alignItems: 'center', + }, + fullscreenImage: { + width: '90%', + height: '72%', + resizeMode: 'contain', + }, + fullscreenClose: { + position: 'absolute', + top: 56, + right: 20, + backgroundColor: '#00000088', + borderRadius: 20, + padding: 8, + }, + paywallOverlay: { + flex: 1, + backgroundColor: '#000000aa', + justifyContent: 'flex-end', + }, + paywallContent: { + borderTopLeftRadius: 32, + borderTopRightRadius: 32, + padding: 24, + paddingBottom: 48, + borderTopWidth: 1, + }, + paywallHeader: { + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'flex-start', + marginBottom: 20, + }, + paywallIconWrap: { + width: 64, + height: 64, + borderRadius: 20, + justifyContent: 'center', + alignItems: 'center', + }, + paywallClose: { + padding: 4, + }, + paywallTitle: { + fontSize: 24, + fontWeight: '800', + marginBottom: 8, + letterSpacing: 0.2, + }, + paywallSubtitle: { + fontSize: 15, + lineHeight: 22, + marginBottom: 28, + }, + paywallFeatures: { + gap: 18, + marginBottom: 32, + }, + paywallFeatureRow: { + flexDirection: 'row', + gap: 14, + alignItems: 'center', + }, + paywallFeatureIcon: { + width: 38, + height: 38, + borderRadius: 12, + justifyContent: 'center', + alignItems: 'center', + }, + paywallFeatureTitle: { + fontSize: 15, + fontWeight: '700', + marginBottom: 2, + }, + paywallFeatureDesc: { + fontSize: 13, + lineHeight: 18, + }, + paywallPrimaryBtn: { + borderRadius: 18, + paddingVertical: 16, + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'center', + gap: 8, + shadowOpacity: 0.2, + shadowRadius: 10, + shadowOffset: { width: 0, height: 4 }, + elevation: 4, + }, + paywallPrimaryBtnText: { + fontSize: 17, + fontWeight: '700', + }, + paywallSecondaryBtn: { + marginTop: 12, + paddingVertical: 12, + alignItems: 'center', + }, + paywallSecondaryBtnText: { + fontSize: 14, + fontWeight: '600', + }, +}); diff --git a/app/profile/billing.tsx b/app/profile/billing.tsx index 424daf4..d76059d 100644 --- a/app/profile/billing.tsx +++ b/app/profile/billing.tsx @@ -1,657 +1,910 @@ -import React, { useState } from 'react'; -import { View, Text, TouchableOpacity, ScrollView, StyleSheet, Modal, ActivityIndicator, Alert, Platform } from 'react-native'; -import { SafeAreaView } from 'react-native-safe-area-context'; -import { Ionicons } from '@expo/vector-icons'; -import { useRouter } from 'expo-router'; -import RevenueCatUI, { PAYWALL_RESULT } from "react-native-purchases-ui"; -import { usePostHog } from 'posthog-react-native'; -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 React, { useEffect, useMemo, useState } from 'react'; +import { View, Text, TouchableOpacity, ScrollView, StyleSheet, Modal, ActivityIndicator, Alert, Linking } from 'react-native'; +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 { useApp } from '../../context/AppContext'; +import { useColors } from '../../constants/Colors'; +import { ThemeBackdrop } from '../../components/ThemeBackdrop'; +import { Language } from '../../types'; +import { PurchaseProductId } from '../../services/backend/contracts'; + +const getBillingCopy = (language: Language) => { + if (language === 'de') { + return { + title: 'Abo und Credits', + planLabel: 'Aktueller Plan', + planFree: 'Free', + planPro: 'Pro', + creditsAvailableLabel: 'Verfügbare Credits', + manageSubscription: 'Abo verwalten', + subscriptionTitle: 'Abos', + subscriptionHint: 'Wähle ein Abo und schalte stärkere KI-Scans sowie mehr Credits frei.', + freePlanName: 'Free', + freePlanPrice: '0 EUR / Monat', + proPlanName: 'Pro', + proPlanPrice: '4.99 EUR / Monat', + proBadgeText: 'EMPFOHLEN', + proYearlyPlanName: 'Pro', + proYearlyPlanPrice: '39.99 EUR / Jahr', + proYearlyBadgeText: 'SPAREN', + proBenefits: [ + '250 Credits jeden Monat', + 'Pro-Scans mit GPT-5.4', + 'Unbegrenzte Historie & Galerie', + 'KI-Pflanzendoktor inklusive', + 'Priorisierter Support' + ], + topupTitle: 'Credits Aufladen', + topupSmall: '25 Credits – 1,99 €', + topupMedium: '120 Credits – 6,99 €', + topupLarge: '300 Credits – 12,99 €', + topupBestValue: 'BESTES ANGEBOT', + cancelTitle: 'Schade, dass du gehst', + cancelQuestion: 'Dürfen wir fragen, warum du kündigst?', + reasonTooExpensive: 'Es ist mir zu teuer', + reasonNotUsing: 'Ich nutze die App zu selten', + reasonOther: 'Ein anderer Grund', + offerTitle: 'Ein Geschenk für dich!', + offerText: 'Bleib dabei und erhalte den nächsten Monat für nur 2,49 € (50% Rabatt).', + offerAccept: 'Rabatt sichern', + offerDecline: 'Nein, Kündigung fortsetzen', + confirmCancelBtn: 'Jetzt kündigen', + restorePurchases: 'Käufe wiederherstellen', + autoRenewMonthly: 'Verlängert sich monatlich automatisch. Jederzeit über iOS-Einstellungen kündbar.', + autoRenewYearly: 'Verlängert sich jährlich automatisch. Jederzeit über iOS-Einstellungen kündbar.', + manageInSettings: 'In iOS-Einstellungen verwalten', + }; + } else if (language === 'es') { + return { + title: 'Suscripción y Créditos', + planLabel: 'Plan Actual', + planFree: 'Gratis', + planPro: 'Pro', + creditsAvailableLabel: 'Créditos Disponibles', + manageSubscription: 'Administrar Suscripción', + subscriptionTitle: 'Suscripciones', + subscriptionHint: 'Elige un plan y desbloquea escaneos con IA más potentes y más créditos.', + freePlanName: 'Gratis', + freePlanPrice: '0 EUR / Mes', + proPlanName: 'Pro', + proPlanPrice: '4.99 EUR / Mes', + proBadgeText: 'RECOMENDADO', + proYearlyPlanName: 'Pro', + proYearlyPlanPrice: '39.99 EUR / Año', + proYearlyBadgeText: 'AHORRAR', + proBenefits: [ + '250 créditos cada mes', + 'Escaneos Pro con GPT-5.4', + 'Historial y galería ilimitados', + 'Doctor de plantas de IA incluido', + 'Soporte prioritario' + ], + topupTitle: 'Recargar Créditos', + topupSmall: '25 Créditos – 1,99 €', + topupMedium: '120 Créditos – 6,99 €', + topupLarge: '300 Créditos – 12,99 €', + topupBestValue: 'MEJOR OFERTA', + cancelTitle: 'Lamentamos verte ir', + cancelQuestion: '¿Podemos saber por qué cancelas?', + reasonTooExpensive: 'Es muy caro', + reasonNotUsing: 'No lo uso suficiente', + reasonOther: 'Otra razón', + offerTitle: '¡Un regalo para ti!', + offerText: 'Quédate y obtén el próximo mes por solo 2,49 € (50% de descuento).', + offerAccept: 'Aceptar descuento', + offerDecline: 'No, continuar cancelando', + confirmCancelBtn: 'Cancelar ahora', + restorePurchases: 'Restaurar Compras', + autoRenewMonthly: 'Se renueva mensualmente de forma automática. Cancela cuando quieras en Ajustes de iOS.', + autoRenewYearly: 'Se renueva anualmente de forma automática. Cancela cuando quieras en Ajustes de iOS.', + manageInSettings: 'Administrar en Ajustes de iOS', + }; + } + return { + title: 'Billing & Credits', + planLabel: 'Current Plan', + planFree: 'Free', + planPro: 'Pro', + creditsAvailableLabel: 'Available Credits', + manageSubscription: 'Manage Subscription', + subscriptionTitle: 'Subscriptions', + subscriptionHint: 'Choose a plan to unlock stronger AI scans and more credits.', + freePlanName: 'Free', + freePlanPrice: '0 EUR / Month', + proPlanName: 'Pro', + proPlanPrice: '4.99 EUR / Month', + proBadgeText: 'RECOMMENDED', + proYearlyPlanName: 'Pro', + proYearlyPlanPrice: '39.99 EUR / Year', + proYearlyBadgeText: 'SAVE', + proBenefits: [ + '250 credits every month', + 'Pro scans with GPT-5.4', + 'Unlimited history & gallery', + 'AI Plant Doctor included', + 'Priority support' + ], + topupTitle: 'Topup Credits', + topupSmall: '25 Credits – €1.99', + topupMedium: '120 Credits – €6.99', + topupLarge: '300 Credits – €12.99', + topupBestValue: 'BEST VALUE', + cancelTitle: 'Sorry to see you go', + cancelQuestion: 'May we ask why you are cancelling?', + reasonTooExpensive: 'It is too expensive', + reasonNotUsing: 'I don\'t use it enough', + reasonOther: 'Other reason', + offerTitle: 'A gift for you!', + offerText: 'Stay with us and get your next month for just €2.49 (50% off).', + offerAccept: 'Claim discount', + offerDecline: 'No, continue cancelling', + confirmCancelBtn: 'Cancel now', + restorePurchases: 'Restore Purchases', + autoRenewMonthly: 'Auto-renews monthly. Cancel anytime in iOS Settings.', + autoRenewYearly: 'Auto-renews annually. Cancel anytime in iOS Settings.', + manageInSettings: 'Manage in iOS Settings', + }; +}; + + + +export default function BillingScreen() { + const router = useRouter(); + const { isDarkMode, language, billingSummary, isLoadingBilling, simulatePurchase, simulateWebhookEvent, syncRevenueCatState, colorPalette, session } = useApp(); + const colors = useColors(isDarkMode, colorPalette); + const copy = getBillingCopy(language); + const isExpoGo = Constants.appOwnership === 'expo'; + + const [subModalVisible, setSubModalVisible] = useState(false); + const [isUpdating, setIsUpdating] = useState(false); + const [storeReady, setStoreReady] = useState(isExpoGo); + const [subscriptionPackages, setSubscriptionPackages] = useState>>({}); + const [topupProducts, setTopupProducts] = useState>>({}); + + // Cancel Flow State + const [cancelStep, setCancelStep] = useState<'none' | 'survey' | 'offer'>('none'); + + const planId = billingSummary?.entitlement?.plan || 'free'; + const credits = isLoadingBilling && !billingSummary ? '...' : (billingSummary?.credits?.available ?? '--'); + + useEffect(() => { + let cancelled = false; + + const loadStoreProducts = async () => { + if (isExpoGo) { + setStoreReady(true); + return; + } + + try { + const [offerings, topups] = await Promise.all([ + Purchases.getOfferings(), + Purchases.getProducts(['topup_small', 'topup_medium', 'topup_large'], PRODUCT_CATEGORY.NON_SUBSCRIPTION), + ]); + + if (cancelled) return; + + const currentOffering = offerings.current; + setSubscriptionPackages({ + monthly_pro: currentOffering?.monthly ?? undefined, + yearly_pro: currentOffering?.annual ?? undefined, + }); + + setTopupProducts({ + topup_small: topups.find((product) => product.identifier === 'topup_small'), + topup_medium: topups.find((product) => product.identifier === 'topup_medium'), + topup_large: topups.find((product) => product.identifier === 'topup_large'), + }); + } catch (error) { + console.warn('Failed to load RevenueCat products', error); + } finally { + if (!cancelled) { + setStoreReady(true); + } + } + }; + + loadStoreProducts(); + + return () => { + cancelled = true; + }; + }, [isExpoGo]); + + const monthlyPackage = subscriptionPackages.monthly_pro; + const yearlyPackage = subscriptionPackages.yearly_pro; + + const monthlyPrice = monthlyPackage?.product.priceString ?? copy.proPlanPrice; + const yearlyPrice = yearlyPackage?.product.priceString ?? copy.proYearlyPlanPrice; + + const topupLabels = useMemo(() => ({ + topup_small: topupProducts.topup_small ? `25 Credits - ${topupProducts.topup_small.priceString}` : copy.topupSmall, + topup_medium: topupProducts.topup_medium ? `120 Credits - ${topupProducts.topup_medium.priceString}` : copy.topupMedium, + topup_large: topupProducts.topup_large ? `300 Credits - ${topupProducts.topup_large.priceString}` : copy.topupLarge, + }), [copy.topupLarge, copy.topupMedium, copy.topupSmall, topupProducts.topup_large, topupProducts.topup_medium, topupProducts.topup_small]); -const getBillingCopy = (language: Language) => { - if (language === 'de') { - return { - title: 'Abo und Credits', - planLabel: 'Aktueller Plan', - planFree: 'Free', - planPro: 'Pro', - creditsAvailableLabel: 'Verfügbare Credits', - manageSubscription: 'Abo verwalten', - subscriptionTitle: 'Abos', - subscriptionHint: 'Wähle ein Abo und schalte stärkere KI-Scans sowie mehr Credits frei.', - freePlanName: 'Free', - freePlanPrice: '0 EUR / Monat', - proPlanName: 'Pro', - proPlanPrice: '4.99 EUR / Monat', - proBadgeText: 'EMPFOHLEN', - proYearlyPlanName: 'Pro', - proYearlyPlanPrice: '39.99 EUR / Jahr', - proYearlyBadgeText: 'SPAREN', - proBenefits: [ - '250 Credits jeden Monat', - 'Pro-Scans mit GPT-5.4', - 'Unbegrenzte Historie & Galerie', - 'KI-Pflanzendoktor inklusive', - 'Priorisierter Support' - ], - topupTitle: 'Credits Aufladen', - topupSmall: '25 Credits – 1,99 €', - topupMedium: '120 Credits – 6,99 €', - topupLarge: '300 Credits – 12,99 €', - topupBestValue: 'BESTES ANGEBOT', - cancelTitle: 'Schade, dass du gehst', - cancelQuestion: 'Dürfen wir fragen, warum du kündigst?', - reasonTooExpensive: 'Es ist mir zu teuer', - reasonNotUsing: 'Ich nutze die App zu selten', - reasonOther: 'Ein anderer Grund', - offerTitle: 'Ein Geschenk für dich!', - offerText: 'Bleib dabei und erhalte den nächsten Monat für nur 2,49 € (50% Rabatt).', - offerAccept: 'Rabatt sichern', - offerDecline: 'Nein, Kündigung fortsetzen', - confirmCancelBtn: 'Jetzt kündigen', - }; - } else if (language === 'es') { - return { - title: 'Suscripción y Créditos', - planLabel: 'Plan Actual', - planFree: 'Gratis', - planPro: 'Pro', - creditsAvailableLabel: 'Créditos Disponibles', - manageSubscription: 'Administrar Suscripción', - subscriptionTitle: 'Suscripciones', - subscriptionHint: 'Elige un plan y desbloquea escaneos con IA más potentes y más créditos.', - freePlanName: 'Gratis', - freePlanPrice: '0 EUR / Mes', - proPlanName: 'Pro', - proPlanPrice: '4.99 EUR / Mes', - proBadgeText: 'RECOMENDADO', - proYearlyPlanName: 'Pro', - proYearlyPlanPrice: '39.99 EUR / Año', - proYearlyBadgeText: 'AHORRAR', - proBenefits: [ - '250 créditos cada mes', - 'Escaneos Pro con GPT-5.4', - 'Historial y galería ilimitados', - 'Doctor de plantas de IA incluido', - 'Soporte prioritario' - ], - topupTitle: 'Recargar Créditos', - topupSmall: '25 Créditos – 1,99 €', - topupMedium: '120 Créditos – 6,99 €', - topupLarge: '300 Créditos – 12,99 €', - topupBestValue: 'MEJOR OFERTA', - cancelTitle: 'Lamentamos verte ir', - cancelQuestion: '¿Podemos saber por qué cancelas?', - reasonTooExpensive: 'Es muy caro', - reasonNotUsing: 'No lo uso suficiente', - reasonOther: 'Otra razón', - offerTitle: '¡Un regalo para ti!', - offerText: 'Quédate y obtén el próximo mes por solo 2,49 € (50% de descuento).', - offerAccept: 'Aceptar descuento', - offerDecline: 'No, continuar cancelando', - confirmCancelBtn: 'Cancelar ahora', - }; - } - return { - title: 'Billing & Credits', - planLabel: 'Current Plan', - planFree: 'Free', - planPro: 'Pro', - creditsAvailableLabel: 'Available Credits', - manageSubscription: 'Manage Subscription', - subscriptionTitle: 'Subscriptions', - subscriptionHint: 'Choose a plan to unlock stronger AI scans and more credits.', - freePlanName: 'Free', - freePlanPrice: '0 EUR / Month', - proPlanName: 'Pro', - proPlanPrice: '4.99 EUR / Month', - proBadgeText: 'RECOMMENDED', - proYearlyPlanName: 'Pro', - proYearlyPlanPrice: '39.99 EUR / Year', - proYearlyBadgeText: 'SAVE', - proBenefits: [ - '250 credits every month', - 'Pro scans with GPT-5.4', - 'Unlimited history & gallery', - 'AI Plant Doctor included', - 'Priority support' - ], - topupTitle: 'Topup Credits', - topupSmall: '25 Credits – €1.99', - topupMedium: '120 Credits – €6.99', - topupLarge: '300 Credits – €12.99', - topupBestValue: 'BEST VALUE', - cancelTitle: 'Sorry to see you go', - cancelQuestion: 'May we ask why you are cancelling?', - reasonTooExpensive: 'It is too expensive', - reasonNotUsing: 'I don\'t use it enough', - reasonOther: 'Other reason', - offerTitle: 'A gift for you!', - offerText: 'Stay with us and get your next month for just €2.49 (50% off).', - offerAccept: 'Claim discount', - offerDecline: 'No, continue cancelling', - confirmCancelBtn: 'Cancel now', + const openAppleSubscriptions = async () => { + await Linking.openURL('itms-apps://apps.apple.com/account/subscriptions'); }; -}; - - - -export default function BillingScreen() { - const router = useRouter(); - const { isDarkMode, language, billingSummary, isLoadingBilling, simulatePurchase, simulateWebhookEvent, appearanceMode, colorPalette, session } = useApp(); - const colors = useColors(isDarkMode, colorPalette); - const copy = getBillingCopy(language); - const posthog = usePostHog(); - - const [subModalVisible, setSubModalVisible] = useState(false); - const [isUpdating, setIsUpdating] = useState(false); - - // Cancel Flow State - const [cancelStep, setCancelStep] = useState<'none' | 'survey' | 'offer'>('none'); - const [cancelReason, setCancelReason] = useState(null); - - const planId = billingSummary?.entitlement?.plan || 'free'; - const credits = isLoadingBilling && !billingSummary ? '...' : (billingSummary?.credits?.available ?? '--'); - - const handlePurchase = async (productId: PurchaseProductId) => { - setIsUpdating(true); - try { - const paywallResult: PAYWALL_RESULT = await RevenueCatUI.presentPaywall(); - switch (paywallResult) { - case PAYWALL_RESULT.NOT_PRESENTED: - case PAYWALL_RESULT.ERROR: - case PAYWALL_RESULT.CANCELLED: - break; - case PAYWALL_RESULT.PURCHASED: - case PAYWALL_RESULT.RESTORED: - await simulatePurchase(productId); - setSubModalVisible(false); - break; - default: - break; - } - } catch (e) { - const msg = e instanceof Error ? e.message : String(e); - console.error('Payment failed', e); - if (__DEV__ && (msg.toLowerCase().includes('native') || msg.toLowerCase().includes('not found') || msg.toLowerCase().includes('undefined'))) { - // Fallback for Expo Go since RevenueCat native module is not available - console.log('Falling back to simulated purchase in Expo Go'); - await simulatePurchase(productId); - setSubModalVisible(false); - } else { - Alert.alert('Unerwarteter Fehler', msg); - } - } finally { - setIsUpdating(false); + + const handlePurchase = async (productId: PurchaseProductId) => { + setIsUpdating(true); + try { + if (isExpoGo) { + // ExpoGo has no native RevenueCat — use simulation for development only + await simulatePurchase(productId); + } else { + if (productId === 'monthly_pro' || productId === 'yearly_pro') { + if (planId === 'pro') { + await openAppleSubscriptions(); + setSubModalVisible(false); + return; + } + const selectedPackage = productId === 'monthly_pro' ? monthlyPackage : yearlyPackage; + if (!selectedPackage) { + 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 { + 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); + } + } + setSubModalVisible(false); + } catch (e) { + const msg = e instanceof Error ? e.message : String(e); + const userCancelled = typeof e === 'object' && e !== null && 'userCancelled' in e && Boolean((e as { userCancelled?: boolean }).userCancelled); + + if (userCancelled) { + return; + } + + console.error('Payment failed', e); + Alert.alert('Unerwarteter Fehler', msg); + } finally { + setIsUpdating(false); + } + }; + + const handleRestore = async () => { + setIsUpdating(true); + try { + if (!isExpoGo) { + const customerInfo = await Purchases.restorePurchases(); + await syncRevenueCatState(customerInfo as any); + } + Alert.alert(copy.restorePurchases, '✓'); + } catch (e) { + Alert.alert('Error', e instanceof Error ? e.message : String(e)); + } finally { + setIsUpdating(false); + } + }; + + const handleDowngrade = async () => { + if (planId === 'free') return; + if (!isExpoGo) { + await openAppleSubscriptions(); + return; } - }; - - - const handleSimulatePurchase = async (productId: PurchaseProductId) => { - // Fallback for free option - setIsUpdating(true); - await simulatePurchase(productId); - setIsUpdating(false); - setSubModalVisible(false); - }; - - const handleDowngrade = async () => { - if (planId === 'free') return; // already on free plan - setCancelStep('survey'); - }; - - const finalizeCancel = async () => { - setIsUpdating(true); - try { - await simulateWebhookEvent('entitlement_revoked'); - setCancelStep('none'); - setSubModalVisible(false); - } catch (e) { - console.error('Downgrade failed', e); - } finally { - setIsUpdating(false); - } - }; - - return ( - - - - - router.back()} style={styles.backButton}> - - - {copy.title} - - - - - {isLoadingBilling ? ( - - ) : ( - <> - - {copy.planLabel} - - - {planId === 'pro' ? copy.planPro : copy.planFree} - - setSubModalVisible(true)} - > - {copy.manageSubscription} - - - - {copy.creditsAvailableLabel} - {credits} - - - - {copy.topupTitle} - - {([ - { id: 'topup_small' as PurchaseProductId, label: copy.topupSmall }, - { id: 'topup_medium' as PurchaseProductId, label: copy.topupMedium, badge: copy.topupBestValue }, - { id: 'topup_large' as PurchaseProductId, label: copy.topupLarge }, - ] as { id: PurchaseProductId; label: string; badge?: string }[]).map((pack) => ( - handlePurchase(pack.id)} - disabled={isUpdating} - > - - - - {isUpdating ? '...' : pack.label} - - - {pack.badge && ( - - {pack.badge} - - )} - - ))} - - - - )} - - - - setSubModalVisible(false)}> - - - - - {cancelStep === 'survey' ? copy.cancelTitle : cancelStep === 'offer' ? copy.offerTitle : copy.subscriptionTitle} - - { - setSubModalVisible(false); - setCancelStep('none'); - }}> - - - - - {cancelStep === 'none' ? ( - <> - {copy.subscriptionHint} - - - - {copy.freePlanName} - {copy.freePlanPrice} - - {planId === 'free' && } - - - handlePurchase('monthly_pro')} - disabled={isUpdating} - > - - - {copy.proPlanName} - - {copy.proBadgeText} - - - {copy.proPlanPrice} - - - {copy.proBenefits.map((b, i) => ( - - - {b} - - ))} - - - {planId === 'pro' && } - - - handlePurchase('yearly_pro')} - disabled={isUpdating} - > - - - {copy.proYearlyPlanName} - - {copy.proYearlyBadgeText} - - - {copy.proYearlyPlanPrice} - - - {copy.proBenefits.map((b, i) => ( - - - {b} - - ))} - - - {planId === 'pro' && } - - - - ) : cancelStep === 'survey' ? ( - - {copy.cancelQuestion} - - {[ - { id: 'expensive', label: copy.reasonTooExpensive, icon: 'cash-outline' }, - { id: 'not_using', label: copy.reasonNotUsing, icon: 'calendar-outline' }, - { id: 'other', label: copy.reasonOther, icon: 'ellipsis-horizontal-outline' }, - ].map((reason) => ( - { - setCancelReason(reason.id); - setCancelStep('offer'); - }} - > - - - - {reason.label} - - - ))} - - - ) : ( - - - - - - {copy.offerText} - - { - // Handle applying discount here (future implementation) - Alert.alert('Erfolg', 'Rabatt angewendet! (Mock)'); - setCancelStep('none'); - setSubModalVisible(false); - }} - > - {copy.offerAccept} - - - - - {copy.offerDecline} - - - )} - {isUpdating && cancelStep === 'none' && } - - - - - ); -} - -const styles = StyleSheet.create({ - safeArea: { flex: 1 }, - header: { flexDirection: 'row', alignItems: 'center', padding: 16 }, - backButton: { width: 40, height: 40, justifyContent: 'center' }, - title: { flex: 1, fontSize: 20, fontWeight: '700', textAlign: 'center' }, - scrollContent: { padding: 16, gap: 16 }, - card: { - padding: 16, - borderRadius: 16, - borderWidth: StyleSheet.hairlineWidth, - }, - sectionTitle: { - fontSize: 14, - fontWeight: '600', - textTransform: 'uppercase', - letterSpacing: 0.5, - marginBottom: 8, - }, - row: { - flexDirection: 'row', - justifyContent: 'space-between', - alignItems: 'center', - }, - value: { - fontSize: 18, - fontWeight: '600', - }, - manageBtn: { - paddingHorizontal: 16, - paddingVertical: 8, - borderRadius: 20, - }, - manageBtnText: { - color: '#fff', - fontSize: 14, - fontWeight: '600', - }, - creditsValue: { - fontSize: 32, - fontWeight: '700', - }, - topupBtn: { - flexDirection: 'row', - alignItems: 'center', - justifyContent: 'center', - paddingVertical: 12, - borderRadius: 12, - borderWidth: 2, - gap: 8, - }, - topupText: { - fontSize: 16, - fontWeight: '600', - }, - modalOverlay: { - flex: 1, - backgroundColor: '#00000080', - justifyContent: 'flex-end', - }, - modalContent: { - borderTopLeftRadius: 24, - borderTopRightRadius: 24, - padding: 24, - borderTopWidth: StyleSheet.hairlineWidth, - paddingBottom: 40, - }, - modalHeader: { - flexDirection: 'row', - justifyContent: 'space-between', - alignItems: 'center', - marginBottom: 8, - }, - modalTitle: { - fontSize: 20, - fontWeight: '700', - }, - modalHint: { - fontSize: 14, - marginBottom: 24, - }, - plansContainer: { - gap: 12, - }, - planOption: { - padding: 16, - borderRadius: 12, - borderWidth: 2, - flexDirection: 'row', - justifyContent: 'space-between', - alignItems: 'center', - }, - planName: { - fontSize: 18, - fontWeight: '600', - }, - planPrice: { - fontSize: 14, - }, - planHeaderRow: { - flexDirection: 'row', - alignItems: 'center', - gap: 8, - marginBottom: 2, - }, - proBadge: { - paddingHorizontal: 8, - paddingVertical: 2, - borderRadius: 6, - }, - proBadgeText: { - color: '#fff', - fontSize: 10, - fontWeight: '800', - }, - proBenefits: { - marginTop: 12, - gap: 6, - }, - benefitRow: { - flexDirection: 'row', - alignItems: 'center', - gap: 6, - }, - benefitText: { - fontSize: 12, - fontWeight: '500', - }, - cancelFlowContainer: { - marginTop: 8, - }, - cancelHint: { - fontSize: 15, - marginBottom: 16, - }, - reasonList: { - gap: 12, - }, - reasonOption: { - flexDirection: 'row', - alignItems: 'center', - padding: 16, - borderWidth: 1, - borderRadius: 12, - }, - reasonIcon: { - width: 36, - height: 36, - borderRadius: 18, - justifyContent: 'center', - alignItems: 'center', - marginRight: 12, - }, - reasonText: { - flex: 1, - fontSize: 16, - fontWeight: '500', - }, - offerCard: { - borderRadius: 16, - padding: 24, - alignItems: 'center', - marginBottom: 16, - }, - offerIconWrap: { - width: 56, - height: 56, - borderRadius: 28, - justifyContent: 'center', - alignItems: 'center', - marginBottom: 16, - }, - offerText: { - fontSize: 16, - textAlign: 'center', - lineHeight: 24, - marginBottom: 24, - fontWeight: '500', - }, - offerAcceptBtn: { - paddingHorizontal: 24, - paddingVertical: 14, - borderRadius: 24, - width: '100%', - alignItems: 'center', - }, - offerAcceptBtnText: { - color: '#fff', - fontSize: 16, - fontWeight: '700', - }, - offerDeclineBtn: { - paddingVertical: 12, - alignItems: 'center', - }, - offerDeclineBtnText: { - fontSize: 15, - fontWeight: '500', - }, -}); + // Expo Go / dev only: simulate cancel flow + setCancelStep('survey'); + }; + + const finalizeCancel = async () => { + setIsUpdating(true); + try { + await simulateWebhookEvent('entitlement_revoked'); + setCancelStep('none'); + setSubModalVisible(false); + } catch (e) { + console.error('Downgrade failed', e); + } finally { + setIsUpdating(false); + } + }; + + return ( + + + + + router.back()} style={styles.backButton}> + + + {copy.title} + + + + + {isLoadingBilling && session ? ( + + ) : ( + <> + {session && ( + + {copy.planLabel} + + + {planId === 'pro' ? copy.planPro : copy.planFree} + + setSubModalVisible(true)} + > + {copy.manageSubscription} + + + + {copy.creditsAvailableLabel} + {credits} + + )} + {!session && ( + + Subscription Plans + + Choose a plan to unlock AI plant scans and care features. + + + {/* Monthly */} + + + GreenLens Pro + + MONTHLY + + + {monthlyPrice} + {copy.autoRenewMonthly} + + {copy.proBenefits.map((b, i) => ( + + + {b} + + ))} + + handlePurchase('monthly_pro')} + disabled={isUpdating || !storeReady} + > + Subscribe Monthly + + + + {/* Yearly */} + + + GreenLens Pro + + YEARLY + + + {yearlyPrice} + {copy.autoRenewYearly} + + {copy.proBenefits.map((b, i) => ( + + + {b} + + ))} + + handlePurchase('yearly_pro')} + disabled={isUpdating || !storeReady} + > + Subscribe Yearly + + + + + Linking.openURL('https://greenlns-landing.vercel.app/privacy')}> + Privacy Policy + + · + Linking.openURL('https://greenlns-landing.vercel.app/terms')}> + Terms of Use + + + + {copy.restorePurchases} + + + )} + + + {copy.topupTitle} + + {([ + { id: 'topup_small' as PurchaseProductId, label: topupLabels.topup_small }, + { id: 'topup_medium' as PurchaseProductId, label: topupLabels.topup_medium, badge: copy.topupBestValue }, + { id: 'topup_large' as PurchaseProductId, label: topupLabels.topup_large }, + ] as { id: PurchaseProductId; label: string; badge?: string }[]).map((pack) => ( + handlePurchase(pack.id)} + disabled={isUpdating || !storeReady} + > + + + + {isUpdating ? '...' : pack.label} + + + {pack.badge && ( + + {pack.badge} + + )} + + ))} + + + Linking.openURL('https://greenlns-landing.vercel.app/privacy')}> + Privacy Policy + + · + Linking.openURL('https://greenlns-landing.vercel.app/terms')}> + Terms of Use + + + + {copy.restorePurchases} + + + + )} + + + + setSubModalVisible(false)}> + + + + + {cancelStep === 'survey' ? copy.cancelTitle : cancelStep === 'offer' ? copy.offerTitle : copy.subscriptionTitle} + + { + setSubModalVisible(false); + setCancelStep('none'); + }}> + + + + + {cancelStep === 'none' ? ( + <> + {copy.subscriptionHint} + + + + {copy.freePlanName} + {copy.freePlanPrice} + + {planId === 'free' && } + + + handlePurchase('monthly_pro')} + disabled={isUpdating} + > + + + {copy.proPlanName} + + {copy.proBadgeText} + + + {monthlyPrice} + {copy.autoRenewMonthly} + + + {copy.proBenefits.map((b, i) => ( + + + {b} + + ))} + + + {planId === 'pro' && } + + + handlePurchase('yearly_pro')} + disabled={isUpdating || !storeReady} + > + + + {copy.proYearlyPlanName} + + {copy.proYearlyBadgeText} + + + {yearlyPrice} + {copy.autoRenewYearly} + + + {copy.proBenefits.map((b, i) => ( + + + {b} + + ))} + + + {planId === 'pro' && } + + + + Linking.openURL('https://greenlns-landing.vercel.app/privacy')}> + Privacy Policy + + · + Linking.openURL('https://greenlns-landing.vercel.app/terms')}> + Terms of Use + + + + {copy.restorePurchases} + + + ) : cancelStep === 'survey' ? ( + + {copy.cancelQuestion} + + {[ + { id: 'expensive', label: copy.reasonTooExpensive, icon: 'cash-outline' }, + { id: 'not_using', label: copy.reasonNotUsing, icon: 'calendar-outline' }, + { id: 'other', label: copy.reasonOther, icon: 'ellipsis-horizontal-outline' }, + ].map((reason) => ( + { + setCancelStep('offer'); + }} + > + + + + {reason.label} + + + ))} + + + ) : ( + + + + + + {copy.offerText} + + { + // Handle applying discount here (future implementation) + Alert.alert('Erfolg', 'Rabatt angewendet! (Mock)'); + setCancelStep('none'); + setSubModalVisible(false); + }} + > + {copy.offerAccept} + + + + + {copy.offerDecline} + + + )} + {(isUpdating || (!storeReady && cancelStep === 'none')) && } + + + + + ); +} + +const styles = StyleSheet.create({ + safeArea: { flex: 1 }, + header: { flexDirection: 'row', alignItems: 'center', padding: 16 }, + backButton: { width: 40, height: 40, justifyContent: 'center' }, + title: { flex: 1, fontSize: 20, fontWeight: '700', textAlign: 'center' }, + scrollContent: { padding: 16, gap: 16 }, + card: { + padding: 16, + borderRadius: 16, + borderWidth: StyleSheet.hairlineWidth, + }, + sectionTitle: { + fontSize: 14, + fontWeight: '600', + textTransform: 'uppercase', + letterSpacing: 0.5, + marginBottom: 8, + }, + row: { + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + }, + value: { + fontSize: 18, + fontWeight: '600', + }, + manageBtn: { + paddingHorizontal: 16, + paddingVertical: 8, + borderRadius: 20, + }, + manageBtnText: { + color: '#fff', + fontSize: 14, + fontWeight: '600', + }, + creditsValue: { + fontSize: 32, + fontWeight: '700', + }, + topupBtn: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'center', + paddingVertical: 12, + borderRadius: 12, + borderWidth: 2, + gap: 8, + }, + topupText: { + fontSize: 16, + fontWeight: '600', + }, + modalOverlay: { + flex: 1, + backgroundColor: '#00000080', + justifyContent: 'flex-end', + }, + modalContent: { + borderTopLeftRadius: 24, + borderTopRightRadius: 24, + padding: 24, + borderTopWidth: StyleSheet.hairlineWidth, + paddingBottom: 40, + }, + modalHeader: { + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + marginBottom: 8, + }, + modalTitle: { + fontSize: 20, + fontWeight: '700', + }, + modalHint: { + fontSize: 14, + marginBottom: 24, + }, + plansContainer: { + gap: 12, + }, + planOption: { + padding: 16, + borderRadius: 12, + borderWidth: 2, + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + }, + planName: { + fontSize: 18, + fontWeight: '600', + }, + planPrice: { + fontSize: 14, + }, + planHeaderRow: { + flexDirection: 'row', + alignItems: 'center', + gap: 8, + marginBottom: 2, + }, + proBadge: { + paddingHorizontal: 8, + paddingVertical: 2, + borderRadius: 6, + }, + proBadgeText: { + color: '#fff', + fontSize: 10, + fontWeight: '800', + }, + proBenefits: { + marginTop: 12, + gap: 6, + }, + benefitRow: { + flexDirection: 'row', + alignItems: 'center', + gap: 6, + }, + benefitText: { + fontSize: 12, + fontWeight: '500', + }, + cancelFlowContainer: { + marginTop: 8, + }, + cancelHint: { + fontSize: 15, + marginBottom: 16, + }, + reasonList: { + gap: 12, + }, + reasonOption: { + flexDirection: 'row', + alignItems: 'center', + padding: 16, + borderWidth: 1, + borderRadius: 12, + }, + reasonIcon: { + width: 36, + height: 36, + borderRadius: 18, + justifyContent: 'center', + alignItems: 'center', + marginRight: 12, + }, + reasonText: { + flex: 1, + fontSize: 16, + fontWeight: '500', + }, + offerCard: { + borderRadius: 16, + padding: 24, + alignItems: 'center', + marginBottom: 16, + }, + offerIconWrap: { + width: 56, + height: 56, + borderRadius: 28, + justifyContent: 'center', + alignItems: 'center', + marginBottom: 16, + }, + offerText: { + fontSize: 16, + textAlign: 'center', + lineHeight: 24, + marginBottom: 24, + fontWeight: '500', + }, + offerAcceptBtn: { + paddingHorizontal: 24, + paddingVertical: 14, + borderRadius: 24, + width: '100%', + alignItems: 'center', + }, + offerAcceptBtnText: { + color: '#fff', + fontSize: 16, + fontWeight: '700', + }, + offerDeclineBtn: { + paddingVertical: 12, + alignItems: 'center', + }, + offerDeclineBtnText: { + fontSize: 15, + fontWeight: '500', + }, + guestPlanCard: { + borderWidth: 2, + borderRadius: 12, + padding: 16, + }, + guestPlanHeader: { + flexDirection: 'row', + alignItems: 'center', + gap: 8, + marginBottom: 4, + }, + guestPlanName: { + fontSize: 18, + fontWeight: '700', + }, + guestPlanPrice: { + fontSize: 22, + fontWeight: '700', + marginBottom: 2, + }, + guestPlanRenew: { + fontSize: 12, + }, + guestSubscribeBtn: { + marginTop: 14, + paddingVertical: 12, + borderRadius: 10, + alignItems: 'center', + }, + legalLinksRow: { + flexDirection: 'row', + justifyContent: 'center', + alignItems: 'center', + marginTop: 16, + }, + legalLink: { + fontSize: 12, + fontWeight: '500', + textDecorationLine: 'underline', + }, + legalSep: { + fontSize: 12, + }, + restoreBtn: { + alignItems: 'center', + paddingVertical: 8, + }, + autoRenewText: { + fontSize: 11, + marginTop: 2, + marginBottom: 4, + }, +}); diff --git a/app/profile/data.tsx b/app/profile/data.tsx index 7c32f2d..92eb6e8 100644 --- a/app/profile/data.tsx +++ b/app/profile/data.tsx @@ -1,226 +1,226 @@ -import React from 'react'; -import { View, Text, TouchableOpacity, ScrollView, StyleSheet, Share, Alert } from 'react-native'; -import { SafeAreaView } from 'react-native-safe-area-context'; -import { Ionicons } from '@expo/vector-icons'; -import { useRouter } from 'expo-router'; -import { useApp } from '../../context/AppContext'; -import { useColors } from '../../constants/Colors'; -import { ThemeBackdrop } from '../../components/ThemeBackdrop'; -import { Language } from '../../types'; - -const getDataCopy = (language: Language) => { - if (language === 'de') { - return { - title: 'Daten & Datenschutz', - exportData: 'Daten exportieren', - exportHint: 'Teilt deine Sammlung als JSON.', - clearHistory: 'Lexikon-Verlauf loeschen', - clearHistoryHint: 'Entfernt alle letzten Suchbegriffe.', - clearHistoryDoneTitle: 'Verlauf geloescht', - clearHistoryDoneMessage: 'Der Suchverlauf wurde entfernt.', - logout: 'Abmelden', - logoutHint: 'Zurueck zum Onboarding und Profil zuruecksetzen.', - logoutConfirmTitle: 'Abmelden?', - logoutConfirmMessage: 'Du wirst auf den Startbildschirm zurueckgesetzt.', - deleteAccount: 'Konto unwiderruflich löschen', - deleteAccountHint: 'Löscht alle deine Daten, Pflanzen und Abos permanent.', - deleteConfirmTitle: 'Konto wirklich löschen?', - deleteConfirmMessage: 'Achtung: Dieser Schritt kann nicht rückgängig gemacht werden. Alle deine Pflanzen, Scans und Credits gehen sofort verloren.', - deleteActionBtn: 'Ja, dauerhaft löschen', - genericErrorTitle: 'Fehler', - genericErrorMessage: 'Aktion konnte nicht abgeschlossen werden.', - }; - } - - if (language === 'es') { - return { - title: 'Datos y Privacidad', - exportData: 'Exportar Datos', - exportHint: 'Comparte tu coleccion como JSON.', - clearHistory: 'Borrar historial', - clearHistoryHint: 'Elimina las busquedas recientes.', - clearHistoryDoneTitle: 'Historial borrado', - clearHistoryDoneMessage: 'El historial de busqueda ha sido eliminado.', - logout: 'Cerrar sesion', - logoutHint: 'Volver a la pantalla de inicio y reiniciar perfil.', - logoutConfirmTitle: 'Cerrar sesion?', - logoutConfirmMessage: 'Seras enviado a la pantalla de inicio.', - deleteAccount: 'Eliminar cuenta permanentemente', - deleteAccountHint: 'Elimina todos tus datos, plantas y suscripciones.', - deleteConfirmTitle: '¿Seguro que quieres eliminar tu cuenta?', - deleteConfirmMessage: 'Atención: Este paso no se puede deshacer. Todas tus plantas, escaneos y créditos se perderán inmediatamente.', - deleteActionBtn: 'Sí, eliminar permanentemente', - genericErrorTitle: 'Error', - genericErrorMessage: 'La accion no pudo ser completada.', - }; - } - - return { - title: 'Data & Privacy', - exportData: 'Export Data', - exportHint: 'Share your collection as JSON.', - clearHistory: 'Clear Search History', - clearHistoryHint: 'Removes recent search queries.', - clearHistoryDoneTitle: 'History Cleared', - clearHistoryDoneMessage: 'Search history has been removed.', - logout: 'Log Out', - logoutHint: 'Return to onboarding and reset profile.', - logoutConfirmTitle: 'Log Out?', - logoutConfirmMessage: 'You will be returned to the start screen.', - deleteAccount: 'Delete Account Permanently', - deleteAccountHint: 'Permanently deletes all your data, plants, and subscriptions.', - deleteConfirmTitle: 'Are you sure?', - deleteConfirmMessage: 'Warning: This cannot be undone. All your plants, scans, and credits will be lost immediately.', - deleteActionBtn: 'Yes, delete permanently', - genericErrorTitle: 'Error', - genericErrorMessage: 'Action could not be completed.', - }; -}; - -export default function DataScreen() { - const router = useRouter(); - const { isDarkMode, language, plants, appearanceMode, colorPalette, clearLexiconSearchHistory, signOut } = useApp(); - const colors = useColors(isDarkMode, colorPalette); - const copy = getDataCopy(language); - - const handleExportData = async () => { - try { - const dataStr = JSON.stringify(plants, null, 2); - await Share.share({ - message: dataStr, - title: 'GreenLens_Export.json', - }); - } catch { - Alert.alert(copy.genericErrorTitle, copy.genericErrorMessage); - } - }; - - const handleClearHistory = () => { - clearLexiconSearchHistory(); - Alert.alert(copy.clearHistoryDoneTitle, copy.clearHistoryDoneMessage); - }; - - const handleLogout = () => { - Alert.alert(copy.logoutConfirmTitle, copy.logoutConfirmMessage, [ - { text: 'Cancel', style: 'cancel' }, - { - text: copy.logout, - style: 'destructive', - onPress: async () => { - await signOut(); - router.replace('/auth/login'); - }, - }, - ]); - }; - - const handleDeleteAccount = () => { - Alert.alert(copy.deleteConfirmTitle, copy.deleteConfirmMessage, [ - { text: 'Cancel', style: 'cancel' }, - { - text: copy.deleteActionBtn, - style: 'destructive', - onPress: async () => { - // Future implementation: call backend to wipe user data, cancel active Stripe subscriptions - await signOut(); - router.replace('/onboarding'); - }, - }, - ]); - }; - - return ( - - - - - router.back()} style={styles.backButton}> - - - {copy.title} - - - - - - - - - - {copy.exportData} - {copy.exportHint} - - - - - - - - - {copy.clearHistory} - {copy.clearHistoryHint} - - - - - - - - - {copy.logout} - {copy.logoutHint} - - - - - - - - - - {copy.deleteAccount} - {copy.deleteAccountHint} - - - - - - - ); -} - -const styles = StyleSheet.create({ - safeArea: { flex: 1 }, - header: { flexDirection: 'row', alignItems: 'center', padding: 16 }, - backButton: { width: 40, height: 40, justifyContent: 'center' }, - title: { flex: 1, fontSize: 20, fontWeight: '700', textAlign: 'center' }, - scrollContent: { padding: 16, gap: 16 }, - actionRow: { - flexDirection: 'row', - alignItems: 'center', - padding: 16, - borderRadius: 16, - borderWidth: StyleSheet.hairlineWidth, - marginBottom: 16, - }, - actionIcon: { - width: 40, - height: 40, - borderRadius: 20, - backgroundColor: '#00000010', - justifyContent: 'center', - alignItems: 'center', - marginRight: 16, - }, - actionTextContainer: { - flex: 1, - }, - actionTitle: { - fontSize: 16, - fontWeight: '600', - marginBottom: 4, - }, - actionHint: { - fontSize: 13, - }, -}); +import React from 'react'; +import { View, Text, TouchableOpacity, ScrollView, StyleSheet, Share, Alert } from 'react-native'; +import { SafeAreaView } from 'react-native-safe-area-context'; +import { Ionicons } from '@expo/vector-icons'; +import { useRouter } from 'expo-router'; +import { useApp } from '../../context/AppContext'; +import { useColors } from '../../constants/Colors'; +import { ThemeBackdrop } from '../../components/ThemeBackdrop'; +import { Language } from '../../types'; + +const getDataCopy = (language: Language) => { + if (language === 'de') { + return { + title: 'Daten & Datenschutz', + exportData: 'Daten exportieren', + exportHint: 'Teilt deine Sammlung als JSON.', + clearHistory: 'Lexikon-Verlauf loeschen', + clearHistoryHint: 'Entfernt alle letzten Suchbegriffe.', + clearHistoryDoneTitle: 'Verlauf geloescht', + clearHistoryDoneMessage: 'Der Suchverlauf wurde entfernt.', + logout: 'Abmelden', + logoutHint: 'Zurueck zum Onboarding und Profil zuruecksetzen.', + logoutConfirmTitle: 'Abmelden?', + logoutConfirmMessage: 'Du wirst auf den Startbildschirm zurueckgesetzt.', + deleteAccount: 'Konto unwiderruflich löschen', + deleteAccountHint: 'Löscht alle deine Daten, Pflanzen und Abos permanent.', + deleteConfirmTitle: 'Konto wirklich löschen?', + deleteConfirmMessage: 'Achtung: Dieser Schritt kann nicht rückgängig gemacht werden. Alle deine Pflanzen, Scans und Credits gehen sofort verloren.', + deleteActionBtn: 'Ja, dauerhaft löschen', + genericErrorTitle: 'Fehler', + genericErrorMessage: 'Aktion konnte nicht abgeschlossen werden.', + }; + } + + if (language === 'es') { + return { + title: 'Datos y Privacidad', + exportData: 'Exportar Datos', + exportHint: 'Comparte tu coleccion como JSON.', + clearHistory: 'Borrar historial', + clearHistoryHint: 'Elimina las busquedas recientes.', + clearHistoryDoneTitle: 'Historial borrado', + clearHistoryDoneMessage: 'El historial de busqueda ha sido eliminado.', + logout: 'Cerrar sesion', + logoutHint: 'Volver a la pantalla de inicio y reiniciar perfil.', + logoutConfirmTitle: 'Cerrar sesion?', + logoutConfirmMessage: 'Seras enviado a la pantalla de inicio.', + deleteAccount: 'Eliminar cuenta permanentemente', + deleteAccountHint: 'Elimina todos tus datos, plantas y suscripciones.', + deleteConfirmTitle: '¿Seguro que quieres eliminar tu cuenta?', + deleteConfirmMessage: 'Atención: Este paso no se puede deshacer. Todas tus plantas, escaneos y créditos se perderán inmediatamente.', + deleteActionBtn: 'Sí, eliminar permanentemente', + genericErrorTitle: 'Error', + genericErrorMessage: 'La accion no pudo ser completada.', + }; + } + + return { + title: 'Data & Privacy', + exportData: 'Export Data', + exportHint: 'Share your collection as JSON.', + clearHistory: 'Clear Search History', + clearHistoryHint: 'Removes recent search queries.', + clearHistoryDoneTitle: 'History Cleared', + clearHistoryDoneMessage: 'Search history has been removed.', + logout: 'Log Out', + logoutHint: 'Return to onboarding and reset profile.', + logoutConfirmTitle: 'Log Out?', + logoutConfirmMessage: 'You will be returned to the start screen.', + deleteAccount: 'Delete Account Permanently', + deleteAccountHint: 'Permanently deletes all your data, plants, and subscriptions.', + deleteConfirmTitle: 'Are you sure?', + deleteConfirmMessage: 'Warning: This cannot be undone. All your plants, scans, and credits will be lost immediately.', + deleteActionBtn: 'Yes, delete permanently', + genericErrorTitle: 'Error', + genericErrorMessage: 'Action could not be completed.', + }; +}; + +export default function DataScreen() { + const router = useRouter(); + const { isDarkMode, language, plants, appearanceMode, colorPalette, clearLexiconSearchHistory, signOut } = useApp(); + const colors = useColors(isDarkMode, colorPalette); + const copy = getDataCopy(language); + + const handleExportData = async () => { + try { + const dataStr = JSON.stringify(plants, null, 2); + await Share.share({ + message: dataStr, + title: 'GreenLens_Export.json', + }); + } catch { + Alert.alert(copy.genericErrorTitle, copy.genericErrorMessage); + } + }; + + const handleClearHistory = () => { + clearLexiconSearchHistory(); + Alert.alert(copy.clearHistoryDoneTitle, copy.clearHistoryDoneMessage); + }; + + const handleLogout = () => { + Alert.alert(copy.logoutConfirmTitle, copy.logoutConfirmMessage, [ + { text: 'Cancel', style: 'cancel' }, + { + text: copy.logout, + style: 'destructive', + onPress: async () => { + await signOut(); + router.replace('/auth/login'); + }, + }, + ]); + }; + + const handleDeleteAccount = () => { + Alert.alert(copy.deleteConfirmTitle, copy.deleteConfirmMessage, [ + { text: 'Cancel', style: 'cancel' }, + { + text: copy.deleteActionBtn, + style: 'destructive', + onPress: async () => { + // Future implementation: call backend to wipe user data, cancel active Stripe subscriptions + await signOut(); + router.replace('/onboarding'); + }, + }, + ]); + }; + + return ( + + + + + router.back()} style={styles.backButton}> + + + {copy.title} + + + + + + + + + + {copy.exportData} + {copy.exportHint} + + + + + + + + + {copy.clearHistory} + {copy.clearHistoryHint} + + + + + + + + + {copy.logout} + {copy.logoutHint} + + + + + + + + + + {copy.deleteAccount} + {copy.deleteAccountHint} + + + + + + + ); +} + +const styles = StyleSheet.create({ + safeArea: { flex: 1 }, + header: { flexDirection: 'row', alignItems: 'center', padding: 16 }, + backButton: { width: 40, height: 40, justifyContent: 'center' }, + title: { flex: 1, fontSize: 20, fontWeight: '700', textAlign: 'center' }, + scrollContent: { padding: 16, gap: 16 }, + actionRow: { + flexDirection: 'row', + alignItems: 'center', + padding: 16, + borderRadius: 16, + borderWidth: StyleSheet.hairlineWidth, + marginBottom: 16, + }, + actionIcon: { + width: 40, + height: 40, + borderRadius: 20, + backgroundColor: '#00000010', + justifyContent: 'center', + alignItems: 'center', + marginRight: 16, + }, + actionTextContainer: { + flex: 1, + }, + actionTitle: { + fontSize: 16, + fontWeight: '600', + marginBottom: 4, + }, + actionHint: { + fontSize: 13, + }, +}); diff --git a/app/profile/preferences.tsx b/app/profile/preferences.tsx index 31f1207..9ad07b9 100644 --- a/app/profile/preferences.tsx +++ b/app/profile/preferences.tsx @@ -1,229 +1,229 @@ -import React, { useState } from 'react'; -import { View, Text, TouchableOpacity, ScrollView, StyleSheet } from 'react-native'; -import { SafeAreaView } from 'react-native-safe-area-context'; -import { Ionicons } from '@expo/vector-icons'; -import { useRouter } from 'expo-router'; -import { useApp } from '../../context/AppContext'; -import { useColors } from '../../constants/Colors'; -import { ThemeBackdrop } from '../../components/ThemeBackdrop'; -import { AppearanceMode, ColorPalette, Language } from '../../types'; - -const PALETTE_SWATCHES: Record = { - forest: ['#5fa779', '#3d7f57'], - ocean: ['#5a90be', '#3d6f99'], - sunset: ['#c98965', '#a36442'], - mono: ['#7b8796', '#5b6574'], -}; - -const getPreferencesCopy = (language: Language) => { - if (language === 'de') { - return { - title: 'Einstellungen', - appearanceMode: 'Modell', - colorPalette: 'Farbpalette', - languageLabel: 'Sprache', - themeSystem: 'System', - themeLight: 'Hell', - themeDark: 'Dunkel', - paletteForest: 'Forest', - paletteOcean: 'Ocean', - paletteSunset: 'Sunset', - paletteMono: 'Mono', - }; - } else if (language === 'es') { - return { - title: 'Ajustes', - appearanceMode: 'Modo', - colorPalette: 'Paleta', - languageLabel: 'Idioma', - themeSystem: 'Sistema', - themeLight: 'Claro', - themeDark: 'Oscuro', - paletteForest: 'Forest', - paletteOcean: 'Ocean', - paletteSunset: 'Sunset', - paletteMono: 'Mono', - }; - } - return { - title: 'Preferences', - appearanceMode: 'Appearance Mode', - colorPalette: 'Color Palette', - languageLabel: 'Language', - themeSystem: 'System', - themeLight: 'Light', - themeDark: 'Dark', - paletteForest: 'Forest', - paletteOcean: 'Ocean', - paletteSunset: 'Sunset', - paletteMono: 'Mono', - }; -}; - -export default function PreferencesScreen() { - const router = useRouter(); - const { isDarkMode, appearanceMode, colorPalette, language, setAppearanceMode, setColorPalette, changeLanguage } = useApp(); - const colors = useColors(isDarkMode, colorPalette); - const copy = getPreferencesCopy(language); - - return ( - - - - - router.back()} style={styles.backButton}> - - - {copy.title} - - - - - - {copy.appearanceMode} - - {(['system', 'light', 'dark'] as AppearanceMode[]).map((mode) => { - const isActive = appearanceMode === mode; - const label = mode === 'system' ? copy.themeSystem : mode === 'light' ? copy.themeLight : copy.themeDark; - return ( - setAppearanceMode(mode)} - > - - {label} - - - ); - })} - - - - - {copy.colorPalette} - - {(['forest', 'ocean', 'sunset', 'mono'] as ColorPalette[]).map((p) => { - const isActive = colorPalette === p; - const swatch = PALETTE_SWATCHES[p] || ['#ccc', '#999']; - const label = p === 'forest' ? copy.paletteForest : p === 'ocean' ? copy.paletteOcean : p === 'sunset' ? copy.paletteSunset : copy.paletteMono; - return ( - setColorPalette(p)} - > - - {label} - - ); - })} - - - - - {copy.languageLabel} - - {(['en', 'de', 'es'] as Language[]).map(lang => { - const isActive = language === lang; - const label = lang === 'en' ? 'English' : lang === 'de' ? 'Deutsch' : 'Español'; - return ( - changeLanguage(lang)} - > - - {label} - - - ); - })} - - - - - - - ); -} - -const styles = StyleSheet.create({ - safeArea: { flex: 1 }, - header: { flexDirection: 'row', alignItems: 'center', padding: 16 }, - backButton: { width: 40, height: 40, justifyContent: 'center' }, - title: { flex: 1, fontSize: 20, fontWeight: '700', textAlign: 'center' }, - scrollContent: { padding: 16, gap: 16 }, - card: { - padding: 16, - borderRadius: 16, - borderWidth: StyleSheet.hairlineWidth, - }, - sectionTitle: { - fontSize: 14, - fontWeight: '600', - textTransform: 'uppercase', - letterSpacing: 0.5, - marginBottom: 16, - }, - segmentedControl: { - flexDirection: 'row', - backgroundColor: '#00000010', - borderRadius: 12, - padding: 4, - }, - segmentBtn: { - flex: 1, - paddingVertical: 10, - alignItems: 'center', - borderRadius: 8, - }, - segmentText: { - fontSize: 14, - fontWeight: '500', - }, - swatchContainer: { - flexDirection: 'row', - justifyContent: 'space-between', - }, - swatchWrap: { - alignItems: 'center', - padding: 4, - borderRadius: 12, - borderWidth: 2, - borderColor: 'transparent', - gap: 6, - }, - swatch: { - width: 48, - height: 48, - borderRadius: 24, - }, - swatchLabel: { - fontSize: 12, - fontWeight: '500', - }, - langRow: { - flexDirection: 'row', - flexWrap: 'wrap', - gap: 12, - }, - langBtn: { - paddingHorizontal: 16, - paddingVertical: 10, - borderRadius: 12, - backgroundColor: '#00000010', - }, -}); +import React, { useState } from 'react'; +import { View, Text, TouchableOpacity, ScrollView, StyleSheet } from 'react-native'; +import { SafeAreaView } from 'react-native-safe-area-context'; +import { Ionicons } from '@expo/vector-icons'; +import { useRouter } from 'expo-router'; +import { useApp } from '../../context/AppContext'; +import { useColors } from '../../constants/Colors'; +import { ThemeBackdrop } from '../../components/ThemeBackdrop'; +import { AppearanceMode, ColorPalette, Language } from '../../types'; + +const PALETTE_SWATCHES: Record = { + forest: ['#5fa779', '#3d7f57'], + ocean: ['#5a90be', '#3d6f99'], + sunset: ['#c98965', '#a36442'], + mono: ['#7b8796', '#5b6574'], +}; + +const getPreferencesCopy = (language: Language) => { + if (language === 'de') { + return { + title: 'Einstellungen', + appearanceMode: 'Modell', + colorPalette: 'Farbpalette', + languageLabel: 'Sprache', + themeSystem: 'System', + themeLight: 'Hell', + themeDark: 'Dunkel', + paletteForest: 'Forest', + paletteOcean: 'Ocean', + paletteSunset: 'Sunset', + paletteMono: 'Mono', + }; + } else if (language === 'es') { + return { + title: 'Ajustes', + appearanceMode: 'Modo', + colorPalette: 'Paleta', + languageLabel: 'Idioma', + themeSystem: 'Sistema', + themeLight: 'Claro', + themeDark: 'Oscuro', + paletteForest: 'Forest', + paletteOcean: 'Ocean', + paletteSunset: 'Sunset', + paletteMono: 'Mono', + }; + } + return { + title: 'Preferences', + appearanceMode: 'Appearance Mode', + colorPalette: 'Color Palette', + languageLabel: 'Language', + themeSystem: 'System', + themeLight: 'Light', + themeDark: 'Dark', + paletteForest: 'Forest', + paletteOcean: 'Ocean', + paletteSunset: 'Sunset', + paletteMono: 'Mono', + }; +}; + +export default function PreferencesScreen() { + const router = useRouter(); + const { isDarkMode, appearanceMode, colorPalette, language, setAppearanceMode, setColorPalette, changeLanguage } = useApp(); + const colors = useColors(isDarkMode, colorPalette); + const copy = getPreferencesCopy(language); + + return ( + + + + + router.back()} style={styles.backButton}> + + + {copy.title} + + + + + + {copy.appearanceMode} + + {(['system', 'light', 'dark'] as AppearanceMode[]).map((mode) => { + const isActive = appearanceMode === mode; + const label = mode === 'system' ? copy.themeSystem : mode === 'light' ? copy.themeLight : copy.themeDark; + return ( + setAppearanceMode(mode)} + > + + {label} + + + ); + })} + + + + + {copy.colorPalette} + + {(['forest', 'ocean', 'sunset', 'mono'] as ColorPalette[]).map((p) => { + const isActive = colorPalette === p; + const swatch = PALETTE_SWATCHES[p] || ['#ccc', '#999']; + const label = p === 'forest' ? copy.paletteForest : p === 'ocean' ? copy.paletteOcean : p === 'sunset' ? copy.paletteSunset : copy.paletteMono; + return ( + setColorPalette(p)} + > + + {label} + + ); + })} + + + + + {copy.languageLabel} + + {(['en', 'de', 'es'] as Language[]).map(lang => { + const isActive = language === lang; + const label = lang === 'en' ? 'English' : lang === 'de' ? 'Deutsch' : 'Español'; + return ( + changeLanguage(lang)} + > + + {label} + + + ); + })} + + + + + + + ); +} + +const styles = StyleSheet.create({ + safeArea: { flex: 1 }, + header: { flexDirection: 'row', alignItems: 'center', padding: 16 }, + backButton: { width: 40, height: 40, justifyContent: 'center' }, + title: { flex: 1, fontSize: 20, fontWeight: '700', textAlign: 'center' }, + scrollContent: { padding: 16, gap: 16 }, + card: { + padding: 16, + borderRadius: 16, + borderWidth: StyleSheet.hairlineWidth, + }, + sectionTitle: { + fontSize: 14, + fontWeight: '600', + textTransform: 'uppercase', + letterSpacing: 0.5, + marginBottom: 16, + }, + segmentedControl: { + flexDirection: 'row', + backgroundColor: '#00000010', + borderRadius: 12, + padding: 4, + }, + segmentBtn: { + flex: 1, + paddingVertical: 10, + alignItems: 'center', + borderRadius: 8, + }, + segmentText: { + fontSize: 14, + fontWeight: '500', + }, + swatchContainer: { + flexDirection: 'row', + justifyContent: 'space-between', + }, + swatchWrap: { + alignItems: 'center', + padding: 4, + borderRadius: 12, + borderWidth: 2, + borderColor: 'transparent', + gap: 6, + }, + swatch: { + width: 48, + height: 48, + borderRadius: 24, + }, + swatchLabel: { + fontSize: 12, + fontWeight: '500', + }, + langRow: { + flexDirection: 'row', + flexWrap: 'wrap', + gap: 12, + }, + langBtn: { + paddingHorizontal: 16, + paddingVertical: 10, + borderRadius: 12, + backgroundColor: '#00000010', + }, +}); diff --git a/app/scanner.tsx b/app/scanner.tsx index e74f64e..eae2e71 100644 --- a/app/scanner.tsx +++ b/app/scanner.tsx @@ -1,669 +1,690 @@ -import React, { useEffect, useRef, useState } from 'react'; -import { - View, Text, StyleSheet, TouchableOpacity, Image, Alert, Animated, Easing, -} from 'react-native'; -import { useLocalSearchParams, useRouter } from 'expo-router'; -import { Ionicons } from '@expo/vector-icons'; -import { CameraView, useCameraPermissions } from 'expo-camera'; -import { useSafeAreaInsets } from 'react-native-safe-area-context'; -import * as ImagePicker from 'expo-image-picker'; -import * as Haptics from 'expo-haptics'; -import { usePostHog } from 'posthog-react-native'; -import { useApp } from '../context/AppContext'; -import { useColors } from '../constants/Colors'; -import { PlantRecognitionService } from '../services/plantRecognitionService'; -import { IdentificationResult } from '../types'; -import { ResultCard } from '../components/ResultCard'; -import { backendApiClient, isInsufficientCreditsError } from '../services/backend/backendApiClient'; -import { isBackendApiError } from '../services/backend/contracts'; -import { createIdempotencyKey } from '../utils/idempotency'; - -const HEALTH_CHECK_CREDIT_COST = 2; - -const getBillingCopy = (language: 'de' | 'en' | 'es') => { - if (language === 'de') { - return { - creditsLabel: 'Credits', - noCreditsTitle: 'Keine Credits mehr', - noCreditsMessage: 'Du hast keine Credits mehr fuer KI-Scans. Upgrade oder Top-up im Profil.', - healthNoCreditsMessage: `Du brauchst ${HEALTH_CHECK_CREDIT_COST} Credits fuer den Health-Check.`, - managePlan: 'Plan verwalten', - dismiss: 'Schliessen', - genericErrorTitle: 'Fehler', - genericErrorMessage: 'Analyse fehlgeschlagen.', - providerErrorMessage: 'KI-Scan gerade nicht verfuegbar. Bitte API-Key/Netzwerk pruefen.', - healthProviderErrorMessage: 'KI-Health-Check gerade nicht verfuegbar. Bitte API-Key/Netzwerk pruefen.', - healthTitle: 'Health Check', - healthDoneTitle: 'Health Check abgeschlossen', - healthDoneMessage: 'Neues Foto wurde geprueft und zur Galerie hinzugefuegt.', - signupLabel: 'Registrieren', - }; - } - - if (language === 'es') { - return { - creditsLabel: 'Creditos', - noCreditsTitle: 'Sin creditos', - noCreditsMessage: 'No tienes creditos para escaneos AI. Actualiza o compra top-up en Perfil.', - healthNoCreditsMessage: `Necesitas ${HEALTH_CHECK_CREDIT_COST} creditos para el health-check.`, - managePlan: 'Gestionar plan', - dismiss: 'Cerrar', - genericErrorTitle: 'Error', - genericErrorMessage: 'Analisis fallido.', - providerErrorMessage: 'Escaneo IA no disponible ahora. Revisa API key y red.', - healthProviderErrorMessage: 'Health-check IA no disponible ahora. Revisa API key y red.', - healthTitle: 'Health Check', - healthDoneTitle: 'Health-check completado', - healthDoneMessage: 'La foto nueva fue analizada y guardada en la galeria.', - signupLabel: 'Registrarse', - }; - } - - return { - creditsLabel: 'Credits', - noCreditsTitle: 'No credits left', - noCreditsMessage: 'You have no AI scan credits left. Upgrade or buy a top-up in Profile.', - healthNoCreditsMessage: `You need ${HEALTH_CHECK_CREDIT_COST} credits for the health check.`, - managePlan: 'Manage plan', - dismiss: 'Close', - genericErrorTitle: 'Error', - genericErrorMessage: 'Analysis failed.', - providerErrorMessage: 'AI scan is unavailable right now. Check API key and network.', - healthProviderErrorMessage: 'AI health check is unavailable right now. Check API key and network.', - healthTitle: 'Health Check', - healthDoneTitle: 'Health Check Complete', - healthDoneMessage: 'The new photo was analyzed and added to gallery.', - signupLabel: 'Sign Up', - }; -}; - -export default function ScannerScreen() { - const params = useLocalSearchParams<{ mode?: string; plantId?: string }>(); - const posthog = usePostHog(); - const { - isDarkMode, - colorPalette, - language, - t, - savePlant, - plants, - updatePlant, - billingSummary, - refreshBillingSummary, - isLoadingBilling, - session, - setPendingPlant, - guestScanCount, - incrementGuestScanCount, - } = useApp(); - const colors = useColors(isDarkMode, colorPalette); - const router = useRouter(); - const insets = useSafeAreaInsets(); - const billingCopy = getBillingCopy(language); - const isHealthMode = params.mode === 'health'; - const healthPlantId = Array.isArray(params.plantId) ? params.plantId[0] : params.plantId; - const healthPlant = isHealthMode && healthPlantId - ? plants.find((item) => item.id === healthPlantId) - : null; - const availableCredits = session - ? (billingSummary?.credits.available ?? 0) - : Math.max(0, 5 - guestScanCount); - - const [permission, requestPermission] = useCameraPermissions(); - const [selectedImage, setSelectedImage] = useState(null); - const [isAnalyzing, setIsAnalyzing] = useState(false); - const [analysisProgress, setAnalysisProgress] = useState(0); - const [analysisResult, setAnalysisResult] = useState(null); - const cameraRef = useRef(null); - const scanLineProgress = useRef(new Animated.Value(0)).current; - const scanPulse = useRef(new Animated.Value(0)).current; - - useEffect(() => { - if (!isAnalyzing) { - scanLineProgress.stopAnimation(); - scanLineProgress.setValue(0); - scanPulse.stopAnimation(); - scanPulse.setValue(0); - return; - } - - const lineAnimation = Animated.loop( - Animated.sequence([ - Animated.timing(scanLineProgress, { - toValue: 1, - duration: 1500, - easing: Easing.inOut(Easing.quad), - useNativeDriver: true, - }), - Animated.timing(scanLineProgress, { - toValue: 0, - duration: 1500, - easing: Easing.inOut(Easing.quad), - useNativeDriver: true, - }), - ]) - ); - - const pulseAnimation = Animated.loop( - Animated.sequence([ - Animated.timing(scanPulse, { toValue: 1, duration: 900, useNativeDriver: true }), - Animated.timing(scanPulse, { toValue: 0, duration: 900, useNativeDriver: true }), - ]) - ); - - lineAnimation.start(); - pulseAnimation.start(); - - return () => { - lineAnimation.stop(); - pulseAnimation.stop(); - }; - }, [isAnalyzing, scanLineProgress, scanPulse]); - - const analyzeImage = async (imageUri: string, galleryImageUri?: string) => { - if (isAnalyzing) return; - - if (availableCredits <= 0) { - Alert.alert( - billingCopy.noCreditsTitle, - isHealthMode ? billingCopy.healthNoCreditsMessage : billingCopy.noCreditsMessage, - [ - { text: billingCopy.dismiss, style: 'cancel' }, - { - text: billingCopy.signupLabel, - onPress: () => router.push('/auth/signup'), - }, - ], - ); - return; - } - - setIsAnalyzing(true); - setAnalysisProgress(0); - setAnalysisResult(null); - - const startTime = Date.now(); - - const progressInterval = setInterval(() => { - setAnalysisProgress((prev) => { - if (prev < 30) return prev + Math.random() * 8; - if (prev < 70) return prev + Math.random() * 2; - if (prev < 90) return prev + 0.5; - return prev; - }); - }, 150); - - try { - if (isHealthMode) { - if (!healthPlant) { - Alert.alert(billingCopy.genericErrorTitle, billingCopy.genericErrorMessage); - setSelectedImage(null); - setIsAnalyzing(false); - return; - } - - const response = await backendApiClient.runHealthCheck({ - idempotencyKey: createIdempotencyKey('health-check', healthPlant.id), - imageUri, - language, - plantContext: { - name: healthPlant.name, - botanicalName: healthPlant.botanicalName, - careInfo: healthPlant.careInfo, - description: healthPlant.description, - }, - }); - - posthog.capture('llm_generation', { - scan_type: 'health_check', - success: true, - latency_ms: Date.now() - startTime, - }); - - if (!session) { - incrementGuestScanCount(); - } - - const currentGallery = healthPlant.gallery || []; - const existingChecks = healthPlant.healthChecks || []; - const updatedChecks = [response.healthCheck, ...existingChecks].slice(0, 6); - const updatedPlant = { - ...healthPlant, - gallery: galleryImageUri ? [...currentGallery, galleryImageUri] : currentGallery, - healthChecks: updatedChecks, - }; - await updatePlant(updatedPlant); - } else { - const result = await PlantRecognitionService.identify(imageUri, language, { - idempotencyKey: createIdempotencyKey('scan-plant'), - }); - - posthog.capture('llm_generation', { - scan_type: 'identification', - success: true, - latency_ms: Date.now() - startTime, - }); - - if (!session) { - incrementGuestScanCount(); - } - - setAnalysisResult(result); - } - setAnalysisProgress(100); - await Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success); - await new Promise(resolve => setTimeout(resolve, 500)); - setIsAnalyzing(false); - if (isHealthMode && healthPlant) { - Alert.alert(billingCopy.healthDoneTitle, billingCopy.healthDoneMessage, [ - { text: billingCopy.dismiss, onPress: () => router.replace(`/plant/${healthPlant.id}`) }, - ]); - } - } catch (error) { - console.error('Analysis failed', error); - - posthog.capture('llm_generation', { - scan_type: isHealthMode ? 'health_check' : 'identification', - success: false, - error_type: isInsufficientCreditsError(error) ? 'insufficient_credits' : 'provider_error', - latency_ms: Date.now() - startTime, - }); - - if (isInsufficientCreditsError(error)) { - Alert.alert( - billingCopy.noCreditsTitle, - isHealthMode ? billingCopy.healthNoCreditsMessage : billingCopy.noCreditsMessage, - [ - { text: billingCopy.dismiss, style: 'cancel' }, - { - text: billingCopy.managePlan, - onPress: () => router.replace('/(tabs)/profile'), - }, - ], - ); - } else if ( - isBackendApiError(error) && - (error.code === 'PROVIDER_ERROR' || error.code === 'TIMEOUT') - ) { - Alert.alert( - billingCopy.genericErrorTitle, - isHealthMode ? billingCopy.healthProviderErrorMessage : billingCopy.providerErrorMessage, - ); - } else { - Alert.alert(billingCopy.genericErrorTitle, billingCopy.genericErrorMessage); - } - setSelectedImage(null); - setIsAnalyzing(false); - } finally { - clearInterval(progressInterval); - await refreshBillingSummary(); - } - }; - - const takePicture = async () => { - if (!cameraRef.current || isAnalyzing) return; - await Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Medium); - const photo = await cameraRef.current.takePictureAsync({ base64: true, quality: 0.7 }); - if (photo) { - const analysisUri = photo.base64 - ? `data:image/jpeg;base64,${photo.base64}` - : photo.uri; - const galleryUri = photo.uri || analysisUri; - setSelectedImage(analysisUri); - analyzeImage(analysisUri, galleryUri); - } - }; - - const pickImage = async () => { - if (isAnalyzing) return; - - const result = await ImagePicker.launchImageLibraryAsync({ - mediaTypes: ['images'], - quality: 0.7, - base64: true, - }); - if (!result.canceled && result.assets[0]) { - const asset = result.assets[0]; - const uri = asset.base64 - ? `data:image/jpeg;base64,${asset.base64}` - : asset.uri; - - setSelectedImage(uri); - analyzeImage(uri, asset.uri || uri); - } - }; - - const handleSave = async () => { - if (analysisResult && selectedImage) { - if (!session) { - // Guest mode: store result and go to signup - setPendingPlant(analysisResult, selectedImage); - router.replace('/auth/signup'); - return; - } - - try { - await savePlant(analysisResult, selectedImage); - router.back(); - } catch (error) { - console.error('Saving identified plant failed', error); - Alert.alert(billingCopy.genericErrorTitle, billingCopy.genericErrorMessage); - } - } - }; - - const handleClose = () => { - router.back(); - }; - - const controlsPaddingBottom = Math.max(20, insets.bottom + 10); - const controlsPanelHeight = 28 + 80 + controlsPaddingBottom; - const analysisBottomOffset = controlsPanelHeight + 12; - const scanLineTranslateY = scanLineProgress.interpolate({ - inputRange: [0, 1], - outputRange: [24, 280], - }); - const scanPulseScale = scanPulse.interpolate({ - inputRange: [0, 1], - outputRange: [0.98, 1.02], - }); - const scanPulseOpacity = scanPulse.interpolate({ - inputRange: [0, 1], - outputRange: [0.22, 0.55], - }); - - // Show result - if (!isHealthMode && analysisResult && selectedImage) { - return ( - - ); - } - - // Camera permission - if (!permission?.granted) { - return ( - - - Camera access is required to scan plants. - - Grant Permission - - - Cancel - - - ); - } - - return ( - - {/* Header */} - - - - - - {isHealthMode ? billingCopy.healthTitle : t.scanner} - - - - - {billingCopy.creditsLabel}: {availableCredits} - - - - - {/* Camera */} - - {selectedImage ? ( - - ) : ( - - )} - - {/* Scan Frame */} - - {selectedImage && ( - - )} - {isAnalyzing && ( - <> - - - - )} - - - - - - - - {/* Analyzing Overlay */} - {isAnalyzing && ( - - - - - - {analysisProgress < 100 ? t.analyzing : t.result} - - - - {Math.round(analysisProgress)}% - - - - - - - - - {t.localProcessing} - - - {analysisProgress < 30 ? t.scanStage1 : analysisProgress < 75 ? t.scanStage2 : t.scanStage3} - - - - )} - - {/* Bottom Controls */} - - - - {t.gallery} - - - - - - - - - {t.help} - - - - ); -} - -const styles = StyleSheet.create({ - container: { flex: 1 }, - header: { - position: 'absolute', - top: 0, - left: 0, - right: 0, - zIndex: 10, - flexDirection: 'row', - justifyContent: 'space-between', - alignItems: 'center', - paddingTop: 60, - paddingHorizontal: 24, - }, - headerTitle: { fontSize: 18, fontWeight: '600' }, - creditBadge: { - borderWidth: 1, - borderRadius: 14, - paddingHorizontal: 8, - paddingVertical: 4, - flexDirection: 'row', - alignItems: 'center', - gap: 4, - }, - creditBadgeText: { fontSize: 10, fontWeight: '700' }, - cameraContainer: { - flex: 1, - justifyContent: 'center', - alignItems: 'center', - }, - scanFrame: { - width: 256, - height: 320, - borderWidth: 2.5, - borderColor: '#ffffff50', - borderRadius: 28, - overflow: 'hidden', - }, - scanPulseFrame: { - ...StyleSheet.absoluteFillObject, - borderWidth: 1.5, - borderRadius: 28, - }, - scanLine: { - position: 'absolute', - left: 16, - right: 16, - height: 2, - borderRadius: 999, - shadowColor: '#ffffff', - shadowOffset: { width: 0, height: 0 }, - shadowOpacity: 0.8, - shadowRadius: 8, - elevation: 6, - }, - corner: { position: 'absolute', width: 24, height: 24 }, - tl: { top: 16, left: 16, borderTopWidth: 4, borderLeftWidth: 4, borderTopLeftRadius: 12 }, - tr: { top: 16, right: 16, borderTopWidth: 4, borderRightWidth: 4, borderTopRightRadius: 12 }, - bl: { bottom: 16, left: 16, borderBottomWidth: 4, borderLeftWidth: 4, borderBottomLeftRadius: 12 }, - br: { bottom: 16, right: 16, borderBottomWidth: 4, borderRightWidth: 4, borderBottomRightRadius: 12 }, - controls: { - borderTopLeftRadius: 28, - borderTopRightRadius: 28, - paddingHorizontal: 32, - paddingTop: 28, - flexDirection: 'row', - justifyContent: 'space-between', - alignItems: 'center', - }, - controlBtn: { alignItems: 'center', gap: 6 }, - controlBtnDisabled: { opacity: 0.5 }, - controlLabel: { fontSize: 11, fontWeight: '500' }, - shutterBtn: { - width: 80, - height: 80, - borderRadius: 40, - borderWidth: 4, - justifyContent: 'center', - alignItems: 'center', - shadowColor: '#000', - shadowOffset: { width: 0, height: 4 }, - shadowOpacity: 0.2, - shadowRadius: 8, - elevation: 8, - }, - shutterInner: { width: 64, height: 64, borderRadius: 32 }, - shutterBtnDisabled: { opacity: 0.6 }, - analysisSheet: { - position: 'absolute', - left: 16, - right: 16, - borderRadius: 20, - borderWidth: 1, - paddingHorizontal: 16, - paddingVertical: 14, - zIndex: 20, - shadowColor: '#000', - shadowOffset: { width: 0, height: 4 }, - shadowOpacity: 0.28, - shadowRadius: 14, - elevation: 14, - }, - analysisHeader: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', marginBottom: 10 }, - analysisBadge: { - flexDirection: 'row', - alignItems: 'center', - gap: 6, - borderRadius: 999, - paddingHorizontal: 10, - paddingVertical: 5, - }, - analysisLabel: { fontWeight: '700', fontSize: 12, letterSpacing: 0.2 }, - analysisPercent: { fontFamily: 'monospace', fontSize: 12, fontWeight: '700' }, - progressBg: { height: 9, borderRadius: 999, overflow: 'hidden', marginBottom: 10 }, - progressFill: { height: '100%', borderRadius: 4 }, - analysisFooter: { gap: 4 }, - analysisStatusRow: { flexDirection: 'row', alignItems: 'center', gap: 6 }, - statusDot: { width: 8, height: 8, borderRadius: 4 }, - analysisStage: { fontSize: 10, fontWeight: '700', textTransform: 'uppercase', letterSpacing: 1 }, - analysisStageDetail: { fontSize: 11, lineHeight: 16, fontWeight: '500' }, - permissionContainer: { flex: 1, justifyContent: 'center', alignItems: 'center', padding: 32 }, - permissionText: { fontSize: 16, textAlign: 'center', marginBottom: 20 }, - permissionBtn: { paddingHorizontal: 24, paddingVertical: 12, borderRadius: 12 }, - permissionBtnText: { fontWeight: '700', fontSize: 15 }, -}); +import React, { useEffect, useRef, useState } from 'react'; +import { + View, Text, StyleSheet, TouchableOpacity, Image, Alert, Animated, Easing, +} from 'react-native'; +import { useLocalSearchParams, useRouter } from 'expo-router'; +import { Ionicons } from '@expo/vector-icons'; +import { CameraView, useCameraPermissions } from 'expo-camera'; +import { useSafeAreaInsets } from 'react-native-safe-area-context'; +import * as ImagePicker from 'expo-image-picker'; +import * as Haptics from 'expo-haptics'; +import { usePostHog } from 'posthog-react-native'; +import { useApp } from '../context/AppContext'; +import { useColors } from '../constants/Colors'; +import { PlantRecognitionService } from '../services/plantRecognitionService'; +import { IdentificationResult } from '../types'; +import { ResultCard } from '../components/ResultCard'; +import { backendApiClient, isInsufficientCreditsError, isNetworkError } from '../services/backend/backendApiClient'; +import { isBackendApiError } from '../services/backend/contracts'; +import { createIdempotencyKey } from '../utils/idempotency'; + +const HEALTH_CHECK_CREDIT_COST = 2; + +const getBillingCopy = (language: 'de' | 'en' | 'es') => { + if (language === 'de') { + return { + creditsLabel: 'Credits', + noCreditsTitle: 'Keine Credits mehr', + noCreditsMessage: 'Du hast keine Credits mehr fuer KI-Scans. Upgrade oder Top-up im Profil.', + healthNoCreditsMessage: `Du brauchst ${HEALTH_CHECK_CREDIT_COST} Credits fuer den Health-Check.`, + managePlan: 'Plan verwalten', + dismiss: 'Schliessen', + genericErrorTitle: 'Fehler', + genericErrorMessage: 'Analyse fehlgeschlagen.', + noConnectionTitle: 'Keine Verbindung', + noConnectionMessage: 'Keine Verbindung zum Server. Bitte prüfe deine Internetverbindung und versuche es erneut.', + retryLabel: 'Erneut versuchen', + providerErrorMessage: 'KI-Scan gerade nicht verfügbar. Bitte versuche es erneut.', + healthProviderErrorMessage: 'KI-Health-Check gerade nicht verfügbar. Bitte versuche es erneut.', + healthTitle: 'Health Check', + healthDoneTitle: 'Health Check abgeschlossen', + healthDoneMessage: 'Neues Foto wurde geprueft und zur Galerie hinzugefuegt.', + signupLabel: 'Registrieren', + }; + } + + if (language === 'es') { + return { + creditsLabel: 'Creditos', + noCreditsTitle: 'Sin creditos', + noCreditsMessage: 'No tienes creditos para escaneos AI. Actualiza o compra top-up en Perfil.', + healthNoCreditsMessage: `Necesitas ${HEALTH_CHECK_CREDIT_COST} creditos para el health-check.`, + managePlan: 'Gestionar plan', + dismiss: 'Cerrar', + genericErrorTitle: 'Error', + genericErrorMessage: 'Analisis fallido.', + noConnectionTitle: 'Sin conexión', + noConnectionMessage: 'Sin conexión al servidor. Comprueba tu internet e inténtalo de nuevo.', + retryLabel: 'Reintentar', + providerErrorMessage: 'Escaneo IA no disponible ahora. Inténtalo de nuevo.', + healthProviderErrorMessage: 'Health-check IA no disponible ahora. Inténtalo de nuevo.', + healthTitle: 'Health Check', + healthDoneTitle: 'Health-check completado', + healthDoneMessage: 'La foto nueva fue analizada y guardada en la galeria.', + signupLabel: 'Registrarse', + }; + } + + return { + creditsLabel: 'Credits', + noCreditsTitle: 'No credits left', + noCreditsMessage: 'You have no AI scan credits left. Upgrade or buy a top-up in Profile.', + healthNoCreditsMessage: `You need ${HEALTH_CHECK_CREDIT_COST} credits for the health check.`, + managePlan: 'Manage plan', + dismiss: 'Close', + genericErrorTitle: 'Error', + genericErrorMessage: 'Analysis failed.', + noConnectionTitle: 'No connection', + noConnectionMessage: 'Could not reach the server. Check your internet connection and try again.', + retryLabel: 'Try again', + providerErrorMessage: 'AI scan is currently unavailable. Please try again.', + healthProviderErrorMessage: 'AI health check is currently unavailable. Please try again.', + healthTitle: 'Health Check', + healthDoneTitle: 'Health Check Complete', + healthDoneMessage: 'The new photo was analyzed and added to gallery.', + signupLabel: 'Sign Up', + }; +}; + +export default function ScannerScreen() { + const params = useLocalSearchParams<{ mode?: string; plantId?: string }>(); + const posthog = usePostHog(); + const { + isDarkMode, + colorPalette, + language, + t, + savePlant, + plants, + updatePlant, + billingSummary, + refreshBillingSummary, + isLoadingBilling, + session, + setPendingPlant, + guestScanCount, + incrementGuestScanCount, + } = useApp(); + const colors = useColors(isDarkMode, colorPalette); + const router = useRouter(); + const insets = useSafeAreaInsets(); + const billingCopy = getBillingCopy(language); + const isHealthMode = params.mode === 'health'; + const healthPlantId = Array.isArray(params.plantId) ? params.plantId[0] : params.plantId; + const healthPlant = isHealthMode && healthPlantId + ? plants.find((item) => item.id === healthPlantId) + : null; + const availableCredits = session + ? (billingSummary?.credits.available ?? 0) + : Math.max(0, 5 - guestScanCount); + + const [permission, requestPermission] = useCameraPermissions(); + const [selectedImage, setSelectedImage] = useState(null); + const [isAnalyzing, setIsAnalyzing] = useState(false); + const [analysisProgress, setAnalysisProgress] = useState(0); + const [analysisResult, setAnalysisResult] = useState(null); + const cameraRef = useRef(null); + const scanLineProgress = useRef(new Animated.Value(0)).current; + const scanPulse = useRef(new Animated.Value(0)).current; + + useEffect(() => { + if (!isAnalyzing) { + scanLineProgress.stopAnimation(); + scanLineProgress.setValue(0); + scanPulse.stopAnimation(); + scanPulse.setValue(0); + return; + } + + const lineAnimation = Animated.loop( + Animated.sequence([ + Animated.timing(scanLineProgress, { + toValue: 1, + duration: 1500, + easing: Easing.inOut(Easing.quad), + useNativeDriver: true, + }), + Animated.timing(scanLineProgress, { + toValue: 0, + duration: 1500, + easing: Easing.inOut(Easing.quad), + useNativeDriver: true, + }), + ]) + ); + + const pulseAnimation = Animated.loop( + Animated.sequence([ + Animated.timing(scanPulse, { toValue: 1, duration: 900, useNativeDriver: true }), + Animated.timing(scanPulse, { toValue: 0, duration: 900, useNativeDriver: true }), + ]) + ); + + lineAnimation.start(); + pulseAnimation.start(); + + return () => { + lineAnimation.stop(); + pulseAnimation.stop(); + }; + }, [isAnalyzing, scanLineProgress, scanPulse]); + + const analyzeImage = async (imageUri: string, galleryImageUri?: string) => { + if (isAnalyzing) return; + + if (availableCredits <= 0) { + if (!session) { + // Guest: show paywall directly — no registration required to purchase + router.push('/profile/billing'); + return; + } + Alert.alert( + billingCopy.noCreditsTitle, + isHealthMode ? billingCopy.healthNoCreditsMessage : billingCopy.noCreditsMessage, + [ + { text: billingCopy.dismiss, style: 'cancel' }, + { + text: billingCopy.managePlan, + onPress: () => router.replace('/(tabs)/profile'), + }, + ], + ); + return; + } + + setIsAnalyzing(true); + setAnalysisProgress(0); + setAnalysisResult(null); + + const startTime = Date.now(); + + const progressInterval = setInterval(() => { + setAnalysisProgress((prev) => { + if (prev < 30) return prev + Math.random() * 8; + if (prev < 70) return prev + Math.random() * 2; + if (prev < 90) return prev + 0.5; + return prev; + }); + }, 150); + + try { + if (isHealthMode) { + if (!healthPlant) { + Alert.alert(billingCopy.genericErrorTitle, billingCopy.genericErrorMessage); + setSelectedImage(null); + setIsAnalyzing(false); + return; + } + + const response = await backendApiClient.runHealthCheck({ + idempotencyKey: createIdempotencyKey('health-check', healthPlant.id), + imageUri, + language, + plantContext: { + name: healthPlant.name, + botanicalName: healthPlant.botanicalName, + careInfo: healthPlant.careInfo, + description: healthPlant.description, + }, + }); + + posthog.capture('llm_generation', { + scan_type: 'health_check', + success: true, + latency_ms: Date.now() - startTime, + }); + + if (!session) { + incrementGuestScanCount(); + } + + const currentGallery = healthPlant.gallery || []; + const existingChecks = healthPlant.healthChecks || []; + const updatedChecks = [response.healthCheck, ...existingChecks].slice(0, 6); + const updatedPlant = { + ...healthPlant, + gallery: galleryImageUri ? [...currentGallery, galleryImageUri] : currentGallery, + healthChecks: updatedChecks, + }; + await updatePlant(updatedPlant); + } else { + const result = await PlantRecognitionService.identify(imageUri, language, { + idempotencyKey: createIdempotencyKey('scan-plant'), + }); + + posthog.capture('llm_generation', { + scan_type: 'identification', + success: true, + latency_ms: Date.now() - startTime, + }); + + if (!session) { + incrementGuestScanCount(); + } + + setAnalysisResult(result); + } + setAnalysisProgress(100); + await Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success); + await new Promise(resolve => setTimeout(resolve, 500)); + setIsAnalyzing(false); + if (isHealthMode && healthPlant) { + Alert.alert(billingCopy.healthDoneTitle, billingCopy.healthDoneMessage, [ + { text: billingCopy.dismiss, onPress: () => router.replace(`/plant/${healthPlant.id}`) }, + ]); + } + } catch (error) { + console.error('Analysis failed', error); + + posthog.capture('llm_generation', { + scan_type: isHealthMode ? 'health_check' : 'identification', + success: false, + error_type: isInsufficientCreditsError(error) ? 'insufficient_credits' : 'provider_error', + latency_ms: Date.now() - startTime, + }); + + if (isInsufficientCreditsError(error)) { + Alert.alert( + billingCopy.noCreditsTitle, + isHealthMode ? billingCopy.healthNoCreditsMessage : billingCopy.noCreditsMessage, + [ + { text: billingCopy.dismiss, style: 'cancel' }, + { + text: billingCopy.managePlan, + onPress: () => router.replace('/(tabs)/profile'), + }, + ], + ); + } else if (isNetworkError(error)) { + Alert.alert( + billingCopy.noConnectionTitle, + billingCopy.noConnectionMessage, + [ + { text: billingCopy.dismiss, style: 'cancel' }, + { text: billingCopy.retryLabel, onPress: () => analyzeImage(imageUri, galleryImageUri) }, + ], + ); + } else if (isBackendApiError(error) && error.code === 'PROVIDER_ERROR') { + Alert.alert( + billingCopy.genericErrorTitle, + isHealthMode ? billingCopy.healthProviderErrorMessage : billingCopy.providerErrorMessage, + [ + { text: billingCopy.dismiss, style: 'cancel' }, + { text: billingCopy.retryLabel, onPress: () => analyzeImage(imageUri, galleryImageUri) }, + ], + ); + } else { + Alert.alert(billingCopy.genericErrorTitle, billingCopy.genericErrorMessage); + } + setSelectedImage(null); + setIsAnalyzing(false); + } finally { + clearInterval(progressInterval); + await refreshBillingSummary(); + } + }; + + const takePicture = async () => { + if (!cameraRef.current || isAnalyzing) return; + await Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Medium); + const photo = await cameraRef.current.takePictureAsync({ base64: true, quality: 0.7 }); + if (photo) { + const analysisUri = photo.base64 + ? `data:image/jpeg;base64,${photo.base64}` + : photo.uri; + const galleryUri = photo.uri || analysisUri; + setSelectedImage(analysisUri); + analyzeImage(analysisUri, galleryUri); + } + }; + + const pickImage = async () => { + if (isAnalyzing) return; + + const result = await ImagePicker.launchImageLibraryAsync({ + mediaTypes: ['images'], + quality: 0.7, + base64: true, + }); + if (!result.canceled && result.assets[0]) { + const asset = result.assets[0]; + const uri = asset.base64 + ? `data:image/jpeg;base64,${asset.base64}` + : asset.uri; + + setSelectedImage(uri); + analyzeImage(uri, asset.uri || uri); + } + }; + + const handleSave = async () => { + if (analysisResult && selectedImage) { + if (!session) { + // Guest mode: store result and go to signup + setPendingPlant(analysisResult, selectedImage); + router.replace('/auth/signup'); + return; + } + + try { + await savePlant(analysisResult, selectedImage); + router.back(); + } catch (error) { + console.error('Saving identified plant failed', error); + Alert.alert(billingCopy.genericErrorTitle, billingCopy.genericErrorMessage); + } + } + }; + + const handleClose = () => { + router.back(); + }; + + const controlsPaddingBottom = Math.max(20, insets.bottom + 10); + const controlsPanelHeight = 28 + 80 + controlsPaddingBottom; + const analysisBottomOffset = controlsPanelHeight + 12; + const scanLineTranslateY = scanLineProgress.interpolate({ + inputRange: [0, 1], + outputRange: [24, 280], + }); + const scanPulseScale = scanPulse.interpolate({ + inputRange: [0, 1], + outputRange: [0.98, 1.02], + }); + const scanPulseOpacity = scanPulse.interpolate({ + inputRange: [0, 1], + outputRange: [0.22, 0.55], + }); + + // Show result + if (!isHealthMode && analysisResult && selectedImage) { + return ( + + ); + } + + // Camera permission + if (!permission?.granted) { + return ( + + + Camera access is required to scan plants. + + Continue + + + ); + } + + return ( + + {/* Header */} + + + + + + {isHealthMode ? billingCopy.healthTitle : t.scanner} + + + + + {billingCopy.creditsLabel}: {availableCredits} + + + + + {/* Camera */} + + {selectedImage ? ( + + ) : ( + + )} + + {/* Scan Frame */} + + {selectedImage && ( + + )} + {isAnalyzing && ( + <> + + + + )} + + + + + + + + {/* Analyzing Overlay */} + {isAnalyzing && ( + + + + + + {analysisProgress < 100 ? t.analyzing : t.result} + + + + {Math.round(analysisProgress)}% + + + + + + + + + {t.aiProcessing} + + + {analysisProgress < 30 ? t.scanStage1 : analysisProgress < 75 ? t.scanStage2 : t.scanStage3} + + + + )} + + {/* Bottom Controls */} + + + + {t.gallery} + + + + + + + + + {t.help} + + + + ); +} + +const styles = StyleSheet.create({ + container: { flex: 1 }, + header: { + position: 'absolute', + top: 0, + left: 0, + right: 0, + zIndex: 10, + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + paddingTop: 60, + paddingHorizontal: 24, + }, + headerTitle: { fontSize: 18, fontWeight: '600' }, + creditBadge: { + borderWidth: 1, + borderRadius: 14, + paddingHorizontal: 8, + paddingVertical: 4, + flexDirection: 'row', + alignItems: 'center', + gap: 4, + }, + creditBadgeText: { fontSize: 10, fontWeight: '700' }, + cameraContainer: { + flex: 1, + justifyContent: 'center', + alignItems: 'center', + }, + scanFrame: { + width: 256, + height: 320, + borderWidth: 2.5, + borderColor: '#ffffff50', + borderRadius: 28, + overflow: 'hidden', + }, + scanPulseFrame: { + ...StyleSheet.absoluteFillObject, + borderWidth: 1.5, + borderRadius: 28, + }, + scanLine: { + position: 'absolute', + left: 16, + right: 16, + height: 2, + borderRadius: 999, + shadowColor: '#ffffff', + shadowOffset: { width: 0, height: 0 }, + shadowOpacity: 0.8, + shadowRadius: 8, + elevation: 6, + }, + corner: { position: 'absolute', width: 24, height: 24 }, + tl: { top: 16, left: 16, borderTopWidth: 4, borderLeftWidth: 4, borderTopLeftRadius: 12 }, + tr: { top: 16, right: 16, borderTopWidth: 4, borderRightWidth: 4, borderTopRightRadius: 12 }, + bl: { bottom: 16, left: 16, borderBottomWidth: 4, borderLeftWidth: 4, borderBottomLeftRadius: 12 }, + br: { bottom: 16, right: 16, borderBottomWidth: 4, borderRightWidth: 4, borderBottomRightRadius: 12 }, + controls: { + borderTopLeftRadius: 28, + borderTopRightRadius: 28, + paddingHorizontal: 32, + paddingTop: 28, + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + }, + controlBtn: { alignItems: 'center', gap: 6 }, + controlBtnDisabled: { opacity: 0.5 }, + controlLabel: { fontSize: 11, fontWeight: '500' }, + shutterBtn: { + width: 80, + height: 80, + borderRadius: 40, + borderWidth: 4, + justifyContent: 'center', + alignItems: 'center', + shadowColor: '#000', + shadowOffset: { width: 0, height: 4 }, + shadowOpacity: 0.2, + shadowRadius: 8, + elevation: 8, + }, + shutterInner: { width: 64, height: 64, borderRadius: 32 }, + shutterBtnDisabled: { opacity: 0.6 }, + analysisSheet: { + position: 'absolute', + left: 16, + right: 16, + borderRadius: 20, + borderWidth: 1, + paddingHorizontal: 16, + paddingVertical: 14, + zIndex: 20, + shadowColor: '#000', + shadowOffset: { width: 0, height: 4 }, + shadowOpacity: 0.28, + shadowRadius: 14, + elevation: 14, + }, + analysisHeader: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', marginBottom: 10 }, + analysisBadge: { + flexDirection: 'row', + alignItems: 'center', + gap: 6, + borderRadius: 999, + paddingHorizontal: 10, + paddingVertical: 5, + }, + analysisLabel: { fontWeight: '700', fontSize: 12, letterSpacing: 0.2 }, + analysisPercent: { fontFamily: 'monospace', fontSize: 12, fontWeight: '700' }, + progressBg: { height: 9, borderRadius: 999, overflow: 'hidden', marginBottom: 10 }, + progressFill: { height: '100%', borderRadius: 4 }, + analysisFooter: { gap: 4 }, + analysisStatusRow: { flexDirection: 'row', alignItems: 'center', gap: 6 }, + statusDot: { width: 8, height: 8, borderRadius: 4 }, + analysisStage: { fontSize: 10, fontWeight: '700', textTransform: 'uppercase', letterSpacing: 1 }, + analysisStageDetail: { fontSize: 11, lineHeight: 16, fontWeight: '500' }, + permissionContainer: { flex: 1, justifyContent: 'center', alignItems: 'center', padding: 32 }, + permissionText: { fontSize: 16, textAlign: 'center', marginBottom: 20 }, + permissionBtn: { paddingHorizontal: 24, paddingVertical: 12, borderRadius: 12 }, + permissionBtnText: { fontWeight: '700', fontSize: 15 }, +}); diff --git a/audits/semantic-search/README.md b/audits/semantic-search/README.md index 7f8e5eb..6fc1643 100644 --- a/audits/semantic-search/README.md +++ b/audits/semantic-search/README.md @@ -1,32 +1,32 @@ -# Semantic Search Audit - -Generated: 2026-03-12T14:15:29.567Z - -Files: -- `summary.json`: category counts and suggested audit order -- `all-plants-categories.csv`: one row per plant with its full category list -- `master.csv`: all category assignments with blank evidence columns -- `suspicious.csv`: entries that require elevated review based on rule flags -- `categories/*.csv`: per-category audit sheets - -Suggested audit order: -- pet_friendly (15) -- air_purifier (12) -- medicinal (32) -- low_light (16) -- bright_light (42) -- sun (172) -- easy (132) -- high_humidity (51) -- hanging (34) -- tree (59) -- large (35) -- patterned (31) -- flowering (157) -- succulent (46) - -Workflow: -1. Review one category CSV at a time. -2. Fill `audit_status`, `evidence_source`, `evidence_url`, and `notes`. -3. Apply only high-confidence source-tag corrections to the lexicon batch files. -4. Rebuild the server catalog from batches after source edits. +# Semantic Search Audit + +Generated: 2026-03-12T14:15:29.567Z + +Files: +- `summary.json`: category counts and suggested audit order +- `all-plants-categories.csv`: one row per plant with its full category list +- `master.csv`: all category assignments with blank evidence columns +- `suspicious.csv`: entries that require elevated review based on rule flags +- `categories/*.csv`: per-category audit sheets + +Suggested audit order: +- pet_friendly (15) +- air_purifier (12) +- medicinal (32) +- low_light (16) +- bright_light (42) +- sun (172) +- easy (132) +- high_humidity (51) +- hanging (34) +- tree (59) +- large (35) +- patterned (31) +- flowering (157) +- succulent (46) + +Workflow: +1. Review one category CSV at a time. +2. Fill `audit_status`, `evidence_source`, `evidence_url`, and `notes`. +3. Apply only high-confidence source-tag corrections to the lexicon batch files. +4. Rebuild the server catalog from batches after source edits. diff --git a/audits/semantic-search/all-plants-categories.csv b/audits/semantic-search/all-plants-categories.csv index c3b6ba8..40cd3c9 100644 --- a/audits/semantic-search/all-plants-categories.csv +++ b/audits/semantic-search/all-plants-categories.csv @@ -1,359 +1,359 @@ -source_file,source_index,name,botanical_name,all_categories,category_count,description,light,temp,water_interval_days -constants/lexiconBatch2.ts,115,Faecherahorn,Acer palmatum,tree,1,"Der Faecherahorn ist ein japanischer Zierahorn mit feingeschnittenen, faecherfoermigen Blaettern in Gruen oder Rot.",Helles bis volles Licht,10-22 °C,5 -constants/lexiconBatch2.ts,212,Spitzahorn,Acer platanoides,tree|large|sun,3,Spitzahorn ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 -constants/lexiconBatch2.ts,108,Schafgarbe,Achillea millefolium,flowering|medicinal|sun,3,Die Schafgarbe hat weisse oder rosafarbene Bluetenschirme und fein gefiederte Blaetter. Wichtige Heilpflanze.,Volles Sonnenlicht,10-25 °C,7 -constants/lexiconBatch1.ts,86,Wuestenrose,Adenium obesum,flowering|succulent|sun,3,Die Wuestenrose ist eine sukkulente Zimmerpflanze mit dickem Stamm und leuchtend pinken Blueten.,Volles Sonnenlicht,20-35 °C,10 -constants/lexiconBatch2.ts,117,Socotra-Wuestenrose,Adenium socotranum,flowering|succulent|sun,3,"Die Socotra-Wuestenrose ist eine seltene, endemische Art mit einem sehr dicken, knolligen Stamm und rosa Blueten.",Volles Sonnenlicht,20-35 °C,14 -constants/lexiconBatch2.ts,42,Frauenhaarfarn,Adiantum raddianum,high_humidity,1,"Der Frauenhaarfarn hat zarte, feingliedrige Wedel auf schwarzen, draht­aehnlichen Stielen. Liebt Feuchtigkeit.",Helles indirektes Licht,18-27 °C,3 -constants/lexiconBatch2.ts,31,Adromischus,Adromischus cristatus,easy|succulent|sun,3,Adromischus ist eine kompakte Sukkulente mit ungewoehnlich wellenrandigen Blaettern auf kurzen Staengeln.,Helles bis volles Licht,15-25 °C,14 -constants/lexiconBatch2.ts,34,Silbervase,Aechmea fasciata,flowering|patterned,2,Die Silbervase ist eine Bromelie mit silbrig gebänderten Blaettern und einem rosafarbenen Bluetenstand.,Helles indirektes Licht,18-25 °C,10 -constants/lexiconBatch1.ts,10,Schwarze Rose (Aeonium),Aeonium arboreum,succulent|sun,2,"Das Aeonium bildet dekorative, rosettenfoermige Sukkulenten an verzweigten Stielen.",Volles Sonnenlicht,10-25 °C,10 -constants/lexiconBatch1.ts,98,Lippenstiftpflanze,Aeschynanthus radicans,flowering|hanging|high_humidity,3,Die Lippenstiftpflanze hat haengende Triebe mit glaenzenden Blaettern und leuchtend roten Roehrenbluten.,Helles indirektes Licht,18-27 °C,7 -constants/lexiconBatch1.ts,11,Agave,Agave americana,succulent|large|sun,3,"Die Agave ist eine imposante Sukkulente mit steifen, blaugruenen Blaettern mit Stacheln. Sie bluet nur einmal.",Volles Sonnenlicht,10-35 °C,21 -constants/lexiconBatch1.ts,50,Aglaoneme,Aglaonema commutatum,easy|patterned|low_light,3,Die Aglaoneme ist eine dekorative Zimmerpflanze mit silbrig-gruen gemusterten Blaettern. Tolerant gegenueber wenig Licht.,Wenig bis helles Licht,15-26 °C,7 -constants/lexiconBatch2.ts,155,Stockrose,Alcea rosea,flowering|sun,2,"Stockrose ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch1.ts,30,Schnittlauch,Allium schoenoprasum,easy,1,Schnittlauch ist ein beliebtes Kuechenkraut mit roehrenfoermigen Blaettern und lila Blueten.,Helles bis volles Licht,10-25 °C,3 -constants/lexiconBatch2.ts,135,Schnittknoblauch,Allium tuberosum,easy|sun,2,Schnittknoblauch ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 -constants/lexiconBatch1.ts,46,Amazona-Taro,Alocasia amazonica,patterned|large|high_humidity,3,"Der Amazona-Taro besticht mit dunkelgruenen, pfeilfoermigen Blaettern mit markant weissen Rippen.",Indirektes Licht,18-27 °C,5 -constants/lexiconBatch2.ts,225,Alocasia zebrina,Alocasia zebrina,bright_light|high_humidity,2,Alocasia zebrina ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5 -constants/lexiconBatch1.ts,89,Kap-Aloe,Aloe arborescens,easy|succulent|medicinal|sun,4,"Die Kap-Aloe ist eine strauchige Aloe mit schmalen, gezaehnten Blaettern und leuchtend roten Bluetenaehren im Winter.",Volles Sonnenlicht,10-30 °C,14 -constants/lexiconBatch2.ts,18,Kap-Aloe (ferox),Aloe ferox,succulent|large|medicinal|sun,4,"Aloe ferox ist eine grosse, imposante Aloe mit stachligen, blaugruenen Blaettern und leuchtend roten Bluetenaehren.",Volles Sonnenlicht,10-30 °C,14 -constants/lexiconBatch2.ts,128,Zitronenverbene,Aloysia citrodora,easy|sun,2,Zitronenverbene ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 -constants/lexiconBatch2.ts,73,Muschelingwer,Alpinia zerumbet,flowering|large|high_humidity,3,"Der Muschelingwer hat lange, elegante Blaetter und haengende Bluetenrispen mit weiss-rosa Bluetchen.",Helles bis volles Licht,20-30 °C,5 -constants/lexiconBatch2.ts,194,Fuchsschwanz,Amaranthus caudatus,flowering|sun,2,"Fuchsschwanz ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,163,Anemone,Anemone coronaria,flowering|sun,2,"Anemone ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,140,Dill,Anethum graveolens,easy|sun,2,Dill ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 -constants/lexiconBatch2.ts,125,Kerbel,Anthriscus cerefolium,easy|sun,2,Kerbel ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 -constants/lexiconBatch2.ts,233,Samt-Anthurie,Anthurium clarinervium,patterned|high_humidity,2,Samt-Anthurie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5 -constants/lexiconBatch2.ts,234,Kristall-Anthurie,Anthurium crystallinum,patterned|high_humidity,2,Kristall-Anthurie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5 -constants/lexiconBatch2.ts,147,Loewenmaeulchen,Antirrhinum majus,flowering|sun,2,"Loewenmaeulchen ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,232,Norfolk-Tanne,Araucaria heterophylla,tree|bright_light,2,Norfolk-Tanne ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7 -constants/lexiconBatch2.ts,107,Arnika,Arnica montana,flowering|medicinal|sun,3,Arnika ist eine bekannte Heilpflanze aus den Alpen mit goldgelben Korbbluten. Sie wird fuer Muskeln und Gelenke verwendet.,Volles Sonnenlicht,10-20 °C,7 -constants/lexiconBatch2.ts,110,Wermut,Artemisia absinthium,medicinal|sun,2,"Wermut ist ein stark aromatisches Heilkraut mit silbrig-gruenen, tief eingeschnittenen Blaettern. Fuer Kraeuterlikoere.",Volles Sonnenlicht,10-25 °C,14 -constants/lexiconBatch2.ts,122,Estragon,Artemisia dracunculus,easy|sun,2,Estragon ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 -constants/lexiconBatch2.ts,178,Seidenpflanze,Asclepias tuberosa,flowering|sun,2,"Seidenpflanze ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,16,Schusterpflanze,Aspidistra elatior,easy|low_light,2,"Die Schusterpflanze ist eine extrem robuste Zimmerpflanze mit langen, dunkelgruenen Blaettern. Vertraegt tiefe Temperaturen.",Wenig bis helles Licht,10-20 °C,14 -constants/lexiconBatch2.ts,43,Vogelnest-Farn,Asplenium nidus,easy|low_light|high_humidity,3,"Der Vogelnest-Farn hat ganzrandige, glaenzende Wedel, die eine Nestform bilden. Sehr dekorativ und robust.",Helles indirektes Licht,18-27 °C,5 -constants/lexiconBatch2.ts,13,Japanische Aucube,Aucuba japonica,easy|low_light,2,"Die Japanische Aucube hat glaenzende, gruene oder gelbgefleckte Blaetter. Sehr schattenvertraeglich.",Wenig bis helles Licht,10-20 °C,7 -constants/lexiconBatch1.ts,92,Indische Azalee,Azalea indica,flowering,1,"Die Indische Azalee ist ein beliebter Zierstrauch mit grossen, auffaelligen Blueten in Rosa- und Rottönen.",Helles indirektes Licht,10-20 °C,4 -constants/lexiconBatch2.ts,7,Bambusrohr,Bambusa vulgaris,easy|large,2,Das Bambusrohr ist eine schnell wachsende Bambusart mit gelbgruenen Halmen. Sehr dekorativ und vielseitig nutzbar.,Helles bis volles Licht,15-30 °C,5 -constants/lexiconBatch1.ts,41,Pferdeschwanzpalme,Beaucarnea recurvata,easy|succulent|tree|sun,4,"Die Pferdeschwanzpalme hat einen verdickten Stammbasis als Wasserspeicher und lange, schmale Blaetter.",Volles Sonnenlicht,15-30 °C,21 -constants/lexiconBatch2.ts,57,Forellen-Begonie,Begonia maculata,patterned|high_humidity,2,Die Forellen-Begonie hat olivgruene Blaetter mit silbernen Punkten und einer roten Unterseite. Atemberaubend.,Helles indirektes Licht,18-27 °C,7 -constants/lexiconBatch1.ts,18,Koenigsbegonie,Begonia rex,patterned|high_humidity,2,"Die Koenigsbegonie beeindruckt mit prachtvoll gemusterten Blaettern in Silber, Rot und Gruen.",Indirektes Licht,18-25 °C,5 -constants/lexiconBatch2.ts,175,Eisbegonie,Begonia semperflorens-cultorum,flowering|bright_light,2,"Eisbegonie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,58,Knollen-Begonie,Begonia tuberhybrida,flowering|high_humidity,2,"Die Knollen-Begonie hat riesige, rosenaehnliche Blueten in leuchtendem Rot, Orange, Gelb oder Weiss.",Helles indirektes Licht,15-22 °C,5 -constants/lexiconBatch2.ts,145,Gaensebluemchen,Bellis perennis,flowering|sun,2,"Gaensebluemchen ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,97,Mangold,Beta vulgaris,easy,1,"Mangold ist ein farbenfrohes Blattgemuese mit bunten Stielen in Rot, Gelb, Orange und Weiss.",Helles bis volles Licht,10-25 °C,3 -constants/lexiconBatch2.ts,114,Hange-Birke,Betula pendula,tree|large|medicinal,3,Die Haenge-Birke hat charakteristisch weisse Rinde und haengende Zweige. Die Blaetter werden in der Heilkunde genutzt.,Volles Sonnenlicht,10-25 °C,7 -constants/lexiconBatch2.ts,38,Billbergia,Billbergia nutans,easy|flowering,2,"Die Billbergia ist eine robuste Bromelie mit schmalen, gruenen Blaettern und hängenden, blauen und gruenen Blueten.",Helles indirektes Licht,15-25 °C,7 -constants/lexiconBatch2.ts,129,Borretsch,Borago officinalis,easy|sun,2,Borretsch ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 -constants/lexiconBatch1.ts,62,Bougainvillea,Bougainvillea spectabilis,flowering|bright_light|sun,3,"Die Bougainvillea ist eine rankenreiche Kletterpflanze mit leuchtend farbigen Hochblaettern in Rot, Orange oder Pink.",Volles Sonnenlicht,18-30 °C,5 -constants/lexiconBatch2.ts,223,Schmetterlingsflieder,Buddleja davidii,flowering|tree|sun,3,Schmetterlingsflieder ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 -constants/lexiconBatch2.ts,202,Buchsbaum,Buxus sempervirens,tree|sun,2,Buchsbaum ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 -constants/lexiconBatch1.ts,49,Buntblatt,Caladium bicolor,patterned|high_humidity,2,"Das Buntblatt beeindruckt mit transparenten, bunt gemusterten Blaettern in Pink, Rot, Weiss und Gruen.",Indirektes Licht,20-30 °C,5 -constants/lexiconBatch2.ts,187,Ringelblume,Calendula officinalis,flowering|medicinal|sun,3,"Ringelblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,63,Calibrachoa,Calibrachoa hybrida,easy|flowering|hanging|sun,4,"Calibrachoa ist eine petunienaehnliche Haengepflanze mit unzaehligen, kleinen Trichterbluten in allen Farben.",Volles Sonnenlicht,15-25 °C,2 -constants/lexiconBatch2.ts,56,Callisia,Callisia repens,easy|hanging,2,"Callisia repens ist ein kleines, kriechendes Kraut mit winzigen, gruenen Blaettern. Ideal fuer haengende Behaelter.",Helles indirektes Licht,15-25 °C,5 -constants/lexiconBatch1.ts,93,Kamelie,Camellia japonica,flowering,1,Die Kamelie ist ein eleganter Zierstrauch mit glaenzenden Blaettern und rosenaehnlichen Blueten von Januar bis April.,Helles indirektes Licht,7-18 °C,5 -constants/lexiconBatch2.ts,85,Teestrauch,Camellia sinensis,flowering,1,"Der Teestrauch ist die Pflanze, aus deren Blaettern Tee gewonnen wird. Er hat weisse Blueten und glaenzende Blaetter.",Helles indirektes Licht,15-22 °C,7 -constants/lexiconBatch2.ts,184,Trompetenwinde,Campsis radicans,flowering|bright_light,2,"Trompetenwinde ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,67,Blumenschilfrohr,Canna indica,flowering|large|sun,3,"Das Blumenschilfrohr hat grosse, tropisch wirkende Blaetter und auffaellige Blueten in Rot, Orange oder Gelb.",Volles Sonnenlicht,18-28 °C,5 -constants/lexiconBatch2.ts,92,Chili,Capsicum annuum,easy|medicinal|sun,3,"Chili ist eine beliebte Gemuese- und Zierpflanze mit leuchtenden, roten oder orangen Fruechten. Im Topf kultivierbar.",Volles Sonnenlicht,20-30 °C,4 -constants/lexiconBatch2.ts,90,Papaya,Carica papaya,large|sun,2,"Die Papaya ist eine tropische Fruchtpflanze mit grossen, gelappten Blaettern und orangen Fruechten.",Volles Sonnenlicht,20-35 °C,5 -constants/lexiconBatch2.ts,217,Trompetenbaum,Catalpa bignonioides,tree|large|sun,3,Trompetenbaum ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 -constants/lexiconBatch1.ts,73,Cattleya-Orchidee,Cattleya labiata,flowering|high_humidity,2,"Die Cattleya ist die Koenigin der Orchideen mit ueppigen, duftenden Blueten in Lila, Rosa und Weiss.",Helles indirektes Licht,18-28 °C,7 -constants/lexiconBatch2.ts,208,Zeder,Cedrus libani,tree|large|sun,3,Zeder ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 -constants/lexiconBatch2.ts,188,Kornblume,Centaurea cyanus,flowering|sun,2,"Kornblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch1.ts,81,Peruanischer Fackelkaktus,Cereus peruvianus,easy|succulent|large|sun,4,"Der Peruanische Fackelkaktus ist ein saeulenfoermiger Kaktus, der im Innenraum bis zu 2 m hoch werden kann.",Volles Sonnenlicht,15-35 °C,21 -constants/lexiconBatch1.ts,99,Herzkette,Ceropegia woodii,easy|succulent|patterned|hanging,4,"Die Herzkette hat duenne, haengende Ranken mit herzfoermigen, silbergrau gemusterten Blaettchen.",Helles indirektes Licht,15-27 °C,14 -constants/lexiconBatch1.ts,43,Bergpalme,Chamaedorea elegans,easy|pet_friendly|tree|air_purifier|low_light,5,Die Bergpalme ist eine kompakte Zimmerpalme fuer schattigere Standorte. Ideal fuer dunkle Innenraeume.,Wenig bis helles Licht,15-25 °C,7 -constants/lexiconBatch2.ts,138,Roemische Kamille,Chamaemelum nobile,easy|medicinal|sun,3,Roemische Kamille ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 -constants/lexiconBatch2.ts,101,Kamille,Chamomilla recutita,easy|medicinal|sun,3,"Die Kamille ist ein beliebtes Heilkraut mit kleinen, weiss-gelben Blueten. Das aetherische Oel wirkt beruhigend.",Volles Sonnenlicht,15-25 °C,5 -constants/lexiconBatch1.ts,67,Chrysantheme,Chrysanthemum indicum,flowering,1,"Die Chrysantheme ist die klassische Herbstblume mit ueppigen, dichten Blueten in vielen Farben.",Helles bis volles Licht,12-22 °C,4 -constants/lexiconBatch2.ts,86,Zitronenbaum,Citrus limon,tree|sun,2,"Der Zitronenbaum ist ein kleiner, immergruener Baum mit weissen, duftenden Blueten und gelben Fruechten.",Volles Sonnenlicht,18-28 °C,5 -constants/lexiconBatch2.ts,87,Orangenbaum,Citrus sinensis,tree|sun,2,"Der Orangenbaum ist ein kleiner, immergruener Baum mit weissen Blueten und orangen Fruechten.",Volles Sonnenlicht,18-28 °C,5 -constants/lexiconBatch2.ts,157,Clematis,Clematis viticella,flowering|bright_light,2,"Clematis ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch1.ts,104,Riemenblatt,Clivia miniata,flowering,1,Das Riemenblatt ist eine dekorative Zimmerpflanze mit leuchtend orangefarbenen Blueten im Fruehling.,Helles indirektes Licht,15-24 °C,10 -constants/lexiconBatch2.ts,224,Kroton,Codiaeum variegatum,patterned|bright_light,2,Kroton ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7 -constants/lexiconBatch2.ts,84,Kaffeestrauch,Coffea arabica,easy,1,"Der Kaffeestrauch hat glaenzende, dunkelgruene Blaetter und entwickelt rote Kaffe­ekirschen. Kann im Topf gehalten werden.",Helles indirektes Licht,18-25 °C,7 -constants/lexiconBatch2.ts,245,Kaffeepflanze arabica nana,Coffea arabica Nana,bright_light,1,Kaffeepflanze arabica nana ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7 -constants/lexiconBatch1.ts,47,Taro,Colocasia esculenta,large|high_humidity,2,"Der Taro ist eine tropische Pflanze mit grossen, herzfoermigen Blaettern. Die Knollen sind Nahrungsquelle.",Helles indirektes Licht,18-30 °C,3 -constants/lexiconBatch1.ts,97,Columnea,Columnea gloriosa,flowering|hanging|high_humidity,3,"Die Columnea ist eine haengende Zimmerpflanze mit kleinen, behaarten Blaettern und leuchtend roten, roehrenfoermigen Blueten.",Helles indirektes Licht,18-25 °C,7 -constants/lexiconBatch2.ts,24,Konophytum,Conophytum calculus,succulent|sun,2,"Das Konophytum ist eine sehr kompakte Sukkulente, die zwei Blaetter zu einer kugelfoermigen Form verschmilzt.",Volles Sonnenlicht,10-25 °C,21 -constants/lexiconBatch2.ts,160,Maigloeckchen,Convallaria majalis,flowering|medicinal,2,"Maigloeckchen ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,14,Keulenlilie,Cordyline australis,easy|tree|sun,3,"Die Keulenlilie hat lange, schmale, gruene oder rotbraune Blaetter in einem dekorativen Schopf.",Helles bis volles Licht,10-25 °C,7 -constants/lexiconBatch2.ts,15,Tiroler Keulenlilie,Cordyline fruticosa,easy,1,"Die Tiroler Keulenlilie hat leuchtend rote, gruene oder buntlaubige Blaetter. Eine exotische Zimmerpflanze.",Helles indirektes Licht,18-27 °C,7 -constants/lexiconBatch2.ts,181,Maedchenauge,Coreopsis tinctoria,flowering|sun,2,"Maedchenauge ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,139,Koriander,Coriandrum sativum,easy|sun,2,Koriander ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 -constants/lexiconBatch2.ts,150,Kosmee,Cosmos bipinnatus,flowering|sun,2,"Kosmee ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,29,Kotyledon,Cotyledon orbiculata,easy|succulent|sun,3,"Kotyledon hat dickfleischige, runde Blaetter mit einem mehligen, weisslichen Belag. Sehr trockenheitsresistent.",Helles bis volles Licht,15-25 °C,14 -constants/lexiconBatch2.ts,26,Moos-Crassula,Crassula muscosa,easy|succulent|sun,3,"Die Moos-Crassula hat dicht aneinandergereihte, winzige gruene Blaetter auf unverzweigten Trieben. Sieht aus wie Moos.",Helles bis volles Licht,15-25 °C,14 -constants/lexiconBatch1.ts,5,Jadepflanze,Crassula ovata,easy|succulent|sun,3,"Die Jadepflanze ist eine langlebige Sukkulente mit dicken, ovalen Blaettern. In Japan gilt sie als Gluecksbringer.",Helles bis volles Licht,15-24 °C,14 -constants/lexiconBatch1.ts,110,Krokus,Crocus vernus,easy|flowering,2,"Der Krokus ist einer der ersten Fruehjahrs­boten mit kelchfoermigen Blueten in Lila, Weiss und Gelb.",Helles bis volles Licht,5-15 °C,7 -constants/lexiconBatch2.ts,39,Cryptanthus,Cryptanthus bivittatus,patterned|high_humidity,2,Cryptanthus ist eine niedrig wachsende Bromelie mit sternfoermigen Rosetten und gemusterten Blaettern. Fuer Terrarien.,Helles indirektes Licht,18-27 °C,7 -constants/lexiconBatch1.ts,53,Ctenanthe,Ctenanthe burle-marxii,patterned|high_humidity,2,Die Ctenanthe hat faszinierend gemusterte Blaetter mit dunkelgruunem Fischgraetenmuster auf hellgruunem Hintergrund.,Indirektes Licht,18-25 °C,5 -constants/lexiconBatch2.ts,94,Gurke,Cucumis sativus,easy|sun,2,"Die Gurke ist eine rankende Gemuese­pflanze mit gruenen, erfrischenden Fruechten. Im Balkonkasten kultivierbar.",Volles Sonnenlicht,18-28 °C,3 -constants/lexiconBatch2.ts,209,Zypresse,Cupressus sempervirens,tree|large|sun,3,Zypresse ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 -constants/lexiconBatch2.ts,74,Kurkuma,Curcuma longa,medicinal|high_humidity,2,Kurkuma ist eine tropische Gewuerzpflanze mit breiten Blaettern und leuchtend gelber Wurzel. Wichtiges Heilgewuerz.,Helles bis volles Licht,20-30 °C,7 -constants/lexiconBatch2.ts,236,String of Bananas,Curio radicans,succulent|hanging|sun,3,String of Bananas ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles bis volles Licht,18-30 C,10 -constants/lexiconBatch2.ts,237,String of Dolphins,Curio x peregrinus,succulent|hanging|sun,3,String of Dolphins ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles bis volles Licht,18-30 C,10 -constants/lexiconBatch2.ts,239,Palmfarn,Cycas revoluta,tree|large|sun,3,Palmfarn ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles bis volles Licht,18-30 C,10 -constants/lexiconBatch1.ts,19,Alpenveilchen,Cyclamen persicum,flowering,1,"Das Alpenveilchen bluet im Herbst und Winter mit eleganten Blueten in Rosa, Rot oder Weiss.",Helles indirektes Licht,12-18 °C,5 -constants/lexiconBatch1.ts,71,Zymbidium,Cymbidium lowianum,flowering,1,"Das Zymbidium ist eine robuste Orchidee mit langen, grassartigen Blaettern und eleganten Bluetenrispen.",Helles Licht,12-24 °C,7 -constants/lexiconBatch2.ts,127,Zitronengras,Cymbopogon citratus,easy|sun,2,Zitronengras ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 -constants/lexiconBatch2.ts,9,Paragraphenpflanze,Cyperus alternifolius,high_humidity,1,"Die Paragraphenpflanze hat lange, grasartige Blaetter, die sternfoermig vom Stiel abstehen. Sie liebt viel Wasser.",Helles bis volles Licht,18-27 °C,3 -constants/lexiconBatch2.ts,68,Dahlie,Dahlia pinnata,flowering|sun,2,Die Dahlie ist eine prachtvolle Sommerblume mit Blueten in allen Groessen und Formen. Sie wird aus Knollen gezogen.,Volles Sonnenlicht,15-25 °C,5 -constants/lexiconBatch2.ts,99,Karotte,Daucus carota,easy,1,Die Karotte ist eine beliebte Gemuese­pflanze mit orangefarbenen Wurzeln. Im tiefen Topf kultivierbar.,Helles bis volles Licht,15-22 °C,5 -constants/lexiconBatch2.ts,215,Flammenbaum,Delonix regia,flowering|tree|large,3,Flammenbaum ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 -constants/lexiconBatch2.ts,153,Rittersporn,Delphinium elatum,flowering|sun,2,"Rittersporn ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch1.ts,70,Dendrobium,Dendrobium nobile,flowering|high_humidity,2,"Das Dendrobium ist eine beliebte Zimmerorchidee mit langen Pseudobulben, die im Winter mit Blueten besetzt werden.",Helles indirektes Licht,15-28 °C,10 -constants/lexiconBatch2.ts,189,Bartnelke,Dianthus barbatus,flowering|sun,2,"Bartnelke ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,146,Nelke,Dianthus caryophyllus,flowering|sun,2,"Nelke ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch1.ts,48,Dieffenbachie,Dieffenbachia seguine,easy|air_purifier|low_light,3,"Die Dieffenbachie ist eine tropische Blattschmuckpflanze mit grossen, gruen-weiss gefleckten Blaettern.",Helles indirektes Licht,18-26 °C,7 -constants/lexiconBatch2.ts,109,Roter Fingerhut,Digitalis purpurea,flowering|medicinal,2,"Der Rote Fingerhut hat hohe Bluetenstaende mit roehrenfoermigen, gepunkteten Blueten in Rosa. Wichtige Arzneipflanze.",Helles bis volles Licht,10-20 °C,7 -constants/lexiconBatch2.ts,77,Venusfliegenfalle,Dionaea muscipula,sun,1,Die Venusfliegenfalle ist eine fleischfressende Pflanze mit klappfallartigen Blaettern. Faengt Insekten.,Volles Sonnenlicht,15-30 °C,5 -constants/lexiconBatch1.ts,101,Dischidia,Dischidia ruscifolia,succulent|hanging,2,"Die Dischidia ist eine epiphytische Haengepflanze mit kleinen, runden Blaettern entlang duenner Ranken.",Helles indirektes Licht,18-27 °C,7 -constants/lexiconBatch1.ts,14,Maisstrauch,Dracaena fragrans,easy|tree|air_purifier|low_light,4,"Der Maisstrauch ist eine robuste Zimmerpflanze mit breiten, gestreiften Blaettern. Gedeiht auch bei wenig Licht.",Helles indirektes Licht,15-25 °C,10 -constants/lexiconBatch1.ts,13,Drachenbaum,Dracaena marginata,easy|tree|air_purifier,3,"Der Drachenbaum ist eine schlanke Zimmerpflanze mit roten, schmalen Blaettern auf langen Staemmen.",Helles indirektes Licht,15-25 °C,10 -constants/lexiconBatch2.ts,80,Sonnentau,Drosera capensis,high_humidity|sun,2,Der Sonnentau faengt Insekten mit klebrigen Tropfen auf seinen Blaettern. Eine faszinierende fleischfressende Pflanze.,Volles Sonnenlicht,15-25 °C,5 -constants/lexiconBatch2.ts,30,Dudleya,Dudleya brittonii,easy|succulent|sun,3,"Dudleya ist eine rosetten­bildende Sukkulente mit silbrig-weissen, mehligen Blaettern. Sehr elegant.",Volles Sonnenlicht,10-25 °C,14 -constants/lexiconBatch1.ts,42,Goldfruchtpalme,Dypsis lutescens,pet_friendly|tree|air_purifier,3,Die Goldfruchtpalme ist eine elegante Zimmerpalme mit gelblich-gruenen Stielen und gefiederten Wedeln.,Helles indirektes Licht,18-27 °C,5 -constants/lexiconBatch1.ts,4,Echeverie,Echeveria elegans,easy|succulent|sun,3,"Die Echeverie bildet symmetrische, rosettenfoermige Sukkulenten mit blaugruenen Blaettern. Pflegeleicht.",Volles Sonnenlicht,15-25 °C,14 -constants/lexiconBatch2.ts,106,Sonnenhut,Echinacea purpurea,flowering|medicinal|sun,3,"Der Sonnenhut ist eine beliebte Heilpflanze mit grossen, pinkfarbenen Blueten. Er staerkt das Immunsystem.",Helles bis volles Licht,15-25 °C,7 -constants/lexiconBatch1.ts,77,Goldene Tonne,Echinocactus grusonii,easy|succulent|sun,3,Die Goldene Tonne ist ein ikonischer kugelfoermiger Kaktus mit goldgelben Stacheln. Waechst langsam aber imposant.,Volles Sonnenlicht,15-35 °C,21 -constants/lexiconBatch1.ts,83,San-Pedro-Kaktus,Echinopsis pachanoi,easy|succulent|sun,3,"Der San-Pedro-Kaktus ist ein schnell wachsender, saeulenfoermiger Kaktus aus den Anden.",Volles Sonnenlicht,10-35 °C,14 -constants/lexiconBatch1.ts,84,Koenigin der Nacht,Epiphyllum oxypetalum,flowering|succulent,2,"Die Koenigin der Nacht bluet nur eine einzige Nacht lang mit riesigen, intensiv duftenden weissen Blueten.",Indirektes Licht,18-27 °C,7 -constants/lexiconBatch1.ts,16,Marmor-Efeutute,Epipremnum aureum Marble Queen,easy|hanging|air_purifier,3,Die Marmor-Efeutute hat cremeweiss-gruen marmorierte Blaetter. Eine dekorative Variante der klassischen Efeutute.,Helles indirektes Licht,15-30 °C,7 -constants/lexiconBatch2.ts,53,Neon-Efeutute,Epipremnum pinnatum Neon,easy|hanging|air_purifier,3,Die Neon-Efeutute hat leuchtend limonengruene Blaetter. Sehr auffaellig und pflegeleicht.,Helles indirektes Licht,15-30 °C,7 -constants/lexiconBatch2.ts,186,Kalifornischer Mohn,Eschscholzia californica,flowering|sun,2,"Kalifornischer Mohn ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,210,Eukalyptus,Eucalyptus globulus,tree|medicinal|sun,3,Eukalyptus ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 -constants/lexiconBatch2.ts,19,Christusdorn,Euphorbia milii,easy|flowering|succulent|sun,4,Der Christusdorn ist eine sukkulente Wolfsmilch mit stacheligen Zweigen und kleinen roten oder gelben Hochblaettern.,Helles bis volles Licht,15-28 °C,10 -constants/lexiconBatch2.ts,20,Weihnachtsstern,Euphorbia pulcherrima,flowering,1,Der Weihnachtsstern ist die klassische Winterpflanze mit leuchtend roten Hochblaettern. Er steht symbolisch fuer Weihnachten.,Helles indirektes Licht,15-22 °C,7 -constants/lexiconBatch1.ts,12,Bleistiftkaktus,Euphorbia tirucalli,easy|succulent|sun,3,"Der Bleistiftkaktus ist eine sukkulente Wolfsmilch mit duennen, zylindrischen Zweigen ohne Blaetter.",Volles Sonnenlicht,18-30 °C,14 -constants/lexiconBatch2.ts,137,Wasabi,Eutrema japonicum,bright_light|high_humidity,2,"Wasabi ist ein seltenes Wuerzkraut, das gleichmaessige Feuchte und eher kuehle Bedingungen bevorzugt.",Helles indirektes Licht,8-20 C,4 -constants/lexiconBatch2.ts,12,Fatsia,Fatsia japonica,easy|low_light,2,"Die Fatsia ist ein dekorativer Zimmerstrauch mit grossen, handfoermigen, glaenzenden Blaettern. Sehr robust.",Helles indirektes Licht,10-20 °C,7 -constants/lexiconBatch1.ts,78,Fass-Kaktus,Ferocactus cylindraceus,easy|succulent|sun,3,"Der Fass-Kaktus ist ein zylindrischer Wuestenkaktus mit langen, roten Stacheln. Sehr langlebig.",Volles Sonnenlicht,15-35 °C,21 -constants/lexiconBatch2.ts,248,Ficus altissima,Ficus altissima,tree|bright_light,2,Ficus altissima ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7 -constants/lexiconBatch1.ts,1,Birkenfeige,Ficus benjamina,tree|air_purifier,2,"Die Birkenfeige ist ein eleganter Zimmerstrauch mit haengenden Aesten und kleinen, glaenzenden Blaettern.",Helles indirektes Licht,16-24 °C,7 -constants/lexiconBatch1.ts,38,Gummibaum,Ficus elastica,easy|tree|air_purifier,3,"Der Gummibaum ist eine imposante Zimmerpflanze mit grossen, glaenzenden, lederartigen Blaettern. Reinigt die Luft.",Helles indirektes Licht,16-24 °C,10 -constants/lexiconBatch1.ts,39,Geigenfeige,Ficus lyrata,tree|large|bright_light,3,"Die Geigenfeige ist ein Trendbaum mit grossen, geigenfoermigen Blaettern. Benoetigt viel Licht.",Helles indirektes Licht,18-27 °C,7 -constants/lexiconBatch2.ts,247,Ficus microcarpa,Ficus microcarpa,easy|tree|bright_light,3,Ficus microcarpa ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7 -constants/lexiconBatch2.ts,116,Bonsai-Feige,Ficus retusa,tree,1,"Die Bonsai-Feige ist eine klassische Bonsai-Art mit kleinen, elliptischen Blaettern. Sehr formbar.",Helles indirektes Licht,16-24 °C,7 -constants/lexiconBatch2.ts,226,Nervenpflanze,Fittonia albivenis,patterned|high_humidity,2,Nervenpflanze ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5 -constants/lexiconBatch2.ts,219,Forsythie,Forsythia x intermedia,flowering|tree|sun,3,Forsythie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 -constants/lexiconBatch2.ts,100,Erdbeere,Fragaria ananassa,easy|pet_friendly|sun,3,"Die Erdbeere ist ein beliebtes Obst fuer Balkon und Terrasse mit aromatischen, roten Fruechten.",Helles bis volles Licht,15-25 °C,3 -constants/lexiconBatch2.ts,169,Freesie,Freesia refracta,flowering|sun,2,"Freesie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch1.ts,33,Fuchsie,Fuchsia hybrida,flowering|hanging,2,"Die Fuchsie haengt mit eleganten, zweifarbigen Blueten wie kleine Ohrringe herab. Ideal fuer Ampeln.",Helles indirektes Licht,14-22 °C,3 -constants/lexiconBatch2.ts,60,Triphylla-Fuchsie,Fuchsia triphylla,flowering|hanging,2,"Die Triphylla-Fuchsie hat lange, roehrenfoermige, orangefarbe Blueten in haengenden Trauben. Sehr exotisch.",Helles indirektes Licht,15-22 °C,3 -constants/lexiconBatch2.ts,196,Kokardenblume,Gaillardia aristata,flowering|sun,2,"Kokardenblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch1.ts,22,Gardenie,Gardenia jasminoides,flowering|high_humidity,2,"Die Gardenie fasziniert mit cremefarbenen, intensiv duftenden Blueten. Anspruchsvoll in der Pflege.",Helles indirektes Licht,18-23 °C,5 -constants/lexiconBatch1.ts,90,Gasteria,Gasteria carinata,easy|succulent|low_light,3,"Die Gasteria ist eine kleine Sukkulente mit zweireihig angeordneten, zungenfoermigen, gefleckten Blaettern.",Helles indirektes Licht,15-25 °C,14 -constants/lexiconBatch2.ts,190,Mittagsgold,Gazania rigens,flowering|sun,2,"Mittagsgold ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch1.ts,32,Blutroter Storchschnabel,Geranium sanguineum,easy|flowering,2,Der Blutrote Storchschnabel ist ein zierlicher Storchschnabel mit intensiv magentafarbenen Blueten.,Helles bis volles Licht,10-25 °C,7 -constants/lexiconBatch1.ts,68,Gerbera,Gerbera jamesonii,flowering|air_purifier|bright_light,3,"Die Gerbera ist eine farbenfrohe Schnittblume mit grossen, sonnenblumenaehnlichen Blueten. Sehr beliebt.",Helles bis volles Licht,15-25 °C,5 -constants/lexiconBatch2.ts,216,Ginkgo,Ginkgo biloba,tree|medicinal|sun,3,Ginkgo ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 -constants/lexiconBatch2.ts,161,Gladiole,Gladiolus hortulanus,flowering|sun,2,"Gladiole ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch1.ts,96,Gloxinie,Gloxinia speciosa,flowering|high_humidity,2,"Die Gloxinie hat grosse, samtartige Blueten in Violett, Rosa oder Weiss mit farbigen Raendern.",Helles indirektes Licht,18-25 °C,5 -constants/lexiconBatch2.ts,240,Calathea lancifolia,Goeppertia insignis,pet_friendly|patterned|high_humidity,3,Calathea lancifolia ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5 -constants/lexiconBatch2.ts,241,Calathea ornata,Goeppertia ornata,pet_friendly|patterned|high_humidity,3,Calathea ornata ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5 -constants/lexiconBatch1.ts,87,Geisterpflanze,Graptopetalum paraguayense,easy|succulent|sun,3,"Die Geisterpflanze hat zartgraue bis perlmutt-rosafarbene, rosettenfoermige Blaetter. Sehr robuste Sukkulente.",Volles Sonnenlicht,15-25 °C,14 -constants/lexiconBatch2.ts,36,Guzmania,Guzmania lingulata,flowering|high_humidity,2,"Die Guzmania ist eine Bromelie mit glänzenden, gruenen Blaettern und einem leuchtend roten, sternfoermigen Bluetenstand.",Helles indirektes Licht,18-27 °C,7 -constants/lexiconBatch1.ts,80,Mond-Kaktus,Gymnocalycium mihanovichii,easy|succulent,2,Der Mond-Kaktus ist eine farbenfrohe Veredelung eines chlorophylllosen Kaktus auf einem gruenen Unterlagekaktus.,Indirektes Licht,15-30 °C,14 -constants/lexiconBatch2.ts,119,Zaubernuss,Hamamelis mollis,flowering|medicinal,2,"Die Zaubernuss bluet im Winter mit fadendunnen, gelben Bluetenkranzeln, die bis -10 Grad standhalten.",Helles bis volles Licht,10-20 °C,10 -constants/lexiconBatch1.ts,6,Zebra-Haworthie,Haworthia fasciata,easy|succulent|low_light,3,Die Zebra-Haworthie ist eine kompakte Sukkulente mit weissen Querstreifen auf dunkelgruenen Blaettern.,Helles indirektes Licht,15-25 °C,14 -constants/lexiconBatch1.ts,37,Efeu,Hedera helix,easy|hanging|air_purifier|low_light,4,"Efeu ist eine robuste Kletter- und Haengepflanze mit charakteristischen, dreilappigen Blaettern. Sehr langlebig.",Wenig bis helles Licht,10-20 °C,7 -constants/lexiconBatch2.ts,83,Heliamphora,Heliamphora nutans,high_humidity,1,Heliamphora ist eine urtuemliche Kannenpflanze aus den Tafelbergen Venezuelas. Sehr dekorativ und selten.,Helles indirektes Licht,15-25 °C,5 -constants/lexiconBatch2.ts,141,Sonnenblume,Helianthus annuus,flowering|sun,2,"Sonnenblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,133,Currykraut,Helichrysum italicum,easy|sun,2,Currykraut ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 -constants/lexiconBatch2.ts,72,Heliconia,Heliconia psittacorum,flowering|bright_light|high_humidity,3,"Die Heliconia hat leuchtend orangefarbe oder rote, bootsfoermige Hochblaetter. Eine exotische Tropenpflanze.",Helles bis volles Licht,20-30 °C,5 -constants/lexiconBatch2.ts,191,Heliotrop,Heliotropium arborescens,flowering|sun,2,"Heliotrop ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,183,Lenzrose,Helleborus orientalis,flowering,1,"Lenzrose ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,182,Taglilie,Hemerocallis fulva,flowering|sun,2,"Taglilie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch1.ts,21,Hibiskus,Hibiscus rosa-sinensis,flowering|bright_light|sun,3,"Der Hibiskus begeistert mit grossen, trompetenfoermigen Blueten in Rot, Orange und Rosa.",Volles Sonnenlicht,18-28 °C,3 -constants/lexiconBatch2.ts,220,Gartenhibiskus,Hibiscus syriacus,flowering|tree|sun,3,Gartenhibiskus ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 -constants/lexiconBatch1.ts,105,Ritterstern,Hippeastrum hybrid,flowering|bright_light,2,"Der Ritterstern beeindruckt im Winter mit riesigen, trompetenfoermigen Blueten in Rot, Pink oder Weiss.",Helles bis volles Licht,18-25 °C,7 -constants/lexiconBatch2.ts,3,Kentia-Palme,Howea forsteriana,pet_friendly|tree|low_light,3,"Die Kentia-Palme ist eine der elegantesten Zimmerpalmen mit langen, herabhängenden Fiederblaettern.",Helles indirektes Licht,18-25 °C,7 -constants/lexiconBatch1.ts,58,Kleine Wachsblume,Hoya bella,flowering|succulent|hanging,3,"Die Kleine Wachsblume traegt zierliche, sternfoermige weisse Blueten mit rosa Mitte. Haengende Sukkulente.",Helles indirektes Licht,18-27 °C,10 -constants/lexiconBatch1.ts,57,Wachsblume,Hoya carnosa,easy|flowering|succulent|hanging,4,"Die Wachsblume ist eine Kletterpflanze mit dicken, wachsartigen Blaettern und sternfoermigen, duftenden Blueten.",Helles indirektes Licht,16-27 °C,10 -constants/lexiconBatch2.ts,159,Hasengloeckchen,Hyacinthoides non-scripta,flowering|sun,2,"Hasengloeckchen ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch1.ts,108,Hyazinthe,Hyacinthus orientalis,easy|flowering,2,"Die Hyazinthe bezaubert mit dichten Bluetenrispen und intensivem Duft in Blau, Rosa, Weiss oder Gelb.",Helles bis volles Licht,10-18 °C,5 -constants/lexiconBatch2.ts,148,Hortensie,Hydrangea macrophylla,flowering|bright_light,2,"Hortensie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Helles bis halbschattiges Licht,8-24 C,4 -constants/lexiconBatch2.ts,105,Johanniskraut,Hypericum perforatum,flowering|medicinal|sun,3,Das Johanniskraut hat leuchtend gelbe Blueten und ist ein wichtiges Heilkraut gegen Depressionen und Stimmungstiefs.,Volles Sonnenlicht,10-25 °C,7 -constants/lexiconBatch2.ts,227,Punktblatt,Hypoestes phyllostachya,patterned|bright_light,2,Punktblatt ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7 -constants/lexiconBatch2.ts,136,Ysop,Hyssopus officinalis,easy|sun,2,Ysop ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 -constants/lexiconBatch2.ts,203,Stechpalme,Ilex aquifolium,tree|sun,2,Stechpalme ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 -constants/lexiconBatch2.ts,176,Gartenbalsamine,Impatiens balsamina,flowering|bright_light,2,"Gartenbalsamine ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,59,Neuguinea-Balsamine,Impatiens hawkeri,easy|flowering,2,"Die Neuguinea-Balsamine hat grosse, leuchtende Blueten und ist sehr bluehfreudig. Ideal fuer Terrassen.",Helles indirektes Licht,18-27 °C,3 -constants/lexiconBatch1.ts,20,Fleissiges Lieschen,Impatiens walleriana,easy|flowering,2,Das Fleissige Lieschen bluet von Fruehling bis Herbst unermudlich in vielen Farben.,Helles indirektes Licht,16-24 °C,2 -constants/lexiconBatch1.ts,64,Suesskartoffel,Ipomoea batatas,easy|hanging|sun,3,"Die Suesskartoffel-Zierpflanze hat dekorative, herzfoermige Blaetter in gruen oder dunkelviolett. Ideal als Haengepflanze.",Volles Sonnenlicht,20-30 °C,5 -constants/lexiconBatch2.ts,156,Prunkwinde,Ipomoea purpurea,flowering|sun,2,"Prunkwinde ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,144,Bart-Iris,Iris germanica,flowering|sun,2,"Bart-Iris ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,211,Jacaranda,Jacaranda mimosifolia,flowering|tree|large,3,Jacaranda ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 -constants/lexiconBatch1.ts,59,Jasmin,Jasminum polyanthum,flowering,1,"Der Jasmin ist eine Kletterpflanze mit intensiv duftenden, weissen Blueten. Er bluet im Winter und Fruehling.",Helles bis volles Licht,10-22 °C,5 -constants/lexiconBatch2.ts,172,Arabischer Jasmin,Jasminum sambac,flowering|bright_light,2,"Arabischer Jasmin ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch1.ts,9,Kalanchoe,Kalanchoe blossfeldiana,easy|flowering|succulent|sun,4,"Die Kalanchoe ist eine beliebte Bluehpflanze mit leuchtenden Blueten in Rot, Orange, Gelb oder Rosa.",Helles bis volles Licht,15-25 °C,10 -constants/lexiconBatch2.ts,22,Brutblatt,Kalanchoe daigremontiana,easy|succulent|sun,3,Das Brutblatt bildet entlang des Blattrandes zahlreiche kleine Jungpflanzen. Eine faszinierende Sukkulente.,Helles bis volles Licht,15-25 °C,14 -constants/lexiconBatch2.ts,21,Kaninchen-Ohren,Kalanchoe tomentosa,easy|succulent|sun,3,"Kaninchen-Ohren haben weisslich-filzige Blaetter mit braunen Raendern, die Kaninchen­ohren aehneln. Sehr dekorativ.",Helles bis volles Licht,15-25 °C,14 -constants/lexiconBatch2.ts,95,Salat,Lactuca sativa,easy,1,Salat ist eine schnell wachsende Blattgemuese­pflanze. Im Topf und Balkonkasten sehr gut zu kultivieren.,Helles bis volles Licht,10-22 °C,3 -constants/lexiconBatch2.ts,197,Traenendes Herz,Lamprocapnos spectabilis,flowering|bright_light,2,"Traenendes Herz ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,64,Wandelroeschen,Lantana camara,flowering|bright_light|sun,3,"Das Wandelroeschen hat kugelige Bluetenkoepfe, die die Farbe von Gelb ueber Orange zu Rot wechseln. Sehr attraktiv.",Volles Sonnenlicht,18-28 °C,5 -constants/lexiconBatch2.ts,158,Duftwicke,Lathyrus odoratus,flowering|sun,2,"Duftwicke ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,121,Lorbeer,Laurus nobilis,easy|sun,2,Lorbeer ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 -constants/lexiconBatch1.ts,23,Echter Lavendel,Lavandula angustifolia,medicinal|bright_light|sun,3,Der Echte Lavendel ist ein aromatischer Halbstrauch mit lilafarbenen Bluetenaehren. Herrlicher Duft.,Volles Sonnenlicht,10-25 °C,10 -constants/lexiconBatch2.ts,180,Bechermalve,Lavatera trimestris,flowering|sun,2,"Bechermalve ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,173,Margerite,Leucanthemum vulgare,flowering|sun,2,"Margerite ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,201,Shasta-Margerite,Leucanthemum x superbum,flowering|sun,2,"Shasta-Margerite ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,126,Liebstoeckel,Levisticum officinale,easy|sun,2,Liebstoeckel ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 -constants/lexiconBatch2.ts,69,Ostertrompete,Lilium longiflorum,flowering|bright_light,2,"Die Ostertrompete hat grosse, weisse, trichterfoermige Blueten mit intensivem Duft. Klassische Osterblume.",Helles bis volles Licht,15-25 °C,5 -constants/lexiconBatch2.ts,23,Lebende Steine,Lithops julii,succulent|sun,2,"Lebende Steine sind faszinierende Mimikry-Sukkulenten, die Kieselsteinen taeuschen aehnlich sehen. Sehr trockenheitsresistent.",Volles Sonnenlicht,10-30 °C,21 -constants/lexiconBatch2.ts,4,Chinesische Fächerpalme,Livistona chinensis,tree|bright_light,2,"Die Chinesische Fächerpalme hat grosse, faecher­foermige Blaetter auf einem einzelnen Stamm. Sehr dekorativ.",Helles bis volles Licht,15-25 °C,7 -constants/lexiconBatch2.ts,62,Duftsteinrich,Lobularia maritima,easy|flowering,2,"Der Duftsteinrich ist ein niedrig wachsendes Pflanzchen mit winzigen, weissen oder lilafarbenen Blueten und suessem Duft.",Helles bis volles Licht,10-22 °C,3 -constants/lexiconBatch2.ts,171,Geissblatt,Lonicera japonica,flowering|bright_light,2,"Geissblatt ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,154,Lupine,Lupinus polyphyllus,flowering|sun,2,"Lupine ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,204,Magnolie,Magnolia grandiflora,flowering|tree|large,3,Magnolie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 -constants/lexiconBatch1.ts,79,Mammillaria,Mammillaria zeilmanniana,easy|flowering|succulent|sun,4,"Die Mammillaria ist ein kompakter, kugelfoermiger Kaktus, der im Fruehling einen Kranz aus rosa Blueten traegt.",Volles Sonnenlicht,15-35 °C,14 -constants/lexiconBatch1.ts,51,Gebet-Pflanze,Maranta leuconeura,pet_friendly|patterned|high_humidity,3,Die Gebet-Pflanze faltet ihre gemusterten Blaetter nachts wie Haende zusammen. Faszinierende rote und gruene Muster.,Indirektes Licht,18-27 °C,5 -constants/lexiconBatch2.ts,102,Zitronenmelisse,Melissa officinalis,easy|medicinal,2,Die Zitronenmelisse ist ein zitronig duftendes Heilkraut. Sie beruhigt die Nerven und foerdert den Schlaf.,Helles bis volles Licht,15-25 °C,5 -constants/lexiconBatch1.ts,26,Gruene Minze,Mentha spicata,easy,1,"Die Gruene Minze ist ein wuchsfreudiges Kuechenkraut mit frischem, minzigem Duft. Fuer Tee und Cocktails.",Helles bis volles Licht,15-25 °C,3 -constants/lexiconBatch2.ts,46,Tueipelfarn (Microsorum),Microsorum punctatum,high_humidity,1,"Microsorum punctatum ist ein tropischer Farn mit langen, ungeteilten, glaenzenden Wedeln. Fuer feuchte Standorte.",Helles indirektes Licht,18-27 °C,7 -constants/lexiconBatch1.ts,75,Stiefmuetterchen-Orchidee,Miltoniopsis roezlii,flowering|high_humidity,2,"Die Stiefmuetterchen-Orchidee hat grosse, flache Blueten. Bevorzugt kuehle Temperaturen und hohe Luftfeuchtigkeit.",Indirektes Licht,15-22 °C,5 -constants/lexiconBatch2.ts,76,Schamkraut,Mimosa pudica,flowering|bright_light,2,"Das Schamkraut faltet seine Blaettchen blitzschnell zusammen, wenn man sie beruehrt. Ein faszinierendes Erlebnis.",Helles bis volles Licht,20-28 °C,5 -constants/lexiconBatch2.ts,179,Indianernessel,Monarda didyma,flowering|sun,2,"Indianernessel ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,47,Monstera adansonii,Monstera adansonii,easy|hanging,2,Monstera adansonii hat herzfoermige Blaetter mit zahlreichen runden Lochern. Eine rankende Zimmerpflanze.,Helles indirektes Licht,18-27 °C,7 -constants/lexiconBatch2.ts,48,Monstera obliqua,Monstera obliqua,patterned|hanging,2,"Monstera obliqua ist eine seltene Monstera-Art mit filigranen Blaettern, die hauptsaechlich aus Lochern bestehen.",Helles indirektes Licht,18-27 °C,7 -constants/lexiconBatch2.ts,2,Bananenpflanze,Musa acuminata,large|high_humidity,2,"Die Bananenpflanze ist eine tropische Staude mit riesigen, glaenzenden Blaettern. Im Zimmer selten fruechttragend.",Helles bis volles Licht,20-30 °C,5 -constants/lexiconBatch1.ts,109,Traubenhyazinthe,Muscari armeniacum,easy|flowering,2,"Die Traubenhyazinthe bildet dichte Trauben aus kleinen, blauen bis violetten Gloeckchen. Zuverlaessige Fruejahrszwiebel.",Helles bis volles Licht,8-18 °C,7 -constants/lexiconBatch2.ts,177,Vergissmeinnicht,Myosotis sylvatica,flowering|sun,2,"Vergissmeinnicht ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch1.ts,106,Osterglocke,Narcissus pseudonarcissus,flowering,1,"Die Osterglocke ist der klassische Fruehjahrsblueher mit leuchtend gelben, trompetenfoermigen Blueten.",Helles bis volles Licht,10-18 °C,5 -constants/lexiconBatch2.ts,199,Nemesie,Nemesia strumosa,flowering|sun,2,"Nemesie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,37,Neoregelia,Neoregelia carolinae,flowering|patterned|bright_light,3,"Die Neoregelia ist eine Bromelie, bei der das Herzblatt zur Bluetzeit leuchtend rot wird. Sehr dekorativ.",Helles bis volles Licht,18-27 °C,7 -constants/lexiconBatch2.ts,79,Kannenpflanze,Nepenthes alata,hanging|high_humidity,2,"Die Kannenpflanze bildet grosse, gefuellte Kannen als Insekten­fallen. Eine faszinierende, tropische Pflanze.",Helles indirektes Licht,20-30 °C,5 -constants/lexiconBatch2.ts,132,Katzenminze,Nepeta cataria,easy|sun,2,Katzenminze ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 -constants/lexiconBatch2.ts,120,Oleander,Nerium oleander,flowering|bright_light|sun,3,"Der Oleander ist ein mediteraner Strauch mit leuchtend roten, rosa oder weissen Blueten. Sehr hitzetolerant.",Volles Sonnenlicht,15-28 °C,7 -constants/lexiconBatch2.ts,193,Ziertabak,Nicotiana alata,flowering|sun,2,"Ziertabak ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch1.ts,25,Basilikum,Ocimum basilicum,easy|medicinal|sun,3,"Basilikum ist das beliebteste Kuechenkraut mit intensiv aromatischen, gruenen Blaettern. Fuer Pesto verwendet.",Volles Sonnenlicht,18-30 °C,2 -constants/lexiconBatch1.ts,74,Tanzerinnen-Orchidee,Oncidium sphacelatum,flowering|high_humidity,2,"Die Tanzerinnen-Orchidee traegt lange Rispen mit Hunderten kleiner, gelb-brauner Blueten. Sehr reichliche Bluetracht.",Helles indirektes Licht,18-27 °C,7 -constants/lexiconBatch1.ts,82,Hasenohren-Kaktus,Opuntia microdasys,easy|succulent|sun,3,"Der Hasenohren-Kaktus hat flache, ovale Triebe mit dichten weissen Glochiden. Klassischer Zimmerkaktus.",Volles Sonnenlicht,10-35 °C,21 -constants/lexiconBatch2.ts,124,Majoran,Origanum majorana,easy|sun,2,Majoran ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 -constants/lexiconBatch1.ts,28,Oregano,Origanum vulgare,easy|medicinal|sun,3,"Oregano ist ein aromatisches Kuechenkraut mit runden, behaarten Blaettern. In mediterraner Kueche beliebt.",Volles Sonnenlicht,15-25 °C,7 -constants/lexiconBatch2.ts,200,Kapmargerite,Osteospermum ecklonis,flowering|sun,2,"Kapmargerite ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch1.ts,54,Kleeblume,Oxalis triangularis,flowering|patterned,2,"Die Kleeblume hat tiefviolette, dreieckige Blaetter und zarte rosa Blueten. Sie faltet die Blaetter bei Dunkelheit.",Helles indirektes Licht,15-24 °C,7 -constants/lexiconBatch2.ts,231,Glueckskastanie,Pachira aquatica,easy|tree|bright_light,3,Glueckskastanie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7 -constants/lexiconBatch1.ts,88,Mondstein-Pflanze,Pachyphytum oviferum,easy|succulent|sun,3,"Die Mondstein-Pflanze hat dicke, ovale Blaetter mit einem pastellrosafarbenen, mehligen Ueberzug.",Volles Sonnenlicht,15-25 °C,14 -constants/lexiconBatch2.ts,143,Pfingstrose,Paeonia lactiflora,flowering|sun,2,"Pfingstrose ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,6,Schraubenbaum,Pandanus veitchii,patterned|bright_light,2,"Der Schraubenbaum hat spiralfoermig angeordnete, gruenweiss gestreifte Blaetter. Sehr dekorativ und exotisch.",Helles bis volles Licht,18-27 °C,7 -constants/lexiconBatch2.ts,185,Mohn,Papaver rhoeas,flowering|sun,2,"Mohn ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch1.ts,63,Passionsblume,Passiflora caerulea,flowering,1,"Die Passionsblume ist eine faszinierende Kletterpflanze mit komplex strukturierten, blau-weissen Blueten.",Helles bis volles Licht,15-27 °C,5 -constants/lexiconBatch1.ts,31,Rosengeranie,Pelargonium graveolens,easy|medicinal|sun,3,Die Rosengeranie ist eine Duftpflanze mit tief eingeschnittenen Blaettern und rosaenlichem Aroma.,Volles Sonnenlicht,15-25 °C,7 -constants/lexiconBatch2.ts,61,Efeu-Geranie,Pelargonium peltatum,easy|flowering|hanging|sun,4,"Die Efeu-Geranie hat efeufoermige, glaenzende Blaetter und bluet den ganzen Sommer in leuchtenden Farben.",Helles bis volles Licht,15-25 °C,5 -constants/lexiconBatch2.ts,174,Stehende Geranie,Pelargonium zonale,flowering|sun,2,"Stehende Geranie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,229,Wassermelonen-Peperomie,Peperomia argyreia,pet_friendly|patterned,2,Wassermelonen-Peperomie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7 -constants/lexiconBatch1.ts,102,Rippenpeperomie,Peperomia caperata,easy|pet_friendly,2,"Die Rippenpeperomie hat tief gerippte, dunkelgruene bis violette Blaetter mit einer samtigen Textur.",Helles indirektes Licht,18-26 °C,10 -constants/lexiconBatch1.ts,103,Spiegelpeperomie,Peperomia obtusifolia,easy|pet_friendly|low_light,3,"Die Spiegelpeperomie hat glaenzende, lederartige, oval-runde Blaetter in tiefem Gruen. Sehr robust.",Helles indirektes Licht,16-26 °C,10 -constants/lexiconBatch2.ts,230,Raindrop-Peperomie,Peperomia polybotrya,easy|pet_friendly,2,Raindrop-Peperomie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7 -constants/lexiconBatch2.ts,134,Shiso,Perilla frutescens,easy|sun,2,Shiso ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 -constants/lexiconBatch1.ts,29,Petersilie,Petroselinum crispum,easy,1,Petersilie ist eines der meistgenutzten Kuechenkraeuter mit frisch-aromatischem Geschmack. Reich an Vitaminen.,Helles Licht,10-25 °C,3 -constants/lexiconBatch1.ts,34,Petunie,Petunia hybrida,easy|pet_friendly|flowering|sun,4,Die Petunie ist eine der beliebtesten Balkonpflanzen mit trichterfoermigen Blueten in unzaehligen Farben.,Volles Sonnenlicht,15-25 °C,2 -constants/lexiconBatch1.ts,69,Schmetterlingsorchidee,Phalaenopsis amabilis,flowering|high_humidity,2,Die Schmetterlingsorchidee ist die bekannteste Zimmerorchidee. Sie bluet bei guter Pflege monatelang.,Helles indirektes Licht,18-28 °C,10 -constants/lexiconBatch2.ts,50,Philodendron bipinnatifidum,Philodendron bipinnatifidum,easy|large,2,"Philodendron bipinnatifidum hat grosse, tief gelappte Blaetter. Er entwickelt einen beeindruckenden, baumfoermigen Wuchs.",Helles indirektes Licht,18-27 °C,7 -constants/lexiconBatch2.ts,51,Roter Philodendron,Philodendron erubescens,easy|hanging,2,"Der Rote Philodendron hat glaenzende, herzfoermige Blaetter, die jung roetrlich erscheinen. Sehr dekorativ.",Helles indirektes Licht,18-27 °C,7 -constants/lexiconBatch2.ts,243,Philodendron Pink Princess,Philodendron erubescens Pink Princess,patterned|bright_light,2,Philodendron Pink Princess ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7 -constants/lexiconBatch2.ts,49,Philodendron gloriosum,Philodendron gloriosum,patterned|large|high_humidity,3,"Philodendron gloriosum hat grosse, samtige, herzfoermige Blaetter mit weissen Rippen. Eine atemberaubende Pflanze.",Helles indirektes Licht,18-27 °C,7 -constants/lexiconBatch1.ts,15,Herzblatt-Philodendron,Philodendron hederaceum,easy|hanging|low_light,3,Der Herzblatt-Philodendron ist eine pflegeleichte Kletter- oder Haengepflanze mit herzfoermigen Blaettern.,Indirektes Licht,18-28 °C,7 -constants/lexiconBatch2.ts,242,Philodendron Brasil,Philodendron hederaceum Brasil,easy|hanging|low_light,3,Philodendron Brasil ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7 -constants/lexiconBatch2.ts,40,Blaues Kanaelfarn,Phlebodium aureum,high_humidity,1,"Der Blaue Kanaelfarn hat wachsartige, blaugruene Wedel und glaenzende Wurzelstaemme. Sehr dekorativ.",Helles indirektes Licht,18-27 °C,7 -constants/lexiconBatch2.ts,165,Flammenblume,Phlox paniculata,flowering|sun,2,"Flammenblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch1.ts,44,Zwergdattelpalme,Phoenix roebelenii,tree|bright_light,2,"Die Zwergdattelpalme ist eine zierliche Palme mit eleganten, gebogenen Fiederblaettern. Tropisches Flair.",Helles bis volles Licht,18-27 °C,7 -constants/lexiconBatch2.ts,8,Goldener Bambus,Phyllostachys aurea,easy|large,2,"Der Goldene Bambus hat elegante, goldgelbe Halme mit engstehenden Knoten. Sehr dekorativ als Sichtschutz.",Helles bis volles Licht,10-30 °C,5 -constants/lexiconBatch2.ts,207,Fichte,Picea abies,tree|large|sun,3,Fichte ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 -constants/lexiconBatch2.ts,228,Aluminium-Pflanze,Pilea cadierei,easy|pet_friendly|patterned,3,Aluminium-Pflanze ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7 -constants/lexiconBatch1.ts,2,Ufopflanze,Pilea peperomioides,easy|pet_friendly,2,"Die Ufopflanze hat unverwechselbare, runde Blaetter auf langen Stielen. Bildet leicht Ableger zum Verschenken.",Helles indirektes Licht,13-30 °C,7 -constants/lexiconBatch2.ts,81,Fettkraut,Pinguicula grandiflora,flowering|high_humidity,2,"Das Fettkraut faengt Insekten mit klebrigen Blaettern. Es bluet mit violetten, sporenartigen Blueten.",Helles indirektes Licht,10-20 °C,5 -constants/lexiconBatch2.ts,206,Kiefer,Pinus sylvestris,tree|large|sun,3,Kiefer ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 -constants/lexiconBatch2.ts,41,Geweihfarn,Platycerium bifurcatum,hanging|high_humidity,2,"Der Geweihfarn hat gespaltene Wedel, die einem Hirschgeweih aehneln. Er ist ein epiphytischer Farn fuer Holz.",Helles indirektes Licht,15-25 °C,7 -constants/lexiconBatch2.ts,152,Buntnessel,Plectranthus scutellarioides,patterned|bright_light,2,"Buntnessel ist eine farbstarke Zierpflanze, die vor allem fuer ihr dekoratives Laub beliebt ist.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch1.ts,61,Bleiwurz,Plumbago auriculata,flowering|bright_light|sun,3,"Die Bleiwurz ist ein halbimmergruener Strauch mit himmelblauen Blueten, der fast das ganze Jahr bluet.",Volles Sonnenlicht,15-27 °C,5 -constants/lexiconBatch2.ts,118,Tempel-Baum,Plumeria rubra,flowering|tree|sun,3,"Der Tempel-Baum hat intensiv duftende, sternfoermige Blueten in Weiss, Gelb oder Rosa. Klassische Tropenblume.",Volles Sonnenlicht,20-30 °C,7 -constants/lexiconBatch2.ts,44,Tueipelfarn,Polypodium vulgare,easy,1,Der Tueipelfarn ist ein heimischer Farn mit gelappten Wedeln und runden Sporenhaeufchen auf der Unterseite.,Helles indirektes Licht,10-20 °C,7 -constants/lexiconBatch2.ts,27,Speckbaum,Portulacaria afra,easy|succulent|sun,3,"Der Speckbaum ist eine sukkulente Pflanze mit roten Stielen und kleinen, runden, glaenzenden Blaettern.",Helles bis volles Licht,15-30 °C,14 -constants/lexiconBatch1.ts,36,Primel,Primula vulgaris,flowering,1,"Die Primel ist einer der ersten Fruehjahrs­boten mit lebhaften Blueten in Gelb, Pink, Rot und Lila.",Helles indirektes Licht,10-18 °C,4 -constants/lexiconBatch2.ts,71,Koenigs-Protea,Protea cynaroides,flowering|large|sun,3,"Die Koenigs-Protea ist die Nationalblume Suedafrikas mit riesigen, imposanten Bluetenkoepfen. Eine echte Besonderheit.",Volles Sonnenlicht,10-25 °C,7 -constants/lexiconBatch2.ts,218,Kirschlorbeer,Prunus laurocerasus,tree|sun,2,Kirschlorbeer ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 -constants/lexiconBatch2.ts,89,Guave,Psidium guajava,tree|sun,2,Die Guave ist ein tropischer Obstbaum mit gelblich-weissen Fruechten. Sie ist reich an Vitamin C.,Volles Sonnenlicht,18-30 °C,7 -constants/lexiconBatch2.ts,88,Granatapfelbaum,Punica granatum,flowering|tree|sun,3,"Der Granatapfelbaum hat leuchtend rote Blueten und rote, essbare Fruechte mit rubinroten Kernen.",Volles Sonnenlicht,15-28 °C,7 -constants/lexiconBatch2.ts,205,Eiche,Quercus robur,tree|large|sun,3,Eiche ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 -constants/lexiconBatch2.ts,162,Ranunkel,Ranunculus asiaticus,flowering|sun,2,"Ranunkel ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,98,Radieschen,Raphanus sativus,easy,1,"Das Radieschen ist ein schnellwachsendes Gemuese mit runden, roten Knollen. Es reift in nur 3-4 Wochen.",Helles bis volles Licht,10-22 °C,2 -constants/lexiconBatch2.ts,52,Mini-Monstera,Rhaphidophora tetrasperma,easy|hanging,2,"Die Mini-Monstera hat monstera­aehnliche, gelochte Blaetter auf einer kompakten, klettternden Pflanze. Sehr trendig.",Helles indirektes Licht,18-27 °C,7 -constants/lexiconBatch1.ts,45,Stab-Palme,Rhapis excelsa,tree|low_light,2,"Die Stab-Palme ist eine elegante Zimmerpalme mit faecher­foermigen Blaettern auf duennen, bambusartigen Staemmen.",Helles indirektes Licht,15-25 °C,7 -constants/lexiconBatch1.ts,85,Korallenkaktus,Rhipsalis baccifera,succulent|hanging,2,"Der Korallenkaktus ist ein epiphytischer Kaktus mit duennen, haengenden Trieben und kleinen weissen Beeren.",Indirektes Licht,18-27 °C,7 -constants/lexiconBatch2.ts,170,Rhododendron,Rhododendron catawbiense,flowering|tree|bright_light,3,"Rhododendron ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch1.ts,91,Japanische Azalee,Rhododendron simsii,flowering,1,"Die Japanische Azalee bluet im Winter und Fruehling ueppig mit leuchtend roten, rosa oder weissen Blueten.",Helles indirektes Licht,10-18 °C,4 -constants/lexiconBatch2.ts,214,Robinie,Robinia pseudoacacia,tree|large|sun,3,Robinie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 -constants/lexiconBatch1.ts,66,Chinesische Rose,Rosa chinensis,flowering|sun,2,Die Chinesische Rose ist eine der Stammarten vieler Gartenrosen und bluet fast ununterbrochen.,Volles Sonnenlicht,15-25 °C,5 -constants/lexiconBatch2.ts,142,Rose,Rosa x hybrida,flowering|bright_light|sun,3,"Rose ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch1.ts,24,Rosmarin,Rosmarinus officinalis,easy|medicinal|sun,3,Rosmarin ist ein aromatisches Kraut mit nadelartigen Blaettern und blauen Blueten. In der Kueche unverzichtbar.,Volles Sonnenlicht,10-25 °C,7 -constants/lexiconBatch2.ts,167,Rudbeckie,Rudbeckia hirta,flowering|sun,2,"Rudbeckie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,130,Sauerampfer,Rumex acetosa,easy|sun,2,Sauerampfer ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 -constants/lexiconBatch1.ts,94,Afrikanisches Veilchen,Saintpaulia ionantha,easy|flowering,2,"Das Afrikanische Veilchen ist eine kleine, kompakte Bluehpflanze mit samtigen Blaettern und violetten Blueten.",Helles indirektes Licht,18-25 °C,7 -constants/lexiconBatch2.ts,113,Silber-Weide,Salix alba,tree|large|medicinal,3,"Die Silber-Weide hat silbrig-glaenzende Blaetter. Weidenrinde enthält Salicylsaeure, die Grundlage von Aspirin.",Helles bis volles Licht,10-25 °C,7 -constants/lexiconBatch2.ts,195,Mehlsalbei,Salvia farinacea,flowering|sun,2,"Mehlsalbei ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,103,Salbei,Salvia officinalis,easy|medicinal|sun,3,Salbei ist ein aromatisches Heilkraut mit silbrig-gruenen Blaettern. Er hat antibakterielle und entzuendungshem­mende Wirkung.,Volles Sonnenlicht,10-25 °C,7 -constants/lexiconBatch2.ts,168,Feuersalbei,Salvia splendens,flowering|sun,2,"Feuersalbei ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,112,Schwarzer Holunder,Sambucus nigra,flowering|tree|medicinal,3,Der Schwarze Holunder hat weisse Doldenbluten und schwarze Beeren. Die Fruechte werden fuer Sirup und Saft verwendet.,Helles bis volles Licht,10-25 °C,7 -constants/lexiconBatch2.ts,17,Zylindrischer Bogenhanf,Sansevieria cylindrica,easy|succulent|sun,3,"Der Zylindrische Bogenhanf hat zylindrische, aufrechte Blaetter, die sich nach oben verjuengen. Sehr pflegeleicht.",Helles bis volles Licht,15-27 °C,14 -constants/lexiconBatch2.ts,78,Purpursonnentau,Sarracenia purpurea,high_humidity|sun,2,Der Purpursonnentau ist eine fleischfressende Kannenpflanze mit purpurroten Kannen. Faengt Insekten.,Volles Sonnenlicht,5-25 °C,3 -constants/lexiconBatch2.ts,123,Bohnenkraut,Satureja hortensis,easy|sun,2,Bohnenkraut ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 -constants/lexiconBatch2.ts,11,Grosse Strahlenaralie,Schefflera actinophylla,easy|tree|large,3,"Die Grosse Strahlenaralie kann grosse, handfoermige Blaetter entwickeln. Sie ist ideal als Zimmerstrauch.",Helles indirektes Licht,18-27 °C,7 -constants/lexiconBatch2.ts,10,Strahlenaralie,Schefflera arboricola,easy|tree|air_purifier,3,"Die Strahlenaralie hat fingerfoermig angeordnete, glaenzende Blaetter auf langen Stielen. Sehr robuste Zimmerpflanze.",Helles indirektes Licht,15-25 °C,7 -constants/lexiconBatch2.ts,235,Falsche Aralie,Schefflera elegantissima,tree|bright_light,2,Falsche Aralie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7 -constants/lexiconBatch1.ts,8,Weihnachtskaktus,Schlumbergera truncata,easy|flowering|succulent,3,"Der Weihnachtskaktus erfreut zur Weihnachtszeit mit leuchtenden Blueten in Rosa, Rot oder Weiss.",Helles indirektes Licht,15-21 °C,7 -constants/lexiconBatch1.ts,55,Satinpothos,Scindapsus pictus,easy|patterned|hanging,3,"Der Satinpothos hat samtig-glaenzende, silbrig gefleckte Blaetter auf langen, haengenden Ranken.",Helles indirektes Licht,18-28 °C,7 -constants/lexiconBatch1.ts,7,Eselschwanz,Sedum morganianum,easy|succulent|hanging|sun,4,"Der Eselschwanz ist eine haengende Sukkulente mit langen Trieben aus dichten, blaugruenen Blaettchen.",Volles Sonnenlicht,15-25 °C,14 -constants/lexiconBatch2.ts,45,Regenbogenmoos,Selaginella uncinata,patterned|high_humidity,2,"Das Regenbogenmoos hat schuppenfoermige Blaetter, die im Licht schillernd irisieren. Dekorativ fuer Terrarien.",Helles indirektes Licht,18-27 °C,5 -constants/lexiconBatch1.ts,100,Perlenschnur-Pflanze,Senecio rowleyanus,easy|succulent|hanging,3,"Die Perlenschnur-Pflanze hat haengende Ranken mit kugelfoermigen, perlenaehnlichen Blaettern. Einzigartige Sukkulente.",Helles bis volles Licht,15-27 °C,14 -constants/lexiconBatch2.ts,28,Blauer Kreuzkraut,Senecio serpens,easy|succulent|sun,3,"Der Blaue Kreuzkraut hat zylindrische, blaublaugruene Blaetter und einen kriechenden Wuchs. Sehr dekorativ.",Helles bis volles Licht,15-25 °C,14 -constants/lexiconBatch2.ts,91,Tomate,Solanum lycopersicum,easy,1,"Die Tomate ist eine beliebte Gemuese- und Balkonpflanze mit roten, saftigen Fruechten. Im Topf kultivierbar.",Volles Sonnenlicht,18-28 °C,3 -constants/lexiconBatch2.ts,93,Aubergine,Solanum melongena,bright_light|sun,2,"Die Aubergine ist eine Gemuese­pflanze mit grossen, violetten Fruechten. Sie benoetigt viel Waerme und Sonne.",Volles Sonnenlicht,20-30 °C,5 -constants/lexiconBatch2.ts,238,Bubikopf,Soleirolia soleirolii,pet_friendly|high_humidity,2,Bubikopf ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,15-24 C,4 -constants/lexiconBatch2.ts,213,Eberesche,Sorbus aucuparia,tree|large|sun,3,Eberesche ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 -constants/lexiconBatch2.ts,96,Spinat,Spinacia oleracea,easy,1,Spinat ist ein naehrstoffreiches Blattgemuese mit dunkelgruenen Blaettern. Reich an Eisen und Vitaminen.,Helles bis volles Licht,10-20 °C,3 -constants/lexiconBatch2.ts,222,Spierstrauch,Spiraea japonica,flowering|tree|sun,3,Spierstrauch ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 -constants/lexiconBatch2.ts,25,Aasblume,Stapelia grandiflora,flowering|succulent|sun,3,"Die Aasblume hat fleischige, gruene Staengel und riesige, sternfoermige Blueten mit aasartigem Duft.",Helles bis volles Licht,18-30 °C,14 -constants/lexiconBatch1.ts,60,Madagaskar-Jasmin,Stephanotis floribunda,flowering,1,"Der Madagaskar-Jasmin hat dicke, glaenzende Blaetter und wachsweisse, intensiv duftende Blueten. Klassische Hochzeitsblume.",Helles indirektes Licht,18-25 °C,7 -constants/lexiconBatch2.ts,131,Stevia,Stevia rebaudiana,easy|sun,2,Stevia ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 -constants/lexiconBatch2.ts,1,Weisse Strelitzie,Strelitzia nicolai,tree|large|bright_light,3,"Die Weisse Strelitzie ist ein beeindruckender Zimmerstrauch mit grossen, blaugruenen Blaettern und weiss-blauen Blueten.",Helles bis volles Licht,18-27 °C,7 -constants/lexiconBatch1.ts,3,Paradiesvogelblume,Strelitzia reginae,flowering|large|sun,3,"Die Paradiesvogelblume beeindruckt mit leuchtend orangefarbenen und blauen Blueten, die einem Vogel aehneln.",Volles Sonnenlicht,18-26 °C,7 -constants/lexiconBatch1.ts,95,Drehfrucht,Streptocarpus hybridus,flowering,1,"Die Drehfrucht ist ein Gesneriengewaechs mit langen, gerippten Blaettern und trichterfoermigen Blueten in Lila oder Rosa.",Helles indirektes Licht,15-22 °C,7 -constants/lexiconBatch1.ts,52,Stromanthe,Stromanthe sanguinea,patterned|high_humidity,2,Die Stromanthe hat dekorative Blaetter mit weissem Muster und leuchtend roter Unterseite. Familie der Marantaceen.,Helles indirektes Licht,18-25 °C,5 -constants/lexiconBatch2.ts,166,Herbstaster,Symphyotrichum novi-belgii,flowering|sun,2,"Herbstaster ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch1.ts,56,Pfeilblatt,Syngonium podophyllum,easy|hanging,2,"Das Pfeilblatt hat charakteristisch pfeilfoermige Blaetter, die sich mit dem Alter weiterentwickeln.",Helles indirektes Licht,16-27 °C,7 -constants/lexiconBatch2.ts,149,Flieder,Syringa vulgaris,flowering|tree|sun,3,"Flieder ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,66,Studentenblume,Tagetes patula,easy|flowering|sun,3,Die Studentenblume ist eine robuste Sommerblume mit orangen oder gelben Blueten. Sie haelt Schadlinge fern.,Volles Sonnenlicht,15-28 °C,3 -constants/lexiconBatch2.ts,244,Philodendron Xanadu,Thaumatophyllum xanadu,bright_light,1,Philodendron Xanadu ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7 -constants/lexiconBatch1.ts,27,Thymian,Thymus vulgaris,easy|medicinal|sun,3,"Thymian ist ein kleiner, aromatischer Strauch mit winzigen Blaettern und rosa Blueten. Wichtiges Kuechenkraut.",Volles Sonnenlicht,10-25 °C,7 -constants/lexiconBatch2.ts,33,Luftpflanze,Tillandsia ionantha,easy,1,Die Luftpflanze ist eine kompakte Bromelie ohne Topferde. Sie nimmt Wasser und Naehrstoffe ueber die Blattschuppen auf.,Helles bis volles Licht,15-30 °C,3 -constants/lexiconBatch2.ts,32,Spanisches Moos,Tillandsia usneoides,easy|hanging,2,"Das Spanische Moos ist eine epiphytische Bromelie ohne Wurzeln, die in der Luft haengt. Es benoetigt nur Feuchtigkeitsbespruehing.",Helles bis volles Licht,15-30 °C,3 -constants/lexiconBatch2.ts,55,Weisse Tradescantia,Tradescantia fluminensis,easy|hanging,2,Die Weisse Tradescantia hat gruene Blaetter mit weisslichen Unterseiten. Sehr robust und schnellwachsend.,Helles indirektes Licht,15-25 °C,5 -constants/lexiconBatch2.ts,54,Lila Tradescantia,Tradescantia pallida,easy|hanging|sun,3,Die Lila Tradescantia hat leuchtend purpurrote Blaetter und ist sehr auffaellig. Sie liebt viel Licht.,Helles bis volles Licht,15-25 °C,5 -constants/lexiconBatch1.ts,17,Zebrakraut,Tradescantia zebrina,easy|patterned|hanging,3,Das Zebrakraut faellt durch seine silbrig-lila gestreiften Blaetter auf. Schnellwachsende Haengepflanze.,Helles indirektes Licht,15-25 °C,5 -constants/lexiconBatch2.ts,151,Kapuzinerkresse,Tropaeolum majus,flowering|sun,2,"Kapuzinerkresse ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch1.ts,107,Tulpe,Tulipa gesneriana,easy|flowering,2,Die Tulpe ist eine der beliebtesten Fruehjahrsblueher mit kelchfoermigen Blueten in unzaehligen Farben.,Helles bis volles Licht,8-18 °C,5 -constants/lexiconBatch2.ts,111,Grosse Brennessel,Urtica dioica,medicinal,1,Die Grosse Brennessel ist eine Heilpflanze mit brennenden Haaren. Die Blaetter sind reich an Vitaminen und Mineralien.,Helles bis volles Licht,10-25 °C,7 -constants/lexiconBatch2.ts,82,Wasserschlauch,Utricularia gibba,high_humidity|sun,2,Der Wasserschlauch ist eine wasserbewohnende fleischfressende Pflanze mit Schlaeuchen als Insekten­fallen.,Helles bis volles Licht,15-25 °C,2 -constants/lexiconBatch2.ts,104,Baldrian,Valeriana officinalis,flowering|medicinal,2,Baldrian ist ein bekanntes Heilkraut mit weissen bis roeslichen Blueten. Die Wurzeln werden zur Schlaffoerderung verwendet.,Helles bis volles Licht,15-25 °C,7 -constants/lexiconBatch1.ts,72,Vanda-Orchidee,Vanda coerulea,flowering|bright_light|high_humidity,3,Die Vanda-Orchidee ist bekannt fuer ihre seltene blaue Bluetenfarbe. Epiphytische Orchidee mit grossen Blueten.,Helles bis volles Licht,20-30 °C,3 -constants/lexiconBatch1.ts,76,Vanille,Vanilla planifolia,flowering|high_humidity,2,"Die Vanille ist eine kletternde Orchidee, aus deren Fruechten das beliebte Gewuerz gewonnen wird.",Helles indirektes Licht,20-30 °C,5 -constants/lexiconBatch2.ts,192,Koenigskerze,Verbascum thapsus,flowering|medicinal|sun,3,"Koenigskerze ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,164,Eisenkraut,Verbena bonariensis,flowering|sun,2,"Eisenkraut ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch2.ts,198,Hornveilchen,Viola cornuta,flowering|sun,2,"Hornveilchen ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 -constants/lexiconBatch1.ts,35,Stiefmuetterchen,Viola wittrockiana,easy|flowering,2,Das Stiefmuetterchen ist ein bekannter Fruehjahrsblueher mit charakteristisch gezeichneten Blueten.,Helles bis volles Licht,5-18 °C,3 -constants/lexiconBatch2.ts,35,Flammen-Bromelie,Vriesea splendens,flowering|patterned|high_humidity,3,"Die Flammen-Bromelie hat gebänderte, dunkelgruene Blaetter und einen spektakulaeren, roten Bluetenstand.",Helles indirektes Licht,18-25 °C,7 -constants/lexiconBatch2.ts,5,Mexikanische Fächerpalme,Washingtonia robusta,tree|large|sun,3,"Die Mexikanische Fächerpalme ist eine schlanke, hohe Palme mit faecher­foermigen Blaettern. Sehr hitzetolerant.",Volles Sonnenlicht,15-35 °C,10 -constants/lexiconBatch2.ts,221,Weigelie,Weigela florida,flowering|tree|sun,3,Weigelie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 -constants/lexiconBatch1.ts,65,Chinesischer Blauregen,Wisteria sinensis,flowering|large|sun,3,"Der Chinesische Blauregen ist ein ueppiger Kletterkuenstler mit langen, duftenden Bluetentrauben in Lila.",Volles Sonnenlicht,10-25 °C,7 -constants/lexiconBatch2.ts,246,Yucca aloifolia,Yucca aloifolia,easy|tree|sun,3,Yucca aloifolia ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Volles Sonnenlicht,18-30 C,10 -constants/lexiconBatch1.ts,40,Yucca-Palme,Yucca elephantipes,easy|tree|sun,3,"Die Yucca-Palme ist eine robuste Zimmerpflanze mit starrem, immergruenem Blaetterschopf auf einem dicken Stamm.",Helles bis volles Licht,15-28 °C,14 -constants/lexiconBatch2.ts,70,Calla,Zantedeschia aethiopica,flowering|high_humidity,2,"Die Calla hat elegante, trichterfoermige weisse Hochblaetter und glaenzende, herzfoermige Blaetter. Sehr edel.",Helles indirektes Licht,15-24 °C,7 -constants/lexiconBatch2.ts,75,Ingwer,Zingiber officinale,medicinal|high_humidity,2,Ingwer ist eine tropische Gewuerzpflanze mit aromatischen Knollen. Die Blaetter sind schilfartig.,Helles indirektes Licht,20-30 °C,5 -constants/lexiconBatch2.ts,65,Zinnie,Zinnia elegans,easy|flowering|sun,3,"Die Zinnie ist eine leuchtende Sommerblume mit grossen, dahlienaehnlichen Blueten. Sehr robust und hitzetolerant.",Volles Sonnenlicht,18-30 °C,3 +source_file,source_index,name,botanical_name,all_categories,category_count,description,light,temp,water_interval_days +constants/lexiconBatch2.ts,115,Faecherahorn,Acer palmatum,tree,1,"Der Faecherahorn ist ein japanischer Zierahorn mit feingeschnittenen, faecherfoermigen Blaettern in Gruen oder Rot.",Helles bis volles Licht,10-22 °C,5 +constants/lexiconBatch2.ts,212,Spitzahorn,Acer platanoides,tree|large|sun,3,Spitzahorn ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 +constants/lexiconBatch2.ts,108,Schafgarbe,Achillea millefolium,flowering|medicinal|sun,3,Die Schafgarbe hat weisse oder rosafarbene Bluetenschirme und fein gefiederte Blaetter. Wichtige Heilpflanze.,Volles Sonnenlicht,10-25 °C,7 +constants/lexiconBatch1.ts,86,Wuestenrose,Adenium obesum,flowering|succulent|sun,3,Die Wuestenrose ist eine sukkulente Zimmerpflanze mit dickem Stamm und leuchtend pinken Blueten.,Volles Sonnenlicht,20-35 °C,10 +constants/lexiconBatch2.ts,117,Socotra-Wuestenrose,Adenium socotranum,flowering|succulent|sun,3,"Die Socotra-Wuestenrose ist eine seltene, endemische Art mit einem sehr dicken, knolligen Stamm und rosa Blueten.",Volles Sonnenlicht,20-35 °C,14 +constants/lexiconBatch2.ts,42,Frauenhaarfarn,Adiantum raddianum,high_humidity,1,"Der Frauenhaarfarn hat zarte, feingliedrige Wedel auf schwarzen, draht­aehnlichen Stielen. Liebt Feuchtigkeit.",Helles indirektes Licht,18-27 °C,3 +constants/lexiconBatch2.ts,31,Adromischus,Adromischus cristatus,easy|succulent|sun,3,Adromischus ist eine kompakte Sukkulente mit ungewoehnlich wellenrandigen Blaettern auf kurzen Staengeln.,Helles bis volles Licht,15-25 °C,14 +constants/lexiconBatch2.ts,34,Silbervase,Aechmea fasciata,flowering|patterned,2,Die Silbervase ist eine Bromelie mit silbrig gebänderten Blaettern und einem rosafarbenen Bluetenstand.,Helles indirektes Licht,18-25 °C,10 +constants/lexiconBatch1.ts,10,Schwarze Rose (Aeonium),Aeonium arboreum,succulent|sun,2,"Das Aeonium bildet dekorative, rosettenfoermige Sukkulenten an verzweigten Stielen.",Volles Sonnenlicht,10-25 °C,10 +constants/lexiconBatch1.ts,98,Lippenstiftpflanze,Aeschynanthus radicans,flowering|hanging|high_humidity,3,Die Lippenstiftpflanze hat haengende Triebe mit glaenzenden Blaettern und leuchtend roten Roehrenbluten.,Helles indirektes Licht,18-27 °C,7 +constants/lexiconBatch1.ts,11,Agave,Agave americana,succulent|large|sun,3,"Die Agave ist eine imposante Sukkulente mit steifen, blaugruenen Blaettern mit Stacheln. Sie bluet nur einmal.",Volles Sonnenlicht,10-35 °C,21 +constants/lexiconBatch1.ts,50,Aglaoneme,Aglaonema commutatum,easy|patterned|low_light,3,Die Aglaoneme ist eine dekorative Zimmerpflanze mit silbrig-gruen gemusterten Blaettern. Tolerant gegenueber wenig Licht.,Wenig bis helles Licht,15-26 °C,7 +constants/lexiconBatch2.ts,155,Stockrose,Alcea rosea,flowering|sun,2,"Stockrose ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch1.ts,30,Schnittlauch,Allium schoenoprasum,easy,1,Schnittlauch ist ein beliebtes Kuechenkraut mit roehrenfoermigen Blaettern und lila Blueten.,Helles bis volles Licht,10-25 °C,3 +constants/lexiconBatch2.ts,135,Schnittknoblauch,Allium tuberosum,easy|sun,2,Schnittknoblauch ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 +constants/lexiconBatch1.ts,46,Amazona-Taro,Alocasia amazonica,patterned|large|high_humidity,3,"Der Amazona-Taro besticht mit dunkelgruenen, pfeilfoermigen Blaettern mit markant weissen Rippen.",Indirektes Licht,18-27 °C,5 +constants/lexiconBatch2.ts,225,Alocasia zebrina,Alocasia zebrina,bright_light|high_humidity,2,Alocasia zebrina ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5 +constants/lexiconBatch1.ts,89,Kap-Aloe,Aloe arborescens,easy|succulent|medicinal|sun,4,"Die Kap-Aloe ist eine strauchige Aloe mit schmalen, gezaehnten Blaettern und leuchtend roten Bluetenaehren im Winter.",Volles Sonnenlicht,10-30 °C,14 +constants/lexiconBatch2.ts,18,Kap-Aloe (ferox),Aloe ferox,succulent|large|medicinal|sun,4,"Aloe ferox ist eine grosse, imposante Aloe mit stachligen, blaugruenen Blaettern und leuchtend roten Bluetenaehren.",Volles Sonnenlicht,10-30 °C,14 +constants/lexiconBatch2.ts,128,Zitronenverbene,Aloysia citrodora,easy|sun,2,Zitronenverbene ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 +constants/lexiconBatch2.ts,73,Muschelingwer,Alpinia zerumbet,flowering|large|high_humidity,3,"Der Muschelingwer hat lange, elegante Blaetter und haengende Bluetenrispen mit weiss-rosa Bluetchen.",Helles bis volles Licht,20-30 °C,5 +constants/lexiconBatch2.ts,194,Fuchsschwanz,Amaranthus caudatus,flowering|sun,2,"Fuchsschwanz ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,163,Anemone,Anemone coronaria,flowering|sun,2,"Anemone ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,140,Dill,Anethum graveolens,easy|sun,2,Dill ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 +constants/lexiconBatch2.ts,125,Kerbel,Anthriscus cerefolium,easy|sun,2,Kerbel ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 +constants/lexiconBatch2.ts,233,Samt-Anthurie,Anthurium clarinervium,patterned|high_humidity,2,Samt-Anthurie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5 +constants/lexiconBatch2.ts,234,Kristall-Anthurie,Anthurium crystallinum,patterned|high_humidity,2,Kristall-Anthurie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5 +constants/lexiconBatch2.ts,147,Loewenmaeulchen,Antirrhinum majus,flowering|sun,2,"Loewenmaeulchen ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,232,Norfolk-Tanne,Araucaria heterophylla,tree|bright_light,2,Norfolk-Tanne ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7 +constants/lexiconBatch2.ts,107,Arnika,Arnica montana,flowering|medicinal|sun,3,Arnika ist eine bekannte Heilpflanze aus den Alpen mit goldgelben Korbbluten. Sie wird fuer Muskeln und Gelenke verwendet.,Volles Sonnenlicht,10-20 °C,7 +constants/lexiconBatch2.ts,110,Wermut,Artemisia absinthium,medicinal|sun,2,"Wermut ist ein stark aromatisches Heilkraut mit silbrig-gruenen, tief eingeschnittenen Blaettern. Fuer Kraeuterlikoere.",Volles Sonnenlicht,10-25 °C,14 +constants/lexiconBatch2.ts,122,Estragon,Artemisia dracunculus,easy|sun,2,Estragon ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 +constants/lexiconBatch2.ts,178,Seidenpflanze,Asclepias tuberosa,flowering|sun,2,"Seidenpflanze ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,16,Schusterpflanze,Aspidistra elatior,easy|low_light,2,"Die Schusterpflanze ist eine extrem robuste Zimmerpflanze mit langen, dunkelgruenen Blaettern. Vertraegt tiefe Temperaturen.",Wenig bis helles Licht,10-20 °C,14 +constants/lexiconBatch2.ts,43,Vogelnest-Farn,Asplenium nidus,easy|low_light|high_humidity,3,"Der Vogelnest-Farn hat ganzrandige, glaenzende Wedel, die eine Nestform bilden. Sehr dekorativ und robust.",Helles indirektes Licht,18-27 °C,5 +constants/lexiconBatch2.ts,13,Japanische Aucube,Aucuba japonica,easy|low_light,2,"Die Japanische Aucube hat glaenzende, gruene oder gelbgefleckte Blaetter. Sehr schattenvertraeglich.",Wenig bis helles Licht,10-20 °C,7 +constants/lexiconBatch1.ts,92,Indische Azalee,Azalea indica,flowering,1,"Die Indische Azalee ist ein beliebter Zierstrauch mit grossen, auffaelligen Blueten in Rosa- und Rottönen.",Helles indirektes Licht,10-20 °C,4 +constants/lexiconBatch2.ts,7,Bambusrohr,Bambusa vulgaris,easy|large,2,Das Bambusrohr ist eine schnell wachsende Bambusart mit gelbgruenen Halmen. Sehr dekorativ und vielseitig nutzbar.,Helles bis volles Licht,15-30 °C,5 +constants/lexiconBatch1.ts,41,Pferdeschwanzpalme,Beaucarnea recurvata,easy|succulent|tree|sun,4,"Die Pferdeschwanzpalme hat einen verdickten Stammbasis als Wasserspeicher und lange, schmale Blaetter.",Volles Sonnenlicht,15-30 °C,21 +constants/lexiconBatch2.ts,57,Forellen-Begonie,Begonia maculata,patterned|high_humidity,2,Die Forellen-Begonie hat olivgruene Blaetter mit silbernen Punkten und einer roten Unterseite. Atemberaubend.,Helles indirektes Licht,18-27 °C,7 +constants/lexiconBatch1.ts,18,Koenigsbegonie,Begonia rex,patterned|high_humidity,2,"Die Koenigsbegonie beeindruckt mit prachtvoll gemusterten Blaettern in Silber, Rot und Gruen.",Indirektes Licht,18-25 °C,5 +constants/lexiconBatch2.ts,175,Eisbegonie,Begonia semperflorens-cultorum,flowering|bright_light,2,"Eisbegonie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,58,Knollen-Begonie,Begonia tuberhybrida,flowering|high_humidity,2,"Die Knollen-Begonie hat riesige, rosenaehnliche Blueten in leuchtendem Rot, Orange, Gelb oder Weiss.",Helles indirektes Licht,15-22 °C,5 +constants/lexiconBatch2.ts,145,Gaensebluemchen,Bellis perennis,flowering|sun,2,"Gaensebluemchen ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,97,Mangold,Beta vulgaris,easy,1,"Mangold ist ein farbenfrohes Blattgemuese mit bunten Stielen in Rot, Gelb, Orange und Weiss.",Helles bis volles Licht,10-25 °C,3 +constants/lexiconBatch2.ts,114,Hange-Birke,Betula pendula,tree|large|medicinal,3,Die Haenge-Birke hat charakteristisch weisse Rinde und haengende Zweige. Die Blaetter werden in der Heilkunde genutzt.,Volles Sonnenlicht,10-25 °C,7 +constants/lexiconBatch2.ts,38,Billbergia,Billbergia nutans,easy|flowering,2,"Die Billbergia ist eine robuste Bromelie mit schmalen, gruenen Blaettern und hängenden, blauen und gruenen Blueten.",Helles indirektes Licht,15-25 °C,7 +constants/lexiconBatch2.ts,129,Borretsch,Borago officinalis,easy|sun,2,Borretsch ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 +constants/lexiconBatch1.ts,62,Bougainvillea,Bougainvillea spectabilis,flowering|bright_light|sun,3,"Die Bougainvillea ist eine rankenreiche Kletterpflanze mit leuchtend farbigen Hochblaettern in Rot, Orange oder Pink.",Volles Sonnenlicht,18-30 °C,5 +constants/lexiconBatch2.ts,223,Schmetterlingsflieder,Buddleja davidii,flowering|tree|sun,3,Schmetterlingsflieder ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 +constants/lexiconBatch2.ts,202,Buchsbaum,Buxus sempervirens,tree|sun,2,Buchsbaum ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 +constants/lexiconBatch1.ts,49,Buntblatt,Caladium bicolor,patterned|high_humidity,2,"Das Buntblatt beeindruckt mit transparenten, bunt gemusterten Blaettern in Pink, Rot, Weiss und Gruen.",Indirektes Licht,20-30 °C,5 +constants/lexiconBatch2.ts,187,Ringelblume,Calendula officinalis,flowering|medicinal|sun,3,"Ringelblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,63,Calibrachoa,Calibrachoa hybrida,easy|flowering|hanging|sun,4,"Calibrachoa ist eine petunienaehnliche Haengepflanze mit unzaehligen, kleinen Trichterbluten in allen Farben.",Volles Sonnenlicht,15-25 °C,2 +constants/lexiconBatch2.ts,56,Callisia,Callisia repens,easy|hanging,2,"Callisia repens ist ein kleines, kriechendes Kraut mit winzigen, gruenen Blaettern. Ideal fuer haengende Behaelter.",Helles indirektes Licht,15-25 °C,5 +constants/lexiconBatch1.ts,93,Kamelie,Camellia japonica,flowering,1,Die Kamelie ist ein eleganter Zierstrauch mit glaenzenden Blaettern und rosenaehnlichen Blueten von Januar bis April.,Helles indirektes Licht,7-18 °C,5 +constants/lexiconBatch2.ts,85,Teestrauch,Camellia sinensis,flowering,1,"Der Teestrauch ist die Pflanze, aus deren Blaettern Tee gewonnen wird. Er hat weisse Blueten und glaenzende Blaetter.",Helles indirektes Licht,15-22 °C,7 +constants/lexiconBatch2.ts,184,Trompetenwinde,Campsis radicans,flowering|bright_light,2,"Trompetenwinde ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,67,Blumenschilfrohr,Canna indica,flowering|large|sun,3,"Das Blumenschilfrohr hat grosse, tropisch wirkende Blaetter und auffaellige Blueten in Rot, Orange oder Gelb.",Volles Sonnenlicht,18-28 °C,5 +constants/lexiconBatch2.ts,92,Chili,Capsicum annuum,easy|medicinal|sun,3,"Chili ist eine beliebte Gemuese- und Zierpflanze mit leuchtenden, roten oder orangen Fruechten. Im Topf kultivierbar.",Volles Sonnenlicht,20-30 °C,4 +constants/lexiconBatch2.ts,90,Papaya,Carica papaya,large|sun,2,"Die Papaya ist eine tropische Fruchtpflanze mit grossen, gelappten Blaettern und orangen Fruechten.",Volles Sonnenlicht,20-35 °C,5 +constants/lexiconBatch2.ts,217,Trompetenbaum,Catalpa bignonioides,tree|large|sun,3,Trompetenbaum ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 +constants/lexiconBatch1.ts,73,Cattleya-Orchidee,Cattleya labiata,flowering|high_humidity,2,"Die Cattleya ist die Koenigin der Orchideen mit ueppigen, duftenden Blueten in Lila, Rosa und Weiss.",Helles indirektes Licht,18-28 °C,7 +constants/lexiconBatch2.ts,208,Zeder,Cedrus libani,tree|large|sun,3,Zeder ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 +constants/lexiconBatch2.ts,188,Kornblume,Centaurea cyanus,flowering|sun,2,"Kornblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch1.ts,81,Peruanischer Fackelkaktus,Cereus peruvianus,easy|succulent|large|sun,4,"Der Peruanische Fackelkaktus ist ein saeulenfoermiger Kaktus, der im Innenraum bis zu 2 m hoch werden kann.",Volles Sonnenlicht,15-35 °C,21 +constants/lexiconBatch1.ts,99,Herzkette,Ceropegia woodii,easy|succulent|patterned|hanging,4,"Die Herzkette hat duenne, haengende Ranken mit herzfoermigen, silbergrau gemusterten Blaettchen.",Helles indirektes Licht,15-27 °C,14 +constants/lexiconBatch1.ts,43,Bergpalme,Chamaedorea elegans,easy|pet_friendly|tree|air_purifier|low_light,5,Die Bergpalme ist eine kompakte Zimmerpalme fuer schattigere Standorte. Ideal fuer dunkle Innenraeume.,Wenig bis helles Licht,15-25 °C,7 +constants/lexiconBatch2.ts,138,Roemische Kamille,Chamaemelum nobile,easy|medicinal|sun,3,Roemische Kamille ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 +constants/lexiconBatch2.ts,101,Kamille,Chamomilla recutita,easy|medicinal|sun,3,"Die Kamille ist ein beliebtes Heilkraut mit kleinen, weiss-gelben Blueten. Das aetherische Oel wirkt beruhigend.",Volles Sonnenlicht,15-25 °C,5 +constants/lexiconBatch1.ts,67,Chrysantheme,Chrysanthemum indicum,flowering,1,"Die Chrysantheme ist die klassische Herbstblume mit ueppigen, dichten Blueten in vielen Farben.",Helles bis volles Licht,12-22 °C,4 +constants/lexiconBatch2.ts,86,Zitronenbaum,Citrus limon,tree|sun,2,"Der Zitronenbaum ist ein kleiner, immergruener Baum mit weissen, duftenden Blueten und gelben Fruechten.",Volles Sonnenlicht,18-28 °C,5 +constants/lexiconBatch2.ts,87,Orangenbaum,Citrus sinensis,tree|sun,2,"Der Orangenbaum ist ein kleiner, immergruener Baum mit weissen Blueten und orangen Fruechten.",Volles Sonnenlicht,18-28 °C,5 +constants/lexiconBatch2.ts,157,Clematis,Clematis viticella,flowering|bright_light,2,"Clematis ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch1.ts,104,Riemenblatt,Clivia miniata,flowering,1,Das Riemenblatt ist eine dekorative Zimmerpflanze mit leuchtend orangefarbenen Blueten im Fruehling.,Helles indirektes Licht,15-24 °C,10 +constants/lexiconBatch2.ts,224,Kroton,Codiaeum variegatum,patterned|bright_light,2,Kroton ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7 +constants/lexiconBatch2.ts,84,Kaffeestrauch,Coffea arabica,easy,1,"Der Kaffeestrauch hat glaenzende, dunkelgruene Blaetter und entwickelt rote Kaffe­ekirschen. Kann im Topf gehalten werden.",Helles indirektes Licht,18-25 °C,7 +constants/lexiconBatch2.ts,245,Kaffeepflanze arabica nana,Coffea arabica Nana,bright_light,1,Kaffeepflanze arabica nana ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7 +constants/lexiconBatch1.ts,47,Taro,Colocasia esculenta,large|high_humidity,2,"Der Taro ist eine tropische Pflanze mit grossen, herzfoermigen Blaettern. Die Knollen sind Nahrungsquelle.",Helles indirektes Licht,18-30 °C,3 +constants/lexiconBatch1.ts,97,Columnea,Columnea gloriosa,flowering|hanging|high_humidity,3,"Die Columnea ist eine haengende Zimmerpflanze mit kleinen, behaarten Blaettern und leuchtend roten, roehrenfoermigen Blueten.",Helles indirektes Licht,18-25 °C,7 +constants/lexiconBatch2.ts,24,Konophytum,Conophytum calculus,succulent|sun,2,"Das Konophytum ist eine sehr kompakte Sukkulente, die zwei Blaetter zu einer kugelfoermigen Form verschmilzt.",Volles Sonnenlicht,10-25 °C,21 +constants/lexiconBatch2.ts,160,Maigloeckchen,Convallaria majalis,flowering|medicinal,2,"Maigloeckchen ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,14,Keulenlilie,Cordyline australis,easy|tree|sun,3,"Die Keulenlilie hat lange, schmale, gruene oder rotbraune Blaetter in einem dekorativen Schopf.",Helles bis volles Licht,10-25 °C,7 +constants/lexiconBatch2.ts,15,Tiroler Keulenlilie,Cordyline fruticosa,easy,1,"Die Tiroler Keulenlilie hat leuchtend rote, gruene oder buntlaubige Blaetter. Eine exotische Zimmerpflanze.",Helles indirektes Licht,18-27 °C,7 +constants/lexiconBatch2.ts,181,Maedchenauge,Coreopsis tinctoria,flowering|sun,2,"Maedchenauge ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,139,Koriander,Coriandrum sativum,easy|sun,2,Koriander ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 +constants/lexiconBatch2.ts,150,Kosmee,Cosmos bipinnatus,flowering|sun,2,"Kosmee ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,29,Kotyledon,Cotyledon orbiculata,easy|succulent|sun,3,"Kotyledon hat dickfleischige, runde Blaetter mit einem mehligen, weisslichen Belag. Sehr trockenheitsresistent.",Helles bis volles Licht,15-25 °C,14 +constants/lexiconBatch2.ts,26,Moos-Crassula,Crassula muscosa,easy|succulent|sun,3,"Die Moos-Crassula hat dicht aneinandergereihte, winzige gruene Blaetter auf unverzweigten Trieben. Sieht aus wie Moos.",Helles bis volles Licht,15-25 °C,14 +constants/lexiconBatch1.ts,5,Jadepflanze,Crassula ovata,easy|succulent|sun,3,"Die Jadepflanze ist eine langlebige Sukkulente mit dicken, ovalen Blaettern. In Japan gilt sie als Gluecksbringer.",Helles bis volles Licht,15-24 °C,14 +constants/lexiconBatch1.ts,110,Krokus,Crocus vernus,easy|flowering,2,"Der Krokus ist einer der ersten Fruehjahrs­boten mit kelchfoermigen Blueten in Lila, Weiss und Gelb.",Helles bis volles Licht,5-15 °C,7 +constants/lexiconBatch2.ts,39,Cryptanthus,Cryptanthus bivittatus,patterned|high_humidity,2,Cryptanthus ist eine niedrig wachsende Bromelie mit sternfoermigen Rosetten und gemusterten Blaettern. Fuer Terrarien.,Helles indirektes Licht,18-27 °C,7 +constants/lexiconBatch1.ts,53,Ctenanthe,Ctenanthe burle-marxii,patterned|high_humidity,2,Die Ctenanthe hat faszinierend gemusterte Blaetter mit dunkelgruunem Fischgraetenmuster auf hellgruunem Hintergrund.,Indirektes Licht,18-25 °C,5 +constants/lexiconBatch2.ts,94,Gurke,Cucumis sativus,easy|sun,2,"Die Gurke ist eine rankende Gemuese­pflanze mit gruenen, erfrischenden Fruechten. Im Balkonkasten kultivierbar.",Volles Sonnenlicht,18-28 °C,3 +constants/lexiconBatch2.ts,209,Zypresse,Cupressus sempervirens,tree|large|sun,3,Zypresse ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 +constants/lexiconBatch2.ts,74,Kurkuma,Curcuma longa,medicinal|high_humidity,2,Kurkuma ist eine tropische Gewuerzpflanze mit breiten Blaettern und leuchtend gelber Wurzel. Wichtiges Heilgewuerz.,Helles bis volles Licht,20-30 °C,7 +constants/lexiconBatch2.ts,236,String of Bananas,Curio radicans,succulent|hanging|sun,3,String of Bananas ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles bis volles Licht,18-30 C,10 +constants/lexiconBatch2.ts,237,String of Dolphins,Curio x peregrinus,succulent|hanging|sun,3,String of Dolphins ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles bis volles Licht,18-30 C,10 +constants/lexiconBatch2.ts,239,Palmfarn,Cycas revoluta,tree|large|sun,3,Palmfarn ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles bis volles Licht,18-30 C,10 +constants/lexiconBatch1.ts,19,Alpenveilchen,Cyclamen persicum,flowering,1,"Das Alpenveilchen bluet im Herbst und Winter mit eleganten Blueten in Rosa, Rot oder Weiss.",Helles indirektes Licht,12-18 °C,5 +constants/lexiconBatch1.ts,71,Zymbidium,Cymbidium lowianum,flowering,1,"Das Zymbidium ist eine robuste Orchidee mit langen, grassartigen Blaettern und eleganten Bluetenrispen.",Helles Licht,12-24 °C,7 +constants/lexiconBatch2.ts,127,Zitronengras,Cymbopogon citratus,easy|sun,2,Zitronengras ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 +constants/lexiconBatch2.ts,9,Paragraphenpflanze,Cyperus alternifolius,high_humidity,1,"Die Paragraphenpflanze hat lange, grasartige Blaetter, die sternfoermig vom Stiel abstehen. Sie liebt viel Wasser.",Helles bis volles Licht,18-27 °C,3 +constants/lexiconBatch2.ts,68,Dahlie,Dahlia pinnata,flowering|sun,2,Die Dahlie ist eine prachtvolle Sommerblume mit Blueten in allen Groessen und Formen. Sie wird aus Knollen gezogen.,Volles Sonnenlicht,15-25 °C,5 +constants/lexiconBatch2.ts,99,Karotte,Daucus carota,easy,1,Die Karotte ist eine beliebte Gemuese­pflanze mit orangefarbenen Wurzeln. Im tiefen Topf kultivierbar.,Helles bis volles Licht,15-22 °C,5 +constants/lexiconBatch2.ts,215,Flammenbaum,Delonix regia,flowering|tree|large,3,Flammenbaum ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 +constants/lexiconBatch2.ts,153,Rittersporn,Delphinium elatum,flowering|sun,2,"Rittersporn ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch1.ts,70,Dendrobium,Dendrobium nobile,flowering|high_humidity,2,"Das Dendrobium ist eine beliebte Zimmerorchidee mit langen Pseudobulben, die im Winter mit Blueten besetzt werden.",Helles indirektes Licht,15-28 °C,10 +constants/lexiconBatch2.ts,189,Bartnelke,Dianthus barbatus,flowering|sun,2,"Bartnelke ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,146,Nelke,Dianthus caryophyllus,flowering|sun,2,"Nelke ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch1.ts,48,Dieffenbachie,Dieffenbachia seguine,easy|air_purifier|low_light,3,"Die Dieffenbachie ist eine tropische Blattschmuckpflanze mit grossen, gruen-weiss gefleckten Blaettern.",Helles indirektes Licht,18-26 °C,7 +constants/lexiconBatch2.ts,109,Roter Fingerhut,Digitalis purpurea,flowering|medicinal,2,"Der Rote Fingerhut hat hohe Bluetenstaende mit roehrenfoermigen, gepunkteten Blueten in Rosa. Wichtige Arzneipflanze.",Helles bis volles Licht,10-20 °C,7 +constants/lexiconBatch2.ts,77,Venusfliegenfalle,Dionaea muscipula,sun,1,Die Venusfliegenfalle ist eine fleischfressende Pflanze mit klappfallartigen Blaettern. Faengt Insekten.,Volles Sonnenlicht,15-30 °C,5 +constants/lexiconBatch1.ts,101,Dischidia,Dischidia ruscifolia,succulent|hanging,2,"Die Dischidia ist eine epiphytische Haengepflanze mit kleinen, runden Blaettern entlang duenner Ranken.",Helles indirektes Licht,18-27 °C,7 +constants/lexiconBatch1.ts,14,Maisstrauch,Dracaena fragrans,easy|tree|air_purifier|low_light,4,"Der Maisstrauch ist eine robuste Zimmerpflanze mit breiten, gestreiften Blaettern. Gedeiht auch bei wenig Licht.",Helles indirektes Licht,15-25 °C,10 +constants/lexiconBatch1.ts,13,Drachenbaum,Dracaena marginata,easy|tree|air_purifier,3,"Der Drachenbaum ist eine schlanke Zimmerpflanze mit roten, schmalen Blaettern auf langen Staemmen.",Helles indirektes Licht,15-25 °C,10 +constants/lexiconBatch2.ts,80,Sonnentau,Drosera capensis,high_humidity|sun,2,Der Sonnentau faengt Insekten mit klebrigen Tropfen auf seinen Blaettern. Eine faszinierende fleischfressende Pflanze.,Volles Sonnenlicht,15-25 °C,5 +constants/lexiconBatch2.ts,30,Dudleya,Dudleya brittonii,easy|succulent|sun,3,"Dudleya ist eine rosetten­bildende Sukkulente mit silbrig-weissen, mehligen Blaettern. Sehr elegant.",Volles Sonnenlicht,10-25 °C,14 +constants/lexiconBatch1.ts,42,Goldfruchtpalme,Dypsis lutescens,pet_friendly|tree|air_purifier,3,Die Goldfruchtpalme ist eine elegante Zimmerpalme mit gelblich-gruenen Stielen und gefiederten Wedeln.,Helles indirektes Licht,18-27 °C,5 +constants/lexiconBatch1.ts,4,Echeverie,Echeveria elegans,easy|succulent|sun,3,"Die Echeverie bildet symmetrische, rosettenfoermige Sukkulenten mit blaugruenen Blaettern. Pflegeleicht.",Volles Sonnenlicht,15-25 °C,14 +constants/lexiconBatch2.ts,106,Sonnenhut,Echinacea purpurea,flowering|medicinal|sun,3,"Der Sonnenhut ist eine beliebte Heilpflanze mit grossen, pinkfarbenen Blueten. Er staerkt das Immunsystem.",Helles bis volles Licht,15-25 °C,7 +constants/lexiconBatch1.ts,77,Goldene Tonne,Echinocactus grusonii,easy|succulent|sun,3,Die Goldene Tonne ist ein ikonischer kugelfoermiger Kaktus mit goldgelben Stacheln. Waechst langsam aber imposant.,Volles Sonnenlicht,15-35 °C,21 +constants/lexiconBatch1.ts,83,San-Pedro-Kaktus,Echinopsis pachanoi,easy|succulent|sun,3,"Der San-Pedro-Kaktus ist ein schnell wachsender, saeulenfoermiger Kaktus aus den Anden.",Volles Sonnenlicht,10-35 °C,14 +constants/lexiconBatch1.ts,84,Koenigin der Nacht,Epiphyllum oxypetalum,flowering|succulent,2,"Die Koenigin der Nacht bluet nur eine einzige Nacht lang mit riesigen, intensiv duftenden weissen Blueten.",Indirektes Licht,18-27 °C,7 +constants/lexiconBatch1.ts,16,Marmor-Efeutute,Epipremnum aureum Marble Queen,easy|hanging|air_purifier,3,Die Marmor-Efeutute hat cremeweiss-gruen marmorierte Blaetter. Eine dekorative Variante der klassischen Efeutute.,Helles indirektes Licht,15-30 °C,7 +constants/lexiconBatch2.ts,53,Neon-Efeutute,Epipremnum pinnatum Neon,easy|hanging|air_purifier,3,Die Neon-Efeutute hat leuchtend limonengruene Blaetter. Sehr auffaellig und pflegeleicht.,Helles indirektes Licht,15-30 °C,7 +constants/lexiconBatch2.ts,186,Kalifornischer Mohn,Eschscholzia californica,flowering|sun,2,"Kalifornischer Mohn ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,210,Eukalyptus,Eucalyptus globulus,tree|medicinal|sun,3,Eukalyptus ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 +constants/lexiconBatch2.ts,19,Christusdorn,Euphorbia milii,easy|flowering|succulent|sun,4,Der Christusdorn ist eine sukkulente Wolfsmilch mit stacheligen Zweigen und kleinen roten oder gelben Hochblaettern.,Helles bis volles Licht,15-28 °C,10 +constants/lexiconBatch2.ts,20,Weihnachtsstern,Euphorbia pulcherrima,flowering,1,Der Weihnachtsstern ist die klassische Winterpflanze mit leuchtend roten Hochblaettern. Er steht symbolisch fuer Weihnachten.,Helles indirektes Licht,15-22 °C,7 +constants/lexiconBatch1.ts,12,Bleistiftkaktus,Euphorbia tirucalli,easy|succulent|sun,3,"Der Bleistiftkaktus ist eine sukkulente Wolfsmilch mit duennen, zylindrischen Zweigen ohne Blaetter.",Volles Sonnenlicht,18-30 °C,14 +constants/lexiconBatch2.ts,137,Wasabi,Eutrema japonicum,bright_light|high_humidity,2,"Wasabi ist ein seltenes Wuerzkraut, das gleichmaessige Feuchte und eher kuehle Bedingungen bevorzugt.",Helles indirektes Licht,8-20 C,4 +constants/lexiconBatch2.ts,12,Fatsia,Fatsia japonica,easy|low_light,2,"Die Fatsia ist ein dekorativer Zimmerstrauch mit grossen, handfoermigen, glaenzenden Blaettern. Sehr robust.",Helles indirektes Licht,10-20 °C,7 +constants/lexiconBatch1.ts,78,Fass-Kaktus,Ferocactus cylindraceus,easy|succulent|sun,3,"Der Fass-Kaktus ist ein zylindrischer Wuestenkaktus mit langen, roten Stacheln. Sehr langlebig.",Volles Sonnenlicht,15-35 °C,21 +constants/lexiconBatch2.ts,248,Ficus altissima,Ficus altissima,tree|bright_light,2,Ficus altissima ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7 +constants/lexiconBatch1.ts,1,Birkenfeige,Ficus benjamina,tree|air_purifier,2,"Die Birkenfeige ist ein eleganter Zimmerstrauch mit haengenden Aesten und kleinen, glaenzenden Blaettern.",Helles indirektes Licht,16-24 °C,7 +constants/lexiconBatch1.ts,38,Gummibaum,Ficus elastica,easy|tree|air_purifier,3,"Der Gummibaum ist eine imposante Zimmerpflanze mit grossen, glaenzenden, lederartigen Blaettern. Reinigt die Luft.",Helles indirektes Licht,16-24 °C,10 +constants/lexiconBatch1.ts,39,Geigenfeige,Ficus lyrata,tree|large|bright_light,3,"Die Geigenfeige ist ein Trendbaum mit grossen, geigenfoermigen Blaettern. Benoetigt viel Licht.",Helles indirektes Licht,18-27 °C,7 +constants/lexiconBatch2.ts,247,Ficus microcarpa,Ficus microcarpa,easy|tree|bright_light,3,Ficus microcarpa ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7 +constants/lexiconBatch2.ts,116,Bonsai-Feige,Ficus retusa,tree,1,"Die Bonsai-Feige ist eine klassische Bonsai-Art mit kleinen, elliptischen Blaettern. Sehr formbar.",Helles indirektes Licht,16-24 °C,7 +constants/lexiconBatch2.ts,226,Nervenpflanze,Fittonia albivenis,patterned|high_humidity,2,Nervenpflanze ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5 +constants/lexiconBatch2.ts,219,Forsythie,Forsythia x intermedia,flowering|tree|sun,3,Forsythie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 +constants/lexiconBatch2.ts,100,Erdbeere,Fragaria ananassa,easy|pet_friendly|sun,3,"Die Erdbeere ist ein beliebtes Obst fuer Balkon und Terrasse mit aromatischen, roten Fruechten.",Helles bis volles Licht,15-25 °C,3 +constants/lexiconBatch2.ts,169,Freesie,Freesia refracta,flowering|sun,2,"Freesie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch1.ts,33,Fuchsie,Fuchsia hybrida,flowering|hanging,2,"Die Fuchsie haengt mit eleganten, zweifarbigen Blueten wie kleine Ohrringe herab. Ideal fuer Ampeln.",Helles indirektes Licht,14-22 °C,3 +constants/lexiconBatch2.ts,60,Triphylla-Fuchsie,Fuchsia triphylla,flowering|hanging,2,"Die Triphylla-Fuchsie hat lange, roehrenfoermige, orangefarbe Blueten in haengenden Trauben. Sehr exotisch.",Helles indirektes Licht,15-22 °C,3 +constants/lexiconBatch2.ts,196,Kokardenblume,Gaillardia aristata,flowering|sun,2,"Kokardenblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch1.ts,22,Gardenie,Gardenia jasminoides,flowering|high_humidity,2,"Die Gardenie fasziniert mit cremefarbenen, intensiv duftenden Blueten. Anspruchsvoll in der Pflege.",Helles indirektes Licht,18-23 °C,5 +constants/lexiconBatch1.ts,90,Gasteria,Gasteria carinata,easy|succulent|low_light,3,"Die Gasteria ist eine kleine Sukkulente mit zweireihig angeordneten, zungenfoermigen, gefleckten Blaettern.",Helles indirektes Licht,15-25 °C,14 +constants/lexiconBatch2.ts,190,Mittagsgold,Gazania rigens,flowering|sun,2,"Mittagsgold ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch1.ts,32,Blutroter Storchschnabel,Geranium sanguineum,easy|flowering,2,Der Blutrote Storchschnabel ist ein zierlicher Storchschnabel mit intensiv magentafarbenen Blueten.,Helles bis volles Licht,10-25 °C,7 +constants/lexiconBatch1.ts,68,Gerbera,Gerbera jamesonii,flowering|air_purifier|bright_light,3,"Die Gerbera ist eine farbenfrohe Schnittblume mit grossen, sonnenblumenaehnlichen Blueten. Sehr beliebt.",Helles bis volles Licht,15-25 °C,5 +constants/lexiconBatch2.ts,216,Ginkgo,Ginkgo biloba,tree|medicinal|sun,3,Ginkgo ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 +constants/lexiconBatch2.ts,161,Gladiole,Gladiolus hortulanus,flowering|sun,2,"Gladiole ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch1.ts,96,Gloxinie,Gloxinia speciosa,flowering|high_humidity,2,"Die Gloxinie hat grosse, samtartige Blueten in Violett, Rosa oder Weiss mit farbigen Raendern.",Helles indirektes Licht,18-25 °C,5 +constants/lexiconBatch2.ts,240,Calathea lancifolia,Goeppertia insignis,pet_friendly|patterned|high_humidity,3,Calathea lancifolia ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5 +constants/lexiconBatch2.ts,241,Calathea ornata,Goeppertia ornata,pet_friendly|patterned|high_humidity,3,Calathea ornata ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5 +constants/lexiconBatch1.ts,87,Geisterpflanze,Graptopetalum paraguayense,easy|succulent|sun,3,"Die Geisterpflanze hat zartgraue bis perlmutt-rosafarbene, rosettenfoermige Blaetter. Sehr robuste Sukkulente.",Volles Sonnenlicht,15-25 °C,14 +constants/lexiconBatch2.ts,36,Guzmania,Guzmania lingulata,flowering|high_humidity,2,"Die Guzmania ist eine Bromelie mit glänzenden, gruenen Blaettern und einem leuchtend roten, sternfoermigen Bluetenstand.",Helles indirektes Licht,18-27 °C,7 +constants/lexiconBatch1.ts,80,Mond-Kaktus,Gymnocalycium mihanovichii,easy|succulent,2,Der Mond-Kaktus ist eine farbenfrohe Veredelung eines chlorophylllosen Kaktus auf einem gruenen Unterlagekaktus.,Indirektes Licht,15-30 °C,14 +constants/lexiconBatch2.ts,119,Zaubernuss,Hamamelis mollis,flowering|medicinal,2,"Die Zaubernuss bluet im Winter mit fadendunnen, gelben Bluetenkranzeln, die bis -10 Grad standhalten.",Helles bis volles Licht,10-20 °C,10 +constants/lexiconBatch1.ts,6,Zebra-Haworthie,Haworthia fasciata,easy|succulent|low_light,3,Die Zebra-Haworthie ist eine kompakte Sukkulente mit weissen Querstreifen auf dunkelgruenen Blaettern.,Helles indirektes Licht,15-25 °C,14 +constants/lexiconBatch1.ts,37,Efeu,Hedera helix,easy|hanging|air_purifier|low_light,4,"Efeu ist eine robuste Kletter- und Haengepflanze mit charakteristischen, dreilappigen Blaettern. Sehr langlebig.",Wenig bis helles Licht,10-20 °C,7 +constants/lexiconBatch2.ts,83,Heliamphora,Heliamphora nutans,high_humidity,1,Heliamphora ist eine urtuemliche Kannenpflanze aus den Tafelbergen Venezuelas. Sehr dekorativ und selten.,Helles indirektes Licht,15-25 °C,5 +constants/lexiconBatch2.ts,141,Sonnenblume,Helianthus annuus,flowering|sun,2,"Sonnenblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,133,Currykraut,Helichrysum italicum,easy|sun,2,Currykraut ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 +constants/lexiconBatch2.ts,72,Heliconia,Heliconia psittacorum,flowering|bright_light|high_humidity,3,"Die Heliconia hat leuchtend orangefarbe oder rote, bootsfoermige Hochblaetter. Eine exotische Tropenpflanze.",Helles bis volles Licht,20-30 °C,5 +constants/lexiconBatch2.ts,191,Heliotrop,Heliotropium arborescens,flowering|sun,2,"Heliotrop ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,183,Lenzrose,Helleborus orientalis,flowering,1,"Lenzrose ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,182,Taglilie,Hemerocallis fulva,flowering|sun,2,"Taglilie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch1.ts,21,Hibiskus,Hibiscus rosa-sinensis,flowering|bright_light|sun,3,"Der Hibiskus begeistert mit grossen, trompetenfoermigen Blueten in Rot, Orange und Rosa.",Volles Sonnenlicht,18-28 °C,3 +constants/lexiconBatch2.ts,220,Gartenhibiskus,Hibiscus syriacus,flowering|tree|sun,3,Gartenhibiskus ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 +constants/lexiconBatch1.ts,105,Ritterstern,Hippeastrum hybrid,flowering|bright_light,2,"Der Ritterstern beeindruckt im Winter mit riesigen, trompetenfoermigen Blueten in Rot, Pink oder Weiss.",Helles bis volles Licht,18-25 °C,7 +constants/lexiconBatch2.ts,3,Kentia-Palme,Howea forsteriana,pet_friendly|tree|low_light,3,"Die Kentia-Palme ist eine der elegantesten Zimmerpalmen mit langen, herabhängenden Fiederblaettern.",Helles indirektes Licht,18-25 °C,7 +constants/lexiconBatch1.ts,58,Kleine Wachsblume,Hoya bella,flowering|succulent|hanging,3,"Die Kleine Wachsblume traegt zierliche, sternfoermige weisse Blueten mit rosa Mitte. Haengende Sukkulente.",Helles indirektes Licht,18-27 °C,10 +constants/lexiconBatch1.ts,57,Wachsblume,Hoya carnosa,easy|flowering|succulent|hanging,4,"Die Wachsblume ist eine Kletterpflanze mit dicken, wachsartigen Blaettern und sternfoermigen, duftenden Blueten.",Helles indirektes Licht,16-27 °C,10 +constants/lexiconBatch2.ts,159,Hasengloeckchen,Hyacinthoides non-scripta,flowering|sun,2,"Hasengloeckchen ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch1.ts,108,Hyazinthe,Hyacinthus orientalis,easy|flowering,2,"Die Hyazinthe bezaubert mit dichten Bluetenrispen und intensivem Duft in Blau, Rosa, Weiss oder Gelb.",Helles bis volles Licht,10-18 °C,5 +constants/lexiconBatch2.ts,148,Hortensie,Hydrangea macrophylla,flowering|bright_light,2,"Hortensie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Helles bis halbschattiges Licht,8-24 C,4 +constants/lexiconBatch2.ts,105,Johanniskraut,Hypericum perforatum,flowering|medicinal|sun,3,Das Johanniskraut hat leuchtend gelbe Blueten und ist ein wichtiges Heilkraut gegen Depressionen und Stimmungstiefs.,Volles Sonnenlicht,10-25 °C,7 +constants/lexiconBatch2.ts,227,Punktblatt,Hypoestes phyllostachya,patterned|bright_light,2,Punktblatt ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7 +constants/lexiconBatch2.ts,136,Ysop,Hyssopus officinalis,easy|sun,2,Ysop ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 +constants/lexiconBatch2.ts,203,Stechpalme,Ilex aquifolium,tree|sun,2,Stechpalme ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 +constants/lexiconBatch2.ts,176,Gartenbalsamine,Impatiens balsamina,flowering|bright_light,2,"Gartenbalsamine ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,59,Neuguinea-Balsamine,Impatiens hawkeri,easy|flowering,2,"Die Neuguinea-Balsamine hat grosse, leuchtende Blueten und ist sehr bluehfreudig. Ideal fuer Terrassen.",Helles indirektes Licht,18-27 °C,3 +constants/lexiconBatch1.ts,20,Fleissiges Lieschen,Impatiens walleriana,easy|flowering,2,Das Fleissige Lieschen bluet von Fruehling bis Herbst unermudlich in vielen Farben.,Helles indirektes Licht,16-24 °C,2 +constants/lexiconBatch1.ts,64,Suesskartoffel,Ipomoea batatas,easy|hanging|sun,3,"Die Suesskartoffel-Zierpflanze hat dekorative, herzfoermige Blaetter in gruen oder dunkelviolett. Ideal als Haengepflanze.",Volles Sonnenlicht,20-30 °C,5 +constants/lexiconBatch2.ts,156,Prunkwinde,Ipomoea purpurea,flowering|sun,2,"Prunkwinde ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,144,Bart-Iris,Iris germanica,flowering|sun,2,"Bart-Iris ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,211,Jacaranda,Jacaranda mimosifolia,flowering|tree|large,3,Jacaranda ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 +constants/lexiconBatch1.ts,59,Jasmin,Jasminum polyanthum,flowering,1,"Der Jasmin ist eine Kletterpflanze mit intensiv duftenden, weissen Blueten. Er bluet im Winter und Fruehling.",Helles bis volles Licht,10-22 °C,5 +constants/lexiconBatch2.ts,172,Arabischer Jasmin,Jasminum sambac,flowering|bright_light,2,"Arabischer Jasmin ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch1.ts,9,Kalanchoe,Kalanchoe blossfeldiana,easy|flowering|succulent|sun,4,"Die Kalanchoe ist eine beliebte Bluehpflanze mit leuchtenden Blueten in Rot, Orange, Gelb oder Rosa.",Helles bis volles Licht,15-25 °C,10 +constants/lexiconBatch2.ts,22,Brutblatt,Kalanchoe daigremontiana,easy|succulent|sun,3,Das Brutblatt bildet entlang des Blattrandes zahlreiche kleine Jungpflanzen. Eine faszinierende Sukkulente.,Helles bis volles Licht,15-25 °C,14 +constants/lexiconBatch2.ts,21,Kaninchen-Ohren,Kalanchoe tomentosa,easy|succulent|sun,3,"Kaninchen-Ohren haben weisslich-filzige Blaetter mit braunen Raendern, die Kaninchen­ohren aehneln. Sehr dekorativ.",Helles bis volles Licht,15-25 °C,14 +constants/lexiconBatch2.ts,95,Salat,Lactuca sativa,easy,1,Salat ist eine schnell wachsende Blattgemuese­pflanze. Im Topf und Balkonkasten sehr gut zu kultivieren.,Helles bis volles Licht,10-22 °C,3 +constants/lexiconBatch2.ts,197,Traenendes Herz,Lamprocapnos spectabilis,flowering|bright_light,2,"Traenendes Herz ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,64,Wandelroeschen,Lantana camara,flowering|bright_light|sun,3,"Das Wandelroeschen hat kugelige Bluetenkoepfe, die die Farbe von Gelb ueber Orange zu Rot wechseln. Sehr attraktiv.",Volles Sonnenlicht,18-28 °C,5 +constants/lexiconBatch2.ts,158,Duftwicke,Lathyrus odoratus,flowering|sun,2,"Duftwicke ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,121,Lorbeer,Laurus nobilis,easy|sun,2,Lorbeer ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 +constants/lexiconBatch1.ts,23,Echter Lavendel,Lavandula angustifolia,medicinal|bright_light|sun,3,Der Echte Lavendel ist ein aromatischer Halbstrauch mit lilafarbenen Bluetenaehren. Herrlicher Duft.,Volles Sonnenlicht,10-25 °C,10 +constants/lexiconBatch2.ts,180,Bechermalve,Lavatera trimestris,flowering|sun,2,"Bechermalve ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,173,Margerite,Leucanthemum vulgare,flowering|sun,2,"Margerite ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,201,Shasta-Margerite,Leucanthemum x superbum,flowering|sun,2,"Shasta-Margerite ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,126,Liebstoeckel,Levisticum officinale,easy|sun,2,Liebstoeckel ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 +constants/lexiconBatch2.ts,69,Ostertrompete,Lilium longiflorum,flowering|bright_light,2,"Die Ostertrompete hat grosse, weisse, trichterfoermige Blueten mit intensivem Duft. Klassische Osterblume.",Helles bis volles Licht,15-25 °C,5 +constants/lexiconBatch2.ts,23,Lebende Steine,Lithops julii,succulent|sun,2,"Lebende Steine sind faszinierende Mimikry-Sukkulenten, die Kieselsteinen taeuschen aehnlich sehen. Sehr trockenheitsresistent.",Volles Sonnenlicht,10-30 °C,21 +constants/lexiconBatch2.ts,4,Chinesische Fächerpalme,Livistona chinensis,tree|bright_light,2,"Die Chinesische Fächerpalme hat grosse, faecher­foermige Blaetter auf einem einzelnen Stamm. Sehr dekorativ.",Helles bis volles Licht,15-25 °C,7 +constants/lexiconBatch2.ts,62,Duftsteinrich,Lobularia maritima,easy|flowering,2,"Der Duftsteinrich ist ein niedrig wachsendes Pflanzchen mit winzigen, weissen oder lilafarbenen Blueten und suessem Duft.",Helles bis volles Licht,10-22 °C,3 +constants/lexiconBatch2.ts,171,Geissblatt,Lonicera japonica,flowering|bright_light,2,"Geissblatt ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,154,Lupine,Lupinus polyphyllus,flowering|sun,2,"Lupine ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,204,Magnolie,Magnolia grandiflora,flowering|tree|large,3,Magnolie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 +constants/lexiconBatch1.ts,79,Mammillaria,Mammillaria zeilmanniana,easy|flowering|succulent|sun,4,"Die Mammillaria ist ein kompakter, kugelfoermiger Kaktus, der im Fruehling einen Kranz aus rosa Blueten traegt.",Volles Sonnenlicht,15-35 °C,14 +constants/lexiconBatch1.ts,51,Gebet-Pflanze,Maranta leuconeura,pet_friendly|patterned|high_humidity,3,Die Gebet-Pflanze faltet ihre gemusterten Blaetter nachts wie Haende zusammen. Faszinierende rote und gruene Muster.,Indirektes Licht,18-27 °C,5 +constants/lexiconBatch2.ts,102,Zitronenmelisse,Melissa officinalis,easy|medicinal,2,Die Zitronenmelisse ist ein zitronig duftendes Heilkraut. Sie beruhigt die Nerven und foerdert den Schlaf.,Helles bis volles Licht,15-25 °C,5 +constants/lexiconBatch1.ts,26,Gruene Minze,Mentha spicata,easy,1,"Die Gruene Minze ist ein wuchsfreudiges Kuechenkraut mit frischem, minzigem Duft. Fuer Tee und Cocktails.",Helles bis volles Licht,15-25 °C,3 +constants/lexiconBatch2.ts,46,Tueipelfarn (Microsorum),Microsorum punctatum,high_humidity,1,"Microsorum punctatum ist ein tropischer Farn mit langen, ungeteilten, glaenzenden Wedeln. Fuer feuchte Standorte.",Helles indirektes Licht,18-27 °C,7 +constants/lexiconBatch1.ts,75,Stiefmuetterchen-Orchidee,Miltoniopsis roezlii,flowering|high_humidity,2,"Die Stiefmuetterchen-Orchidee hat grosse, flache Blueten. Bevorzugt kuehle Temperaturen und hohe Luftfeuchtigkeit.",Indirektes Licht,15-22 °C,5 +constants/lexiconBatch2.ts,76,Schamkraut,Mimosa pudica,flowering|bright_light,2,"Das Schamkraut faltet seine Blaettchen blitzschnell zusammen, wenn man sie beruehrt. Ein faszinierendes Erlebnis.",Helles bis volles Licht,20-28 °C,5 +constants/lexiconBatch2.ts,179,Indianernessel,Monarda didyma,flowering|sun,2,"Indianernessel ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,47,Monstera adansonii,Monstera adansonii,easy|hanging,2,Monstera adansonii hat herzfoermige Blaetter mit zahlreichen runden Lochern. Eine rankende Zimmerpflanze.,Helles indirektes Licht,18-27 °C,7 +constants/lexiconBatch2.ts,48,Monstera obliqua,Monstera obliqua,patterned|hanging,2,"Monstera obliqua ist eine seltene Monstera-Art mit filigranen Blaettern, die hauptsaechlich aus Lochern bestehen.",Helles indirektes Licht,18-27 °C,7 +constants/lexiconBatch2.ts,2,Bananenpflanze,Musa acuminata,large|high_humidity,2,"Die Bananenpflanze ist eine tropische Staude mit riesigen, glaenzenden Blaettern. Im Zimmer selten fruechttragend.",Helles bis volles Licht,20-30 °C,5 +constants/lexiconBatch1.ts,109,Traubenhyazinthe,Muscari armeniacum,easy|flowering,2,"Die Traubenhyazinthe bildet dichte Trauben aus kleinen, blauen bis violetten Gloeckchen. Zuverlaessige Fruejahrszwiebel.",Helles bis volles Licht,8-18 °C,7 +constants/lexiconBatch2.ts,177,Vergissmeinnicht,Myosotis sylvatica,flowering|sun,2,"Vergissmeinnicht ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch1.ts,106,Osterglocke,Narcissus pseudonarcissus,flowering,1,"Die Osterglocke ist der klassische Fruehjahrsblueher mit leuchtend gelben, trompetenfoermigen Blueten.",Helles bis volles Licht,10-18 °C,5 +constants/lexiconBatch2.ts,199,Nemesie,Nemesia strumosa,flowering|sun,2,"Nemesie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,37,Neoregelia,Neoregelia carolinae,flowering|patterned|bright_light,3,"Die Neoregelia ist eine Bromelie, bei der das Herzblatt zur Bluetzeit leuchtend rot wird. Sehr dekorativ.",Helles bis volles Licht,18-27 °C,7 +constants/lexiconBatch2.ts,79,Kannenpflanze,Nepenthes alata,hanging|high_humidity,2,"Die Kannenpflanze bildet grosse, gefuellte Kannen als Insekten­fallen. Eine faszinierende, tropische Pflanze.",Helles indirektes Licht,20-30 °C,5 +constants/lexiconBatch2.ts,132,Katzenminze,Nepeta cataria,easy|sun,2,Katzenminze ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 +constants/lexiconBatch2.ts,120,Oleander,Nerium oleander,flowering|bright_light|sun,3,"Der Oleander ist ein mediteraner Strauch mit leuchtend roten, rosa oder weissen Blueten. Sehr hitzetolerant.",Volles Sonnenlicht,15-28 °C,7 +constants/lexiconBatch2.ts,193,Ziertabak,Nicotiana alata,flowering|sun,2,"Ziertabak ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch1.ts,25,Basilikum,Ocimum basilicum,easy|medicinal|sun,3,"Basilikum ist das beliebteste Kuechenkraut mit intensiv aromatischen, gruenen Blaettern. Fuer Pesto verwendet.",Volles Sonnenlicht,18-30 °C,2 +constants/lexiconBatch1.ts,74,Tanzerinnen-Orchidee,Oncidium sphacelatum,flowering|high_humidity,2,"Die Tanzerinnen-Orchidee traegt lange Rispen mit Hunderten kleiner, gelb-brauner Blueten. Sehr reichliche Bluetracht.",Helles indirektes Licht,18-27 °C,7 +constants/lexiconBatch1.ts,82,Hasenohren-Kaktus,Opuntia microdasys,easy|succulent|sun,3,"Der Hasenohren-Kaktus hat flache, ovale Triebe mit dichten weissen Glochiden. Klassischer Zimmerkaktus.",Volles Sonnenlicht,10-35 °C,21 +constants/lexiconBatch2.ts,124,Majoran,Origanum majorana,easy|sun,2,Majoran ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 +constants/lexiconBatch1.ts,28,Oregano,Origanum vulgare,easy|medicinal|sun,3,"Oregano ist ein aromatisches Kuechenkraut mit runden, behaarten Blaettern. In mediterraner Kueche beliebt.",Volles Sonnenlicht,15-25 °C,7 +constants/lexiconBatch2.ts,200,Kapmargerite,Osteospermum ecklonis,flowering|sun,2,"Kapmargerite ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch1.ts,54,Kleeblume,Oxalis triangularis,flowering|patterned,2,"Die Kleeblume hat tiefviolette, dreieckige Blaetter und zarte rosa Blueten. Sie faltet die Blaetter bei Dunkelheit.",Helles indirektes Licht,15-24 °C,7 +constants/lexiconBatch2.ts,231,Glueckskastanie,Pachira aquatica,easy|tree|bright_light,3,Glueckskastanie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7 +constants/lexiconBatch1.ts,88,Mondstein-Pflanze,Pachyphytum oviferum,easy|succulent|sun,3,"Die Mondstein-Pflanze hat dicke, ovale Blaetter mit einem pastellrosafarbenen, mehligen Ueberzug.",Volles Sonnenlicht,15-25 °C,14 +constants/lexiconBatch2.ts,143,Pfingstrose,Paeonia lactiflora,flowering|sun,2,"Pfingstrose ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,6,Schraubenbaum,Pandanus veitchii,patterned|bright_light,2,"Der Schraubenbaum hat spiralfoermig angeordnete, gruenweiss gestreifte Blaetter. Sehr dekorativ und exotisch.",Helles bis volles Licht,18-27 °C,7 +constants/lexiconBatch2.ts,185,Mohn,Papaver rhoeas,flowering|sun,2,"Mohn ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch1.ts,63,Passionsblume,Passiflora caerulea,flowering,1,"Die Passionsblume ist eine faszinierende Kletterpflanze mit komplex strukturierten, blau-weissen Blueten.",Helles bis volles Licht,15-27 °C,5 +constants/lexiconBatch1.ts,31,Rosengeranie,Pelargonium graveolens,easy|medicinal|sun,3,Die Rosengeranie ist eine Duftpflanze mit tief eingeschnittenen Blaettern und rosaenlichem Aroma.,Volles Sonnenlicht,15-25 °C,7 +constants/lexiconBatch2.ts,61,Efeu-Geranie,Pelargonium peltatum,easy|flowering|hanging|sun,4,"Die Efeu-Geranie hat efeufoermige, glaenzende Blaetter und bluet den ganzen Sommer in leuchtenden Farben.",Helles bis volles Licht,15-25 °C,5 +constants/lexiconBatch2.ts,174,Stehende Geranie,Pelargonium zonale,flowering|sun,2,"Stehende Geranie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,229,Wassermelonen-Peperomie,Peperomia argyreia,pet_friendly|patterned,2,Wassermelonen-Peperomie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7 +constants/lexiconBatch1.ts,102,Rippenpeperomie,Peperomia caperata,easy|pet_friendly,2,"Die Rippenpeperomie hat tief gerippte, dunkelgruene bis violette Blaetter mit einer samtigen Textur.",Helles indirektes Licht,18-26 °C,10 +constants/lexiconBatch1.ts,103,Spiegelpeperomie,Peperomia obtusifolia,easy|pet_friendly|low_light,3,"Die Spiegelpeperomie hat glaenzende, lederartige, oval-runde Blaetter in tiefem Gruen. Sehr robust.",Helles indirektes Licht,16-26 °C,10 +constants/lexiconBatch2.ts,230,Raindrop-Peperomie,Peperomia polybotrya,easy|pet_friendly,2,Raindrop-Peperomie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7 +constants/lexiconBatch2.ts,134,Shiso,Perilla frutescens,easy|sun,2,Shiso ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 +constants/lexiconBatch1.ts,29,Petersilie,Petroselinum crispum,easy,1,Petersilie ist eines der meistgenutzten Kuechenkraeuter mit frisch-aromatischem Geschmack. Reich an Vitaminen.,Helles Licht,10-25 °C,3 +constants/lexiconBatch1.ts,34,Petunie,Petunia hybrida,easy|pet_friendly|flowering|sun,4,Die Petunie ist eine der beliebtesten Balkonpflanzen mit trichterfoermigen Blueten in unzaehligen Farben.,Volles Sonnenlicht,15-25 °C,2 +constants/lexiconBatch1.ts,69,Schmetterlingsorchidee,Phalaenopsis amabilis,flowering|high_humidity,2,Die Schmetterlingsorchidee ist die bekannteste Zimmerorchidee. Sie bluet bei guter Pflege monatelang.,Helles indirektes Licht,18-28 °C,10 +constants/lexiconBatch2.ts,50,Philodendron bipinnatifidum,Philodendron bipinnatifidum,easy|large,2,"Philodendron bipinnatifidum hat grosse, tief gelappte Blaetter. Er entwickelt einen beeindruckenden, baumfoermigen Wuchs.",Helles indirektes Licht,18-27 °C,7 +constants/lexiconBatch2.ts,51,Roter Philodendron,Philodendron erubescens,easy|hanging,2,"Der Rote Philodendron hat glaenzende, herzfoermige Blaetter, die jung roetrlich erscheinen. Sehr dekorativ.",Helles indirektes Licht,18-27 °C,7 +constants/lexiconBatch2.ts,243,Philodendron Pink Princess,Philodendron erubescens Pink Princess,patterned|bright_light,2,Philodendron Pink Princess ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7 +constants/lexiconBatch2.ts,49,Philodendron gloriosum,Philodendron gloriosum,patterned|large|high_humidity,3,"Philodendron gloriosum hat grosse, samtige, herzfoermige Blaetter mit weissen Rippen. Eine atemberaubende Pflanze.",Helles indirektes Licht,18-27 °C,7 +constants/lexiconBatch1.ts,15,Herzblatt-Philodendron,Philodendron hederaceum,easy|hanging|low_light,3,Der Herzblatt-Philodendron ist eine pflegeleichte Kletter- oder Haengepflanze mit herzfoermigen Blaettern.,Indirektes Licht,18-28 °C,7 +constants/lexiconBatch2.ts,242,Philodendron Brasil,Philodendron hederaceum Brasil,easy|hanging|low_light,3,Philodendron Brasil ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7 +constants/lexiconBatch2.ts,40,Blaues Kanaelfarn,Phlebodium aureum,high_humidity,1,"Der Blaue Kanaelfarn hat wachsartige, blaugruene Wedel und glaenzende Wurzelstaemme. Sehr dekorativ.",Helles indirektes Licht,18-27 °C,7 +constants/lexiconBatch2.ts,165,Flammenblume,Phlox paniculata,flowering|sun,2,"Flammenblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch1.ts,44,Zwergdattelpalme,Phoenix roebelenii,tree|bright_light,2,"Die Zwergdattelpalme ist eine zierliche Palme mit eleganten, gebogenen Fiederblaettern. Tropisches Flair.",Helles bis volles Licht,18-27 °C,7 +constants/lexiconBatch2.ts,8,Goldener Bambus,Phyllostachys aurea,easy|large,2,"Der Goldene Bambus hat elegante, goldgelbe Halme mit engstehenden Knoten. Sehr dekorativ als Sichtschutz.",Helles bis volles Licht,10-30 °C,5 +constants/lexiconBatch2.ts,207,Fichte,Picea abies,tree|large|sun,3,Fichte ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 +constants/lexiconBatch2.ts,228,Aluminium-Pflanze,Pilea cadierei,easy|pet_friendly|patterned,3,Aluminium-Pflanze ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7 +constants/lexiconBatch1.ts,2,Ufopflanze,Pilea peperomioides,easy|pet_friendly,2,"Die Ufopflanze hat unverwechselbare, runde Blaetter auf langen Stielen. Bildet leicht Ableger zum Verschenken.",Helles indirektes Licht,13-30 °C,7 +constants/lexiconBatch2.ts,81,Fettkraut,Pinguicula grandiflora,flowering|high_humidity,2,"Das Fettkraut faengt Insekten mit klebrigen Blaettern. Es bluet mit violetten, sporenartigen Blueten.",Helles indirektes Licht,10-20 °C,5 +constants/lexiconBatch2.ts,206,Kiefer,Pinus sylvestris,tree|large|sun,3,Kiefer ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 +constants/lexiconBatch2.ts,41,Geweihfarn,Platycerium bifurcatum,hanging|high_humidity,2,"Der Geweihfarn hat gespaltene Wedel, die einem Hirschgeweih aehneln. Er ist ein epiphytischer Farn fuer Holz.",Helles indirektes Licht,15-25 °C,7 +constants/lexiconBatch2.ts,152,Buntnessel,Plectranthus scutellarioides,patterned|bright_light,2,"Buntnessel ist eine farbstarke Zierpflanze, die vor allem fuer ihr dekoratives Laub beliebt ist.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch1.ts,61,Bleiwurz,Plumbago auriculata,flowering|bright_light|sun,3,"Die Bleiwurz ist ein halbimmergruener Strauch mit himmelblauen Blueten, der fast das ganze Jahr bluet.",Volles Sonnenlicht,15-27 °C,5 +constants/lexiconBatch2.ts,118,Tempel-Baum,Plumeria rubra,flowering|tree|sun,3,"Der Tempel-Baum hat intensiv duftende, sternfoermige Blueten in Weiss, Gelb oder Rosa. Klassische Tropenblume.",Volles Sonnenlicht,20-30 °C,7 +constants/lexiconBatch2.ts,44,Tueipelfarn,Polypodium vulgare,easy,1,Der Tueipelfarn ist ein heimischer Farn mit gelappten Wedeln und runden Sporenhaeufchen auf der Unterseite.,Helles indirektes Licht,10-20 °C,7 +constants/lexiconBatch2.ts,27,Speckbaum,Portulacaria afra,easy|succulent|sun,3,"Der Speckbaum ist eine sukkulente Pflanze mit roten Stielen und kleinen, runden, glaenzenden Blaettern.",Helles bis volles Licht,15-30 °C,14 +constants/lexiconBatch1.ts,36,Primel,Primula vulgaris,flowering,1,"Die Primel ist einer der ersten Fruehjahrs­boten mit lebhaften Blueten in Gelb, Pink, Rot und Lila.",Helles indirektes Licht,10-18 °C,4 +constants/lexiconBatch2.ts,71,Koenigs-Protea,Protea cynaroides,flowering|large|sun,3,"Die Koenigs-Protea ist die Nationalblume Suedafrikas mit riesigen, imposanten Bluetenkoepfen. Eine echte Besonderheit.",Volles Sonnenlicht,10-25 °C,7 +constants/lexiconBatch2.ts,218,Kirschlorbeer,Prunus laurocerasus,tree|sun,2,Kirschlorbeer ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 +constants/lexiconBatch2.ts,89,Guave,Psidium guajava,tree|sun,2,Die Guave ist ein tropischer Obstbaum mit gelblich-weissen Fruechten. Sie ist reich an Vitamin C.,Volles Sonnenlicht,18-30 °C,7 +constants/lexiconBatch2.ts,88,Granatapfelbaum,Punica granatum,flowering|tree|sun,3,"Der Granatapfelbaum hat leuchtend rote Blueten und rote, essbare Fruechte mit rubinroten Kernen.",Volles Sonnenlicht,15-28 °C,7 +constants/lexiconBatch2.ts,205,Eiche,Quercus robur,tree|large|sun,3,Eiche ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 +constants/lexiconBatch2.ts,162,Ranunkel,Ranunculus asiaticus,flowering|sun,2,"Ranunkel ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,98,Radieschen,Raphanus sativus,easy,1,"Das Radieschen ist ein schnellwachsendes Gemuese mit runden, roten Knollen. Es reift in nur 3-4 Wochen.",Helles bis volles Licht,10-22 °C,2 +constants/lexiconBatch2.ts,52,Mini-Monstera,Rhaphidophora tetrasperma,easy|hanging,2,"Die Mini-Monstera hat monstera­aehnliche, gelochte Blaetter auf einer kompakten, klettternden Pflanze. Sehr trendig.",Helles indirektes Licht,18-27 °C,7 +constants/lexiconBatch1.ts,45,Stab-Palme,Rhapis excelsa,tree|low_light,2,"Die Stab-Palme ist eine elegante Zimmerpalme mit faecher­foermigen Blaettern auf duennen, bambusartigen Staemmen.",Helles indirektes Licht,15-25 °C,7 +constants/lexiconBatch1.ts,85,Korallenkaktus,Rhipsalis baccifera,succulent|hanging,2,"Der Korallenkaktus ist ein epiphytischer Kaktus mit duennen, haengenden Trieben und kleinen weissen Beeren.",Indirektes Licht,18-27 °C,7 +constants/lexiconBatch2.ts,170,Rhododendron,Rhododendron catawbiense,flowering|tree|bright_light,3,"Rhododendron ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch1.ts,91,Japanische Azalee,Rhododendron simsii,flowering,1,"Die Japanische Azalee bluet im Winter und Fruehling ueppig mit leuchtend roten, rosa oder weissen Blueten.",Helles indirektes Licht,10-18 °C,4 +constants/lexiconBatch2.ts,214,Robinie,Robinia pseudoacacia,tree|large|sun,3,Robinie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 +constants/lexiconBatch1.ts,66,Chinesische Rose,Rosa chinensis,flowering|sun,2,Die Chinesische Rose ist eine der Stammarten vieler Gartenrosen und bluet fast ununterbrochen.,Volles Sonnenlicht,15-25 °C,5 +constants/lexiconBatch2.ts,142,Rose,Rosa x hybrida,flowering|bright_light|sun,3,"Rose ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch1.ts,24,Rosmarin,Rosmarinus officinalis,easy|medicinal|sun,3,Rosmarin ist ein aromatisches Kraut mit nadelartigen Blaettern und blauen Blueten. In der Kueche unverzichtbar.,Volles Sonnenlicht,10-25 °C,7 +constants/lexiconBatch2.ts,167,Rudbeckie,Rudbeckia hirta,flowering|sun,2,"Rudbeckie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,130,Sauerampfer,Rumex acetosa,easy|sun,2,Sauerampfer ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 +constants/lexiconBatch1.ts,94,Afrikanisches Veilchen,Saintpaulia ionantha,easy|flowering,2,"Das Afrikanische Veilchen ist eine kleine, kompakte Bluehpflanze mit samtigen Blaettern und violetten Blueten.",Helles indirektes Licht,18-25 °C,7 +constants/lexiconBatch2.ts,113,Silber-Weide,Salix alba,tree|large|medicinal,3,"Die Silber-Weide hat silbrig-glaenzende Blaetter. Weidenrinde enthält Salicylsaeure, die Grundlage von Aspirin.",Helles bis volles Licht,10-25 °C,7 +constants/lexiconBatch2.ts,195,Mehlsalbei,Salvia farinacea,flowering|sun,2,"Mehlsalbei ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,103,Salbei,Salvia officinalis,easy|medicinal|sun,3,Salbei ist ein aromatisches Heilkraut mit silbrig-gruenen Blaettern. Er hat antibakterielle und entzuendungshem­mende Wirkung.,Volles Sonnenlicht,10-25 °C,7 +constants/lexiconBatch2.ts,168,Feuersalbei,Salvia splendens,flowering|sun,2,"Feuersalbei ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,112,Schwarzer Holunder,Sambucus nigra,flowering|tree|medicinal,3,Der Schwarze Holunder hat weisse Doldenbluten und schwarze Beeren. Die Fruechte werden fuer Sirup und Saft verwendet.,Helles bis volles Licht,10-25 °C,7 +constants/lexiconBatch2.ts,17,Zylindrischer Bogenhanf,Sansevieria cylindrica,easy|succulent|sun,3,"Der Zylindrische Bogenhanf hat zylindrische, aufrechte Blaetter, die sich nach oben verjuengen. Sehr pflegeleicht.",Helles bis volles Licht,15-27 °C,14 +constants/lexiconBatch2.ts,78,Purpursonnentau,Sarracenia purpurea,high_humidity|sun,2,Der Purpursonnentau ist eine fleischfressende Kannenpflanze mit purpurroten Kannen. Faengt Insekten.,Volles Sonnenlicht,5-25 °C,3 +constants/lexiconBatch2.ts,123,Bohnenkraut,Satureja hortensis,easy|sun,2,Bohnenkraut ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 +constants/lexiconBatch2.ts,11,Grosse Strahlenaralie,Schefflera actinophylla,easy|tree|large,3,"Die Grosse Strahlenaralie kann grosse, handfoermige Blaetter entwickeln. Sie ist ideal als Zimmerstrauch.",Helles indirektes Licht,18-27 °C,7 +constants/lexiconBatch2.ts,10,Strahlenaralie,Schefflera arboricola,easy|tree|air_purifier,3,"Die Strahlenaralie hat fingerfoermig angeordnete, glaenzende Blaetter auf langen Stielen. Sehr robuste Zimmerpflanze.",Helles indirektes Licht,15-25 °C,7 +constants/lexiconBatch2.ts,235,Falsche Aralie,Schefflera elegantissima,tree|bright_light,2,Falsche Aralie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7 +constants/lexiconBatch1.ts,8,Weihnachtskaktus,Schlumbergera truncata,easy|flowering|succulent,3,"Der Weihnachtskaktus erfreut zur Weihnachtszeit mit leuchtenden Blueten in Rosa, Rot oder Weiss.",Helles indirektes Licht,15-21 °C,7 +constants/lexiconBatch1.ts,55,Satinpothos,Scindapsus pictus,easy|patterned|hanging,3,"Der Satinpothos hat samtig-glaenzende, silbrig gefleckte Blaetter auf langen, haengenden Ranken.",Helles indirektes Licht,18-28 °C,7 +constants/lexiconBatch1.ts,7,Eselschwanz,Sedum morganianum,easy|succulent|hanging|sun,4,"Der Eselschwanz ist eine haengende Sukkulente mit langen Trieben aus dichten, blaugruenen Blaettchen.",Volles Sonnenlicht,15-25 °C,14 +constants/lexiconBatch2.ts,45,Regenbogenmoos,Selaginella uncinata,patterned|high_humidity,2,"Das Regenbogenmoos hat schuppenfoermige Blaetter, die im Licht schillernd irisieren. Dekorativ fuer Terrarien.",Helles indirektes Licht,18-27 °C,5 +constants/lexiconBatch1.ts,100,Perlenschnur-Pflanze,Senecio rowleyanus,easy|succulent|hanging,3,"Die Perlenschnur-Pflanze hat haengende Ranken mit kugelfoermigen, perlenaehnlichen Blaettern. Einzigartige Sukkulente.",Helles bis volles Licht,15-27 °C,14 +constants/lexiconBatch2.ts,28,Blauer Kreuzkraut,Senecio serpens,easy|succulent|sun,3,"Der Blaue Kreuzkraut hat zylindrische, blaublaugruene Blaetter und einen kriechenden Wuchs. Sehr dekorativ.",Helles bis volles Licht,15-25 °C,14 +constants/lexiconBatch2.ts,91,Tomate,Solanum lycopersicum,easy,1,"Die Tomate ist eine beliebte Gemuese- und Balkonpflanze mit roten, saftigen Fruechten. Im Topf kultivierbar.",Volles Sonnenlicht,18-28 °C,3 +constants/lexiconBatch2.ts,93,Aubergine,Solanum melongena,bright_light|sun,2,"Die Aubergine ist eine Gemuese­pflanze mit grossen, violetten Fruechten. Sie benoetigt viel Waerme und Sonne.",Volles Sonnenlicht,20-30 °C,5 +constants/lexiconBatch2.ts,238,Bubikopf,Soleirolia soleirolii,pet_friendly|high_humidity,2,Bubikopf ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,15-24 C,4 +constants/lexiconBatch2.ts,213,Eberesche,Sorbus aucuparia,tree|large|sun,3,Eberesche ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 +constants/lexiconBatch2.ts,96,Spinat,Spinacia oleracea,easy,1,Spinat ist ein naehrstoffreiches Blattgemuese mit dunkelgruenen Blaettern. Reich an Eisen und Vitaminen.,Helles bis volles Licht,10-20 °C,3 +constants/lexiconBatch2.ts,222,Spierstrauch,Spiraea japonica,flowering|tree|sun,3,Spierstrauch ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 +constants/lexiconBatch2.ts,25,Aasblume,Stapelia grandiflora,flowering|succulent|sun,3,"Die Aasblume hat fleischige, gruene Staengel und riesige, sternfoermige Blueten mit aasartigem Duft.",Helles bis volles Licht,18-30 °C,14 +constants/lexiconBatch1.ts,60,Madagaskar-Jasmin,Stephanotis floribunda,flowering,1,"Der Madagaskar-Jasmin hat dicke, glaenzende Blaetter und wachsweisse, intensiv duftende Blueten. Klassische Hochzeitsblume.",Helles indirektes Licht,18-25 °C,7 +constants/lexiconBatch2.ts,131,Stevia,Stevia rebaudiana,easy|sun,2,Stevia ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5 +constants/lexiconBatch2.ts,1,Weisse Strelitzie,Strelitzia nicolai,tree|large|bright_light,3,"Die Weisse Strelitzie ist ein beeindruckender Zimmerstrauch mit grossen, blaugruenen Blaettern und weiss-blauen Blueten.",Helles bis volles Licht,18-27 °C,7 +constants/lexiconBatch1.ts,3,Paradiesvogelblume,Strelitzia reginae,flowering|large|sun,3,"Die Paradiesvogelblume beeindruckt mit leuchtend orangefarbenen und blauen Blueten, die einem Vogel aehneln.",Volles Sonnenlicht,18-26 °C,7 +constants/lexiconBatch1.ts,95,Drehfrucht,Streptocarpus hybridus,flowering,1,"Die Drehfrucht ist ein Gesneriengewaechs mit langen, gerippten Blaettern und trichterfoermigen Blueten in Lila oder Rosa.",Helles indirektes Licht,15-22 °C,7 +constants/lexiconBatch1.ts,52,Stromanthe,Stromanthe sanguinea,patterned|high_humidity,2,Die Stromanthe hat dekorative Blaetter mit weissem Muster und leuchtend roter Unterseite. Familie der Marantaceen.,Helles indirektes Licht,18-25 °C,5 +constants/lexiconBatch2.ts,166,Herbstaster,Symphyotrichum novi-belgii,flowering|sun,2,"Herbstaster ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch1.ts,56,Pfeilblatt,Syngonium podophyllum,easy|hanging,2,"Das Pfeilblatt hat charakteristisch pfeilfoermige Blaetter, die sich mit dem Alter weiterentwickeln.",Helles indirektes Licht,16-27 °C,7 +constants/lexiconBatch2.ts,149,Flieder,Syringa vulgaris,flowering|tree|sun,3,"Flieder ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,66,Studentenblume,Tagetes patula,easy|flowering|sun,3,Die Studentenblume ist eine robuste Sommerblume mit orangen oder gelben Blueten. Sie haelt Schadlinge fern.,Volles Sonnenlicht,15-28 °C,3 +constants/lexiconBatch2.ts,244,Philodendron Xanadu,Thaumatophyllum xanadu,bright_light,1,Philodendron Xanadu ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7 +constants/lexiconBatch1.ts,27,Thymian,Thymus vulgaris,easy|medicinal|sun,3,"Thymian ist ein kleiner, aromatischer Strauch mit winzigen Blaettern und rosa Blueten. Wichtiges Kuechenkraut.",Volles Sonnenlicht,10-25 °C,7 +constants/lexiconBatch2.ts,33,Luftpflanze,Tillandsia ionantha,easy,1,Die Luftpflanze ist eine kompakte Bromelie ohne Topferde. Sie nimmt Wasser und Naehrstoffe ueber die Blattschuppen auf.,Helles bis volles Licht,15-30 °C,3 +constants/lexiconBatch2.ts,32,Spanisches Moos,Tillandsia usneoides,easy|hanging,2,"Das Spanische Moos ist eine epiphytische Bromelie ohne Wurzeln, die in der Luft haengt. Es benoetigt nur Feuchtigkeitsbespruehing.",Helles bis volles Licht,15-30 °C,3 +constants/lexiconBatch2.ts,55,Weisse Tradescantia,Tradescantia fluminensis,easy|hanging,2,Die Weisse Tradescantia hat gruene Blaetter mit weisslichen Unterseiten. Sehr robust und schnellwachsend.,Helles indirektes Licht,15-25 °C,5 +constants/lexiconBatch2.ts,54,Lila Tradescantia,Tradescantia pallida,easy|hanging|sun,3,Die Lila Tradescantia hat leuchtend purpurrote Blaetter und ist sehr auffaellig. Sie liebt viel Licht.,Helles bis volles Licht,15-25 °C,5 +constants/lexiconBatch1.ts,17,Zebrakraut,Tradescantia zebrina,easy|patterned|hanging,3,Das Zebrakraut faellt durch seine silbrig-lila gestreiften Blaetter auf. Schnellwachsende Haengepflanze.,Helles indirektes Licht,15-25 °C,5 +constants/lexiconBatch2.ts,151,Kapuzinerkresse,Tropaeolum majus,flowering|sun,2,"Kapuzinerkresse ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch1.ts,107,Tulpe,Tulipa gesneriana,easy|flowering,2,Die Tulpe ist eine der beliebtesten Fruehjahrsblueher mit kelchfoermigen Blueten in unzaehligen Farben.,Helles bis volles Licht,8-18 °C,5 +constants/lexiconBatch2.ts,111,Grosse Brennessel,Urtica dioica,medicinal,1,Die Grosse Brennessel ist eine Heilpflanze mit brennenden Haaren. Die Blaetter sind reich an Vitaminen und Mineralien.,Helles bis volles Licht,10-25 °C,7 +constants/lexiconBatch2.ts,82,Wasserschlauch,Utricularia gibba,high_humidity|sun,2,Der Wasserschlauch ist eine wasserbewohnende fleischfressende Pflanze mit Schlaeuchen als Insekten­fallen.,Helles bis volles Licht,15-25 °C,2 +constants/lexiconBatch2.ts,104,Baldrian,Valeriana officinalis,flowering|medicinal,2,Baldrian ist ein bekanntes Heilkraut mit weissen bis roeslichen Blueten. Die Wurzeln werden zur Schlaffoerderung verwendet.,Helles bis volles Licht,15-25 °C,7 +constants/lexiconBatch1.ts,72,Vanda-Orchidee,Vanda coerulea,flowering|bright_light|high_humidity,3,Die Vanda-Orchidee ist bekannt fuer ihre seltene blaue Bluetenfarbe. Epiphytische Orchidee mit grossen Blueten.,Helles bis volles Licht,20-30 °C,3 +constants/lexiconBatch1.ts,76,Vanille,Vanilla planifolia,flowering|high_humidity,2,"Die Vanille ist eine kletternde Orchidee, aus deren Fruechten das beliebte Gewuerz gewonnen wird.",Helles indirektes Licht,20-30 °C,5 +constants/lexiconBatch2.ts,192,Koenigskerze,Verbascum thapsus,flowering|medicinal|sun,3,"Koenigskerze ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,164,Eisenkraut,Verbena bonariensis,flowering|sun,2,"Eisenkraut ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch2.ts,198,Hornveilchen,Viola cornuta,flowering|sun,2,"Hornveilchen ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4 +constants/lexiconBatch1.ts,35,Stiefmuetterchen,Viola wittrockiana,easy|flowering,2,Das Stiefmuetterchen ist ein bekannter Fruehjahrsblueher mit charakteristisch gezeichneten Blueten.,Helles bis volles Licht,5-18 °C,3 +constants/lexiconBatch2.ts,35,Flammen-Bromelie,Vriesea splendens,flowering|patterned|high_humidity,3,"Die Flammen-Bromelie hat gebänderte, dunkelgruene Blaetter und einen spektakulaeren, roten Bluetenstand.",Helles indirektes Licht,18-25 °C,7 +constants/lexiconBatch2.ts,5,Mexikanische Fächerpalme,Washingtonia robusta,tree|large|sun,3,"Die Mexikanische Fächerpalme ist eine schlanke, hohe Palme mit faecher­foermigen Blaettern. Sehr hitzetolerant.",Volles Sonnenlicht,15-35 °C,10 +constants/lexiconBatch2.ts,221,Weigelie,Weigela florida,flowering|tree|sun,3,Weigelie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7 +constants/lexiconBatch1.ts,65,Chinesischer Blauregen,Wisteria sinensis,flowering|large|sun,3,"Der Chinesische Blauregen ist ein ueppiger Kletterkuenstler mit langen, duftenden Bluetentrauben in Lila.",Volles Sonnenlicht,10-25 °C,7 +constants/lexiconBatch2.ts,246,Yucca aloifolia,Yucca aloifolia,easy|tree|sun,3,Yucca aloifolia ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Volles Sonnenlicht,18-30 C,10 +constants/lexiconBatch1.ts,40,Yucca-Palme,Yucca elephantipes,easy|tree|sun,3,"Die Yucca-Palme ist eine robuste Zimmerpflanze mit starrem, immergruenem Blaetterschopf auf einem dicken Stamm.",Helles bis volles Licht,15-28 °C,14 +constants/lexiconBatch2.ts,70,Calla,Zantedeschia aethiopica,flowering|high_humidity,2,"Die Calla hat elegante, trichterfoermige weisse Hochblaetter und glaenzende, herzfoermige Blaetter. Sehr edel.",Helles indirektes Licht,15-24 °C,7 +constants/lexiconBatch2.ts,75,Ingwer,Zingiber officinale,medicinal|high_humidity,2,Ingwer ist eine tropische Gewuerzpflanze mit aromatischen Knollen. Die Blaetter sind schilfartig.,Helles indirektes Licht,20-30 °C,5 +constants/lexiconBatch2.ts,65,Zinnie,Zinnia elegans,easy|flowering|sun,3,"Die Zinnie ist eine leuchtende Sommerblume mit grossen, dahlienaehnlichen Blueten. Sehr robust und hitzetolerant.",Volles Sonnenlicht,18-30 °C,3 diff --git a/audits/semantic-search/categories/air_purifier.csv b/audits/semantic-search/categories/air_purifier.csv index da6a26b..2865576 100644 --- a/audits/semantic-search/categories/air_purifier.csv +++ b/audits/semantic-search/categories/air_purifier.csv @@ -1,13 +1,13 @@ -category,source_file,source_index,name,botanical_name,description,light,temp,water_interval_days,all_categories,risk_flags,audit_status,evidence_source,evidence_url,notes -air_purifier,constants/lexiconBatch1.ts,43,Bergpalme,Chamaedorea elegans,Die Bergpalme ist eine kompakte Zimmerpalme fuer schattigere Standorte. Ideal fuer dunkle Innenraeume.,Wenig bis helles Licht,15-25 °C,7,easy|pet_friendly|tree|air_purifier|low_light,air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence,,,, -air_purifier,constants/lexiconBatch1.ts,48,Dieffenbachie,Dieffenbachia seguine,"Die Dieffenbachie ist eine tropische Blattschmuckpflanze mit grossen, gruen-weiss gefleckten Blaettern.",Helles indirektes Licht,18-26 °C,7,easy|air_purifier|low_light,air_purifier_requires_external_evidence,,,, -air_purifier,constants/lexiconBatch1.ts,14,Maisstrauch,Dracaena fragrans,"Der Maisstrauch ist eine robuste Zimmerpflanze mit breiten, gestreiften Blaettern. Gedeiht auch bei wenig Licht.",Helles indirektes Licht,15-25 °C,10,easy|tree|air_purifier|low_light,air_purifier_requires_external_evidence,,,, -air_purifier,constants/lexiconBatch1.ts,13,Drachenbaum,Dracaena marginata,"Der Drachenbaum ist eine schlanke Zimmerpflanze mit roten, schmalen Blaettern auf langen Staemmen.",Helles indirektes Licht,15-25 °C,10,easy|tree|air_purifier,air_purifier_requires_external_evidence,,,, -air_purifier,constants/lexiconBatch1.ts,42,Goldfruchtpalme,Dypsis lutescens,Die Goldfruchtpalme ist eine elegante Zimmerpalme mit gelblich-gruenen Stielen und gefiederten Wedeln.,Helles indirektes Licht,18-27 °C,5,pet_friendly|tree|air_purifier,air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence,,,, -air_purifier,constants/lexiconBatch1.ts,16,Marmor-Efeutute,Epipremnum aureum Marble Queen,Die Marmor-Efeutute hat cremeweiss-gruen marmorierte Blaetter. Eine dekorative Variante der klassischen Efeutute.,Helles indirektes Licht,15-30 °C,7,easy|hanging|air_purifier,air_purifier_requires_external_evidence,,,, -air_purifier,constants/lexiconBatch2.ts,53,Neon-Efeutute,Epipremnum pinnatum Neon,Die Neon-Efeutute hat leuchtend limonengruene Blaetter. Sehr auffaellig und pflegeleicht.,Helles indirektes Licht,15-30 °C,7,easy|hanging|air_purifier,air_purifier_requires_external_evidence,,,, -air_purifier,constants/lexiconBatch1.ts,1,Birkenfeige,Ficus benjamina,"Die Birkenfeige ist ein eleganter Zimmerstrauch mit haengenden Aesten und kleinen, glaenzenden Blaettern.",Helles indirektes Licht,16-24 °C,7,tree|air_purifier,air_purifier_requires_external_evidence,,,, -air_purifier,constants/lexiconBatch1.ts,38,Gummibaum,Ficus elastica,"Der Gummibaum ist eine imposante Zimmerpflanze mit grossen, glaenzenden, lederartigen Blaettern. Reinigt die Luft.",Helles indirektes Licht,16-24 °C,10,easy|tree|air_purifier,air_purifier_requires_external_evidence,,,, -air_purifier,constants/lexiconBatch1.ts,68,Gerbera,Gerbera jamesonii,"Die Gerbera ist eine farbenfrohe Schnittblume mit grossen, sonnenblumenaehnlichen Blueten. Sehr beliebt.",Helles bis volles Licht,15-25 °C,5,flowering|air_purifier|bright_light,air_purifier_requires_external_evidence,,,, -air_purifier,constants/lexiconBatch1.ts,37,Efeu,Hedera helix,"Efeu ist eine robuste Kletter- und Haengepflanze mit charakteristischen, dreilappigen Blaettern. Sehr langlebig.",Wenig bis helles Licht,10-20 °C,7,easy|hanging|air_purifier|low_light,air_purifier_requires_external_evidence,,,, -air_purifier,constants/lexiconBatch2.ts,10,Strahlenaralie,Schefflera arboricola,"Die Strahlenaralie hat fingerfoermig angeordnete, glaenzende Blaetter auf langen Stielen. Sehr robuste Zimmerpflanze.",Helles indirektes Licht,15-25 °C,7,easy|tree|air_purifier,air_purifier_requires_external_evidence,,,, +category,source_file,source_index,name,botanical_name,description,light,temp,water_interval_days,all_categories,risk_flags,audit_status,evidence_source,evidence_url,notes +air_purifier,constants/lexiconBatch1.ts,43,Bergpalme,Chamaedorea elegans,Die Bergpalme ist eine kompakte Zimmerpalme fuer schattigere Standorte. Ideal fuer dunkle Innenraeume.,Wenig bis helles Licht,15-25 °C,7,easy|pet_friendly|tree|air_purifier|low_light,air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence,,,, +air_purifier,constants/lexiconBatch1.ts,48,Dieffenbachie,Dieffenbachia seguine,"Die Dieffenbachie ist eine tropische Blattschmuckpflanze mit grossen, gruen-weiss gefleckten Blaettern.",Helles indirektes Licht,18-26 °C,7,easy|air_purifier|low_light,air_purifier_requires_external_evidence,,,, +air_purifier,constants/lexiconBatch1.ts,14,Maisstrauch,Dracaena fragrans,"Der Maisstrauch ist eine robuste Zimmerpflanze mit breiten, gestreiften Blaettern. Gedeiht auch bei wenig Licht.",Helles indirektes Licht,15-25 °C,10,easy|tree|air_purifier|low_light,air_purifier_requires_external_evidence,,,, +air_purifier,constants/lexiconBatch1.ts,13,Drachenbaum,Dracaena marginata,"Der Drachenbaum ist eine schlanke Zimmerpflanze mit roten, schmalen Blaettern auf langen Staemmen.",Helles indirektes Licht,15-25 °C,10,easy|tree|air_purifier,air_purifier_requires_external_evidence,,,, +air_purifier,constants/lexiconBatch1.ts,42,Goldfruchtpalme,Dypsis lutescens,Die Goldfruchtpalme ist eine elegante Zimmerpalme mit gelblich-gruenen Stielen und gefiederten Wedeln.,Helles indirektes Licht,18-27 °C,5,pet_friendly|tree|air_purifier,air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence,,,, +air_purifier,constants/lexiconBatch1.ts,16,Marmor-Efeutute,Epipremnum aureum Marble Queen,Die Marmor-Efeutute hat cremeweiss-gruen marmorierte Blaetter. Eine dekorative Variante der klassischen Efeutute.,Helles indirektes Licht,15-30 °C,7,easy|hanging|air_purifier,air_purifier_requires_external_evidence,,,, +air_purifier,constants/lexiconBatch2.ts,53,Neon-Efeutute,Epipremnum pinnatum Neon,Die Neon-Efeutute hat leuchtend limonengruene Blaetter. Sehr auffaellig und pflegeleicht.,Helles indirektes Licht,15-30 °C,7,easy|hanging|air_purifier,air_purifier_requires_external_evidence,,,, +air_purifier,constants/lexiconBatch1.ts,1,Birkenfeige,Ficus benjamina,"Die Birkenfeige ist ein eleganter Zimmerstrauch mit haengenden Aesten und kleinen, glaenzenden Blaettern.",Helles indirektes Licht,16-24 °C,7,tree|air_purifier,air_purifier_requires_external_evidence,,,, +air_purifier,constants/lexiconBatch1.ts,38,Gummibaum,Ficus elastica,"Der Gummibaum ist eine imposante Zimmerpflanze mit grossen, glaenzenden, lederartigen Blaettern. Reinigt die Luft.",Helles indirektes Licht,16-24 °C,10,easy|tree|air_purifier,air_purifier_requires_external_evidence,,,, +air_purifier,constants/lexiconBatch1.ts,68,Gerbera,Gerbera jamesonii,"Die Gerbera ist eine farbenfrohe Schnittblume mit grossen, sonnenblumenaehnlichen Blueten. Sehr beliebt.",Helles bis volles Licht,15-25 °C,5,flowering|air_purifier|bright_light,air_purifier_requires_external_evidence,,,, +air_purifier,constants/lexiconBatch1.ts,37,Efeu,Hedera helix,"Efeu ist eine robuste Kletter- und Haengepflanze mit charakteristischen, dreilappigen Blaettern. Sehr langlebig.",Wenig bis helles Licht,10-20 °C,7,easy|hanging|air_purifier|low_light,air_purifier_requires_external_evidence,,,, +air_purifier,constants/lexiconBatch2.ts,10,Strahlenaralie,Schefflera arboricola,"Die Strahlenaralie hat fingerfoermig angeordnete, glaenzende Blaetter auf langen Stielen. Sehr robuste Zimmerpflanze.",Helles indirektes Licht,15-25 °C,7,easy|tree|air_purifier,air_purifier_requires_external_evidence,,,, diff --git a/audits/semantic-search/categories/bright_light.csv b/audits/semantic-search/categories/bright_light.csv index c68a29c..dbd6448 100644 --- a/audits/semantic-search/categories/bright_light.csv +++ b/audits/semantic-search/categories/bright_light.csv @@ -1,43 +1,43 @@ -category,source_file,source_index,name,botanical_name,description,light,temp,water_interval_days,all_categories,risk_flags,audit_status,evidence_source,evidence_url,notes -bright_light,constants/lexiconBatch2.ts,225,Alocasia zebrina,Alocasia zebrina,Alocasia zebrina ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5,bright_light|high_humidity,,,,, -bright_light,constants/lexiconBatch2.ts,232,Norfolk-Tanne,Araucaria heterophylla,Norfolk-Tanne ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,tree|bright_light,,,,, -bright_light,constants/lexiconBatch2.ts,175,Eisbegonie,Begonia semperflorens-cultorum,"Eisbegonie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light,,,,, -bright_light,constants/lexiconBatch1.ts,62,Bougainvillea,Bougainvillea spectabilis,"Die Bougainvillea ist eine rankenreiche Kletterpflanze mit leuchtend farbigen Hochblaettern in Rot, Orange oder Pink.",Volles Sonnenlicht,18-30 °C,5,flowering|bright_light|sun,,,,, -bright_light,constants/lexiconBatch2.ts,184,Trompetenwinde,Campsis radicans,"Trompetenwinde ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light,,,,, -bright_light,constants/lexiconBatch2.ts,157,Clematis,Clematis viticella,"Clematis ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light,,,,, -bright_light,constants/lexiconBatch2.ts,224,Kroton,Codiaeum variegatum,Kroton ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,patterned|bright_light,,,,, -bright_light,constants/lexiconBatch2.ts,245,Kaffeepflanze arabica nana,Coffea arabica Nana,Kaffeepflanze arabica nana ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,bright_light,,,,, -bright_light,constants/lexiconBatch2.ts,137,Wasabi,Eutrema japonicum,"Wasabi ist ein seltenes Wuerzkraut, das gleichmaessige Feuchte und eher kuehle Bedingungen bevorzugt.",Helles indirektes Licht,8-20 C,4,bright_light|high_humidity,,,,, -bright_light,constants/lexiconBatch2.ts,248,Ficus altissima,Ficus altissima,Ficus altissima ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,tree|bright_light,,,,, -bright_light,constants/lexiconBatch1.ts,39,Geigenfeige,Ficus lyrata,"Die Geigenfeige ist ein Trendbaum mit grossen, geigenfoermigen Blaettern. Benoetigt viel Licht.",Helles indirektes Licht,18-27 °C,7,tree|large|bright_light,,,,, -bright_light,constants/lexiconBatch2.ts,247,Ficus microcarpa,Ficus microcarpa,Ficus microcarpa ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,easy|tree|bright_light,,,,, -bright_light,constants/lexiconBatch1.ts,68,Gerbera,Gerbera jamesonii,"Die Gerbera ist eine farbenfrohe Schnittblume mit grossen, sonnenblumenaehnlichen Blueten. Sehr beliebt.",Helles bis volles Licht,15-25 °C,5,flowering|air_purifier|bright_light,air_purifier_requires_external_evidence,,,, -bright_light,constants/lexiconBatch2.ts,72,Heliconia,Heliconia psittacorum,"Die Heliconia hat leuchtend orangefarbe oder rote, bootsfoermige Hochblaetter. Eine exotische Tropenpflanze.",Helles bis volles Licht,20-30 °C,5,flowering|bright_light|high_humidity,,,,, -bright_light,constants/lexiconBatch1.ts,21,Hibiskus,Hibiscus rosa-sinensis,"Der Hibiskus begeistert mit grossen, trompetenfoermigen Blueten in Rot, Orange und Rosa.",Volles Sonnenlicht,18-28 °C,3,flowering|bright_light|sun,,,,, -bright_light,constants/lexiconBatch1.ts,105,Ritterstern,Hippeastrum hybrid,"Der Ritterstern beeindruckt im Winter mit riesigen, trompetenfoermigen Blueten in Rot, Pink oder Weiss.",Helles bis volles Licht,18-25 °C,7,flowering|bright_light,,,,, -bright_light,constants/lexiconBatch2.ts,148,Hortensie,Hydrangea macrophylla,"Hortensie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Helles bis halbschattiges Licht,8-24 C,4,flowering|bright_light,,,,, -bright_light,constants/lexiconBatch2.ts,227,Punktblatt,Hypoestes phyllostachya,Punktblatt ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,patterned|bright_light,,,,, -bright_light,constants/lexiconBatch2.ts,176,Gartenbalsamine,Impatiens balsamina,"Gartenbalsamine ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light,,,,, -bright_light,constants/lexiconBatch2.ts,172,Arabischer Jasmin,Jasminum sambac,"Arabischer Jasmin ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light,,,,, -bright_light,constants/lexiconBatch2.ts,197,Traenendes Herz,Lamprocapnos spectabilis,"Traenendes Herz ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light,,,,, -bright_light,constants/lexiconBatch2.ts,64,Wandelroeschen,Lantana camara,"Das Wandelroeschen hat kugelige Bluetenkoepfe, die die Farbe von Gelb ueber Orange zu Rot wechseln. Sehr attraktiv.",Volles Sonnenlicht,18-28 °C,5,flowering|bright_light|sun,,,,, -bright_light,constants/lexiconBatch1.ts,23,Echter Lavendel,Lavandula angustifolia,Der Echte Lavendel ist ein aromatischer Halbstrauch mit lilafarbenen Bluetenaehren. Herrlicher Duft.,Volles Sonnenlicht,10-25 °C,10,medicinal|bright_light|sun,medicinal_requires_external_evidence,,,, -bright_light,constants/lexiconBatch2.ts,69,Ostertrompete,Lilium longiflorum,"Die Ostertrompete hat grosse, weisse, trichterfoermige Blueten mit intensivem Duft. Klassische Osterblume.",Helles bis volles Licht,15-25 °C,5,flowering|bright_light,,,,, -bright_light,constants/lexiconBatch2.ts,4,Chinesische Fächerpalme,Livistona chinensis,"Die Chinesische Fächerpalme hat grosse, faecher­foermige Blaetter auf einem einzelnen Stamm. Sehr dekorativ.",Helles bis volles Licht,15-25 °C,7,tree|bright_light,,,,, -bright_light,constants/lexiconBatch2.ts,171,Geissblatt,Lonicera japonica,"Geissblatt ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light,,,,, -bright_light,constants/lexiconBatch2.ts,76,Schamkraut,Mimosa pudica,"Das Schamkraut faltet seine Blaettchen blitzschnell zusammen, wenn man sie beruehrt. Ein faszinierendes Erlebnis.",Helles bis volles Licht,20-28 °C,5,flowering|bright_light,,,,, -bright_light,constants/lexiconBatch2.ts,37,Neoregelia,Neoregelia carolinae,"Die Neoregelia ist eine Bromelie, bei der das Herzblatt zur Bluetzeit leuchtend rot wird. Sehr dekorativ.",Helles bis volles Licht,18-27 °C,7,flowering|patterned|bright_light,,,,, -bright_light,constants/lexiconBatch2.ts,120,Oleander,Nerium oleander,"Der Oleander ist ein mediteraner Strauch mit leuchtend roten, rosa oder weissen Blueten. Sehr hitzetolerant.",Volles Sonnenlicht,15-28 °C,7,flowering|bright_light|sun,,,,, -bright_light,constants/lexiconBatch2.ts,231,Glueckskastanie,Pachira aquatica,Glueckskastanie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,easy|tree|bright_light,,,,, -bright_light,constants/lexiconBatch2.ts,6,Schraubenbaum,Pandanus veitchii,"Der Schraubenbaum hat spiralfoermig angeordnete, gruenweiss gestreifte Blaetter. Sehr dekorativ und exotisch.",Helles bis volles Licht,18-27 °C,7,patterned|bright_light,,,,, -bright_light,constants/lexiconBatch2.ts,243,Philodendron Pink Princess,Philodendron erubescens Pink Princess,Philodendron Pink Princess ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,patterned|bright_light,,,,, -bright_light,constants/lexiconBatch1.ts,44,Zwergdattelpalme,Phoenix roebelenii,"Die Zwergdattelpalme ist eine zierliche Palme mit eleganten, gebogenen Fiederblaettern. Tropisches Flair.",Helles bis volles Licht,18-27 °C,7,tree|bright_light,,,,, -bright_light,constants/lexiconBatch2.ts,152,Buntnessel,Plectranthus scutellarioides,"Buntnessel ist eine farbstarke Zierpflanze, die vor allem fuer ihr dekoratives Laub beliebt ist.",Volles bis helles Licht,10-24 C,4,patterned|bright_light,,,,, -bright_light,constants/lexiconBatch1.ts,61,Bleiwurz,Plumbago auriculata,"Die Bleiwurz ist ein halbimmergruener Strauch mit himmelblauen Blueten, der fast das ganze Jahr bluet.",Volles Sonnenlicht,15-27 °C,5,flowering|bright_light|sun,,,,, -bright_light,constants/lexiconBatch2.ts,170,Rhododendron,Rhododendron catawbiense,"Rhododendron ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|tree|bright_light,,,,, -bright_light,constants/lexiconBatch2.ts,142,Rose,Rosa x hybrida,"Rose ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light|sun,,,,, -bright_light,constants/lexiconBatch2.ts,235,Falsche Aralie,Schefflera elegantissima,Falsche Aralie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,tree|bright_light,,,,, -bright_light,constants/lexiconBatch2.ts,93,Aubergine,Solanum melongena,"Die Aubergine ist eine Gemuese­pflanze mit grossen, violetten Fruechten. Sie benoetigt viel Waerme und Sonne.",Volles Sonnenlicht,20-30 °C,5,bright_light|sun,,,,, -bright_light,constants/lexiconBatch2.ts,1,Weisse Strelitzie,Strelitzia nicolai,"Die Weisse Strelitzie ist ein beeindruckender Zimmerstrauch mit grossen, blaugruenen Blaettern und weiss-blauen Blueten.",Helles bis volles Licht,18-27 °C,7,tree|large|bright_light,,,,, -bright_light,constants/lexiconBatch2.ts,244,Philodendron Xanadu,Thaumatophyllum xanadu,Philodendron Xanadu ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,bright_light,,,,, -bright_light,constants/lexiconBatch1.ts,72,Vanda-Orchidee,Vanda coerulea,Die Vanda-Orchidee ist bekannt fuer ihre seltene blaue Bluetenfarbe. Epiphytische Orchidee mit grossen Blueten.,Helles bis volles Licht,20-30 °C,3,flowering|bright_light|high_humidity,,,,, +category,source_file,source_index,name,botanical_name,description,light,temp,water_interval_days,all_categories,risk_flags,audit_status,evidence_source,evidence_url,notes +bright_light,constants/lexiconBatch2.ts,225,Alocasia zebrina,Alocasia zebrina,Alocasia zebrina ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5,bright_light|high_humidity,,,,, +bright_light,constants/lexiconBatch2.ts,232,Norfolk-Tanne,Araucaria heterophylla,Norfolk-Tanne ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,tree|bright_light,,,,, +bright_light,constants/lexiconBatch2.ts,175,Eisbegonie,Begonia semperflorens-cultorum,"Eisbegonie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light,,,,, +bright_light,constants/lexiconBatch1.ts,62,Bougainvillea,Bougainvillea spectabilis,"Die Bougainvillea ist eine rankenreiche Kletterpflanze mit leuchtend farbigen Hochblaettern in Rot, Orange oder Pink.",Volles Sonnenlicht,18-30 °C,5,flowering|bright_light|sun,,,,, +bright_light,constants/lexiconBatch2.ts,184,Trompetenwinde,Campsis radicans,"Trompetenwinde ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light,,,,, +bright_light,constants/lexiconBatch2.ts,157,Clematis,Clematis viticella,"Clematis ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light,,,,, +bright_light,constants/lexiconBatch2.ts,224,Kroton,Codiaeum variegatum,Kroton ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,patterned|bright_light,,,,, +bright_light,constants/lexiconBatch2.ts,245,Kaffeepflanze arabica nana,Coffea arabica Nana,Kaffeepflanze arabica nana ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,bright_light,,,,, +bright_light,constants/lexiconBatch2.ts,137,Wasabi,Eutrema japonicum,"Wasabi ist ein seltenes Wuerzkraut, das gleichmaessige Feuchte und eher kuehle Bedingungen bevorzugt.",Helles indirektes Licht,8-20 C,4,bright_light|high_humidity,,,,, +bright_light,constants/lexiconBatch2.ts,248,Ficus altissima,Ficus altissima,Ficus altissima ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,tree|bright_light,,,,, +bright_light,constants/lexiconBatch1.ts,39,Geigenfeige,Ficus lyrata,"Die Geigenfeige ist ein Trendbaum mit grossen, geigenfoermigen Blaettern. Benoetigt viel Licht.",Helles indirektes Licht,18-27 °C,7,tree|large|bright_light,,,,, +bright_light,constants/lexiconBatch2.ts,247,Ficus microcarpa,Ficus microcarpa,Ficus microcarpa ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,easy|tree|bright_light,,,,, +bright_light,constants/lexiconBatch1.ts,68,Gerbera,Gerbera jamesonii,"Die Gerbera ist eine farbenfrohe Schnittblume mit grossen, sonnenblumenaehnlichen Blueten. Sehr beliebt.",Helles bis volles Licht,15-25 °C,5,flowering|air_purifier|bright_light,air_purifier_requires_external_evidence,,,, +bright_light,constants/lexiconBatch2.ts,72,Heliconia,Heliconia psittacorum,"Die Heliconia hat leuchtend orangefarbe oder rote, bootsfoermige Hochblaetter. Eine exotische Tropenpflanze.",Helles bis volles Licht,20-30 °C,5,flowering|bright_light|high_humidity,,,,, +bright_light,constants/lexiconBatch1.ts,21,Hibiskus,Hibiscus rosa-sinensis,"Der Hibiskus begeistert mit grossen, trompetenfoermigen Blueten in Rot, Orange und Rosa.",Volles Sonnenlicht,18-28 °C,3,flowering|bright_light|sun,,,,, +bright_light,constants/lexiconBatch1.ts,105,Ritterstern,Hippeastrum hybrid,"Der Ritterstern beeindruckt im Winter mit riesigen, trompetenfoermigen Blueten in Rot, Pink oder Weiss.",Helles bis volles Licht,18-25 °C,7,flowering|bright_light,,,,, +bright_light,constants/lexiconBatch2.ts,148,Hortensie,Hydrangea macrophylla,"Hortensie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Helles bis halbschattiges Licht,8-24 C,4,flowering|bright_light,,,,, +bright_light,constants/lexiconBatch2.ts,227,Punktblatt,Hypoestes phyllostachya,Punktblatt ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,patterned|bright_light,,,,, +bright_light,constants/lexiconBatch2.ts,176,Gartenbalsamine,Impatiens balsamina,"Gartenbalsamine ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light,,,,, +bright_light,constants/lexiconBatch2.ts,172,Arabischer Jasmin,Jasminum sambac,"Arabischer Jasmin ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light,,,,, +bright_light,constants/lexiconBatch2.ts,197,Traenendes Herz,Lamprocapnos spectabilis,"Traenendes Herz ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light,,,,, +bright_light,constants/lexiconBatch2.ts,64,Wandelroeschen,Lantana camara,"Das Wandelroeschen hat kugelige Bluetenkoepfe, die die Farbe von Gelb ueber Orange zu Rot wechseln. Sehr attraktiv.",Volles Sonnenlicht,18-28 °C,5,flowering|bright_light|sun,,,,, +bright_light,constants/lexiconBatch1.ts,23,Echter Lavendel,Lavandula angustifolia,Der Echte Lavendel ist ein aromatischer Halbstrauch mit lilafarbenen Bluetenaehren. Herrlicher Duft.,Volles Sonnenlicht,10-25 °C,10,medicinal|bright_light|sun,medicinal_requires_external_evidence,,,, +bright_light,constants/lexiconBatch2.ts,69,Ostertrompete,Lilium longiflorum,"Die Ostertrompete hat grosse, weisse, trichterfoermige Blueten mit intensivem Duft. Klassische Osterblume.",Helles bis volles Licht,15-25 °C,5,flowering|bright_light,,,,, +bright_light,constants/lexiconBatch2.ts,4,Chinesische Fächerpalme,Livistona chinensis,"Die Chinesische Fächerpalme hat grosse, faecher­foermige Blaetter auf einem einzelnen Stamm. Sehr dekorativ.",Helles bis volles Licht,15-25 °C,7,tree|bright_light,,,,, +bright_light,constants/lexiconBatch2.ts,171,Geissblatt,Lonicera japonica,"Geissblatt ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light,,,,, +bright_light,constants/lexiconBatch2.ts,76,Schamkraut,Mimosa pudica,"Das Schamkraut faltet seine Blaettchen blitzschnell zusammen, wenn man sie beruehrt. Ein faszinierendes Erlebnis.",Helles bis volles Licht,20-28 °C,5,flowering|bright_light,,,,, +bright_light,constants/lexiconBatch2.ts,37,Neoregelia,Neoregelia carolinae,"Die Neoregelia ist eine Bromelie, bei der das Herzblatt zur Bluetzeit leuchtend rot wird. Sehr dekorativ.",Helles bis volles Licht,18-27 °C,7,flowering|patterned|bright_light,,,,, +bright_light,constants/lexiconBatch2.ts,120,Oleander,Nerium oleander,"Der Oleander ist ein mediteraner Strauch mit leuchtend roten, rosa oder weissen Blueten. Sehr hitzetolerant.",Volles Sonnenlicht,15-28 °C,7,flowering|bright_light|sun,,,,, +bright_light,constants/lexiconBatch2.ts,231,Glueckskastanie,Pachira aquatica,Glueckskastanie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,easy|tree|bright_light,,,,, +bright_light,constants/lexiconBatch2.ts,6,Schraubenbaum,Pandanus veitchii,"Der Schraubenbaum hat spiralfoermig angeordnete, gruenweiss gestreifte Blaetter. Sehr dekorativ und exotisch.",Helles bis volles Licht,18-27 °C,7,patterned|bright_light,,,,, +bright_light,constants/lexiconBatch2.ts,243,Philodendron Pink Princess,Philodendron erubescens Pink Princess,Philodendron Pink Princess ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,patterned|bright_light,,,,, +bright_light,constants/lexiconBatch1.ts,44,Zwergdattelpalme,Phoenix roebelenii,"Die Zwergdattelpalme ist eine zierliche Palme mit eleganten, gebogenen Fiederblaettern. Tropisches Flair.",Helles bis volles Licht,18-27 °C,7,tree|bright_light,,,,, +bright_light,constants/lexiconBatch2.ts,152,Buntnessel,Plectranthus scutellarioides,"Buntnessel ist eine farbstarke Zierpflanze, die vor allem fuer ihr dekoratives Laub beliebt ist.",Volles bis helles Licht,10-24 C,4,patterned|bright_light,,,,, +bright_light,constants/lexiconBatch1.ts,61,Bleiwurz,Plumbago auriculata,"Die Bleiwurz ist ein halbimmergruener Strauch mit himmelblauen Blueten, der fast das ganze Jahr bluet.",Volles Sonnenlicht,15-27 °C,5,flowering|bright_light|sun,,,,, +bright_light,constants/lexiconBatch2.ts,170,Rhododendron,Rhododendron catawbiense,"Rhododendron ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|tree|bright_light,,,,, +bright_light,constants/lexiconBatch2.ts,142,Rose,Rosa x hybrida,"Rose ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light|sun,,,,, +bright_light,constants/lexiconBatch2.ts,235,Falsche Aralie,Schefflera elegantissima,Falsche Aralie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,tree|bright_light,,,,, +bright_light,constants/lexiconBatch2.ts,93,Aubergine,Solanum melongena,"Die Aubergine ist eine Gemuese­pflanze mit grossen, violetten Fruechten. Sie benoetigt viel Waerme und Sonne.",Volles Sonnenlicht,20-30 °C,5,bright_light|sun,,,,, +bright_light,constants/lexiconBatch2.ts,1,Weisse Strelitzie,Strelitzia nicolai,"Die Weisse Strelitzie ist ein beeindruckender Zimmerstrauch mit grossen, blaugruenen Blaettern und weiss-blauen Blueten.",Helles bis volles Licht,18-27 °C,7,tree|large|bright_light,,,,, +bright_light,constants/lexiconBatch2.ts,244,Philodendron Xanadu,Thaumatophyllum xanadu,Philodendron Xanadu ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,bright_light,,,,, +bright_light,constants/lexiconBatch1.ts,72,Vanda-Orchidee,Vanda coerulea,Die Vanda-Orchidee ist bekannt fuer ihre seltene blaue Bluetenfarbe. Epiphytische Orchidee mit grossen Blueten.,Helles bis volles Licht,20-30 °C,3,flowering|bright_light|high_humidity,,,,, diff --git a/audits/semantic-search/categories/easy.csv b/audits/semantic-search/categories/easy.csv index f0d63e7..a40a2b7 100644 --- a/audits/semantic-search/categories/easy.csv +++ b/audits/semantic-search/categories/easy.csv @@ -1,133 +1,133 @@ -category,source_file,source_index,name,botanical_name,description,light,temp,water_interval_days,all_categories,risk_flags,audit_status,evidence_source,evidence_url,notes -easy,constants/lexiconBatch2.ts,31,Adromischus,Adromischus cristatus,Adromischus ist eine kompakte Sukkulente mit ungewoehnlich wellenrandigen Blaettern auf kurzen Staengeln.,Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, -easy,constants/lexiconBatch1.ts,50,Aglaoneme,Aglaonema commutatum,Die Aglaoneme ist eine dekorative Zimmerpflanze mit silbrig-gruen gemusterten Blaettern. Tolerant gegenueber wenig Licht.,Wenig bis helles Licht,15-26 °C,7,easy|patterned|low_light,,,,, -easy,constants/lexiconBatch1.ts,30,Schnittlauch,Allium schoenoprasum,Schnittlauch ist ein beliebtes Kuechenkraut mit roehrenfoermigen Blaettern und lila Blueten.,Helles bis volles Licht,10-25 °C,3,easy,,,,, -easy,constants/lexiconBatch2.ts,135,Schnittknoblauch,Allium tuberosum,Schnittknoblauch ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -easy,constants/lexiconBatch1.ts,89,Kap-Aloe,Aloe arborescens,"Die Kap-Aloe ist eine strauchige Aloe mit schmalen, gezaehnten Blaettern und leuchtend roten Bluetenaehren im Winter.",Volles Sonnenlicht,10-30 °C,14,easy|succulent|medicinal|sun,medicinal_requires_external_evidence,,,, -easy,constants/lexiconBatch2.ts,128,Zitronenverbene,Aloysia citrodora,Zitronenverbene ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -easy,constants/lexiconBatch2.ts,140,Dill,Anethum graveolens,Dill ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -easy,constants/lexiconBatch2.ts,125,Kerbel,Anthriscus cerefolium,Kerbel ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -easy,constants/lexiconBatch2.ts,122,Estragon,Artemisia dracunculus,Estragon ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -easy,constants/lexiconBatch2.ts,16,Schusterpflanze,Aspidistra elatior,"Die Schusterpflanze ist eine extrem robuste Zimmerpflanze mit langen, dunkelgruenen Blaettern. Vertraegt tiefe Temperaturen.",Wenig bis helles Licht,10-20 °C,14,easy|low_light,,,,, -easy,constants/lexiconBatch2.ts,43,Vogelnest-Farn,Asplenium nidus,"Der Vogelnest-Farn hat ganzrandige, glaenzende Wedel, die eine Nestform bilden. Sehr dekorativ und robust.",Helles indirektes Licht,18-27 °C,5,easy|low_light|high_humidity,,,,, -easy,constants/lexiconBatch2.ts,13,Japanische Aucube,Aucuba japonica,"Die Japanische Aucube hat glaenzende, gruene oder gelbgefleckte Blaetter. Sehr schattenvertraeglich.",Wenig bis helles Licht,10-20 °C,7,easy|low_light,,,,, -easy,constants/lexiconBatch2.ts,7,Bambusrohr,Bambusa vulgaris,Das Bambusrohr ist eine schnell wachsende Bambusart mit gelbgruenen Halmen. Sehr dekorativ und vielseitig nutzbar.,Helles bis volles Licht,15-30 °C,5,easy|large,,,,, -easy,constants/lexiconBatch1.ts,41,Pferdeschwanzpalme,Beaucarnea recurvata,"Die Pferdeschwanzpalme hat einen verdickten Stammbasis als Wasserspeicher und lange, schmale Blaetter.",Volles Sonnenlicht,15-30 °C,21,easy|succulent|tree|sun,,,,, -easy,constants/lexiconBatch2.ts,97,Mangold,Beta vulgaris,"Mangold ist ein farbenfrohes Blattgemuese mit bunten Stielen in Rot, Gelb, Orange und Weiss.",Helles bis volles Licht,10-25 °C,3,easy,,,,, -easy,constants/lexiconBatch2.ts,38,Billbergia,Billbergia nutans,"Die Billbergia ist eine robuste Bromelie mit schmalen, gruenen Blaettern und hängenden, blauen und gruenen Blueten.",Helles indirektes Licht,15-25 °C,7,easy|flowering,,,,, -easy,constants/lexiconBatch2.ts,129,Borretsch,Borago officinalis,Borretsch ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -easy,constants/lexiconBatch2.ts,63,Calibrachoa,Calibrachoa hybrida,"Calibrachoa ist eine petunienaehnliche Haengepflanze mit unzaehligen, kleinen Trichterbluten in allen Farben.",Volles Sonnenlicht,15-25 °C,2,easy|flowering|hanging|sun,,,,, -easy,constants/lexiconBatch2.ts,56,Callisia,Callisia repens,"Callisia repens ist ein kleines, kriechendes Kraut mit winzigen, gruenen Blaettern. Ideal fuer haengende Behaelter.",Helles indirektes Licht,15-25 °C,5,easy|hanging,,,,, -easy,constants/lexiconBatch2.ts,92,Chili,Capsicum annuum,"Chili ist eine beliebte Gemuese- und Zierpflanze mit leuchtenden, roten oder orangen Fruechten. Im Topf kultivierbar.",Volles Sonnenlicht,20-30 °C,4,easy|medicinal|sun,medicinal_requires_external_evidence,,,, -easy,constants/lexiconBatch1.ts,81,Peruanischer Fackelkaktus,Cereus peruvianus,"Der Peruanische Fackelkaktus ist ein saeulenfoermiger Kaktus, der im Innenraum bis zu 2 m hoch werden kann.",Volles Sonnenlicht,15-35 °C,21,easy|succulent|large|sun,,,,, -easy,constants/lexiconBatch1.ts,99,Herzkette,Ceropegia woodii,"Die Herzkette hat duenne, haengende Ranken mit herzfoermigen, silbergrau gemusterten Blaettchen.",Helles indirektes Licht,15-27 °C,14,easy|succulent|patterned|hanging,,,,, -easy,constants/lexiconBatch1.ts,43,Bergpalme,Chamaedorea elegans,Die Bergpalme ist eine kompakte Zimmerpalme fuer schattigere Standorte. Ideal fuer dunkle Innenraeume.,Wenig bis helles Licht,15-25 °C,7,easy|pet_friendly|tree|air_purifier|low_light,air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence,,,, -easy,constants/lexiconBatch2.ts,138,Roemische Kamille,Chamaemelum nobile,Roemische Kamille ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|medicinal|sun,medicinal_requires_external_evidence,,,, -easy,constants/lexiconBatch2.ts,101,Kamille,Chamomilla recutita,"Die Kamille ist ein beliebtes Heilkraut mit kleinen, weiss-gelben Blueten. Das aetherische Oel wirkt beruhigend.",Volles Sonnenlicht,15-25 °C,5,easy|medicinal|sun,medicinal_requires_external_evidence,,,, -easy,constants/lexiconBatch2.ts,84,Kaffeestrauch,Coffea arabica,"Der Kaffeestrauch hat glaenzende, dunkelgruene Blaetter und entwickelt rote Kaffe­ekirschen. Kann im Topf gehalten werden.",Helles indirektes Licht,18-25 °C,7,easy,,,,, -easy,constants/lexiconBatch2.ts,14,Keulenlilie,Cordyline australis,"Die Keulenlilie hat lange, schmale, gruene oder rotbraune Blaetter in einem dekorativen Schopf.",Helles bis volles Licht,10-25 °C,7,easy|tree|sun,,,,, -easy,constants/lexiconBatch2.ts,15,Tiroler Keulenlilie,Cordyline fruticosa,"Die Tiroler Keulenlilie hat leuchtend rote, gruene oder buntlaubige Blaetter. Eine exotische Zimmerpflanze.",Helles indirektes Licht,18-27 °C,7,easy,,,,, -easy,constants/lexiconBatch2.ts,139,Koriander,Coriandrum sativum,Koriander ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -easy,constants/lexiconBatch2.ts,29,Kotyledon,Cotyledon orbiculata,"Kotyledon hat dickfleischige, runde Blaetter mit einem mehligen, weisslichen Belag. Sehr trockenheitsresistent.",Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, -easy,constants/lexiconBatch2.ts,26,Moos-Crassula,Crassula muscosa,"Die Moos-Crassula hat dicht aneinandergereihte, winzige gruene Blaetter auf unverzweigten Trieben. Sieht aus wie Moos.",Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, -easy,constants/lexiconBatch1.ts,5,Jadepflanze,Crassula ovata,"Die Jadepflanze ist eine langlebige Sukkulente mit dicken, ovalen Blaettern. In Japan gilt sie als Gluecksbringer.",Helles bis volles Licht,15-24 °C,14,easy|succulent|sun,,,,, -easy,constants/lexiconBatch1.ts,110,Krokus,Crocus vernus,"Der Krokus ist einer der ersten Fruehjahrs­boten mit kelchfoermigen Blueten in Lila, Weiss und Gelb.",Helles bis volles Licht,5-15 °C,7,easy|flowering,,,,, -easy,constants/lexiconBatch2.ts,94,Gurke,Cucumis sativus,"Die Gurke ist eine rankende Gemuese­pflanze mit gruenen, erfrischenden Fruechten. Im Balkonkasten kultivierbar.",Volles Sonnenlicht,18-28 °C,3,easy|sun,,,,, -easy,constants/lexiconBatch2.ts,127,Zitronengras,Cymbopogon citratus,Zitronengras ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -easy,constants/lexiconBatch2.ts,99,Karotte,Daucus carota,Die Karotte ist eine beliebte Gemuese­pflanze mit orangefarbenen Wurzeln. Im tiefen Topf kultivierbar.,Helles bis volles Licht,15-22 °C,5,easy,,,,, -easy,constants/lexiconBatch1.ts,48,Dieffenbachie,Dieffenbachia seguine,"Die Dieffenbachie ist eine tropische Blattschmuckpflanze mit grossen, gruen-weiss gefleckten Blaettern.",Helles indirektes Licht,18-26 °C,7,easy|air_purifier|low_light,air_purifier_requires_external_evidence,,,, -easy,constants/lexiconBatch1.ts,14,Maisstrauch,Dracaena fragrans,"Der Maisstrauch ist eine robuste Zimmerpflanze mit breiten, gestreiften Blaettern. Gedeiht auch bei wenig Licht.",Helles indirektes Licht,15-25 °C,10,easy|tree|air_purifier|low_light,air_purifier_requires_external_evidence,,,, -easy,constants/lexiconBatch1.ts,13,Drachenbaum,Dracaena marginata,"Der Drachenbaum ist eine schlanke Zimmerpflanze mit roten, schmalen Blaettern auf langen Staemmen.",Helles indirektes Licht,15-25 °C,10,easy|tree|air_purifier,air_purifier_requires_external_evidence,,,, -easy,constants/lexiconBatch2.ts,30,Dudleya,Dudleya brittonii,"Dudleya ist eine rosetten­bildende Sukkulente mit silbrig-weissen, mehligen Blaettern. Sehr elegant.",Volles Sonnenlicht,10-25 °C,14,easy|succulent|sun,,,,, -easy,constants/lexiconBatch1.ts,4,Echeverie,Echeveria elegans,"Die Echeverie bildet symmetrische, rosettenfoermige Sukkulenten mit blaugruenen Blaettern. Pflegeleicht.",Volles Sonnenlicht,15-25 °C,14,easy|succulent|sun,,,,, -easy,constants/lexiconBatch1.ts,77,Goldene Tonne,Echinocactus grusonii,Die Goldene Tonne ist ein ikonischer kugelfoermiger Kaktus mit goldgelben Stacheln. Waechst langsam aber imposant.,Volles Sonnenlicht,15-35 °C,21,easy|succulent|sun,,,,, -easy,constants/lexiconBatch1.ts,83,San-Pedro-Kaktus,Echinopsis pachanoi,"Der San-Pedro-Kaktus ist ein schnell wachsender, saeulenfoermiger Kaktus aus den Anden.",Volles Sonnenlicht,10-35 °C,14,easy|succulent|sun,,,,, -easy,constants/lexiconBatch1.ts,16,Marmor-Efeutute,Epipremnum aureum Marble Queen,Die Marmor-Efeutute hat cremeweiss-gruen marmorierte Blaetter. Eine dekorative Variante der klassischen Efeutute.,Helles indirektes Licht,15-30 °C,7,easy|hanging|air_purifier,air_purifier_requires_external_evidence,,,, -easy,constants/lexiconBatch2.ts,53,Neon-Efeutute,Epipremnum pinnatum Neon,Die Neon-Efeutute hat leuchtend limonengruene Blaetter. Sehr auffaellig und pflegeleicht.,Helles indirektes Licht,15-30 °C,7,easy|hanging|air_purifier,air_purifier_requires_external_evidence,,,, -easy,constants/lexiconBatch2.ts,19,Christusdorn,Euphorbia milii,Der Christusdorn ist eine sukkulente Wolfsmilch mit stacheligen Zweigen und kleinen roten oder gelben Hochblaettern.,Helles bis volles Licht,15-28 °C,10,easy|flowering|succulent|sun,,,,, -easy,constants/lexiconBatch1.ts,12,Bleistiftkaktus,Euphorbia tirucalli,"Der Bleistiftkaktus ist eine sukkulente Wolfsmilch mit duennen, zylindrischen Zweigen ohne Blaetter.",Volles Sonnenlicht,18-30 °C,14,easy|succulent|sun,,,,, -easy,constants/lexiconBatch2.ts,12,Fatsia,Fatsia japonica,"Die Fatsia ist ein dekorativer Zimmerstrauch mit grossen, handfoermigen, glaenzenden Blaettern. Sehr robust.",Helles indirektes Licht,10-20 °C,7,easy|low_light,,,,, -easy,constants/lexiconBatch1.ts,78,Fass-Kaktus,Ferocactus cylindraceus,"Der Fass-Kaktus ist ein zylindrischer Wuestenkaktus mit langen, roten Stacheln. Sehr langlebig.",Volles Sonnenlicht,15-35 °C,21,easy|succulent|sun,,,,, -easy,constants/lexiconBatch1.ts,38,Gummibaum,Ficus elastica,"Der Gummibaum ist eine imposante Zimmerpflanze mit grossen, glaenzenden, lederartigen Blaettern. Reinigt die Luft.",Helles indirektes Licht,16-24 °C,10,easy|tree|air_purifier,air_purifier_requires_external_evidence,,,, -easy,constants/lexiconBatch2.ts,247,Ficus microcarpa,Ficus microcarpa,Ficus microcarpa ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,easy|tree|bright_light,,,,, -easy,constants/lexiconBatch2.ts,100,Erdbeere,Fragaria ananassa,"Die Erdbeere ist ein beliebtes Obst fuer Balkon und Terrasse mit aromatischen, roten Fruechten.",Helles bis volles Licht,15-25 °C,3,easy|pet_friendly|sun,pet_friendly_requires_external_evidence,,,, -easy,constants/lexiconBatch1.ts,90,Gasteria,Gasteria carinata,"Die Gasteria ist eine kleine Sukkulente mit zweireihig angeordneten, zungenfoermigen, gefleckten Blaettern.",Helles indirektes Licht,15-25 °C,14,easy|succulent|low_light,,,,, -easy,constants/lexiconBatch1.ts,32,Blutroter Storchschnabel,Geranium sanguineum,Der Blutrote Storchschnabel ist ein zierlicher Storchschnabel mit intensiv magentafarbenen Blueten.,Helles bis volles Licht,10-25 °C,7,easy|flowering,,,,, -easy,constants/lexiconBatch1.ts,87,Geisterpflanze,Graptopetalum paraguayense,"Die Geisterpflanze hat zartgraue bis perlmutt-rosafarbene, rosettenfoermige Blaetter. Sehr robuste Sukkulente.",Volles Sonnenlicht,15-25 °C,14,easy|succulent|sun,,,,, -easy,constants/lexiconBatch1.ts,80,Mond-Kaktus,Gymnocalycium mihanovichii,Der Mond-Kaktus ist eine farbenfrohe Veredelung eines chlorophylllosen Kaktus auf einem gruenen Unterlagekaktus.,Indirektes Licht,15-30 °C,14,easy|succulent,,,,, -easy,constants/lexiconBatch1.ts,6,Zebra-Haworthie,Haworthia fasciata,Die Zebra-Haworthie ist eine kompakte Sukkulente mit weissen Querstreifen auf dunkelgruenen Blaettern.,Helles indirektes Licht,15-25 °C,14,easy|succulent|low_light,,,,, -easy,constants/lexiconBatch1.ts,37,Efeu,Hedera helix,"Efeu ist eine robuste Kletter- und Haengepflanze mit charakteristischen, dreilappigen Blaettern. Sehr langlebig.",Wenig bis helles Licht,10-20 °C,7,easy|hanging|air_purifier|low_light,air_purifier_requires_external_evidence,,,, -easy,constants/lexiconBatch2.ts,133,Currykraut,Helichrysum italicum,Currykraut ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -easy,constants/lexiconBatch1.ts,57,Wachsblume,Hoya carnosa,"Die Wachsblume ist eine Kletterpflanze mit dicken, wachsartigen Blaettern und sternfoermigen, duftenden Blueten.",Helles indirektes Licht,16-27 °C,10,easy|flowering|succulent|hanging,,,,, -easy,constants/lexiconBatch1.ts,108,Hyazinthe,Hyacinthus orientalis,"Die Hyazinthe bezaubert mit dichten Bluetenrispen und intensivem Duft in Blau, Rosa, Weiss oder Gelb.",Helles bis volles Licht,10-18 °C,5,easy|flowering,,,,, -easy,constants/lexiconBatch2.ts,136,Ysop,Hyssopus officinalis,Ysop ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -easy,constants/lexiconBatch2.ts,59,Neuguinea-Balsamine,Impatiens hawkeri,"Die Neuguinea-Balsamine hat grosse, leuchtende Blueten und ist sehr bluehfreudig. Ideal fuer Terrassen.",Helles indirektes Licht,18-27 °C,3,easy|flowering,,,,, -easy,constants/lexiconBatch1.ts,20,Fleissiges Lieschen,Impatiens walleriana,Das Fleissige Lieschen bluet von Fruehling bis Herbst unermudlich in vielen Farben.,Helles indirektes Licht,16-24 °C,2,easy|flowering,,,,, -easy,constants/lexiconBatch1.ts,64,Suesskartoffel,Ipomoea batatas,"Die Suesskartoffel-Zierpflanze hat dekorative, herzfoermige Blaetter in gruen oder dunkelviolett. Ideal als Haengepflanze.",Volles Sonnenlicht,20-30 °C,5,easy|hanging|sun,,,,, -easy,constants/lexiconBatch1.ts,9,Kalanchoe,Kalanchoe blossfeldiana,"Die Kalanchoe ist eine beliebte Bluehpflanze mit leuchtenden Blueten in Rot, Orange, Gelb oder Rosa.",Helles bis volles Licht,15-25 °C,10,easy|flowering|succulent|sun,,,,, -easy,constants/lexiconBatch2.ts,22,Brutblatt,Kalanchoe daigremontiana,Das Brutblatt bildet entlang des Blattrandes zahlreiche kleine Jungpflanzen. Eine faszinierende Sukkulente.,Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, -easy,constants/lexiconBatch2.ts,21,Kaninchen-Ohren,Kalanchoe tomentosa,"Kaninchen-Ohren haben weisslich-filzige Blaetter mit braunen Raendern, die Kaninchen­ohren aehneln. Sehr dekorativ.",Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, -easy,constants/lexiconBatch2.ts,95,Salat,Lactuca sativa,Salat ist eine schnell wachsende Blattgemuese­pflanze. Im Topf und Balkonkasten sehr gut zu kultivieren.,Helles bis volles Licht,10-22 °C,3,easy,,,,, -easy,constants/lexiconBatch2.ts,121,Lorbeer,Laurus nobilis,Lorbeer ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -easy,constants/lexiconBatch2.ts,126,Liebstoeckel,Levisticum officinale,Liebstoeckel ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -easy,constants/lexiconBatch2.ts,62,Duftsteinrich,Lobularia maritima,"Der Duftsteinrich ist ein niedrig wachsendes Pflanzchen mit winzigen, weissen oder lilafarbenen Blueten und suessem Duft.",Helles bis volles Licht,10-22 °C,3,easy|flowering,,,,, -easy,constants/lexiconBatch1.ts,79,Mammillaria,Mammillaria zeilmanniana,"Die Mammillaria ist ein kompakter, kugelfoermiger Kaktus, der im Fruehling einen Kranz aus rosa Blueten traegt.",Volles Sonnenlicht,15-35 °C,14,easy|flowering|succulent|sun,,,,, -easy,constants/lexiconBatch2.ts,102,Zitronenmelisse,Melissa officinalis,Die Zitronenmelisse ist ein zitronig duftendes Heilkraut. Sie beruhigt die Nerven und foerdert den Schlaf.,Helles bis volles Licht,15-25 °C,5,easy|medicinal,medicinal_requires_external_evidence,,,, -easy,constants/lexiconBatch1.ts,26,Gruene Minze,Mentha spicata,"Die Gruene Minze ist ein wuchsfreudiges Kuechenkraut mit frischem, minzigem Duft. Fuer Tee und Cocktails.",Helles bis volles Licht,15-25 °C,3,easy,,,,, -easy,constants/lexiconBatch2.ts,47,Monstera adansonii,Monstera adansonii,Monstera adansonii hat herzfoermige Blaetter mit zahlreichen runden Lochern. Eine rankende Zimmerpflanze.,Helles indirektes Licht,18-27 °C,7,easy|hanging,,,,, -easy,constants/lexiconBatch1.ts,109,Traubenhyazinthe,Muscari armeniacum,"Die Traubenhyazinthe bildet dichte Trauben aus kleinen, blauen bis violetten Gloeckchen. Zuverlaessige Fruejahrszwiebel.",Helles bis volles Licht,8-18 °C,7,easy|flowering,,,,, -easy,constants/lexiconBatch2.ts,132,Katzenminze,Nepeta cataria,Katzenminze ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -easy,constants/lexiconBatch1.ts,25,Basilikum,Ocimum basilicum,"Basilikum ist das beliebteste Kuechenkraut mit intensiv aromatischen, gruenen Blaettern. Fuer Pesto verwendet.",Volles Sonnenlicht,18-30 °C,2,easy|medicinal|sun,medicinal_requires_external_evidence,,,, -easy,constants/lexiconBatch1.ts,82,Hasenohren-Kaktus,Opuntia microdasys,"Der Hasenohren-Kaktus hat flache, ovale Triebe mit dichten weissen Glochiden. Klassischer Zimmerkaktus.",Volles Sonnenlicht,10-35 °C,21,easy|succulent|sun,,,,, -easy,constants/lexiconBatch2.ts,124,Majoran,Origanum majorana,Majoran ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -easy,constants/lexiconBatch1.ts,28,Oregano,Origanum vulgare,"Oregano ist ein aromatisches Kuechenkraut mit runden, behaarten Blaettern. In mediterraner Kueche beliebt.",Volles Sonnenlicht,15-25 °C,7,easy|medicinal|sun,medicinal_requires_external_evidence,,,, -easy,constants/lexiconBatch2.ts,231,Glueckskastanie,Pachira aquatica,Glueckskastanie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,easy|tree|bright_light,,,,, -easy,constants/lexiconBatch1.ts,88,Mondstein-Pflanze,Pachyphytum oviferum,"Die Mondstein-Pflanze hat dicke, ovale Blaetter mit einem pastellrosafarbenen, mehligen Ueberzug.",Volles Sonnenlicht,15-25 °C,14,easy|succulent|sun,,,,, -easy,constants/lexiconBatch1.ts,31,Rosengeranie,Pelargonium graveolens,Die Rosengeranie ist eine Duftpflanze mit tief eingeschnittenen Blaettern und rosaenlichem Aroma.,Volles Sonnenlicht,15-25 °C,7,easy|medicinal|sun,medicinal_requires_external_evidence,,,, -easy,constants/lexiconBatch2.ts,61,Efeu-Geranie,Pelargonium peltatum,"Die Efeu-Geranie hat efeufoermige, glaenzende Blaetter und bluet den ganzen Sommer in leuchtenden Farben.",Helles bis volles Licht,15-25 °C,5,easy|flowering|hanging|sun,,,,, -easy,constants/lexiconBatch1.ts,102,Rippenpeperomie,Peperomia caperata,"Die Rippenpeperomie hat tief gerippte, dunkelgruene bis violette Blaetter mit einer samtigen Textur.",Helles indirektes Licht,18-26 °C,10,easy|pet_friendly,pet_friendly_requires_external_evidence,,,, -easy,constants/lexiconBatch1.ts,103,Spiegelpeperomie,Peperomia obtusifolia,"Die Spiegelpeperomie hat glaenzende, lederartige, oval-runde Blaetter in tiefem Gruen. Sehr robust.",Helles indirektes Licht,16-26 °C,10,easy|pet_friendly|low_light,pet_friendly_requires_external_evidence,,,, -easy,constants/lexiconBatch2.ts,230,Raindrop-Peperomie,Peperomia polybotrya,Raindrop-Peperomie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,easy|pet_friendly,pet_friendly_requires_external_evidence,,,, -easy,constants/lexiconBatch2.ts,134,Shiso,Perilla frutescens,Shiso ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -easy,constants/lexiconBatch1.ts,29,Petersilie,Petroselinum crispum,Petersilie ist eines der meistgenutzten Kuechenkraeuter mit frisch-aromatischem Geschmack. Reich an Vitaminen.,Helles Licht,10-25 °C,3,easy,,,,, -easy,constants/lexiconBatch1.ts,34,Petunie,Petunia hybrida,Die Petunie ist eine der beliebtesten Balkonpflanzen mit trichterfoermigen Blueten in unzaehligen Farben.,Volles Sonnenlicht,15-25 °C,2,easy|pet_friendly|flowering|sun,pet_friendly_requires_external_evidence,,,, -easy,constants/lexiconBatch2.ts,50,Philodendron bipinnatifidum,Philodendron bipinnatifidum,"Philodendron bipinnatifidum hat grosse, tief gelappte Blaetter. Er entwickelt einen beeindruckenden, baumfoermigen Wuchs.",Helles indirektes Licht,18-27 °C,7,easy|large,,,,, -easy,constants/lexiconBatch2.ts,51,Roter Philodendron,Philodendron erubescens,"Der Rote Philodendron hat glaenzende, herzfoermige Blaetter, die jung roetrlich erscheinen. Sehr dekorativ.",Helles indirektes Licht,18-27 °C,7,easy|hanging,,,,, -easy,constants/lexiconBatch1.ts,15,Herzblatt-Philodendron,Philodendron hederaceum,Der Herzblatt-Philodendron ist eine pflegeleichte Kletter- oder Haengepflanze mit herzfoermigen Blaettern.,Indirektes Licht,18-28 °C,7,easy|hanging|low_light,,,,, -easy,constants/lexiconBatch2.ts,242,Philodendron Brasil,Philodendron hederaceum Brasil,Philodendron Brasil ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,easy|hanging|low_light,,,,, -easy,constants/lexiconBatch2.ts,8,Goldener Bambus,Phyllostachys aurea,"Der Goldene Bambus hat elegante, goldgelbe Halme mit engstehenden Knoten. Sehr dekorativ als Sichtschutz.",Helles bis volles Licht,10-30 °C,5,easy|large,,,,, -easy,constants/lexiconBatch2.ts,228,Aluminium-Pflanze,Pilea cadierei,Aluminium-Pflanze ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,easy|pet_friendly|patterned,pet_friendly_requires_external_evidence,,,, -easy,constants/lexiconBatch1.ts,2,Ufopflanze,Pilea peperomioides,"Die Ufopflanze hat unverwechselbare, runde Blaetter auf langen Stielen. Bildet leicht Ableger zum Verschenken.",Helles indirektes Licht,13-30 °C,7,easy|pet_friendly,pet_friendly_requires_external_evidence,,,, -easy,constants/lexiconBatch2.ts,44,Tueipelfarn,Polypodium vulgare,Der Tueipelfarn ist ein heimischer Farn mit gelappten Wedeln und runden Sporenhaeufchen auf der Unterseite.,Helles indirektes Licht,10-20 °C,7,easy,,,,, -easy,constants/lexiconBatch2.ts,27,Speckbaum,Portulacaria afra,"Der Speckbaum ist eine sukkulente Pflanze mit roten Stielen und kleinen, runden, glaenzenden Blaettern.",Helles bis volles Licht,15-30 °C,14,easy|succulent|sun,,,,, -easy,constants/lexiconBatch2.ts,98,Radieschen,Raphanus sativus,"Das Radieschen ist ein schnellwachsendes Gemuese mit runden, roten Knollen. Es reift in nur 3-4 Wochen.",Helles bis volles Licht,10-22 °C,2,easy,,,,, -easy,constants/lexiconBatch2.ts,52,Mini-Monstera,Rhaphidophora tetrasperma,"Die Mini-Monstera hat monstera­aehnliche, gelochte Blaetter auf einer kompakten, klettternden Pflanze. Sehr trendig.",Helles indirektes Licht,18-27 °C,7,easy|hanging,,,,, -easy,constants/lexiconBatch1.ts,24,Rosmarin,Rosmarinus officinalis,Rosmarin ist ein aromatisches Kraut mit nadelartigen Blaettern und blauen Blueten. In der Kueche unverzichtbar.,Volles Sonnenlicht,10-25 °C,7,easy|medicinal|sun,medicinal_requires_external_evidence,,,, -easy,constants/lexiconBatch2.ts,130,Sauerampfer,Rumex acetosa,Sauerampfer ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -easy,constants/lexiconBatch1.ts,94,Afrikanisches Veilchen,Saintpaulia ionantha,"Das Afrikanische Veilchen ist eine kleine, kompakte Bluehpflanze mit samtigen Blaettern und violetten Blueten.",Helles indirektes Licht,18-25 °C,7,easy|flowering,,,,, -easy,constants/lexiconBatch2.ts,103,Salbei,Salvia officinalis,Salbei ist ein aromatisches Heilkraut mit silbrig-gruenen Blaettern. Er hat antibakterielle und entzuendungshem­mende Wirkung.,Volles Sonnenlicht,10-25 °C,7,easy|medicinal|sun,medicinal_requires_external_evidence,,,, -easy,constants/lexiconBatch2.ts,17,Zylindrischer Bogenhanf,Sansevieria cylindrica,"Der Zylindrische Bogenhanf hat zylindrische, aufrechte Blaetter, die sich nach oben verjuengen. Sehr pflegeleicht.",Helles bis volles Licht,15-27 °C,14,easy|succulent|sun,,,,, -easy,constants/lexiconBatch2.ts,123,Bohnenkraut,Satureja hortensis,Bohnenkraut ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -easy,constants/lexiconBatch2.ts,11,Grosse Strahlenaralie,Schefflera actinophylla,"Die Grosse Strahlenaralie kann grosse, handfoermige Blaetter entwickeln. Sie ist ideal als Zimmerstrauch.",Helles indirektes Licht,18-27 °C,7,easy|tree|large,,,,, -easy,constants/lexiconBatch2.ts,10,Strahlenaralie,Schefflera arboricola,"Die Strahlenaralie hat fingerfoermig angeordnete, glaenzende Blaetter auf langen Stielen. Sehr robuste Zimmerpflanze.",Helles indirektes Licht,15-25 °C,7,easy|tree|air_purifier,air_purifier_requires_external_evidence,,,, -easy,constants/lexiconBatch1.ts,8,Weihnachtskaktus,Schlumbergera truncata,"Der Weihnachtskaktus erfreut zur Weihnachtszeit mit leuchtenden Blueten in Rosa, Rot oder Weiss.",Helles indirektes Licht,15-21 °C,7,easy|flowering|succulent,,,,, -easy,constants/lexiconBatch1.ts,55,Satinpothos,Scindapsus pictus,"Der Satinpothos hat samtig-glaenzende, silbrig gefleckte Blaetter auf langen, haengenden Ranken.",Helles indirektes Licht,18-28 °C,7,easy|patterned|hanging,,,,, -easy,constants/lexiconBatch1.ts,7,Eselschwanz,Sedum morganianum,"Der Eselschwanz ist eine haengende Sukkulente mit langen Trieben aus dichten, blaugruenen Blaettchen.",Volles Sonnenlicht,15-25 °C,14,easy|succulent|hanging|sun,,,,, -easy,constants/lexiconBatch1.ts,100,Perlenschnur-Pflanze,Senecio rowleyanus,"Die Perlenschnur-Pflanze hat haengende Ranken mit kugelfoermigen, perlenaehnlichen Blaettern. Einzigartige Sukkulente.",Helles bis volles Licht,15-27 °C,14,easy|succulent|hanging,,,,, -easy,constants/lexiconBatch2.ts,28,Blauer Kreuzkraut,Senecio serpens,"Der Blaue Kreuzkraut hat zylindrische, blaublaugruene Blaetter und einen kriechenden Wuchs. Sehr dekorativ.",Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, -easy,constants/lexiconBatch2.ts,91,Tomate,Solanum lycopersicum,"Die Tomate ist eine beliebte Gemuese- und Balkonpflanze mit roten, saftigen Fruechten. Im Topf kultivierbar.",Volles Sonnenlicht,18-28 °C,3,easy,,,,, -easy,constants/lexiconBatch2.ts,96,Spinat,Spinacia oleracea,Spinat ist ein naehrstoffreiches Blattgemuese mit dunkelgruenen Blaettern. Reich an Eisen und Vitaminen.,Helles bis volles Licht,10-20 °C,3,easy,,,,, -easy,constants/lexiconBatch2.ts,131,Stevia,Stevia rebaudiana,Stevia ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -easy,constants/lexiconBatch1.ts,56,Pfeilblatt,Syngonium podophyllum,"Das Pfeilblatt hat charakteristisch pfeilfoermige Blaetter, die sich mit dem Alter weiterentwickeln.",Helles indirektes Licht,16-27 °C,7,easy|hanging,,,,, -easy,constants/lexiconBatch2.ts,66,Studentenblume,Tagetes patula,Die Studentenblume ist eine robuste Sommerblume mit orangen oder gelben Blueten. Sie haelt Schadlinge fern.,Volles Sonnenlicht,15-28 °C,3,easy|flowering|sun,,,,, -easy,constants/lexiconBatch1.ts,27,Thymian,Thymus vulgaris,"Thymian ist ein kleiner, aromatischer Strauch mit winzigen Blaettern und rosa Blueten. Wichtiges Kuechenkraut.",Volles Sonnenlicht,10-25 °C,7,easy|medicinal|sun,medicinal_requires_external_evidence,,,, -easy,constants/lexiconBatch2.ts,33,Luftpflanze,Tillandsia ionantha,Die Luftpflanze ist eine kompakte Bromelie ohne Topferde. Sie nimmt Wasser und Naehrstoffe ueber die Blattschuppen auf.,Helles bis volles Licht,15-30 °C,3,easy,,,,, -easy,constants/lexiconBatch2.ts,32,Spanisches Moos,Tillandsia usneoides,"Das Spanische Moos ist eine epiphytische Bromelie ohne Wurzeln, die in der Luft haengt. Es benoetigt nur Feuchtigkeitsbespruehing.",Helles bis volles Licht,15-30 °C,3,easy|hanging,,,,, -easy,constants/lexiconBatch2.ts,55,Weisse Tradescantia,Tradescantia fluminensis,Die Weisse Tradescantia hat gruene Blaetter mit weisslichen Unterseiten. Sehr robust und schnellwachsend.,Helles indirektes Licht,15-25 °C,5,easy|hanging,,,,, -easy,constants/lexiconBatch2.ts,54,Lila Tradescantia,Tradescantia pallida,Die Lila Tradescantia hat leuchtend purpurrote Blaetter und ist sehr auffaellig. Sie liebt viel Licht.,Helles bis volles Licht,15-25 °C,5,easy|hanging|sun,,,,, -easy,constants/lexiconBatch1.ts,17,Zebrakraut,Tradescantia zebrina,Das Zebrakraut faellt durch seine silbrig-lila gestreiften Blaetter auf. Schnellwachsende Haengepflanze.,Helles indirektes Licht,15-25 °C,5,easy|patterned|hanging,,,,, -easy,constants/lexiconBatch1.ts,107,Tulpe,Tulipa gesneriana,Die Tulpe ist eine der beliebtesten Fruehjahrsblueher mit kelchfoermigen Blueten in unzaehligen Farben.,Helles bis volles Licht,8-18 °C,5,easy|flowering,,,,, -easy,constants/lexiconBatch1.ts,35,Stiefmuetterchen,Viola wittrockiana,Das Stiefmuetterchen ist ein bekannter Fruehjahrsblueher mit charakteristisch gezeichneten Blueten.,Helles bis volles Licht,5-18 °C,3,easy|flowering,,,,, -easy,constants/lexiconBatch2.ts,246,Yucca aloifolia,Yucca aloifolia,Yucca aloifolia ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Volles Sonnenlicht,18-30 C,10,easy|tree|sun,,,,, -easy,constants/lexiconBatch1.ts,40,Yucca-Palme,Yucca elephantipes,"Die Yucca-Palme ist eine robuste Zimmerpflanze mit starrem, immergruenem Blaetterschopf auf einem dicken Stamm.",Helles bis volles Licht,15-28 °C,14,easy|tree|sun,,,,, -easy,constants/lexiconBatch2.ts,65,Zinnie,Zinnia elegans,"Die Zinnie ist eine leuchtende Sommerblume mit grossen, dahlienaehnlichen Blueten. Sehr robust und hitzetolerant.",Volles Sonnenlicht,18-30 °C,3,easy|flowering|sun,,,,, +category,source_file,source_index,name,botanical_name,description,light,temp,water_interval_days,all_categories,risk_flags,audit_status,evidence_source,evidence_url,notes +easy,constants/lexiconBatch2.ts,31,Adromischus,Adromischus cristatus,Adromischus ist eine kompakte Sukkulente mit ungewoehnlich wellenrandigen Blaettern auf kurzen Staengeln.,Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, +easy,constants/lexiconBatch1.ts,50,Aglaoneme,Aglaonema commutatum,Die Aglaoneme ist eine dekorative Zimmerpflanze mit silbrig-gruen gemusterten Blaettern. Tolerant gegenueber wenig Licht.,Wenig bis helles Licht,15-26 °C,7,easy|patterned|low_light,,,,, +easy,constants/lexiconBatch1.ts,30,Schnittlauch,Allium schoenoprasum,Schnittlauch ist ein beliebtes Kuechenkraut mit roehrenfoermigen Blaettern und lila Blueten.,Helles bis volles Licht,10-25 °C,3,easy,,,,, +easy,constants/lexiconBatch2.ts,135,Schnittknoblauch,Allium tuberosum,Schnittknoblauch ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +easy,constants/lexiconBatch1.ts,89,Kap-Aloe,Aloe arborescens,"Die Kap-Aloe ist eine strauchige Aloe mit schmalen, gezaehnten Blaettern und leuchtend roten Bluetenaehren im Winter.",Volles Sonnenlicht,10-30 °C,14,easy|succulent|medicinal|sun,medicinal_requires_external_evidence,,,, +easy,constants/lexiconBatch2.ts,128,Zitronenverbene,Aloysia citrodora,Zitronenverbene ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +easy,constants/lexiconBatch2.ts,140,Dill,Anethum graveolens,Dill ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +easy,constants/lexiconBatch2.ts,125,Kerbel,Anthriscus cerefolium,Kerbel ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +easy,constants/lexiconBatch2.ts,122,Estragon,Artemisia dracunculus,Estragon ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +easy,constants/lexiconBatch2.ts,16,Schusterpflanze,Aspidistra elatior,"Die Schusterpflanze ist eine extrem robuste Zimmerpflanze mit langen, dunkelgruenen Blaettern. Vertraegt tiefe Temperaturen.",Wenig bis helles Licht,10-20 °C,14,easy|low_light,,,,, +easy,constants/lexiconBatch2.ts,43,Vogelnest-Farn,Asplenium nidus,"Der Vogelnest-Farn hat ganzrandige, glaenzende Wedel, die eine Nestform bilden. Sehr dekorativ und robust.",Helles indirektes Licht,18-27 °C,5,easy|low_light|high_humidity,,,,, +easy,constants/lexiconBatch2.ts,13,Japanische Aucube,Aucuba japonica,"Die Japanische Aucube hat glaenzende, gruene oder gelbgefleckte Blaetter. Sehr schattenvertraeglich.",Wenig bis helles Licht,10-20 °C,7,easy|low_light,,,,, +easy,constants/lexiconBatch2.ts,7,Bambusrohr,Bambusa vulgaris,Das Bambusrohr ist eine schnell wachsende Bambusart mit gelbgruenen Halmen. Sehr dekorativ und vielseitig nutzbar.,Helles bis volles Licht,15-30 °C,5,easy|large,,,,, +easy,constants/lexiconBatch1.ts,41,Pferdeschwanzpalme,Beaucarnea recurvata,"Die Pferdeschwanzpalme hat einen verdickten Stammbasis als Wasserspeicher und lange, schmale Blaetter.",Volles Sonnenlicht,15-30 °C,21,easy|succulent|tree|sun,,,,, +easy,constants/lexiconBatch2.ts,97,Mangold,Beta vulgaris,"Mangold ist ein farbenfrohes Blattgemuese mit bunten Stielen in Rot, Gelb, Orange und Weiss.",Helles bis volles Licht,10-25 °C,3,easy,,,,, +easy,constants/lexiconBatch2.ts,38,Billbergia,Billbergia nutans,"Die Billbergia ist eine robuste Bromelie mit schmalen, gruenen Blaettern und hängenden, blauen und gruenen Blueten.",Helles indirektes Licht,15-25 °C,7,easy|flowering,,,,, +easy,constants/lexiconBatch2.ts,129,Borretsch,Borago officinalis,Borretsch ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +easy,constants/lexiconBatch2.ts,63,Calibrachoa,Calibrachoa hybrida,"Calibrachoa ist eine petunienaehnliche Haengepflanze mit unzaehligen, kleinen Trichterbluten in allen Farben.",Volles Sonnenlicht,15-25 °C,2,easy|flowering|hanging|sun,,,,, +easy,constants/lexiconBatch2.ts,56,Callisia,Callisia repens,"Callisia repens ist ein kleines, kriechendes Kraut mit winzigen, gruenen Blaettern. Ideal fuer haengende Behaelter.",Helles indirektes Licht,15-25 °C,5,easy|hanging,,,,, +easy,constants/lexiconBatch2.ts,92,Chili,Capsicum annuum,"Chili ist eine beliebte Gemuese- und Zierpflanze mit leuchtenden, roten oder orangen Fruechten. Im Topf kultivierbar.",Volles Sonnenlicht,20-30 °C,4,easy|medicinal|sun,medicinal_requires_external_evidence,,,, +easy,constants/lexiconBatch1.ts,81,Peruanischer Fackelkaktus,Cereus peruvianus,"Der Peruanische Fackelkaktus ist ein saeulenfoermiger Kaktus, der im Innenraum bis zu 2 m hoch werden kann.",Volles Sonnenlicht,15-35 °C,21,easy|succulent|large|sun,,,,, +easy,constants/lexiconBatch1.ts,99,Herzkette,Ceropegia woodii,"Die Herzkette hat duenne, haengende Ranken mit herzfoermigen, silbergrau gemusterten Blaettchen.",Helles indirektes Licht,15-27 °C,14,easy|succulent|patterned|hanging,,,,, +easy,constants/lexiconBatch1.ts,43,Bergpalme,Chamaedorea elegans,Die Bergpalme ist eine kompakte Zimmerpalme fuer schattigere Standorte. Ideal fuer dunkle Innenraeume.,Wenig bis helles Licht,15-25 °C,7,easy|pet_friendly|tree|air_purifier|low_light,air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence,,,, +easy,constants/lexiconBatch2.ts,138,Roemische Kamille,Chamaemelum nobile,Roemische Kamille ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|medicinal|sun,medicinal_requires_external_evidence,,,, +easy,constants/lexiconBatch2.ts,101,Kamille,Chamomilla recutita,"Die Kamille ist ein beliebtes Heilkraut mit kleinen, weiss-gelben Blueten. Das aetherische Oel wirkt beruhigend.",Volles Sonnenlicht,15-25 °C,5,easy|medicinal|sun,medicinal_requires_external_evidence,,,, +easy,constants/lexiconBatch2.ts,84,Kaffeestrauch,Coffea arabica,"Der Kaffeestrauch hat glaenzende, dunkelgruene Blaetter und entwickelt rote Kaffe­ekirschen. Kann im Topf gehalten werden.",Helles indirektes Licht,18-25 °C,7,easy,,,,, +easy,constants/lexiconBatch2.ts,14,Keulenlilie,Cordyline australis,"Die Keulenlilie hat lange, schmale, gruene oder rotbraune Blaetter in einem dekorativen Schopf.",Helles bis volles Licht,10-25 °C,7,easy|tree|sun,,,,, +easy,constants/lexiconBatch2.ts,15,Tiroler Keulenlilie,Cordyline fruticosa,"Die Tiroler Keulenlilie hat leuchtend rote, gruene oder buntlaubige Blaetter. Eine exotische Zimmerpflanze.",Helles indirektes Licht,18-27 °C,7,easy,,,,, +easy,constants/lexiconBatch2.ts,139,Koriander,Coriandrum sativum,Koriander ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +easy,constants/lexiconBatch2.ts,29,Kotyledon,Cotyledon orbiculata,"Kotyledon hat dickfleischige, runde Blaetter mit einem mehligen, weisslichen Belag. Sehr trockenheitsresistent.",Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, +easy,constants/lexiconBatch2.ts,26,Moos-Crassula,Crassula muscosa,"Die Moos-Crassula hat dicht aneinandergereihte, winzige gruene Blaetter auf unverzweigten Trieben. Sieht aus wie Moos.",Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, +easy,constants/lexiconBatch1.ts,5,Jadepflanze,Crassula ovata,"Die Jadepflanze ist eine langlebige Sukkulente mit dicken, ovalen Blaettern. In Japan gilt sie als Gluecksbringer.",Helles bis volles Licht,15-24 °C,14,easy|succulent|sun,,,,, +easy,constants/lexiconBatch1.ts,110,Krokus,Crocus vernus,"Der Krokus ist einer der ersten Fruehjahrs­boten mit kelchfoermigen Blueten in Lila, Weiss und Gelb.",Helles bis volles Licht,5-15 °C,7,easy|flowering,,,,, +easy,constants/lexiconBatch2.ts,94,Gurke,Cucumis sativus,"Die Gurke ist eine rankende Gemuese­pflanze mit gruenen, erfrischenden Fruechten. Im Balkonkasten kultivierbar.",Volles Sonnenlicht,18-28 °C,3,easy|sun,,,,, +easy,constants/lexiconBatch2.ts,127,Zitronengras,Cymbopogon citratus,Zitronengras ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +easy,constants/lexiconBatch2.ts,99,Karotte,Daucus carota,Die Karotte ist eine beliebte Gemuese­pflanze mit orangefarbenen Wurzeln. Im tiefen Topf kultivierbar.,Helles bis volles Licht,15-22 °C,5,easy,,,,, +easy,constants/lexiconBatch1.ts,48,Dieffenbachie,Dieffenbachia seguine,"Die Dieffenbachie ist eine tropische Blattschmuckpflanze mit grossen, gruen-weiss gefleckten Blaettern.",Helles indirektes Licht,18-26 °C,7,easy|air_purifier|low_light,air_purifier_requires_external_evidence,,,, +easy,constants/lexiconBatch1.ts,14,Maisstrauch,Dracaena fragrans,"Der Maisstrauch ist eine robuste Zimmerpflanze mit breiten, gestreiften Blaettern. Gedeiht auch bei wenig Licht.",Helles indirektes Licht,15-25 °C,10,easy|tree|air_purifier|low_light,air_purifier_requires_external_evidence,,,, +easy,constants/lexiconBatch1.ts,13,Drachenbaum,Dracaena marginata,"Der Drachenbaum ist eine schlanke Zimmerpflanze mit roten, schmalen Blaettern auf langen Staemmen.",Helles indirektes Licht,15-25 °C,10,easy|tree|air_purifier,air_purifier_requires_external_evidence,,,, +easy,constants/lexiconBatch2.ts,30,Dudleya,Dudleya brittonii,"Dudleya ist eine rosetten­bildende Sukkulente mit silbrig-weissen, mehligen Blaettern. Sehr elegant.",Volles Sonnenlicht,10-25 °C,14,easy|succulent|sun,,,,, +easy,constants/lexiconBatch1.ts,4,Echeverie,Echeveria elegans,"Die Echeverie bildet symmetrische, rosettenfoermige Sukkulenten mit blaugruenen Blaettern. Pflegeleicht.",Volles Sonnenlicht,15-25 °C,14,easy|succulent|sun,,,,, +easy,constants/lexiconBatch1.ts,77,Goldene Tonne,Echinocactus grusonii,Die Goldene Tonne ist ein ikonischer kugelfoermiger Kaktus mit goldgelben Stacheln. Waechst langsam aber imposant.,Volles Sonnenlicht,15-35 °C,21,easy|succulent|sun,,,,, +easy,constants/lexiconBatch1.ts,83,San-Pedro-Kaktus,Echinopsis pachanoi,"Der San-Pedro-Kaktus ist ein schnell wachsender, saeulenfoermiger Kaktus aus den Anden.",Volles Sonnenlicht,10-35 °C,14,easy|succulent|sun,,,,, +easy,constants/lexiconBatch1.ts,16,Marmor-Efeutute,Epipremnum aureum Marble Queen,Die Marmor-Efeutute hat cremeweiss-gruen marmorierte Blaetter. Eine dekorative Variante der klassischen Efeutute.,Helles indirektes Licht,15-30 °C,7,easy|hanging|air_purifier,air_purifier_requires_external_evidence,,,, +easy,constants/lexiconBatch2.ts,53,Neon-Efeutute,Epipremnum pinnatum Neon,Die Neon-Efeutute hat leuchtend limonengruene Blaetter. Sehr auffaellig und pflegeleicht.,Helles indirektes Licht,15-30 °C,7,easy|hanging|air_purifier,air_purifier_requires_external_evidence,,,, +easy,constants/lexiconBatch2.ts,19,Christusdorn,Euphorbia milii,Der Christusdorn ist eine sukkulente Wolfsmilch mit stacheligen Zweigen und kleinen roten oder gelben Hochblaettern.,Helles bis volles Licht,15-28 °C,10,easy|flowering|succulent|sun,,,,, +easy,constants/lexiconBatch1.ts,12,Bleistiftkaktus,Euphorbia tirucalli,"Der Bleistiftkaktus ist eine sukkulente Wolfsmilch mit duennen, zylindrischen Zweigen ohne Blaetter.",Volles Sonnenlicht,18-30 °C,14,easy|succulent|sun,,,,, +easy,constants/lexiconBatch2.ts,12,Fatsia,Fatsia japonica,"Die Fatsia ist ein dekorativer Zimmerstrauch mit grossen, handfoermigen, glaenzenden Blaettern. Sehr robust.",Helles indirektes Licht,10-20 °C,7,easy|low_light,,,,, +easy,constants/lexiconBatch1.ts,78,Fass-Kaktus,Ferocactus cylindraceus,"Der Fass-Kaktus ist ein zylindrischer Wuestenkaktus mit langen, roten Stacheln. Sehr langlebig.",Volles Sonnenlicht,15-35 °C,21,easy|succulent|sun,,,,, +easy,constants/lexiconBatch1.ts,38,Gummibaum,Ficus elastica,"Der Gummibaum ist eine imposante Zimmerpflanze mit grossen, glaenzenden, lederartigen Blaettern. Reinigt die Luft.",Helles indirektes Licht,16-24 °C,10,easy|tree|air_purifier,air_purifier_requires_external_evidence,,,, +easy,constants/lexiconBatch2.ts,247,Ficus microcarpa,Ficus microcarpa,Ficus microcarpa ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,easy|tree|bright_light,,,,, +easy,constants/lexiconBatch2.ts,100,Erdbeere,Fragaria ananassa,"Die Erdbeere ist ein beliebtes Obst fuer Balkon und Terrasse mit aromatischen, roten Fruechten.",Helles bis volles Licht,15-25 °C,3,easy|pet_friendly|sun,pet_friendly_requires_external_evidence,,,, +easy,constants/lexiconBatch1.ts,90,Gasteria,Gasteria carinata,"Die Gasteria ist eine kleine Sukkulente mit zweireihig angeordneten, zungenfoermigen, gefleckten Blaettern.",Helles indirektes Licht,15-25 °C,14,easy|succulent|low_light,,,,, +easy,constants/lexiconBatch1.ts,32,Blutroter Storchschnabel,Geranium sanguineum,Der Blutrote Storchschnabel ist ein zierlicher Storchschnabel mit intensiv magentafarbenen Blueten.,Helles bis volles Licht,10-25 °C,7,easy|flowering,,,,, +easy,constants/lexiconBatch1.ts,87,Geisterpflanze,Graptopetalum paraguayense,"Die Geisterpflanze hat zartgraue bis perlmutt-rosafarbene, rosettenfoermige Blaetter. Sehr robuste Sukkulente.",Volles Sonnenlicht,15-25 °C,14,easy|succulent|sun,,,,, +easy,constants/lexiconBatch1.ts,80,Mond-Kaktus,Gymnocalycium mihanovichii,Der Mond-Kaktus ist eine farbenfrohe Veredelung eines chlorophylllosen Kaktus auf einem gruenen Unterlagekaktus.,Indirektes Licht,15-30 °C,14,easy|succulent,,,,, +easy,constants/lexiconBatch1.ts,6,Zebra-Haworthie,Haworthia fasciata,Die Zebra-Haworthie ist eine kompakte Sukkulente mit weissen Querstreifen auf dunkelgruenen Blaettern.,Helles indirektes Licht,15-25 °C,14,easy|succulent|low_light,,,,, +easy,constants/lexiconBatch1.ts,37,Efeu,Hedera helix,"Efeu ist eine robuste Kletter- und Haengepflanze mit charakteristischen, dreilappigen Blaettern. Sehr langlebig.",Wenig bis helles Licht,10-20 °C,7,easy|hanging|air_purifier|low_light,air_purifier_requires_external_evidence,,,, +easy,constants/lexiconBatch2.ts,133,Currykraut,Helichrysum italicum,Currykraut ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +easy,constants/lexiconBatch1.ts,57,Wachsblume,Hoya carnosa,"Die Wachsblume ist eine Kletterpflanze mit dicken, wachsartigen Blaettern und sternfoermigen, duftenden Blueten.",Helles indirektes Licht,16-27 °C,10,easy|flowering|succulent|hanging,,,,, +easy,constants/lexiconBatch1.ts,108,Hyazinthe,Hyacinthus orientalis,"Die Hyazinthe bezaubert mit dichten Bluetenrispen und intensivem Duft in Blau, Rosa, Weiss oder Gelb.",Helles bis volles Licht,10-18 °C,5,easy|flowering,,,,, +easy,constants/lexiconBatch2.ts,136,Ysop,Hyssopus officinalis,Ysop ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +easy,constants/lexiconBatch2.ts,59,Neuguinea-Balsamine,Impatiens hawkeri,"Die Neuguinea-Balsamine hat grosse, leuchtende Blueten und ist sehr bluehfreudig. Ideal fuer Terrassen.",Helles indirektes Licht,18-27 °C,3,easy|flowering,,,,, +easy,constants/lexiconBatch1.ts,20,Fleissiges Lieschen,Impatiens walleriana,Das Fleissige Lieschen bluet von Fruehling bis Herbst unermudlich in vielen Farben.,Helles indirektes Licht,16-24 °C,2,easy|flowering,,,,, +easy,constants/lexiconBatch1.ts,64,Suesskartoffel,Ipomoea batatas,"Die Suesskartoffel-Zierpflanze hat dekorative, herzfoermige Blaetter in gruen oder dunkelviolett. Ideal als Haengepflanze.",Volles Sonnenlicht,20-30 °C,5,easy|hanging|sun,,,,, +easy,constants/lexiconBatch1.ts,9,Kalanchoe,Kalanchoe blossfeldiana,"Die Kalanchoe ist eine beliebte Bluehpflanze mit leuchtenden Blueten in Rot, Orange, Gelb oder Rosa.",Helles bis volles Licht,15-25 °C,10,easy|flowering|succulent|sun,,,,, +easy,constants/lexiconBatch2.ts,22,Brutblatt,Kalanchoe daigremontiana,Das Brutblatt bildet entlang des Blattrandes zahlreiche kleine Jungpflanzen. Eine faszinierende Sukkulente.,Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, +easy,constants/lexiconBatch2.ts,21,Kaninchen-Ohren,Kalanchoe tomentosa,"Kaninchen-Ohren haben weisslich-filzige Blaetter mit braunen Raendern, die Kaninchen­ohren aehneln. Sehr dekorativ.",Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, +easy,constants/lexiconBatch2.ts,95,Salat,Lactuca sativa,Salat ist eine schnell wachsende Blattgemuese­pflanze. Im Topf und Balkonkasten sehr gut zu kultivieren.,Helles bis volles Licht,10-22 °C,3,easy,,,,, +easy,constants/lexiconBatch2.ts,121,Lorbeer,Laurus nobilis,Lorbeer ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +easy,constants/lexiconBatch2.ts,126,Liebstoeckel,Levisticum officinale,Liebstoeckel ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +easy,constants/lexiconBatch2.ts,62,Duftsteinrich,Lobularia maritima,"Der Duftsteinrich ist ein niedrig wachsendes Pflanzchen mit winzigen, weissen oder lilafarbenen Blueten und suessem Duft.",Helles bis volles Licht,10-22 °C,3,easy|flowering,,,,, +easy,constants/lexiconBatch1.ts,79,Mammillaria,Mammillaria zeilmanniana,"Die Mammillaria ist ein kompakter, kugelfoermiger Kaktus, der im Fruehling einen Kranz aus rosa Blueten traegt.",Volles Sonnenlicht,15-35 °C,14,easy|flowering|succulent|sun,,,,, +easy,constants/lexiconBatch2.ts,102,Zitronenmelisse,Melissa officinalis,Die Zitronenmelisse ist ein zitronig duftendes Heilkraut. Sie beruhigt die Nerven und foerdert den Schlaf.,Helles bis volles Licht,15-25 °C,5,easy|medicinal,medicinal_requires_external_evidence,,,, +easy,constants/lexiconBatch1.ts,26,Gruene Minze,Mentha spicata,"Die Gruene Minze ist ein wuchsfreudiges Kuechenkraut mit frischem, minzigem Duft. Fuer Tee und Cocktails.",Helles bis volles Licht,15-25 °C,3,easy,,,,, +easy,constants/lexiconBatch2.ts,47,Monstera adansonii,Monstera adansonii,Monstera adansonii hat herzfoermige Blaetter mit zahlreichen runden Lochern. Eine rankende Zimmerpflanze.,Helles indirektes Licht,18-27 °C,7,easy|hanging,,,,, +easy,constants/lexiconBatch1.ts,109,Traubenhyazinthe,Muscari armeniacum,"Die Traubenhyazinthe bildet dichte Trauben aus kleinen, blauen bis violetten Gloeckchen. Zuverlaessige Fruejahrszwiebel.",Helles bis volles Licht,8-18 °C,7,easy|flowering,,,,, +easy,constants/lexiconBatch2.ts,132,Katzenminze,Nepeta cataria,Katzenminze ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +easy,constants/lexiconBatch1.ts,25,Basilikum,Ocimum basilicum,"Basilikum ist das beliebteste Kuechenkraut mit intensiv aromatischen, gruenen Blaettern. Fuer Pesto verwendet.",Volles Sonnenlicht,18-30 °C,2,easy|medicinal|sun,medicinal_requires_external_evidence,,,, +easy,constants/lexiconBatch1.ts,82,Hasenohren-Kaktus,Opuntia microdasys,"Der Hasenohren-Kaktus hat flache, ovale Triebe mit dichten weissen Glochiden. Klassischer Zimmerkaktus.",Volles Sonnenlicht,10-35 °C,21,easy|succulent|sun,,,,, +easy,constants/lexiconBatch2.ts,124,Majoran,Origanum majorana,Majoran ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +easy,constants/lexiconBatch1.ts,28,Oregano,Origanum vulgare,"Oregano ist ein aromatisches Kuechenkraut mit runden, behaarten Blaettern. In mediterraner Kueche beliebt.",Volles Sonnenlicht,15-25 °C,7,easy|medicinal|sun,medicinal_requires_external_evidence,,,, +easy,constants/lexiconBatch2.ts,231,Glueckskastanie,Pachira aquatica,Glueckskastanie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,easy|tree|bright_light,,,,, +easy,constants/lexiconBatch1.ts,88,Mondstein-Pflanze,Pachyphytum oviferum,"Die Mondstein-Pflanze hat dicke, ovale Blaetter mit einem pastellrosafarbenen, mehligen Ueberzug.",Volles Sonnenlicht,15-25 °C,14,easy|succulent|sun,,,,, +easy,constants/lexiconBatch1.ts,31,Rosengeranie,Pelargonium graveolens,Die Rosengeranie ist eine Duftpflanze mit tief eingeschnittenen Blaettern und rosaenlichem Aroma.,Volles Sonnenlicht,15-25 °C,7,easy|medicinal|sun,medicinal_requires_external_evidence,,,, +easy,constants/lexiconBatch2.ts,61,Efeu-Geranie,Pelargonium peltatum,"Die Efeu-Geranie hat efeufoermige, glaenzende Blaetter und bluet den ganzen Sommer in leuchtenden Farben.",Helles bis volles Licht,15-25 °C,5,easy|flowering|hanging|sun,,,,, +easy,constants/lexiconBatch1.ts,102,Rippenpeperomie,Peperomia caperata,"Die Rippenpeperomie hat tief gerippte, dunkelgruene bis violette Blaetter mit einer samtigen Textur.",Helles indirektes Licht,18-26 °C,10,easy|pet_friendly,pet_friendly_requires_external_evidence,,,, +easy,constants/lexiconBatch1.ts,103,Spiegelpeperomie,Peperomia obtusifolia,"Die Spiegelpeperomie hat glaenzende, lederartige, oval-runde Blaetter in tiefem Gruen. Sehr robust.",Helles indirektes Licht,16-26 °C,10,easy|pet_friendly|low_light,pet_friendly_requires_external_evidence,,,, +easy,constants/lexiconBatch2.ts,230,Raindrop-Peperomie,Peperomia polybotrya,Raindrop-Peperomie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,easy|pet_friendly,pet_friendly_requires_external_evidence,,,, +easy,constants/lexiconBatch2.ts,134,Shiso,Perilla frutescens,Shiso ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +easy,constants/lexiconBatch1.ts,29,Petersilie,Petroselinum crispum,Petersilie ist eines der meistgenutzten Kuechenkraeuter mit frisch-aromatischem Geschmack. Reich an Vitaminen.,Helles Licht,10-25 °C,3,easy,,,,, +easy,constants/lexiconBatch1.ts,34,Petunie,Petunia hybrida,Die Petunie ist eine der beliebtesten Balkonpflanzen mit trichterfoermigen Blueten in unzaehligen Farben.,Volles Sonnenlicht,15-25 °C,2,easy|pet_friendly|flowering|sun,pet_friendly_requires_external_evidence,,,, +easy,constants/lexiconBatch2.ts,50,Philodendron bipinnatifidum,Philodendron bipinnatifidum,"Philodendron bipinnatifidum hat grosse, tief gelappte Blaetter. Er entwickelt einen beeindruckenden, baumfoermigen Wuchs.",Helles indirektes Licht,18-27 °C,7,easy|large,,,,, +easy,constants/lexiconBatch2.ts,51,Roter Philodendron,Philodendron erubescens,"Der Rote Philodendron hat glaenzende, herzfoermige Blaetter, die jung roetrlich erscheinen. Sehr dekorativ.",Helles indirektes Licht,18-27 °C,7,easy|hanging,,,,, +easy,constants/lexiconBatch1.ts,15,Herzblatt-Philodendron,Philodendron hederaceum,Der Herzblatt-Philodendron ist eine pflegeleichte Kletter- oder Haengepflanze mit herzfoermigen Blaettern.,Indirektes Licht,18-28 °C,7,easy|hanging|low_light,,,,, +easy,constants/lexiconBatch2.ts,242,Philodendron Brasil,Philodendron hederaceum Brasil,Philodendron Brasil ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,easy|hanging|low_light,,,,, +easy,constants/lexiconBatch2.ts,8,Goldener Bambus,Phyllostachys aurea,"Der Goldene Bambus hat elegante, goldgelbe Halme mit engstehenden Knoten. Sehr dekorativ als Sichtschutz.",Helles bis volles Licht,10-30 °C,5,easy|large,,,,, +easy,constants/lexiconBatch2.ts,228,Aluminium-Pflanze,Pilea cadierei,Aluminium-Pflanze ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,easy|pet_friendly|patterned,pet_friendly_requires_external_evidence,,,, +easy,constants/lexiconBatch1.ts,2,Ufopflanze,Pilea peperomioides,"Die Ufopflanze hat unverwechselbare, runde Blaetter auf langen Stielen. Bildet leicht Ableger zum Verschenken.",Helles indirektes Licht,13-30 °C,7,easy|pet_friendly,pet_friendly_requires_external_evidence,,,, +easy,constants/lexiconBatch2.ts,44,Tueipelfarn,Polypodium vulgare,Der Tueipelfarn ist ein heimischer Farn mit gelappten Wedeln und runden Sporenhaeufchen auf der Unterseite.,Helles indirektes Licht,10-20 °C,7,easy,,,,, +easy,constants/lexiconBatch2.ts,27,Speckbaum,Portulacaria afra,"Der Speckbaum ist eine sukkulente Pflanze mit roten Stielen und kleinen, runden, glaenzenden Blaettern.",Helles bis volles Licht,15-30 °C,14,easy|succulent|sun,,,,, +easy,constants/lexiconBatch2.ts,98,Radieschen,Raphanus sativus,"Das Radieschen ist ein schnellwachsendes Gemuese mit runden, roten Knollen. Es reift in nur 3-4 Wochen.",Helles bis volles Licht,10-22 °C,2,easy,,,,, +easy,constants/lexiconBatch2.ts,52,Mini-Monstera,Rhaphidophora tetrasperma,"Die Mini-Monstera hat monstera­aehnliche, gelochte Blaetter auf einer kompakten, klettternden Pflanze. Sehr trendig.",Helles indirektes Licht,18-27 °C,7,easy|hanging,,,,, +easy,constants/lexiconBatch1.ts,24,Rosmarin,Rosmarinus officinalis,Rosmarin ist ein aromatisches Kraut mit nadelartigen Blaettern und blauen Blueten. In der Kueche unverzichtbar.,Volles Sonnenlicht,10-25 °C,7,easy|medicinal|sun,medicinal_requires_external_evidence,,,, +easy,constants/lexiconBatch2.ts,130,Sauerampfer,Rumex acetosa,Sauerampfer ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +easy,constants/lexiconBatch1.ts,94,Afrikanisches Veilchen,Saintpaulia ionantha,"Das Afrikanische Veilchen ist eine kleine, kompakte Bluehpflanze mit samtigen Blaettern und violetten Blueten.",Helles indirektes Licht,18-25 °C,7,easy|flowering,,,,, +easy,constants/lexiconBatch2.ts,103,Salbei,Salvia officinalis,Salbei ist ein aromatisches Heilkraut mit silbrig-gruenen Blaettern. Er hat antibakterielle und entzuendungshem­mende Wirkung.,Volles Sonnenlicht,10-25 °C,7,easy|medicinal|sun,medicinal_requires_external_evidence,,,, +easy,constants/lexiconBatch2.ts,17,Zylindrischer Bogenhanf,Sansevieria cylindrica,"Der Zylindrische Bogenhanf hat zylindrische, aufrechte Blaetter, die sich nach oben verjuengen. Sehr pflegeleicht.",Helles bis volles Licht,15-27 °C,14,easy|succulent|sun,,,,, +easy,constants/lexiconBatch2.ts,123,Bohnenkraut,Satureja hortensis,Bohnenkraut ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +easy,constants/lexiconBatch2.ts,11,Grosse Strahlenaralie,Schefflera actinophylla,"Die Grosse Strahlenaralie kann grosse, handfoermige Blaetter entwickeln. Sie ist ideal als Zimmerstrauch.",Helles indirektes Licht,18-27 °C,7,easy|tree|large,,,,, +easy,constants/lexiconBatch2.ts,10,Strahlenaralie,Schefflera arboricola,"Die Strahlenaralie hat fingerfoermig angeordnete, glaenzende Blaetter auf langen Stielen. Sehr robuste Zimmerpflanze.",Helles indirektes Licht,15-25 °C,7,easy|tree|air_purifier,air_purifier_requires_external_evidence,,,, +easy,constants/lexiconBatch1.ts,8,Weihnachtskaktus,Schlumbergera truncata,"Der Weihnachtskaktus erfreut zur Weihnachtszeit mit leuchtenden Blueten in Rosa, Rot oder Weiss.",Helles indirektes Licht,15-21 °C,7,easy|flowering|succulent,,,,, +easy,constants/lexiconBatch1.ts,55,Satinpothos,Scindapsus pictus,"Der Satinpothos hat samtig-glaenzende, silbrig gefleckte Blaetter auf langen, haengenden Ranken.",Helles indirektes Licht,18-28 °C,7,easy|patterned|hanging,,,,, +easy,constants/lexiconBatch1.ts,7,Eselschwanz,Sedum morganianum,"Der Eselschwanz ist eine haengende Sukkulente mit langen Trieben aus dichten, blaugruenen Blaettchen.",Volles Sonnenlicht,15-25 °C,14,easy|succulent|hanging|sun,,,,, +easy,constants/lexiconBatch1.ts,100,Perlenschnur-Pflanze,Senecio rowleyanus,"Die Perlenschnur-Pflanze hat haengende Ranken mit kugelfoermigen, perlenaehnlichen Blaettern. Einzigartige Sukkulente.",Helles bis volles Licht,15-27 °C,14,easy|succulent|hanging,,,,, +easy,constants/lexiconBatch2.ts,28,Blauer Kreuzkraut,Senecio serpens,"Der Blaue Kreuzkraut hat zylindrische, blaublaugruene Blaetter und einen kriechenden Wuchs. Sehr dekorativ.",Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, +easy,constants/lexiconBatch2.ts,91,Tomate,Solanum lycopersicum,"Die Tomate ist eine beliebte Gemuese- und Balkonpflanze mit roten, saftigen Fruechten. Im Topf kultivierbar.",Volles Sonnenlicht,18-28 °C,3,easy,,,,, +easy,constants/lexiconBatch2.ts,96,Spinat,Spinacia oleracea,Spinat ist ein naehrstoffreiches Blattgemuese mit dunkelgruenen Blaettern. Reich an Eisen und Vitaminen.,Helles bis volles Licht,10-20 °C,3,easy,,,,, +easy,constants/lexiconBatch2.ts,131,Stevia,Stevia rebaudiana,Stevia ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +easy,constants/lexiconBatch1.ts,56,Pfeilblatt,Syngonium podophyllum,"Das Pfeilblatt hat charakteristisch pfeilfoermige Blaetter, die sich mit dem Alter weiterentwickeln.",Helles indirektes Licht,16-27 °C,7,easy|hanging,,,,, +easy,constants/lexiconBatch2.ts,66,Studentenblume,Tagetes patula,Die Studentenblume ist eine robuste Sommerblume mit orangen oder gelben Blueten. Sie haelt Schadlinge fern.,Volles Sonnenlicht,15-28 °C,3,easy|flowering|sun,,,,, +easy,constants/lexiconBatch1.ts,27,Thymian,Thymus vulgaris,"Thymian ist ein kleiner, aromatischer Strauch mit winzigen Blaettern und rosa Blueten. Wichtiges Kuechenkraut.",Volles Sonnenlicht,10-25 °C,7,easy|medicinal|sun,medicinal_requires_external_evidence,,,, +easy,constants/lexiconBatch2.ts,33,Luftpflanze,Tillandsia ionantha,Die Luftpflanze ist eine kompakte Bromelie ohne Topferde. Sie nimmt Wasser und Naehrstoffe ueber die Blattschuppen auf.,Helles bis volles Licht,15-30 °C,3,easy,,,,, +easy,constants/lexiconBatch2.ts,32,Spanisches Moos,Tillandsia usneoides,"Das Spanische Moos ist eine epiphytische Bromelie ohne Wurzeln, die in der Luft haengt. Es benoetigt nur Feuchtigkeitsbespruehing.",Helles bis volles Licht,15-30 °C,3,easy|hanging,,,,, +easy,constants/lexiconBatch2.ts,55,Weisse Tradescantia,Tradescantia fluminensis,Die Weisse Tradescantia hat gruene Blaetter mit weisslichen Unterseiten. Sehr robust und schnellwachsend.,Helles indirektes Licht,15-25 °C,5,easy|hanging,,,,, +easy,constants/lexiconBatch2.ts,54,Lila Tradescantia,Tradescantia pallida,Die Lila Tradescantia hat leuchtend purpurrote Blaetter und ist sehr auffaellig. Sie liebt viel Licht.,Helles bis volles Licht,15-25 °C,5,easy|hanging|sun,,,,, +easy,constants/lexiconBatch1.ts,17,Zebrakraut,Tradescantia zebrina,Das Zebrakraut faellt durch seine silbrig-lila gestreiften Blaetter auf. Schnellwachsende Haengepflanze.,Helles indirektes Licht,15-25 °C,5,easy|patterned|hanging,,,,, +easy,constants/lexiconBatch1.ts,107,Tulpe,Tulipa gesneriana,Die Tulpe ist eine der beliebtesten Fruehjahrsblueher mit kelchfoermigen Blueten in unzaehligen Farben.,Helles bis volles Licht,8-18 °C,5,easy|flowering,,,,, +easy,constants/lexiconBatch1.ts,35,Stiefmuetterchen,Viola wittrockiana,Das Stiefmuetterchen ist ein bekannter Fruehjahrsblueher mit charakteristisch gezeichneten Blueten.,Helles bis volles Licht,5-18 °C,3,easy|flowering,,,,, +easy,constants/lexiconBatch2.ts,246,Yucca aloifolia,Yucca aloifolia,Yucca aloifolia ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Volles Sonnenlicht,18-30 C,10,easy|tree|sun,,,,, +easy,constants/lexiconBatch1.ts,40,Yucca-Palme,Yucca elephantipes,"Die Yucca-Palme ist eine robuste Zimmerpflanze mit starrem, immergruenem Blaetterschopf auf einem dicken Stamm.",Helles bis volles Licht,15-28 °C,14,easy|tree|sun,,,,, +easy,constants/lexiconBatch2.ts,65,Zinnie,Zinnia elegans,"Die Zinnie ist eine leuchtende Sommerblume mit grossen, dahlienaehnlichen Blueten. Sehr robust und hitzetolerant.",Volles Sonnenlicht,18-30 °C,3,easy|flowering|sun,,,,, diff --git a/audits/semantic-search/categories/flowering.csv b/audits/semantic-search/categories/flowering.csv index 08361c7..f73a734 100644 --- a/audits/semantic-search/categories/flowering.csv +++ b/audits/semantic-search/categories/flowering.csv @@ -1,158 +1,158 @@ -category,source_file,source_index,name,botanical_name,description,light,temp,water_interval_days,all_categories,risk_flags,audit_status,evidence_source,evidence_url,notes -flowering,constants/lexiconBatch2.ts,108,Schafgarbe,Achillea millefolium,Die Schafgarbe hat weisse oder rosafarbene Bluetenschirme und fein gefiederte Blaetter. Wichtige Heilpflanze.,Volles Sonnenlicht,10-25 °C,7,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, -flowering,constants/lexiconBatch1.ts,86,Wuestenrose,Adenium obesum,Die Wuestenrose ist eine sukkulente Zimmerpflanze mit dickem Stamm und leuchtend pinken Blueten.,Volles Sonnenlicht,20-35 °C,10,flowering|succulent|sun,,,,, -flowering,constants/lexiconBatch2.ts,117,Socotra-Wuestenrose,Adenium socotranum,"Die Socotra-Wuestenrose ist eine seltene, endemische Art mit einem sehr dicken, knolligen Stamm und rosa Blueten.",Volles Sonnenlicht,20-35 °C,14,flowering|succulent|sun,,,,, -flowering,constants/lexiconBatch2.ts,34,Silbervase,Aechmea fasciata,Die Silbervase ist eine Bromelie mit silbrig gebänderten Blaettern und einem rosafarbenen Bluetenstand.,Helles indirektes Licht,18-25 °C,10,flowering|patterned,,,,, -flowering,constants/lexiconBatch1.ts,98,Lippenstiftpflanze,Aeschynanthus radicans,Die Lippenstiftpflanze hat haengende Triebe mit glaenzenden Blaettern und leuchtend roten Roehrenbluten.,Helles indirektes Licht,18-27 °C,7,flowering|hanging|high_humidity,,,,, -flowering,constants/lexiconBatch2.ts,155,Stockrose,Alcea rosea,"Stockrose ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch2.ts,73,Muschelingwer,Alpinia zerumbet,"Der Muschelingwer hat lange, elegante Blaetter und haengende Bluetenrispen mit weiss-rosa Bluetchen.",Helles bis volles Licht,20-30 °C,5,flowering|large|high_humidity,,,,, -flowering,constants/lexiconBatch2.ts,194,Fuchsschwanz,Amaranthus caudatus,"Fuchsschwanz ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch2.ts,163,Anemone,Anemone coronaria,"Anemone ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch2.ts,147,Loewenmaeulchen,Antirrhinum majus,"Loewenmaeulchen ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch2.ts,107,Arnika,Arnica montana,Arnika ist eine bekannte Heilpflanze aus den Alpen mit goldgelben Korbbluten. Sie wird fuer Muskeln und Gelenke verwendet.,Volles Sonnenlicht,10-20 °C,7,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, -flowering,constants/lexiconBatch2.ts,178,Seidenpflanze,Asclepias tuberosa,"Seidenpflanze ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch1.ts,92,Indische Azalee,Azalea indica,"Die Indische Azalee ist ein beliebter Zierstrauch mit grossen, auffaelligen Blueten in Rosa- und Rottönen.",Helles indirektes Licht,10-20 °C,4,flowering,,,,, -flowering,constants/lexiconBatch2.ts,175,Eisbegonie,Begonia semperflorens-cultorum,"Eisbegonie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light,,,,, -flowering,constants/lexiconBatch2.ts,58,Knollen-Begonie,Begonia tuberhybrida,"Die Knollen-Begonie hat riesige, rosenaehnliche Blueten in leuchtendem Rot, Orange, Gelb oder Weiss.",Helles indirektes Licht,15-22 °C,5,flowering|high_humidity,,,,, -flowering,constants/lexiconBatch2.ts,145,Gaensebluemchen,Bellis perennis,"Gaensebluemchen ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch2.ts,38,Billbergia,Billbergia nutans,"Die Billbergia ist eine robuste Bromelie mit schmalen, gruenen Blaettern und hängenden, blauen und gruenen Blueten.",Helles indirektes Licht,15-25 °C,7,easy|flowering,,,,, -flowering,constants/lexiconBatch1.ts,62,Bougainvillea,Bougainvillea spectabilis,"Die Bougainvillea ist eine rankenreiche Kletterpflanze mit leuchtend farbigen Hochblaettern in Rot, Orange oder Pink.",Volles Sonnenlicht,18-30 °C,5,flowering|bright_light|sun,,,,, -flowering,constants/lexiconBatch2.ts,223,Schmetterlingsflieder,Buddleja davidii,Schmetterlingsflieder ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|sun,,,,, -flowering,constants/lexiconBatch2.ts,187,Ringelblume,Calendula officinalis,"Ringelblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, -flowering,constants/lexiconBatch2.ts,63,Calibrachoa,Calibrachoa hybrida,"Calibrachoa ist eine petunienaehnliche Haengepflanze mit unzaehligen, kleinen Trichterbluten in allen Farben.",Volles Sonnenlicht,15-25 °C,2,easy|flowering|hanging|sun,,,,, -flowering,constants/lexiconBatch1.ts,93,Kamelie,Camellia japonica,Die Kamelie ist ein eleganter Zierstrauch mit glaenzenden Blaettern und rosenaehnlichen Blueten von Januar bis April.,Helles indirektes Licht,7-18 °C,5,flowering,,,,, -flowering,constants/lexiconBatch2.ts,85,Teestrauch,Camellia sinensis,"Der Teestrauch ist die Pflanze, aus deren Blaettern Tee gewonnen wird. Er hat weisse Blueten und glaenzende Blaetter.",Helles indirektes Licht,15-22 °C,7,flowering,,,,, -flowering,constants/lexiconBatch2.ts,184,Trompetenwinde,Campsis radicans,"Trompetenwinde ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light,,,,, -flowering,constants/lexiconBatch2.ts,67,Blumenschilfrohr,Canna indica,"Das Blumenschilfrohr hat grosse, tropisch wirkende Blaetter und auffaellige Blueten in Rot, Orange oder Gelb.",Volles Sonnenlicht,18-28 °C,5,flowering|large|sun,,,,, -flowering,constants/lexiconBatch1.ts,73,Cattleya-Orchidee,Cattleya labiata,"Die Cattleya ist die Koenigin der Orchideen mit ueppigen, duftenden Blueten in Lila, Rosa und Weiss.",Helles indirektes Licht,18-28 °C,7,flowering|high_humidity,,,,, -flowering,constants/lexiconBatch2.ts,188,Kornblume,Centaurea cyanus,"Kornblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch1.ts,67,Chrysantheme,Chrysanthemum indicum,"Die Chrysantheme ist die klassische Herbstblume mit ueppigen, dichten Blueten in vielen Farben.",Helles bis volles Licht,12-22 °C,4,flowering,,,,, -flowering,constants/lexiconBatch2.ts,157,Clematis,Clematis viticella,"Clematis ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light,,,,, -flowering,constants/lexiconBatch1.ts,104,Riemenblatt,Clivia miniata,Das Riemenblatt ist eine dekorative Zimmerpflanze mit leuchtend orangefarbenen Blueten im Fruehling.,Helles indirektes Licht,15-24 °C,10,flowering,,,,, -flowering,constants/lexiconBatch1.ts,97,Columnea,Columnea gloriosa,"Die Columnea ist eine haengende Zimmerpflanze mit kleinen, behaarten Blaettern und leuchtend roten, roehrenfoermigen Blueten.",Helles indirektes Licht,18-25 °C,7,flowering|hanging|high_humidity,,,,, -flowering,constants/lexiconBatch2.ts,160,Maigloeckchen,Convallaria majalis,"Maigloeckchen ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|medicinal,medicinal_requires_external_evidence,,,, -flowering,constants/lexiconBatch2.ts,181,Maedchenauge,Coreopsis tinctoria,"Maedchenauge ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch2.ts,150,Kosmee,Cosmos bipinnatus,"Kosmee ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch1.ts,110,Krokus,Crocus vernus,"Der Krokus ist einer der ersten Fruehjahrs­boten mit kelchfoermigen Blueten in Lila, Weiss und Gelb.",Helles bis volles Licht,5-15 °C,7,easy|flowering,,,,, -flowering,constants/lexiconBatch1.ts,19,Alpenveilchen,Cyclamen persicum,"Das Alpenveilchen bluet im Herbst und Winter mit eleganten Blueten in Rosa, Rot oder Weiss.",Helles indirektes Licht,12-18 °C,5,flowering,,,,, -flowering,constants/lexiconBatch1.ts,71,Zymbidium,Cymbidium lowianum,"Das Zymbidium ist eine robuste Orchidee mit langen, grassartigen Blaettern und eleganten Bluetenrispen.",Helles Licht,12-24 °C,7,flowering,,,,, -flowering,constants/lexiconBatch2.ts,68,Dahlie,Dahlia pinnata,Die Dahlie ist eine prachtvolle Sommerblume mit Blueten in allen Groessen und Formen. Sie wird aus Knollen gezogen.,Volles Sonnenlicht,15-25 °C,5,flowering|sun,,,,, -flowering,constants/lexiconBatch2.ts,215,Flammenbaum,Delonix regia,Flammenbaum ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|large,,,,, -flowering,constants/lexiconBatch2.ts,153,Rittersporn,Delphinium elatum,"Rittersporn ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch1.ts,70,Dendrobium,Dendrobium nobile,"Das Dendrobium ist eine beliebte Zimmerorchidee mit langen Pseudobulben, die im Winter mit Blueten besetzt werden.",Helles indirektes Licht,15-28 °C,10,flowering|high_humidity,,,,, -flowering,constants/lexiconBatch2.ts,189,Bartnelke,Dianthus barbatus,"Bartnelke ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch2.ts,146,Nelke,Dianthus caryophyllus,"Nelke ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch2.ts,109,Roter Fingerhut,Digitalis purpurea,"Der Rote Fingerhut hat hohe Bluetenstaende mit roehrenfoermigen, gepunkteten Blueten in Rosa. Wichtige Arzneipflanze.",Helles bis volles Licht,10-20 °C,7,flowering|medicinal,medicinal_requires_external_evidence,,,, -flowering,constants/lexiconBatch2.ts,106,Sonnenhut,Echinacea purpurea,"Der Sonnenhut ist eine beliebte Heilpflanze mit grossen, pinkfarbenen Blueten. Er staerkt das Immunsystem.",Helles bis volles Licht,15-25 °C,7,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, -flowering,constants/lexiconBatch1.ts,84,Koenigin der Nacht,Epiphyllum oxypetalum,"Die Koenigin der Nacht bluet nur eine einzige Nacht lang mit riesigen, intensiv duftenden weissen Blueten.",Indirektes Licht,18-27 °C,7,flowering|succulent,,,,, -flowering,constants/lexiconBatch2.ts,186,Kalifornischer Mohn,Eschscholzia californica,"Kalifornischer Mohn ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch2.ts,19,Christusdorn,Euphorbia milii,Der Christusdorn ist eine sukkulente Wolfsmilch mit stacheligen Zweigen und kleinen roten oder gelben Hochblaettern.,Helles bis volles Licht,15-28 °C,10,easy|flowering|succulent|sun,,,,, -flowering,constants/lexiconBatch2.ts,20,Weihnachtsstern,Euphorbia pulcherrima,Der Weihnachtsstern ist die klassische Winterpflanze mit leuchtend roten Hochblaettern. Er steht symbolisch fuer Weihnachten.,Helles indirektes Licht,15-22 °C,7,flowering,,,,, -flowering,constants/lexiconBatch2.ts,219,Forsythie,Forsythia x intermedia,Forsythie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|sun,,,,, -flowering,constants/lexiconBatch2.ts,169,Freesie,Freesia refracta,"Freesie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch1.ts,33,Fuchsie,Fuchsia hybrida,"Die Fuchsie haengt mit eleganten, zweifarbigen Blueten wie kleine Ohrringe herab. Ideal fuer Ampeln.",Helles indirektes Licht,14-22 °C,3,flowering|hanging,,,,, -flowering,constants/lexiconBatch2.ts,60,Triphylla-Fuchsie,Fuchsia triphylla,"Die Triphylla-Fuchsie hat lange, roehrenfoermige, orangefarbe Blueten in haengenden Trauben. Sehr exotisch.",Helles indirektes Licht,15-22 °C,3,flowering|hanging,,,,, -flowering,constants/lexiconBatch2.ts,196,Kokardenblume,Gaillardia aristata,"Kokardenblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch1.ts,22,Gardenie,Gardenia jasminoides,"Die Gardenie fasziniert mit cremefarbenen, intensiv duftenden Blueten. Anspruchsvoll in der Pflege.",Helles indirektes Licht,18-23 °C,5,flowering|high_humidity,,,,, -flowering,constants/lexiconBatch2.ts,190,Mittagsgold,Gazania rigens,"Mittagsgold ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch1.ts,32,Blutroter Storchschnabel,Geranium sanguineum,Der Blutrote Storchschnabel ist ein zierlicher Storchschnabel mit intensiv magentafarbenen Blueten.,Helles bis volles Licht,10-25 °C,7,easy|flowering,,,,, -flowering,constants/lexiconBatch1.ts,68,Gerbera,Gerbera jamesonii,"Die Gerbera ist eine farbenfrohe Schnittblume mit grossen, sonnenblumenaehnlichen Blueten. Sehr beliebt.",Helles bis volles Licht,15-25 °C,5,flowering|air_purifier|bright_light,air_purifier_requires_external_evidence,,,, -flowering,constants/lexiconBatch2.ts,161,Gladiole,Gladiolus hortulanus,"Gladiole ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch1.ts,96,Gloxinie,Gloxinia speciosa,"Die Gloxinie hat grosse, samtartige Blueten in Violett, Rosa oder Weiss mit farbigen Raendern.",Helles indirektes Licht,18-25 °C,5,flowering|high_humidity,,,,, -flowering,constants/lexiconBatch2.ts,36,Guzmania,Guzmania lingulata,"Die Guzmania ist eine Bromelie mit glänzenden, gruenen Blaettern und einem leuchtend roten, sternfoermigen Bluetenstand.",Helles indirektes Licht,18-27 °C,7,flowering|high_humidity,,,,, -flowering,constants/lexiconBatch2.ts,119,Zaubernuss,Hamamelis mollis,"Die Zaubernuss bluet im Winter mit fadendunnen, gelben Bluetenkranzeln, die bis -10 Grad standhalten.",Helles bis volles Licht,10-20 °C,10,flowering|medicinal,medicinal_requires_external_evidence,,,, -flowering,constants/lexiconBatch2.ts,141,Sonnenblume,Helianthus annuus,"Sonnenblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch2.ts,72,Heliconia,Heliconia psittacorum,"Die Heliconia hat leuchtend orangefarbe oder rote, bootsfoermige Hochblaetter. Eine exotische Tropenpflanze.",Helles bis volles Licht,20-30 °C,5,flowering|bright_light|high_humidity,,,,, -flowering,constants/lexiconBatch2.ts,191,Heliotrop,Heliotropium arborescens,"Heliotrop ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch2.ts,183,Lenzrose,Helleborus orientalis,"Lenzrose ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering,,,,, -flowering,constants/lexiconBatch2.ts,182,Taglilie,Hemerocallis fulva,"Taglilie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch1.ts,21,Hibiskus,Hibiscus rosa-sinensis,"Der Hibiskus begeistert mit grossen, trompetenfoermigen Blueten in Rot, Orange und Rosa.",Volles Sonnenlicht,18-28 °C,3,flowering|bright_light|sun,,,,, -flowering,constants/lexiconBatch2.ts,220,Gartenhibiskus,Hibiscus syriacus,Gartenhibiskus ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|sun,,,,, -flowering,constants/lexiconBatch1.ts,105,Ritterstern,Hippeastrum hybrid,"Der Ritterstern beeindruckt im Winter mit riesigen, trompetenfoermigen Blueten in Rot, Pink oder Weiss.",Helles bis volles Licht,18-25 °C,7,flowering|bright_light,,,,, -flowering,constants/lexiconBatch1.ts,58,Kleine Wachsblume,Hoya bella,"Die Kleine Wachsblume traegt zierliche, sternfoermige weisse Blueten mit rosa Mitte. Haengende Sukkulente.",Helles indirektes Licht,18-27 °C,10,flowering|succulent|hanging,,,,, -flowering,constants/lexiconBatch1.ts,57,Wachsblume,Hoya carnosa,"Die Wachsblume ist eine Kletterpflanze mit dicken, wachsartigen Blaettern und sternfoermigen, duftenden Blueten.",Helles indirektes Licht,16-27 °C,10,easy|flowering|succulent|hanging,,,,, -flowering,constants/lexiconBatch2.ts,159,Hasengloeckchen,Hyacinthoides non-scripta,"Hasengloeckchen ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch1.ts,108,Hyazinthe,Hyacinthus orientalis,"Die Hyazinthe bezaubert mit dichten Bluetenrispen und intensivem Duft in Blau, Rosa, Weiss oder Gelb.",Helles bis volles Licht,10-18 °C,5,easy|flowering,,,,, -flowering,constants/lexiconBatch2.ts,148,Hortensie,Hydrangea macrophylla,"Hortensie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Helles bis halbschattiges Licht,8-24 C,4,flowering|bright_light,,,,, -flowering,constants/lexiconBatch2.ts,105,Johanniskraut,Hypericum perforatum,Das Johanniskraut hat leuchtend gelbe Blueten und ist ein wichtiges Heilkraut gegen Depressionen und Stimmungstiefs.,Volles Sonnenlicht,10-25 °C,7,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, -flowering,constants/lexiconBatch2.ts,176,Gartenbalsamine,Impatiens balsamina,"Gartenbalsamine ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light,,,,, -flowering,constants/lexiconBatch2.ts,59,Neuguinea-Balsamine,Impatiens hawkeri,"Die Neuguinea-Balsamine hat grosse, leuchtende Blueten und ist sehr bluehfreudig. Ideal fuer Terrassen.",Helles indirektes Licht,18-27 °C,3,easy|flowering,,,,, -flowering,constants/lexiconBatch1.ts,20,Fleissiges Lieschen,Impatiens walleriana,Das Fleissige Lieschen bluet von Fruehling bis Herbst unermudlich in vielen Farben.,Helles indirektes Licht,16-24 °C,2,easy|flowering,,,,, -flowering,constants/lexiconBatch2.ts,156,Prunkwinde,Ipomoea purpurea,"Prunkwinde ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch2.ts,144,Bart-Iris,Iris germanica,"Bart-Iris ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch2.ts,211,Jacaranda,Jacaranda mimosifolia,Jacaranda ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|large,,,,, -flowering,constants/lexiconBatch1.ts,59,Jasmin,Jasminum polyanthum,"Der Jasmin ist eine Kletterpflanze mit intensiv duftenden, weissen Blueten. Er bluet im Winter und Fruehling.",Helles bis volles Licht,10-22 °C,5,flowering,,,,, -flowering,constants/lexiconBatch2.ts,172,Arabischer Jasmin,Jasminum sambac,"Arabischer Jasmin ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light,,,,, -flowering,constants/lexiconBatch1.ts,9,Kalanchoe,Kalanchoe blossfeldiana,"Die Kalanchoe ist eine beliebte Bluehpflanze mit leuchtenden Blueten in Rot, Orange, Gelb oder Rosa.",Helles bis volles Licht,15-25 °C,10,easy|flowering|succulent|sun,,,,, -flowering,constants/lexiconBatch2.ts,197,Traenendes Herz,Lamprocapnos spectabilis,"Traenendes Herz ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light,,,,, -flowering,constants/lexiconBatch2.ts,64,Wandelroeschen,Lantana camara,"Das Wandelroeschen hat kugelige Bluetenkoepfe, die die Farbe von Gelb ueber Orange zu Rot wechseln. Sehr attraktiv.",Volles Sonnenlicht,18-28 °C,5,flowering|bright_light|sun,,,,, -flowering,constants/lexiconBatch2.ts,158,Duftwicke,Lathyrus odoratus,"Duftwicke ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch2.ts,180,Bechermalve,Lavatera trimestris,"Bechermalve ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch2.ts,173,Margerite,Leucanthemum vulgare,"Margerite ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch2.ts,201,Shasta-Margerite,Leucanthemum x superbum,"Shasta-Margerite ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch2.ts,69,Ostertrompete,Lilium longiflorum,"Die Ostertrompete hat grosse, weisse, trichterfoermige Blueten mit intensivem Duft. Klassische Osterblume.",Helles bis volles Licht,15-25 °C,5,flowering|bright_light,,,,, -flowering,constants/lexiconBatch2.ts,62,Duftsteinrich,Lobularia maritima,"Der Duftsteinrich ist ein niedrig wachsendes Pflanzchen mit winzigen, weissen oder lilafarbenen Blueten und suessem Duft.",Helles bis volles Licht,10-22 °C,3,easy|flowering,,,,, -flowering,constants/lexiconBatch2.ts,171,Geissblatt,Lonicera japonica,"Geissblatt ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light,,,,, -flowering,constants/lexiconBatch2.ts,154,Lupine,Lupinus polyphyllus,"Lupine ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch2.ts,204,Magnolie,Magnolia grandiflora,Magnolie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|large,,,,, -flowering,constants/lexiconBatch1.ts,79,Mammillaria,Mammillaria zeilmanniana,"Die Mammillaria ist ein kompakter, kugelfoermiger Kaktus, der im Fruehling einen Kranz aus rosa Blueten traegt.",Volles Sonnenlicht,15-35 °C,14,easy|flowering|succulent|sun,,,,, -flowering,constants/lexiconBatch1.ts,75,Stiefmuetterchen-Orchidee,Miltoniopsis roezlii,"Die Stiefmuetterchen-Orchidee hat grosse, flache Blueten. Bevorzugt kuehle Temperaturen und hohe Luftfeuchtigkeit.",Indirektes Licht,15-22 °C,5,flowering|high_humidity,,,,, -flowering,constants/lexiconBatch2.ts,76,Schamkraut,Mimosa pudica,"Das Schamkraut faltet seine Blaettchen blitzschnell zusammen, wenn man sie beruehrt. Ein faszinierendes Erlebnis.",Helles bis volles Licht,20-28 °C,5,flowering|bright_light,,,,, -flowering,constants/lexiconBatch2.ts,179,Indianernessel,Monarda didyma,"Indianernessel ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch1.ts,109,Traubenhyazinthe,Muscari armeniacum,"Die Traubenhyazinthe bildet dichte Trauben aus kleinen, blauen bis violetten Gloeckchen. Zuverlaessige Fruejahrszwiebel.",Helles bis volles Licht,8-18 °C,7,easy|flowering,,,,, -flowering,constants/lexiconBatch2.ts,177,Vergissmeinnicht,Myosotis sylvatica,"Vergissmeinnicht ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch1.ts,106,Osterglocke,Narcissus pseudonarcissus,"Die Osterglocke ist der klassische Fruehjahrsblueher mit leuchtend gelben, trompetenfoermigen Blueten.",Helles bis volles Licht,10-18 °C,5,flowering,,,,, -flowering,constants/lexiconBatch2.ts,199,Nemesie,Nemesia strumosa,"Nemesie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch2.ts,37,Neoregelia,Neoregelia carolinae,"Die Neoregelia ist eine Bromelie, bei der das Herzblatt zur Bluetzeit leuchtend rot wird. Sehr dekorativ.",Helles bis volles Licht,18-27 °C,7,flowering|patterned|bright_light,,,,, -flowering,constants/lexiconBatch2.ts,120,Oleander,Nerium oleander,"Der Oleander ist ein mediteraner Strauch mit leuchtend roten, rosa oder weissen Blueten. Sehr hitzetolerant.",Volles Sonnenlicht,15-28 °C,7,flowering|bright_light|sun,,,,, -flowering,constants/lexiconBatch2.ts,193,Ziertabak,Nicotiana alata,"Ziertabak ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch1.ts,74,Tanzerinnen-Orchidee,Oncidium sphacelatum,"Die Tanzerinnen-Orchidee traegt lange Rispen mit Hunderten kleiner, gelb-brauner Blueten. Sehr reichliche Bluetracht.",Helles indirektes Licht,18-27 °C,7,flowering|high_humidity,,,,, -flowering,constants/lexiconBatch2.ts,200,Kapmargerite,Osteospermum ecklonis,"Kapmargerite ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch1.ts,54,Kleeblume,Oxalis triangularis,"Die Kleeblume hat tiefviolette, dreieckige Blaetter und zarte rosa Blueten. Sie faltet die Blaetter bei Dunkelheit.",Helles indirektes Licht,15-24 °C,7,flowering|patterned,,,,, -flowering,constants/lexiconBatch2.ts,143,Pfingstrose,Paeonia lactiflora,"Pfingstrose ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch2.ts,185,Mohn,Papaver rhoeas,"Mohn ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch1.ts,63,Passionsblume,Passiflora caerulea,"Die Passionsblume ist eine faszinierende Kletterpflanze mit komplex strukturierten, blau-weissen Blueten.",Helles bis volles Licht,15-27 °C,5,flowering,,,,, -flowering,constants/lexiconBatch2.ts,61,Efeu-Geranie,Pelargonium peltatum,"Die Efeu-Geranie hat efeufoermige, glaenzende Blaetter und bluet den ganzen Sommer in leuchtenden Farben.",Helles bis volles Licht,15-25 °C,5,easy|flowering|hanging|sun,,,,, -flowering,constants/lexiconBatch2.ts,174,Stehende Geranie,Pelargonium zonale,"Stehende Geranie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch1.ts,34,Petunie,Petunia hybrida,Die Petunie ist eine der beliebtesten Balkonpflanzen mit trichterfoermigen Blueten in unzaehligen Farben.,Volles Sonnenlicht,15-25 °C,2,easy|pet_friendly|flowering|sun,pet_friendly_requires_external_evidence,,,, -flowering,constants/lexiconBatch1.ts,69,Schmetterlingsorchidee,Phalaenopsis amabilis,Die Schmetterlingsorchidee ist die bekannteste Zimmerorchidee. Sie bluet bei guter Pflege monatelang.,Helles indirektes Licht,18-28 °C,10,flowering|high_humidity,,,,, -flowering,constants/lexiconBatch2.ts,165,Flammenblume,Phlox paniculata,"Flammenblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch2.ts,81,Fettkraut,Pinguicula grandiflora,"Das Fettkraut faengt Insekten mit klebrigen Blaettern. Es bluet mit violetten, sporenartigen Blueten.",Helles indirektes Licht,10-20 °C,5,flowering|high_humidity,,,,, -flowering,constants/lexiconBatch1.ts,61,Bleiwurz,Plumbago auriculata,"Die Bleiwurz ist ein halbimmergruener Strauch mit himmelblauen Blueten, der fast das ganze Jahr bluet.",Volles Sonnenlicht,15-27 °C,5,flowering|bright_light|sun,,,,, -flowering,constants/lexiconBatch2.ts,118,Tempel-Baum,Plumeria rubra,"Der Tempel-Baum hat intensiv duftende, sternfoermige Blueten in Weiss, Gelb oder Rosa. Klassische Tropenblume.",Volles Sonnenlicht,20-30 °C,7,flowering|tree|sun,,,,, -flowering,constants/lexiconBatch1.ts,36,Primel,Primula vulgaris,"Die Primel ist einer der ersten Fruehjahrs­boten mit lebhaften Blueten in Gelb, Pink, Rot und Lila.",Helles indirektes Licht,10-18 °C,4,flowering,,,,, -flowering,constants/lexiconBatch2.ts,71,Koenigs-Protea,Protea cynaroides,"Die Koenigs-Protea ist die Nationalblume Suedafrikas mit riesigen, imposanten Bluetenkoepfen. Eine echte Besonderheit.",Volles Sonnenlicht,10-25 °C,7,flowering|large|sun,,,,, -flowering,constants/lexiconBatch2.ts,88,Granatapfelbaum,Punica granatum,"Der Granatapfelbaum hat leuchtend rote Blueten und rote, essbare Fruechte mit rubinroten Kernen.",Volles Sonnenlicht,15-28 °C,7,flowering|tree|sun,,,,, -flowering,constants/lexiconBatch2.ts,162,Ranunkel,Ranunculus asiaticus,"Ranunkel ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch2.ts,170,Rhododendron,Rhododendron catawbiense,"Rhododendron ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|tree|bright_light,,,,, -flowering,constants/lexiconBatch1.ts,91,Japanische Azalee,Rhododendron simsii,"Die Japanische Azalee bluet im Winter und Fruehling ueppig mit leuchtend roten, rosa oder weissen Blueten.",Helles indirektes Licht,10-18 °C,4,flowering,,,,, -flowering,constants/lexiconBatch1.ts,66,Chinesische Rose,Rosa chinensis,Die Chinesische Rose ist eine der Stammarten vieler Gartenrosen und bluet fast ununterbrochen.,Volles Sonnenlicht,15-25 °C,5,flowering|sun,,,,, -flowering,constants/lexiconBatch2.ts,142,Rose,Rosa x hybrida,"Rose ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light|sun,,,,, -flowering,constants/lexiconBatch2.ts,167,Rudbeckie,Rudbeckia hirta,"Rudbeckie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch1.ts,94,Afrikanisches Veilchen,Saintpaulia ionantha,"Das Afrikanische Veilchen ist eine kleine, kompakte Bluehpflanze mit samtigen Blaettern und violetten Blueten.",Helles indirektes Licht,18-25 °C,7,easy|flowering,,,,, -flowering,constants/lexiconBatch2.ts,195,Mehlsalbei,Salvia farinacea,"Mehlsalbei ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch2.ts,168,Feuersalbei,Salvia splendens,"Feuersalbei ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch2.ts,112,Schwarzer Holunder,Sambucus nigra,Der Schwarze Holunder hat weisse Doldenbluten und schwarze Beeren. Die Fruechte werden fuer Sirup und Saft verwendet.,Helles bis volles Licht,10-25 °C,7,flowering|tree|medicinal,medicinal_requires_external_evidence,,,, -flowering,constants/lexiconBatch1.ts,8,Weihnachtskaktus,Schlumbergera truncata,"Der Weihnachtskaktus erfreut zur Weihnachtszeit mit leuchtenden Blueten in Rosa, Rot oder Weiss.",Helles indirektes Licht,15-21 °C,7,easy|flowering|succulent,,,,, -flowering,constants/lexiconBatch2.ts,222,Spierstrauch,Spiraea japonica,Spierstrauch ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|sun,,,,, -flowering,constants/lexiconBatch2.ts,25,Aasblume,Stapelia grandiflora,"Die Aasblume hat fleischige, gruene Staengel und riesige, sternfoermige Blueten mit aasartigem Duft.",Helles bis volles Licht,18-30 °C,14,flowering|succulent|sun,,,,, -flowering,constants/lexiconBatch1.ts,60,Madagaskar-Jasmin,Stephanotis floribunda,"Der Madagaskar-Jasmin hat dicke, glaenzende Blaetter und wachsweisse, intensiv duftende Blueten. Klassische Hochzeitsblume.",Helles indirektes Licht,18-25 °C,7,flowering,,,,, -flowering,constants/lexiconBatch1.ts,3,Paradiesvogelblume,Strelitzia reginae,"Die Paradiesvogelblume beeindruckt mit leuchtend orangefarbenen und blauen Blueten, die einem Vogel aehneln.",Volles Sonnenlicht,18-26 °C,7,flowering|large|sun,,,,, -flowering,constants/lexiconBatch1.ts,95,Drehfrucht,Streptocarpus hybridus,"Die Drehfrucht ist ein Gesneriengewaechs mit langen, gerippten Blaettern und trichterfoermigen Blueten in Lila oder Rosa.",Helles indirektes Licht,15-22 °C,7,flowering,,,,, -flowering,constants/lexiconBatch2.ts,166,Herbstaster,Symphyotrichum novi-belgii,"Herbstaster ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch2.ts,149,Flieder,Syringa vulgaris,"Flieder ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|tree|sun,,,,, -flowering,constants/lexiconBatch2.ts,66,Studentenblume,Tagetes patula,Die Studentenblume ist eine robuste Sommerblume mit orangen oder gelben Blueten. Sie haelt Schadlinge fern.,Volles Sonnenlicht,15-28 °C,3,easy|flowering|sun,,,,, -flowering,constants/lexiconBatch2.ts,151,Kapuzinerkresse,Tropaeolum majus,"Kapuzinerkresse ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch1.ts,107,Tulpe,Tulipa gesneriana,Die Tulpe ist eine der beliebtesten Fruehjahrsblueher mit kelchfoermigen Blueten in unzaehligen Farben.,Helles bis volles Licht,8-18 °C,5,easy|flowering,,,,, -flowering,constants/lexiconBatch2.ts,104,Baldrian,Valeriana officinalis,Baldrian ist ein bekanntes Heilkraut mit weissen bis roeslichen Blueten. Die Wurzeln werden zur Schlaffoerderung verwendet.,Helles bis volles Licht,15-25 °C,7,flowering|medicinal,medicinal_requires_external_evidence,,,, -flowering,constants/lexiconBatch1.ts,72,Vanda-Orchidee,Vanda coerulea,Die Vanda-Orchidee ist bekannt fuer ihre seltene blaue Bluetenfarbe. Epiphytische Orchidee mit grossen Blueten.,Helles bis volles Licht,20-30 °C,3,flowering|bright_light|high_humidity,,,,, -flowering,constants/lexiconBatch1.ts,76,Vanille,Vanilla planifolia,"Die Vanille ist eine kletternde Orchidee, aus deren Fruechten das beliebte Gewuerz gewonnen wird.",Helles indirektes Licht,20-30 °C,5,flowering|high_humidity,,,,, -flowering,constants/lexiconBatch2.ts,192,Koenigskerze,Verbascum thapsus,"Koenigskerze ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, -flowering,constants/lexiconBatch2.ts,164,Eisenkraut,Verbena bonariensis,"Eisenkraut ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch2.ts,198,Hornveilchen,Viola cornuta,"Hornveilchen ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch1.ts,35,Stiefmuetterchen,Viola wittrockiana,Das Stiefmuetterchen ist ein bekannter Fruehjahrsblueher mit charakteristisch gezeichneten Blueten.,Helles bis volles Licht,5-18 °C,3,easy|flowering,,,,, -flowering,constants/lexiconBatch2.ts,35,Flammen-Bromelie,Vriesea splendens,"Die Flammen-Bromelie hat gebänderte, dunkelgruene Blaetter und einen spektakulaeren, roten Bluetenstand.",Helles indirektes Licht,18-25 °C,7,flowering|patterned|high_humidity,,,,, -flowering,constants/lexiconBatch2.ts,221,Weigelie,Weigela florida,Weigelie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|sun,,,,, -flowering,constants/lexiconBatch1.ts,65,Chinesischer Blauregen,Wisteria sinensis,"Der Chinesische Blauregen ist ein ueppiger Kletterkuenstler mit langen, duftenden Bluetentrauben in Lila.",Volles Sonnenlicht,10-25 °C,7,flowering|large|sun,,,,, -flowering,constants/lexiconBatch2.ts,70,Calla,Zantedeschia aethiopica,"Die Calla hat elegante, trichterfoermige weisse Hochblaetter und glaenzende, herzfoermige Blaetter. Sehr edel.",Helles indirektes Licht,15-24 °C,7,flowering|high_humidity,,,,, -flowering,constants/lexiconBatch2.ts,65,Zinnie,Zinnia elegans,"Die Zinnie ist eine leuchtende Sommerblume mit grossen, dahlienaehnlichen Blueten. Sehr robust und hitzetolerant.",Volles Sonnenlicht,18-30 °C,3,easy|flowering|sun,,,,, +category,source_file,source_index,name,botanical_name,description,light,temp,water_interval_days,all_categories,risk_flags,audit_status,evidence_source,evidence_url,notes +flowering,constants/lexiconBatch2.ts,108,Schafgarbe,Achillea millefolium,Die Schafgarbe hat weisse oder rosafarbene Bluetenschirme und fein gefiederte Blaetter. Wichtige Heilpflanze.,Volles Sonnenlicht,10-25 °C,7,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, +flowering,constants/lexiconBatch1.ts,86,Wuestenrose,Adenium obesum,Die Wuestenrose ist eine sukkulente Zimmerpflanze mit dickem Stamm und leuchtend pinken Blueten.,Volles Sonnenlicht,20-35 °C,10,flowering|succulent|sun,,,,, +flowering,constants/lexiconBatch2.ts,117,Socotra-Wuestenrose,Adenium socotranum,"Die Socotra-Wuestenrose ist eine seltene, endemische Art mit einem sehr dicken, knolligen Stamm und rosa Blueten.",Volles Sonnenlicht,20-35 °C,14,flowering|succulent|sun,,,,, +flowering,constants/lexiconBatch2.ts,34,Silbervase,Aechmea fasciata,Die Silbervase ist eine Bromelie mit silbrig gebänderten Blaettern und einem rosafarbenen Bluetenstand.,Helles indirektes Licht,18-25 °C,10,flowering|patterned,,,,, +flowering,constants/lexiconBatch1.ts,98,Lippenstiftpflanze,Aeschynanthus radicans,Die Lippenstiftpflanze hat haengende Triebe mit glaenzenden Blaettern und leuchtend roten Roehrenbluten.,Helles indirektes Licht,18-27 °C,7,flowering|hanging|high_humidity,,,,, +flowering,constants/lexiconBatch2.ts,155,Stockrose,Alcea rosea,"Stockrose ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch2.ts,73,Muschelingwer,Alpinia zerumbet,"Der Muschelingwer hat lange, elegante Blaetter und haengende Bluetenrispen mit weiss-rosa Bluetchen.",Helles bis volles Licht,20-30 °C,5,flowering|large|high_humidity,,,,, +flowering,constants/lexiconBatch2.ts,194,Fuchsschwanz,Amaranthus caudatus,"Fuchsschwanz ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch2.ts,163,Anemone,Anemone coronaria,"Anemone ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch2.ts,147,Loewenmaeulchen,Antirrhinum majus,"Loewenmaeulchen ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch2.ts,107,Arnika,Arnica montana,Arnika ist eine bekannte Heilpflanze aus den Alpen mit goldgelben Korbbluten. Sie wird fuer Muskeln und Gelenke verwendet.,Volles Sonnenlicht,10-20 °C,7,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, +flowering,constants/lexiconBatch2.ts,178,Seidenpflanze,Asclepias tuberosa,"Seidenpflanze ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch1.ts,92,Indische Azalee,Azalea indica,"Die Indische Azalee ist ein beliebter Zierstrauch mit grossen, auffaelligen Blueten in Rosa- und Rottönen.",Helles indirektes Licht,10-20 °C,4,flowering,,,,, +flowering,constants/lexiconBatch2.ts,175,Eisbegonie,Begonia semperflorens-cultorum,"Eisbegonie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light,,,,, +flowering,constants/lexiconBatch2.ts,58,Knollen-Begonie,Begonia tuberhybrida,"Die Knollen-Begonie hat riesige, rosenaehnliche Blueten in leuchtendem Rot, Orange, Gelb oder Weiss.",Helles indirektes Licht,15-22 °C,5,flowering|high_humidity,,,,, +flowering,constants/lexiconBatch2.ts,145,Gaensebluemchen,Bellis perennis,"Gaensebluemchen ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch2.ts,38,Billbergia,Billbergia nutans,"Die Billbergia ist eine robuste Bromelie mit schmalen, gruenen Blaettern und hängenden, blauen und gruenen Blueten.",Helles indirektes Licht,15-25 °C,7,easy|flowering,,,,, +flowering,constants/lexiconBatch1.ts,62,Bougainvillea,Bougainvillea spectabilis,"Die Bougainvillea ist eine rankenreiche Kletterpflanze mit leuchtend farbigen Hochblaettern in Rot, Orange oder Pink.",Volles Sonnenlicht,18-30 °C,5,flowering|bright_light|sun,,,,, +flowering,constants/lexiconBatch2.ts,223,Schmetterlingsflieder,Buddleja davidii,Schmetterlingsflieder ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|sun,,,,, +flowering,constants/lexiconBatch2.ts,187,Ringelblume,Calendula officinalis,"Ringelblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, +flowering,constants/lexiconBatch2.ts,63,Calibrachoa,Calibrachoa hybrida,"Calibrachoa ist eine petunienaehnliche Haengepflanze mit unzaehligen, kleinen Trichterbluten in allen Farben.",Volles Sonnenlicht,15-25 °C,2,easy|flowering|hanging|sun,,,,, +flowering,constants/lexiconBatch1.ts,93,Kamelie,Camellia japonica,Die Kamelie ist ein eleganter Zierstrauch mit glaenzenden Blaettern und rosenaehnlichen Blueten von Januar bis April.,Helles indirektes Licht,7-18 °C,5,flowering,,,,, +flowering,constants/lexiconBatch2.ts,85,Teestrauch,Camellia sinensis,"Der Teestrauch ist die Pflanze, aus deren Blaettern Tee gewonnen wird. Er hat weisse Blueten und glaenzende Blaetter.",Helles indirektes Licht,15-22 °C,7,flowering,,,,, +flowering,constants/lexiconBatch2.ts,184,Trompetenwinde,Campsis radicans,"Trompetenwinde ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light,,,,, +flowering,constants/lexiconBatch2.ts,67,Blumenschilfrohr,Canna indica,"Das Blumenschilfrohr hat grosse, tropisch wirkende Blaetter und auffaellige Blueten in Rot, Orange oder Gelb.",Volles Sonnenlicht,18-28 °C,5,flowering|large|sun,,,,, +flowering,constants/lexiconBatch1.ts,73,Cattleya-Orchidee,Cattleya labiata,"Die Cattleya ist die Koenigin der Orchideen mit ueppigen, duftenden Blueten in Lila, Rosa und Weiss.",Helles indirektes Licht,18-28 °C,7,flowering|high_humidity,,,,, +flowering,constants/lexiconBatch2.ts,188,Kornblume,Centaurea cyanus,"Kornblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch1.ts,67,Chrysantheme,Chrysanthemum indicum,"Die Chrysantheme ist die klassische Herbstblume mit ueppigen, dichten Blueten in vielen Farben.",Helles bis volles Licht,12-22 °C,4,flowering,,,,, +flowering,constants/lexiconBatch2.ts,157,Clematis,Clematis viticella,"Clematis ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light,,,,, +flowering,constants/lexiconBatch1.ts,104,Riemenblatt,Clivia miniata,Das Riemenblatt ist eine dekorative Zimmerpflanze mit leuchtend orangefarbenen Blueten im Fruehling.,Helles indirektes Licht,15-24 °C,10,flowering,,,,, +flowering,constants/lexiconBatch1.ts,97,Columnea,Columnea gloriosa,"Die Columnea ist eine haengende Zimmerpflanze mit kleinen, behaarten Blaettern und leuchtend roten, roehrenfoermigen Blueten.",Helles indirektes Licht,18-25 °C,7,flowering|hanging|high_humidity,,,,, +flowering,constants/lexiconBatch2.ts,160,Maigloeckchen,Convallaria majalis,"Maigloeckchen ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|medicinal,medicinal_requires_external_evidence,,,, +flowering,constants/lexiconBatch2.ts,181,Maedchenauge,Coreopsis tinctoria,"Maedchenauge ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch2.ts,150,Kosmee,Cosmos bipinnatus,"Kosmee ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch1.ts,110,Krokus,Crocus vernus,"Der Krokus ist einer der ersten Fruehjahrs­boten mit kelchfoermigen Blueten in Lila, Weiss und Gelb.",Helles bis volles Licht,5-15 °C,7,easy|flowering,,,,, +flowering,constants/lexiconBatch1.ts,19,Alpenveilchen,Cyclamen persicum,"Das Alpenveilchen bluet im Herbst und Winter mit eleganten Blueten in Rosa, Rot oder Weiss.",Helles indirektes Licht,12-18 °C,5,flowering,,,,, +flowering,constants/lexiconBatch1.ts,71,Zymbidium,Cymbidium lowianum,"Das Zymbidium ist eine robuste Orchidee mit langen, grassartigen Blaettern und eleganten Bluetenrispen.",Helles Licht,12-24 °C,7,flowering,,,,, +flowering,constants/lexiconBatch2.ts,68,Dahlie,Dahlia pinnata,Die Dahlie ist eine prachtvolle Sommerblume mit Blueten in allen Groessen und Formen. Sie wird aus Knollen gezogen.,Volles Sonnenlicht,15-25 °C,5,flowering|sun,,,,, +flowering,constants/lexiconBatch2.ts,215,Flammenbaum,Delonix regia,Flammenbaum ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|large,,,,, +flowering,constants/lexiconBatch2.ts,153,Rittersporn,Delphinium elatum,"Rittersporn ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch1.ts,70,Dendrobium,Dendrobium nobile,"Das Dendrobium ist eine beliebte Zimmerorchidee mit langen Pseudobulben, die im Winter mit Blueten besetzt werden.",Helles indirektes Licht,15-28 °C,10,flowering|high_humidity,,,,, +flowering,constants/lexiconBatch2.ts,189,Bartnelke,Dianthus barbatus,"Bartnelke ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch2.ts,146,Nelke,Dianthus caryophyllus,"Nelke ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch2.ts,109,Roter Fingerhut,Digitalis purpurea,"Der Rote Fingerhut hat hohe Bluetenstaende mit roehrenfoermigen, gepunkteten Blueten in Rosa. Wichtige Arzneipflanze.",Helles bis volles Licht,10-20 °C,7,flowering|medicinal,medicinal_requires_external_evidence,,,, +flowering,constants/lexiconBatch2.ts,106,Sonnenhut,Echinacea purpurea,"Der Sonnenhut ist eine beliebte Heilpflanze mit grossen, pinkfarbenen Blueten. Er staerkt das Immunsystem.",Helles bis volles Licht,15-25 °C,7,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, +flowering,constants/lexiconBatch1.ts,84,Koenigin der Nacht,Epiphyllum oxypetalum,"Die Koenigin der Nacht bluet nur eine einzige Nacht lang mit riesigen, intensiv duftenden weissen Blueten.",Indirektes Licht,18-27 °C,7,flowering|succulent,,,,, +flowering,constants/lexiconBatch2.ts,186,Kalifornischer Mohn,Eschscholzia californica,"Kalifornischer Mohn ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch2.ts,19,Christusdorn,Euphorbia milii,Der Christusdorn ist eine sukkulente Wolfsmilch mit stacheligen Zweigen und kleinen roten oder gelben Hochblaettern.,Helles bis volles Licht,15-28 °C,10,easy|flowering|succulent|sun,,,,, +flowering,constants/lexiconBatch2.ts,20,Weihnachtsstern,Euphorbia pulcherrima,Der Weihnachtsstern ist die klassische Winterpflanze mit leuchtend roten Hochblaettern. Er steht symbolisch fuer Weihnachten.,Helles indirektes Licht,15-22 °C,7,flowering,,,,, +flowering,constants/lexiconBatch2.ts,219,Forsythie,Forsythia x intermedia,Forsythie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|sun,,,,, +flowering,constants/lexiconBatch2.ts,169,Freesie,Freesia refracta,"Freesie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch1.ts,33,Fuchsie,Fuchsia hybrida,"Die Fuchsie haengt mit eleganten, zweifarbigen Blueten wie kleine Ohrringe herab. Ideal fuer Ampeln.",Helles indirektes Licht,14-22 °C,3,flowering|hanging,,,,, +flowering,constants/lexiconBatch2.ts,60,Triphylla-Fuchsie,Fuchsia triphylla,"Die Triphylla-Fuchsie hat lange, roehrenfoermige, orangefarbe Blueten in haengenden Trauben. Sehr exotisch.",Helles indirektes Licht,15-22 °C,3,flowering|hanging,,,,, +flowering,constants/lexiconBatch2.ts,196,Kokardenblume,Gaillardia aristata,"Kokardenblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch1.ts,22,Gardenie,Gardenia jasminoides,"Die Gardenie fasziniert mit cremefarbenen, intensiv duftenden Blueten. Anspruchsvoll in der Pflege.",Helles indirektes Licht,18-23 °C,5,flowering|high_humidity,,,,, +flowering,constants/lexiconBatch2.ts,190,Mittagsgold,Gazania rigens,"Mittagsgold ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch1.ts,32,Blutroter Storchschnabel,Geranium sanguineum,Der Blutrote Storchschnabel ist ein zierlicher Storchschnabel mit intensiv magentafarbenen Blueten.,Helles bis volles Licht,10-25 °C,7,easy|flowering,,,,, +flowering,constants/lexiconBatch1.ts,68,Gerbera,Gerbera jamesonii,"Die Gerbera ist eine farbenfrohe Schnittblume mit grossen, sonnenblumenaehnlichen Blueten. Sehr beliebt.",Helles bis volles Licht,15-25 °C,5,flowering|air_purifier|bright_light,air_purifier_requires_external_evidence,,,, +flowering,constants/lexiconBatch2.ts,161,Gladiole,Gladiolus hortulanus,"Gladiole ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch1.ts,96,Gloxinie,Gloxinia speciosa,"Die Gloxinie hat grosse, samtartige Blueten in Violett, Rosa oder Weiss mit farbigen Raendern.",Helles indirektes Licht,18-25 °C,5,flowering|high_humidity,,,,, +flowering,constants/lexiconBatch2.ts,36,Guzmania,Guzmania lingulata,"Die Guzmania ist eine Bromelie mit glänzenden, gruenen Blaettern und einem leuchtend roten, sternfoermigen Bluetenstand.",Helles indirektes Licht,18-27 °C,7,flowering|high_humidity,,,,, +flowering,constants/lexiconBatch2.ts,119,Zaubernuss,Hamamelis mollis,"Die Zaubernuss bluet im Winter mit fadendunnen, gelben Bluetenkranzeln, die bis -10 Grad standhalten.",Helles bis volles Licht,10-20 °C,10,flowering|medicinal,medicinal_requires_external_evidence,,,, +flowering,constants/lexiconBatch2.ts,141,Sonnenblume,Helianthus annuus,"Sonnenblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch2.ts,72,Heliconia,Heliconia psittacorum,"Die Heliconia hat leuchtend orangefarbe oder rote, bootsfoermige Hochblaetter. Eine exotische Tropenpflanze.",Helles bis volles Licht,20-30 °C,5,flowering|bright_light|high_humidity,,,,, +flowering,constants/lexiconBatch2.ts,191,Heliotrop,Heliotropium arborescens,"Heliotrop ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch2.ts,183,Lenzrose,Helleborus orientalis,"Lenzrose ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering,,,,, +flowering,constants/lexiconBatch2.ts,182,Taglilie,Hemerocallis fulva,"Taglilie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch1.ts,21,Hibiskus,Hibiscus rosa-sinensis,"Der Hibiskus begeistert mit grossen, trompetenfoermigen Blueten in Rot, Orange und Rosa.",Volles Sonnenlicht,18-28 °C,3,flowering|bright_light|sun,,,,, +flowering,constants/lexiconBatch2.ts,220,Gartenhibiskus,Hibiscus syriacus,Gartenhibiskus ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|sun,,,,, +flowering,constants/lexiconBatch1.ts,105,Ritterstern,Hippeastrum hybrid,"Der Ritterstern beeindruckt im Winter mit riesigen, trompetenfoermigen Blueten in Rot, Pink oder Weiss.",Helles bis volles Licht,18-25 °C,7,flowering|bright_light,,,,, +flowering,constants/lexiconBatch1.ts,58,Kleine Wachsblume,Hoya bella,"Die Kleine Wachsblume traegt zierliche, sternfoermige weisse Blueten mit rosa Mitte. Haengende Sukkulente.",Helles indirektes Licht,18-27 °C,10,flowering|succulent|hanging,,,,, +flowering,constants/lexiconBatch1.ts,57,Wachsblume,Hoya carnosa,"Die Wachsblume ist eine Kletterpflanze mit dicken, wachsartigen Blaettern und sternfoermigen, duftenden Blueten.",Helles indirektes Licht,16-27 °C,10,easy|flowering|succulent|hanging,,,,, +flowering,constants/lexiconBatch2.ts,159,Hasengloeckchen,Hyacinthoides non-scripta,"Hasengloeckchen ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch1.ts,108,Hyazinthe,Hyacinthus orientalis,"Die Hyazinthe bezaubert mit dichten Bluetenrispen und intensivem Duft in Blau, Rosa, Weiss oder Gelb.",Helles bis volles Licht,10-18 °C,5,easy|flowering,,,,, +flowering,constants/lexiconBatch2.ts,148,Hortensie,Hydrangea macrophylla,"Hortensie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Helles bis halbschattiges Licht,8-24 C,4,flowering|bright_light,,,,, +flowering,constants/lexiconBatch2.ts,105,Johanniskraut,Hypericum perforatum,Das Johanniskraut hat leuchtend gelbe Blueten und ist ein wichtiges Heilkraut gegen Depressionen und Stimmungstiefs.,Volles Sonnenlicht,10-25 °C,7,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, +flowering,constants/lexiconBatch2.ts,176,Gartenbalsamine,Impatiens balsamina,"Gartenbalsamine ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light,,,,, +flowering,constants/lexiconBatch2.ts,59,Neuguinea-Balsamine,Impatiens hawkeri,"Die Neuguinea-Balsamine hat grosse, leuchtende Blueten und ist sehr bluehfreudig. Ideal fuer Terrassen.",Helles indirektes Licht,18-27 °C,3,easy|flowering,,,,, +flowering,constants/lexiconBatch1.ts,20,Fleissiges Lieschen,Impatiens walleriana,Das Fleissige Lieschen bluet von Fruehling bis Herbst unermudlich in vielen Farben.,Helles indirektes Licht,16-24 °C,2,easy|flowering,,,,, +flowering,constants/lexiconBatch2.ts,156,Prunkwinde,Ipomoea purpurea,"Prunkwinde ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch2.ts,144,Bart-Iris,Iris germanica,"Bart-Iris ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch2.ts,211,Jacaranda,Jacaranda mimosifolia,Jacaranda ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|large,,,,, +flowering,constants/lexiconBatch1.ts,59,Jasmin,Jasminum polyanthum,"Der Jasmin ist eine Kletterpflanze mit intensiv duftenden, weissen Blueten. Er bluet im Winter und Fruehling.",Helles bis volles Licht,10-22 °C,5,flowering,,,,, +flowering,constants/lexiconBatch2.ts,172,Arabischer Jasmin,Jasminum sambac,"Arabischer Jasmin ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light,,,,, +flowering,constants/lexiconBatch1.ts,9,Kalanchoe,Kalanchoe blossfeldiana,"Die Kalanchoe ist eine beliebte Bluehpflanze mit leuchtenden Blueten in Rot, Orange, Gelb oder Rosa.",Helles bis volles Licht,15-25 °C,10,easy|flowering|succulent|sun,,,,, +flowering,constants/lexiconBatch2.ts,197,Traenendes Herz,Lamprocapnos spectabilis,"Traenendes Herz ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light,,,,, +flowering,constants/lexiconBatch2.ts,64,Wandelroeschen,Lantana camara,"Das Wandelroeschen hat kugelige Bluetenkoepfe, die die Farbe von Gelb ueber Orange zu Rot wechseln. Sehr attraktiv.",Volles Sonnenlicht,18-28 °C,5,flowering|bright_light|sun,,,,, +flowering,constants/lexiconBatch2.ts,158,Duftwicke,Lathyrus odoratus,"Duftwicke ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch2.ts,180,Bechermalve,Lavatera trimestris,"Bechermalve ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch2.ts,173,Margerite,Leucanthemum vulgare,"Margerite ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch2.ts,201,Shasta-Margerite,Leucanthemum x superbum,"Shasta-Margerite ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch2.ts,69,Ostertrompete,Lilium longiflorum,"Die Ostertrompete hat grosse, weisse, trichterfoermige Blueten mit intensivem Duft. Klassische Osterblume.",Helles bis volles Licht,15-25 °C,5,flowering|bright_light,,,,, +flowering,constants/lexiconBatch2.ts,62,Duftsteinrich,Lobularia maritima,"Der Duftsteinrich ist ein niedrig wachsendes Pflanzchen mit winzigen, weissen oder lilafarbenen Blueten und suessem Duft.",Helles bis volles Licht,10-22 °C,3,easy|flowering,,,,, +flowering,constants/lexiconBatch2.ts,171,Geissblatt,Lonicera japonica,"Geissblatt ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light,,,,, +flowering,constants/lexiconBatch2.ts,154,Lupine,Lupinus polyphyllus,"Lupine ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch2.ts,204,Magnolie,Magnolia grandiflora,Magnolie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|large,,,,, +flowering,constants/lexiconBatch1.ts,79,Mammillaria,Mammillaria zeilmanniana,"Die Mammillaria ist ein kompakter, kugelfoermiger Kaktus, der im Fruehling einen Kranz aus rosa Blueten traegt.",Volles Sonnenlicht,15-35 °C,14,easy|flowering|succulent|sun,,,,, +flowering,constants/lexiconBatch1.ts,75,Stiefmuetterchen-Orchidee,Miltoniopsis roezlii,"Die Stiefmuetterchen-Orchidee hat grosse, flache Blueten. Bevorzugt kuehle Temperaturen und hohe Luftfeuchtigkeit.",Indirektes Licht,15-22 °C,5,flowering|high_humidity,,,,, +flowering,constants/lexiconBatch2.ts,76,Schamkraut,Mimosa pudica,"Das Schamkraut faltet seine Blaettchen blitzschnell zusammen, wenn man sie beruehrt. Ein faszinierendes Erlebnis.",Helles bis volles Licht,20-28 °C,5,flowering|bright_light,,,,, +flowering,constants/lexiconBatch2.ts,179,Indianernessel,Monarda didyma,"Indianernessel ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch1.ts,109,Traubenhyazinthe,Muscari armeniacum,"Die Traubenhyazinthe bildet dichte Trauben aus kleinen, blauen bis violetten Gloeckchen. Zuverlaessige Fruejahrszwiebel.",Helles bis volles Licht,8-18 °C,7,easy|flowering,,,,, +flowering,constants/lexiconBatch2.ts,177,Vergissmeinnicht,Myosotis sylvatica,"Vergissmeinnicht ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch1.ts,106,Osterglocke,Narcissus pseudonarcissus,"Die Osterglocke ist der klassische Fruehjahrsblueher mit leuchtend gelben, trompetenfoermigen Blueten.",Helles bis volles Licht,10-18 °C,5,flowering,,,,, +flowering,constants/lexiconBatch2.ts,199,Nemesie,Nemesia strumosa,"Nemesie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch2.ts,37,Neoregelia,Neoregelia carolinae,"Die Neoregelia ist eine Bromelie, bei der das Herzblatt zur Bluetzeit leuchtend rot wird. Sehr dekorativ.",Helles bis volles Licht,18-27 °C,7,flowering|patterned|bright_light,,,,, +flowering,constants/lexiconBatch2.ts,120,Oleander,Nerium oleander,"Der Oleander ist ein mediteraner Strauch mit leuchtend roten, rosa oder weissen Blueten. Sehr hitzetolerant.",Volles Sonnenlicht,15-28 °C,7,flowering|bright_light|sun,,,,, +flowering,constants/lexiconBatch2.ts,193,Ziertabak,Nicotiana alata,"Ziertabak ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch1.ts,74,Tanzerinnen-Orchidee,Oncidium sphacelatum,"Die Tanzerinnen-Orchidee traegt lange Rispen mit Hunderten kleiner, gelb-brauner Blueten. Sehr reichliche Bluetracht.",Helles indirektes Licht,18-27 °C,7,flowering|high_humidity,,,,, +flowering,constants/lexiconBatch2.ts,200,Kapmargerite,Osteospermum ecklonis,"Kapmargerite ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch1.ts,54,Kleeblume,Oxalis triangularis,"Die Kleeblume hat tiefviolette, dreieckige Blaetter und zarte rosa Blueten. Sie faltet die Blaetter bei Dunkelheit.",Helles indirektes Licht,15-24 °C,7,flowering|patterned,,,,, +flowering,constants/lexiconBatch2.ts,143,Pfingstrose,Paeonia lactiflora,"Pfingstrose ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch2.ts,185,Mohn,Papaver rhoeas,"Mohn ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch1.ts,63,Passionsblume,Passiflora caerulea,"Die Passionsblume ist eine faszinierende Kletterpflanze mit komplex strukturierten, blau-weissen Blueten.",Helles bis volles Licht,15-27 °C,5,flowering,,,,, +flowering,constants/lexiconBatch2.ts,61,Efeu-Geranie,Pelargonium peltatum,"Die Efeu-Geranie hat efeufoermige, glaenzende Blaetter und bluet den ganzen Sommer in leuchtenden Farben.",Helles bis volles Licht,15-25 °C,5,easy|flowering|hanging|sun,,,,, +flowering,constants/lexiconBatch2.ts,174,Stehende Geranie,Pelargonium zonale,"Stehende Geranie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch1.ts,34,Petunie,Petunia hybrida,Die Petunie ist eine der beliebtesten Balkonpflanzen mit trichterfoermigen Blueten in unzaehligen Farben.,Volles Sonnenlicht,15-25 °C,2,easy|pet_friendly|flowering|sun,pet_friendly_requires_external_evidence,,,, +flowering,constants/lexiconBatch1.ts,69,Schmetterlingsorchidee,Phalaenopsis amabilis,Die Schmetterlingsorchidee ist die bekannteste Zimmerorchidee. Sie bluet bei guter Pflege monatelang.,Helles indirektes Licht,18-28 °C,10,flowering|high_humidity,,,,, +flowering,constants/lexiconBatch2.ts,165,Flammenblume,Phlox paniculata,"Flammenblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch2.ts,81,Fettkraut,Pinguicula grandiflora,"Das Fettkraut faengt Insekten mit klebrigen Blaettern. Es bluet mit violetten, sporenartigen Blueten.",Helles indirektes Licht,10-20 °C,5,flowering|high_humidity,,,,, +flowering,constants/lexiconBatch1.ts,61,Bleiwurz,Plumbago auriculata,"Die Bleiwurz ist ein halbimmergruener Strauch mit himmelblauen Blueten, der fast das ganze Jahr bluet.",Volles Sonnenlicht,15-27 °C,5,flowering|bright_light|sun,,,,, +flowering,constants/lexiconBatch2.ts,118,Tempel-Baum,Plumeria rubra,"Der Tempel-Baum hat intensiv duftende, sternfoermige Blueten in Weiss, Gelb oder Rosa. Klassische Tropenblume.",Volles Sonnenlicht,20-30 °C,7,flowering|tree|sun,,,,, +flowering,constants/lexiconBatch1.ts,36,Primel,Primula vulgaris,"Die Primel ist einer der ersten Fruehjahrs­boten mit lebhaften Blueten in Gelb, Pink, Rot und Lila.",Helles indirektes Licht,10-18 °C,4,flowering,,,,, +flowering,constants/lexiconBatch2.ts,71,Koenigs-Protea,Protea cynaroides,"Die Koenigs-Protea ist die Nationalblume Suedafrikas mit riesigen, imposanten Bluetenkoepfen. Eine echte Besonderheit.",Volles Sonnenlicht,10-25 °C,7,flowering|large|sun,,,,, +flowering,constants/lexiconBatch2.ts,88,Granatapfelbaum,Punica granatum,"Der Granatapfelbaum hat leuchtend rote Blueten und rote, essbare Fruechte mit rubinroten Kernen.",Volles Sonnenlicht,15-28 °C,7,flowering|tree|sun,,,,, +flowering,constants/lexiconBatch2.ts,162,Ranunkel,Ranunculus asiaticus,"Ranunkel ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch2.ts,170,Rhododendron,Rhododendron catawbiense,"Rhododendron ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|tree|bright_light,,,,, +flowering,constants/lexiconBatch1.ts,91,Japanische Azalee,Rhododendron simsii,"Die Japanische Azalee bluet im Winter und Fruehling ueppig mit leuchtend roten, rosa oder weissen Blueten.",Helles indirektes Licht,10-18 °C,4,flowering,,,,, +flowering,constants/lexiconBatch1.ts,66,Chinesische Rose,Rosa chinensis,Die Chinesische Rose ist eine der Stammarten vieler Gartenrosen und bluet fast ununterbrochen.,Volles Sonnenlicht,15-25 °C,5,flowering|sun,,,,, +flowering,constants/lexiconBatch2.ts,142,Rose,Rosa x hybrida,"Rose ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light|sun,,,,, +flowering,constants/lexiconBatch2.ts,167,Rudbeckie,Rudbeckia hirta,"Rudbeckie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch1.ts,94,Afrikanisches Veilchen,Saintpaulia ionantha,"Das Afrikanische Veilchen ist eine kleine, kompakte Bluehpflanze mit samtigen Blaettern und violetten Blueten.",Helles indirektes Licht,18-25 °C,7,easy|flowering,,,,, +flowering,constants/lexiconBatch2.ts,195,Mehlsalbei,Salvia farinacea,"Mehlsalbei ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch2.ts,168,Feuersalbei,Salvia splendens,"Feuersalbei ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch2.ts,112,Schwarzer Holunder,Sambucus nigra,Der Schwarze Holunder hat weisse Doldenbluten und schwarze Beeren. Die Fruechte werden fuer Sirup und Saft verwendet.,Helles bis volles Licht,10-25 °C,7,flowering|tree|medicinal,medicinal_requires_external_evidence,,,, +flowering,constants/lexiconBatch1.ts,8,Weihnachtskaktus,Schlumbergera truncata,"Der Weihnachtskaktus erfreut zur Weihnachtszeit mit leuchtenden Blueten in Rosa, Rot oder Weiss.",Helles indirektes Licht,15-21 °C,7,easy|flowering|succulent,,,,, +flowering,constants/lexiconBatch2.ts,222,Spierstrauch,Spiraea japonica,Spierstrauch ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|sun,,,,, +flowering,constants/lexiconBatch2.ts,25,Aasblume,Stapelia grandiflora,"Die Aasblume hat fleischige, gruene Staengel und riesige, sternfoermige Blueten mit aasartigem Duft.",Helles bis volles Licht,18-30 °C,14,flowering|succulent|sun,,,,, +flowering,constants/lexiconBatch1.ts,60,Madagaskar-Jasmin,Stephanotis floribunda,"Der Madagaskar-Jasmin hat dicke, glaenzende Blaetter und wachsweisse, intensiv duftende Blueten. Klassische Hochzeitsblume.",Helles indirektes Licht,18-25 °C,7,flowering,,,,, +flowering,constants/lexiconBatch1.ts,3,Paradiesvogelblume,Strelitzia reginae,"Die Paradiesvogelblume beeindruckt mit leuchtend orangefarbenen und blauen Blueten, die einem Vogel aehneln.",Volles Sonnenlicht,18-26 °C,7,flowering|large|sun,,,,, +flowering,constants/lexiconBatch1.ts,95,Drehfrucht,Streptocarpus hybridus,"Die Drehfrucht ist ein Gesneriengewaechs mit langen, gerippten Blaettern und trichterfoermigen Blueten in Lila oder Rosa.",Helles indirektes Licht,15-22 °C,7,flowering,,,,, +flowering,constants/lexiconBatch2.ts,166,Herbstaster,Symphyotrichum novi-belgii,"Herbstaster ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch2.ts,149,Flieder,Syringa vulgaris,"Flieder ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|tree|sun,,,,, +flowering,constants/lexiconBatch2.ts,66,Studentenblume,Tagetes patula,Die Studentenblume ist eine robuste Sommerblume mit orangen oder gelben Blueten. Sie haelt Schadlinge fern.,Volles Sonnenlicht,15-28 °C,3,easy|flowering|sun,,,,, +flowering,constants/lexiconBatch2.ts,151,Kapuzinerkresse,Tropaeolum majus,"Kapuzinerkresse ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch1.ts,107,Tulpe,Tulipa gesneriana,Die Tulpe ist eine der beliebtesten Fruehjahrsblueher mit kelchfoermigen Blueten in unzaehligen Farben.,Helles bis volles Licht,8-18 °C,5,easy|flowering,,,,, +flowering,constants/lexiconBatch2.ts,104,Baldrian,Valeriana officinalis,Baldrian ist ein bekanntes Heilkraut mit weissen bis roeslichen Blueten. Die Wurzeln werden zur Schlaffoerderung verwendet.,Helles bis volles Licht,15-25 °C,7,flowering|medicinal,medicinal_requires_external_evidence,,,, +flowering,constants/lexiconBatch1.ts,72,Vanda-Orchidee,Vanda coerulea,Die Vanda-Orchidee ist bekannt fuer ihre seltene blaue Bluetenfarbe. Epiphytische Orchidee mit grossen Blueten.,Helles bis volles Licht,20-30 °C,3,flowering|bright_light|high_humidity,,,,, +flowering,constants/lexiconBatch1.ts,76,Vanille,Vanilla planifolia,"Die Vanille ist eine kletternde Orchidee, aus deren Fruechten das beliebte Gewuerz gewonnen wird.",Helles indirektes Licht,20-30 °C,5,flowering|high_humidity,,,,, +flowering,constants/lexiconBatch2.ts,192,Koenigskerze,Verbascum thapsus,"Koenigskerze ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, +flowering,constants/lexiconBatch2.ts,164,Eisenkraut,Verbena bonariensis,"Eisenkraut ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch2.ts,198,Hornveilchen,Viola cornuta,"Hornveilchen ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch1.ts,35,Stiefmuetterchen,Viola wittrockiana,Das Stiefmuetterchen ist ein bekannter Fruehjahrsblueher mit charakteristisch gezeichneten Blueten.,Helles bis volles Licht,5-18 °C,3,easy|flowering,,,,, +flowering,constants/lexiconBatch2.ts,35,Flammen-Bromelie,Vriesea splendens,"Die Flammen-Bromelie hat gebänderte, dunkelgruene Blaetter und einen spektakulaeren, roten Bluetenstand.",Helles indirektes Licht,18-25 °C,7,flowering|patterned|high_humidity,,,,, +flowering,constants/lexiconBatch2.ts,221,Weigelie,Weigela florida,Weigelie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|sun,,,,, +flowering,constants/lexiconBatch1.ts,65,Chinesischer Blauregen,Wisteria sinensis,"Der Chinesische Blauregen ist ein ueppiger Kletterkuenstler mit langen, duftenden Bluetentrauben in Lila.",Volles Sonnenlicht,10-25 °C,7,flowering|large|sun,,,,, +flowering,constants/lexiconBatch2.ts,70,Calla,Zantedeschia aethiopica,"Die Calla hat elegante, trichterfoermige weisse Hochblaetter und glaenzende, herzfoermige Blaetter. Sehr edel.",Helles indirektes Licht,15-24 °C,7,flowering|high_humidity,,,,, +flowering,constants/lexiconBatch2.ts,65,Zinnie,Zinnia elegans,"Die Zinnie ist eine leuchtende Sommerblume mit grossen, dahlienaehnlichen Blueten. Sehr robust und hitzetolerant.",Volles Sonnenlicht,18-30 °C,3,easy|flowering|sun,,,,, diff --git a/audits/semantic-search/categories/hanging.csv b/audits/semantic-search/categories/hanging.csv index dc38e3c..c00e162 100644 --- a/audits/semantic-search/categories/hanging.csv +++ b/audits/semantic-search/categories/hanging.csv @@ -1,35 +1,35 @@ -category,source_file,source_index,name,botanical_name,description,light,temp,water_interval_days,all_categories,risk_flags,audit_status,evidence_source,evidence_url,notes -hanging,constants/lexiconBatch1.ts,98,Lippenstiftpflanze,Aeschynanthus radicans,Die Lippenstiftpflanze hat haengende Triebe mit glaenzenden Blaettern und leuchtend roten Roehrenbluten.,Helles indirektes Licht,18-27 °C,7,flowering|hanging|high_humidity,,,,, -hanging,constants/lexiconBatch2.ts,63,Calibrachoa,Calibrachoa hybrida,"Calibrachoa ist eine petunienaehnliche Haengepflanze mit unzaehligen, kleinen Trichterbluten in allen Farben.",Volles Sonnenlicht,15-25 °C,2,easy|flowering|hanging|sun,,,,, -hanging,constants/lexiconBatch2.ts,56,Callisia,Callisia repens,"Callisia repens ist ein kleines, kriechendes Kraut mit winzigen, gruenen Blaettern. Ideal fuer haengende Behaelter.",Helles indirektes Licht,15-25 °C,5,easy|hanging,,,,, -hanging,constants/lexiconBatch1.ts,99,Herzkette,Ceropegia woodii,"Die Herzkette hat duenne, haengende Ranken mit herzfoermigen, silbergrau gemusterten Blaettchen.",Helles indirektes Licht,15-27 °C,14,easy|succulent|patterned|hanging,,,,, -hanging,constants/lexiconBatch1.ts,97,Columnea,Columnea gloriosa,"Die Columnea ist eine haengende Zimmerpflanze mit kleinen, behaarten Blaettern und leuchtend roten, roehrenfoermigen Blueten.",Helles indirektes Licht,18-25 °C,7,flowering|hanging|high_humidity,,,,, -hanging,constants/lexiconBatch2.ts,236,String of Bananas,Curio radicans,String of Bananas ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles bis volles Licht,18-30 C,10,succulent|hanging|sun,,,,, -hanging,constants/lexiconBatch2.ts,237,String of Dolphins,Curio x peregrinus,String of Dolphins ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles bis volles Licht,18-30 C,10,succulent|hanging|sun,,,,, -hanging,constants/lexiconBatch1.ts,101,Dischidia,Dischidia ruscifolia,"Die Dischidia ist eine epiphytische Haengepflanze mit kleinen, runden Blaettern entlang duenner Ranken.",Helles indirektes Licht,18-27 °C,7,succulent|hanging,,,,, -hanging,constants/lexiconBatch1.ts,16,Marmor-Efeutute,Epipremnum aureum Marble Queen,Die Marmor-Efeutute hat cremeweiss-gruen marmorierte Blaetter. Eine dekorative Variante der klassischen Efeutute.,Helles indirektes Licht,15-30 °C,7,easy|hanging|air_purifier,air_purifier_requires_external_evidence,,,, -hanging,constants/lexiconBatch2.ts,53,Neon-Efeutute,Epipremnum pinnatum Neon,Die Neon-Efeutute hat leuchtend limonengruene Blaetter. Sehr auffaellig und pflegeleicht.,Helles indirektes Licht,15-30 °C,7,easy|hanging|air_purifier,air_purifier_requires_external_evidence,,,, -hanging,constants/lexiconBatch1.ts,33,Fuchsie,Fuchsia hybrida,"Die Fuchsie haengt mit eleganten, zweifarbigen Blueten wie kleine Ohrringe herab. Ideal fuer Ampeln.",Helles indirektes Licht,14-22 °C,3,flowering|hanging,,,,, -hanging,constants/lexiconBatch2.ts,60,Triphylla-Fuchsie,Fuchsia triphylla,"Die Triphylla-Fuchsie hat lange, roehrenfoermige, orangefarbe Blueten in haengenden Trauben. Sehr exotisch.",Helles indirektes Licht,15-22 °C,3,flowering|hanging,,,,, -hanging,constants/lexiconBatch1.ts,37,Efeu,Hedera helix,"Efeu ist eine robuste Kletter- und Haengepflanze mit charakteristischen, dreilappigen Blaettern. Sehr langlebig.",Wenig bis helles Licht,10-20 °C,7,easy|hanging|air_purifier|low_light,air_purifier_requires_external_evidence,,,, -hanging,constants/lexiconBatch1.ts,58,Kleine Wachsblume,Hoya bella,"Die Kleine Wachsblume traegt zierliche, sternfoermige weisse Blueten mit rosa Mitte. Haengende Sukkulente.",Helles indirektes Licht,18-27 °C,10,flowering|succulent|hanging,,,,, -hanging,constants/lexiconBatch1.ts,57,Wachsblume,Hoya carnosa,"Die Wachsblume ist eine Kletterpflanze mit dicken, wachsartigen Blaettern und sternfoermigen, duftenden Blueten.",Helles indirektes Licht,16-27 °C,10,easy|flowering|succulent|hanging,,,,, -hanging,constants/lexiconBatch1.ts,64,Suesskartoffel,Ipomoea batatas,"Die Suesskartoffel-Zierpflanze hat dekorative, herzfoermige Blaetter in gruen oder dunkelviolett. Ideal als Haengepflanze.",Volles Sonnenlicht,20-30 °C,5,easy|hanging|sun,,,,, -hanging,constants/lexiconBatch2.ts,47,Monstera adansonii,Monstera adansonii,Monstera adansonii hat herzfoermige Blaetter mit zahlreichen runden Lochern. Eine rankende Zimmerpflanze.,Helles indirektes Licht,18-27 °C,7,easy|hanging,,,,, -hanging,constants/lexiconBatch2.ts,48,Monstera obliqua,Monstera obliqua,"Monstera obliqua ist eine seltene Monstera-Art mit filigranen Blaettern, die hauptsaechlich aus Lochern bestehen.",Helles indirektes Licht,18-27 °C,7,patterned|hanging,,,,, -hanging,constants/lexiconBatch2.ts,79,Kannenpflanze,Nepenthes alata,"Die Kannenpflanze bildet grosse, gefuellte Kannen als Insekten­fallen. Eine faszinierende, tropische Pflanze.",Helles indirektes Licht,20-30 °C,5,hanging|high_humidity,,,,, -hanging,constants/lexiconBatch2.ts,61,Efeu-Geranie,Pelargonium peltatum,"Die Efeu-Geranie hat efeufoermige, glaenzende Blaetter und bluet den ganzen Sommer in leuchtenden Farben.",Helles bis volles Licht,15-25 °C,5,easy|flowering|hanging|sun,,,,, -hanging,constants/lexiconBatch2.ts,51,Roter Philodendron,Philodendron erubescens,"Der Rote Philodendron hat glaenzende, herzfoermige Blaetter, die jung roetrlich erscheinen. Sehr dekorativ.",Helles indirektes Licht,18-27 °C,7,easy|hanging,,,,, -hanging,constants/lexiconBatch1.ts,15,Herzblatt-Philodendron,Philodendron hederaceum,Der Herzblatt-Philodendron ist eine pflegeleichte Kletter- oder Haengepflanze mit herzfoermigen Blaettern.,Indirektes Licht,18-28 °C,7,easy|hanging|low_light,,,,, -hanging,constants/lexiconBatch2.ts,242,Philodendron Brasil,Philodendron hederaceum Brasil,Philodendron Brasil ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,easy|hanging|low_light,,,,, -hanging,constants/lexiconBatch2.ts,41,Geweihfarn,Platycerium bifurcatum,"Der Geweihfarn hat gespaltene Wedel, die einem Hirschgeweih aehneln. Er ist ein epiphytischer Farn fuer Holz.",Helles indirektes Licht,15-25 °C,7,hanging|high_humidity,,,,, -hanging,constants/lexiconBatch2.ts,52,Mini-Monstera,Rhaphidophora tetrasperma,"Die Mini-Monstera hat monstera­aehnliche, gelochte Blaetter auf einer kompakten, klettternden Pflanze. Sehr trendig.",Helles indirektes Licht,18-27 °C,7,easy|hanging,,,,, -hanging,constants/lexiconBatch1.ts,85,Korallenkaktus,Rhipsalis baccifera,"Der Korallenkaktus ist ein epiphytischer Kaktus mit duennen, haengenden Trieben und kleinen weissen Beeren.",Indirektes Licht,18-27 °C,7,succulent|hanging,,,,, -hanging,constants/lexiconBatch1.ts,55,Satinpothos,Scindapsus pictus,"Der Satinpothos hat samtig-glaenzende, silbrig gefleckte Blaetter auf langen, haengenden Ranken.",Helles indirektes Licht,18-28 °C,7,easy|patterned|hanging,,,,, -hanging,constants/lexiconBatch1.ts,7,Eselschwanz,Sedum morganianum,"Der Eselschwanz ist eine haengende Sukkulente mit langen Trieben aus dichten, blaugruenen Blaettchen.",Volles Sonnenlicht,15-25 °C,14,easy|succulent|hanging|sun,,,,, -hanging,constants/lexiconBatch1.ts,100,Perlenschnur-Pflanze,Senecio rowleyanus,"Die Perlenschnur-Pflanze hat haengende Ranken mit kugelfoermigen, perlenaehnlichen Blaettern. Einzigartige Sukkulente.",Helles bis volles Licht,15-27 °C,14,easy|succulent|hanging,,,,, -hanging,constants/lexiconBatch1.ts,56,Pfeilblatt,Syngonium podophyllum,"Das Pfeilblatt hat charakteristisch pfeilfoermige Blaetter, die sich mit dem Alter weiterentwickeln.",Helles indirektes Licht,16-27 °C,7,easy|hanging,,,,, -hanging,constants/lexiconBatch2.ts,32,Spanisches Moos,Tillandsia usneoides,"Das Spanische Moos ist eine epiphytische Bromelie ohne Wurzeln, die in der Luft haengt. Es benoetigt nur Feuchtigkeitsbespruehing.",Helles bis volles Licht,15-30 °C,3,easy|hanging,,,,, -hanging,constants/lexiconBatch2.ts,55,Weisse Tradescantia,Tradescantia fluminensis,Die Weisse Tradescantia hat gruene Blaetter mit weisslichen Unterseiten. Sehr robust und schnellwachsend.,Helles indirektes Licht,15-25 °C,5,easy|hanging,,,,, -hanging,constants/lexiconBatch2.ts,54,Lila Tradescantia,Tradescantia pallida,Die Lila Tradescantia hat leuchtend purpurrote Blaetter und ist sehr auffaellig. Sie liebt viel Licht.,Helles bis volles Licht,15-25 °C,5,easy|hanging|sun,,,,, -hanging,constants/lexiconBatch1.ts,17,Zebrakraut,Tradescantia zebrina,Das Zebrakraut faellt durch seine silbrig-lila gestreiften Blaetter auf. Schnellwachsende Haengepflanze.,Helles indirektes Licht,15-25 °C,5,easy|patterned|hanging,,,,, +category,source_file,source_index,name,botanical_name,description,light,temp,water_interval_days,all_categories,risk_flags,audit_status,evidence_source,evidence_url,notes +hanging,constants/lexiconBatch1.ts,98,Lippenstiftpflanze,Aeschynanthus radicans,Die Lippenstiftpflanze hat haengende Triebe mit glaenzenden Blaettern und leuchtend roten Roehrenbluten.,Helles indirektes Licht,18-27 °C,7,flowering|hanging|high_humidity,,,,, +hanging,constants/lexiconBatch2.ts,63,Calibrachoa,Calibrachoa hybrida,"Calibrachoa ist eine petunienaehnliche Haengepflanze mit unzaehligen, kleinen Trichterbluten in allen Farben.",Volles Sonnenlicht,15-25 °C,2,easy|flowering|hanging|sun,,,,, +hanging,constants/lexiconBatch2.ts,56,Callisia,Callisia repens,"Callisia repens ist ein kleines, kriechendes Kraut mit winzigen, gruenen Blaettern. Ideal fuer haengende Behaelter.",Helles indirektes Licht,15-25 °C,5,easy|hanging,,,,, +hanging,constants/lexiconBatch1.ts,99,Herzkette,Ceropegia woodii,"Die Herzkette hat duenne, haengende Ranken mit herzfoermigen, silbergrau gemusterten Blaettchen.",Helles indirektes Licht,15-27 °C,14,easy|succulent|patterned|hanging,,,,, +hanging,constants/lexiconBatch1.ts,97,Columnea,Columnea gloriosa,"Die Columnea ist eine haengende Zimmerpflanze mit kleinen, behaarten Blaettern und leuchtend roten, roehrenfoermigen Blueten.",Helles indirektes Licht,18-25 °C,7,flowering|hanging|high_humidity,,,,, +hanging,constants/lexiconBatch2.ts,236,String of Bananas,Curio radicans,String of Bananas ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles bis volles Licht,18-30 C,10,succulent|hanging|sun,,,,, +hanging,constants/lexiconBatch2.ts,237,String of Dolphins,Curio x peregrinus,String of Dolphins ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles bis volles Licht,18-30 C,10,succulent|hanging|sun,,,,, +hanging,constants/lexiconBatch1.ts,101,Dischidia,Dischidia ruscifolia,"Die Dischidia ist eine epiphytische Haengepflanze mit kleinen, runden Blaettern entlang duenner Ranken.",Helles indirektes Licht,18-27 °C,7,succulent|hanging,,,,, +hanging,constants/lexiconBatch1.ts,16,Marmor-Efeutute,Epipremnum aureum Marble Queen,Die Marmor-Efeutute hat cremeweiss-gruen marmorierte Blaetter. Eine dekorative Variante der klassischen Efeutute.,Helles indirektes Licht,15-30 °C,7,easy|hanging|air_purifier,air_purifier_requires_external_evidence,,,, +hanging,constants/lexiconBatch2.ts,53,Neon-Efeutute,Epipremnum pinnatum Neon,Die Neon-Efeutute hat leuchtend limonengruene Blaetter. Sehr auffaellig und pflegeleicht.,Helles indirektes Licht,15-30 °C,7,easy|hanging|air_purifier,air_purifier_requires_external_evidence,,,, +hanging,constants/lexiconBatch1.ts,33,Fuchsie,Fuchsia hybrida,"Die Fuchsie haengt mit eleganten, zweifarbigen Blueten wie kleine Ohrringe herab. Ideal fuer Ampeln.",Helles indirektes Licht,14-22 °C,3,flowering|hanging,,,,, +hanging,constants/lexiconBatch2.ts,60,Triphylla-Fuchsie,Fuchsia triphylla,"Die Triphylla-Fuchsie hat lange, roehrenfoermige, orangefarbe Blueten in haengenden Trauben. Sehr exotisch.",Helles indirektes Licht,15-22 °C,3,flowering|hanging,,,,, +hanging,constants/lexiconBatch1.ts,37,Efeu,Hedera helix,"Efeu ist eine robuste Kletter- und Haengepflanze mit charakteristischen, dreilappigen Blaettern. Sehr langlebig.",Wenig bis helles Licht,10-20 °C,7,easy|hanging|air_purifier|low_light,air_purifier_requires_external_evidence,,,, +hanging,constants/lexiconBatch1.ts,58,Kleine Wachsblume,Hoya bella,"Die Kleine Wachsblume traegt zierliche, sternfoermige weisse Blueten mit rosa Mitte. Haengende Sukkulente.",Helles indirektes Licht,18-27 °C,10,flowering|succulent|hanging,,,,, +hanging,constants/lexiconBatch1.ts,57,Wachsblume,Hoya carnosa,"Die Wachsblume ist eine Kletterpflanze mit dicken, wachsartigen Blaettern und sternfoermigen, duftenden Blueten.",Helles indirektes Licht,16-27 °C,10,easy|flowering|succulent|hanging,,,,, +hanging,constants/lexiconBatch1.ts,64,Suesskartoffel,Ipomoea batatas,"Die Suesskartoffel-Zierpflanze hat dekorative, herzfoermige Blaetter in gruen oder dunkelviolett. Ideal als Haengepflanze.",Volles Sonnenlicht,20-30 °C,5,easy|hanging|sun,,,,, +hanging,constants/lexiconBatch2.ts,47,Monstera adansonii,Monstera adansonii,Monstera adansonii hat herzfoermige Blaetter mit zahlreichen runden Lochern. Eine rankende Zimmerpflanze.,Helles indirektes Licht,18-27 °C,7,easy|hanging,,,,, +hanging,constants/lexiconBatch2.ts,48,Monstera obliqua,Monstera obliqua,"Monstera obliqua ist eine seltene Monstera-Art mit filigranen Blaettern, die hauptsaechlich aus Lochern bestehen.",Helles indirektes Licht,18-27 °C,7,patterned|hanging,,,,, +hanging,constants/lexiconBatch2.ts,79,Kannenpflanze,Nepenthes alata,"Die Kannenpflanze bildet grosse, gefuellte Kannen als Insekten­fallen. Eine faszinierende, tropische Pflanze.",Helles indirektes Licht,20-30 °C,5,hanging|high_humidity,,,,, +hanging,constants/lexiconBatch2.ts,61,Efeu-Geranie,Pelargonium peltatum,"Die Efeu-Geranie hat efeufoermige, glaenzende Blaetter und bluet den ganzen Sommer in leuchtenden Farben.",Helles bis volles Licht,15-25 °C,5,easy|flowering|hanging|sun,,,,, +hanging,constants/lexiconBatch2.ts,51,Roter Philodendron,Philodendron erubescens,"Der Rote Philodendron hat glaenzende, herzfoermige Blaetter, die jung roetrlich erscheinen. Sehr dekorativ.",Helles indirektes Licht,18-27 °C,7,easy|hanging,,,,, +hanging,constants/lexiconBatch1.ts,15,Herzblatt-Philodendron,Philodendron hederaceum,Der Herzblatt-Philodendron ist eine pflegeleichte Kletter- oder Haengepflanze mit herzfoermigen Blaettern.,Indirektes Licht,18-28 °C,7,easy|hanging|low_light,,,,, +hanging,constants/lexiconBatch2.ts,242,Philodendron Brasil,Philodendron hederaceum Brasil,Philodendron Brasil ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,easy|hanging|low_light,,,,, +hanging,constants/lexiconBatch2.ts,41,Geweihfarn,Platycerium bifurcatum,"Der Geweihfarn hat gespaltene Wedel, die einem Hirschgeweih aehneln. Er ist ein epiphytischer Farn fuer Holz.",Helles indirektes Licht,15-25 °C,7,hanging|high_humidity,,,,, +hanging,constants/lexiconBatch2.ts,52,Mini-Monstera,Rhaphidophora tetrasperma,"Die Mini-Monstera hat monstera­aehnliche, gelochte Blaetter auf einer kompakten, klettternden Pflanze. Sehr trendig.",Helles indirektes Licht,18-27 °C,7,easy|hanging,,,,, +hanging,constants/lexiconBatch1.ts,85,Korallenkaktus,Rhipsalis baccifera,"Der Korallenkaktus ist ein epiphytischer Kaktus mit duennen, haengenden Trieben und kleinen weissen Beeren.",Indirektes Licht,18-27 °C,7,succulent|hanging,,,,, +hanging,constants/lexiconBatch1.ts,55,Satinpothos,Scindapsus pictus,"Der Satinpothos hat samtig-glaenzende, silbrig gefleckte Blaetter auf langen, haengenden Ranken.",Helles indirektes Licht,18-28 °C,7,easy|patterned|hanging,,,,, +hanging,constants/lexiconBatch1.ts,7,Eselschwanz,Sedum morganianum,"Der Eselschwanz ist eine haengende Sukkulente mit langen Trieben aus dichten, blaugruenen Blaettchen.",Volles Sonnenlicht,15-25 °C,14,easy|succulent|hanging|sun,,,,, +hanging,constants/lexiconBatch1.ts,100,Perlenschnur-Pflanze,Senecio rowleyanus,"Die Perlenschnur-Pflanze hat haengende Ranken mit kugelfoermigen, perlenaehnlichen Blaettern. Einzigartige Sukkulente.",Helles bis volles Licht,15-27 °C,14,easy|succulent|hanging,,,,, +hanging,constants/lexiconBatch1.ts,56,Pfeilblatt,Syngonium podophyllum,"Das Pfeilblatt hat charakteristisch pfeilfoermige Blaetter, die sich mit dem Alter weiterentwickeln.",Helles indirektes Licht,16-27 °C,7,easy|hanging,,,,, +hanging,constants/lexiconBatch2.ts,32,Spanisches Moos,Tillandsia usneoides,"Das Spanische Moos ist eine epiphytische Bromelie ohne Wurzeln, die in der Luft haengt. Es benoetigt nur Feuchtigkeitsbespruehing.",Helles bis volles Licht,15-30 °C,3,easy|hanging,,,,, +hanging,constants/lexiconBatch2.ts,55,Weisse Tradescantia,Tradescantia fluminensis,Die Weisse Tradescantia hat gruene Blaetter mit weisslichen Unterseiten. Sehr robust und schnellwachsend.,Helles indirektes Licht,15-25 °C,5,easy|hanging,,,,, +hanging,constants/lexiconBatch2.ts,54,Lila Tradescantia,Tradescantia pallida,Die Lila Tradescantia hat leuchtend purpurrote Blaetter und ist sehr auffaellig. Sie liebt viel Licht.,Helles bis volles Licht,15-25 °C,5,easy|hanging|sun,,,,, +hanging,constants/lexiconBatch1.ts,17,Zebrakraut,Tradescantia zebrina,Das Zebrakraut faellt durch seine silbrig-lila gestreiften Blaetter auf. Schnellwachsende Haengepflanze.,Helles indirektes Licht,15-25 °C,5,easy|patterned|hanging,,,,, diff --git a/audits/semantic-search/categories/high_humidity.csv b/audits/semantic-search/categories/high_humidity.csv index 5b735d4..df2e7bd 100644 --- a/audits/semantic-search/categories/high_humidity.csv +++ b/audits/semantic-search/categories/high_humidity.csv @@ -1,52 +1,52 @@ -category,source_file,source_index,name,botanical_name,description,light,temp,water_interval_days,all_categories,risk_flags,audit_status,evidence_source,evidence_url,notes -high_humidity,constants/lexiconBatch2.ts,42,Frauenhaarfarn,Adiantum raddianum,"Der Frauenhaarfarn hat zarte, feingliedrige Wedel auf schwarzen, draht­aehnlichen Stielen. Liebt Feuchtigkeit.",Helles indirektes Licht,18-27 °C,3,high_humidity,,,,, -high_humidity,constants/lexiconBatch1.ts,98,Lippenstiftpflanze,Aeschynanthus radicans,Die Lippenstiftpflanze hat haengende Triebe mit glaenzenden Blaettern und leuchtend roten Roehrenbluten.,Helles indirektes Licht,18-27 °C,7,flowering|hanging|high_humidity,,,,, -high_humidity,constants/lexiconBatch1.ts,46,Amazona-Taro,Alocasia amazonica,"Der Amazona-Taro besticht mit dunkelgruenen, pfeilfoermigen Blaettern mit markant weissen Rippen.",Indirektes Licht,18-27 °C,5,patterned|large|high_humidity,,,,, -high_humidity,constants/lexiconBatch2.ts,225,Alocasia zebrina,Alocasia zebrina,Alocasia zebrina ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5,bright_light|high_humidity,,,,, -high_humidity,constants/lexiconBatch2.ts,73,Muschelingwer,Alpinia zerumbet,"Der Muschelingwer hat lange, elegante Blaetter und haengende Bluetenrispen mit weiss-rosa Bluetchen.",Helles bis volles Licht,20-30 °C,5,flowering|large|high_humidity,,,,, -high_humidity,constants/lexiconBatch2.ts,233,Samt-Anthurie,Anthurium clarinervium,Samt-Anthurie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5,patterned|high_humidity,,,,, -high_humidity,constants/lexiconBatch2.ts,234,Kristall-Anthurie,Anthurium crystallinum,Kristall-Anthurie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5,patterned|high_humidity,,,,, -high_humidity,constants/lexiconBatch2.ts,43,Vogelnest-Farn,Asplenium nidus,"Der Vogelnest-Farn hat ganzrandige, glaenzende Wedel, die eine Nestform bilden. Sehr dekorativ und robust.",Helles indirektes Licht,18-27 °C,5,easy|low_light|high_humidity,,,,, -high_humidity,constants/lexiconBatch2.ts,57,Forellen-Begonie,Begonia maculata,Die Forellen-Begonie hat olivgruene Blaetter mit silbernen Punkten und einer roten Unterseite. Atemberaubend.,Helles indirektes Licht,18-27 °C,7,patterned|high_humidity,,,,, -high_humidity,constants/lexiconBatch1.ts,18,Koenigsbegonie,Begonia rex,"Die Koenigsbegonie beeindruckt mit prachtvoll gemusterten Blaettern in Silber, Rot und Gruen.",Indirektes Licht,18-25 °C,5,patterned|high_humidity,,,,, -high_humidity,constants/lexiconBatch2.ts,58,Knollen-Begonie,Begonia tuberhybrida,"Die Knollen-Begonie hat riesige, rosenaehnliche Blueten in leuchtendem Rot, Orange, Gelb oder Weiss.",Helles indirektes Licht,15-22 °C,5,flowering|high_humidity,,,,, -high_humidity,constants/lexiconBatch1.ts,49,Buntblatt,Caladium bicolor,"Das Buntblatt beeindruckt mit transparenten, bunt gemusterten Blaettern in Pink, Rot, Weiss und Gruen.",Indirektes Licht,20-30 °C,5,patterned|high_humidity,,,,, -high_humidity,constants/lexiconBatch1.ts,73,Cattleya-Orchidee,Cattleya labiata,"Die Cattleya ist die Koenigin der Orchideen mit ueppigen, duftenden Blueten in Lila, Rosa und Weiss.",Helles indirektes Licht,18-28 °C,7,flowering|high_humidity,,,,, -high_humidity,constants/lexiconBatch1.ts,47,Taro,Colocasia esculenta,"Der Taro ist eine tropische Pflanze mit grossen, herzfoermigen Blaettern. Die Knollen sind Nahrungsquelle.",Helles indirektes Licht,18-30 °C,3,large|high_humidity,,,,, -high_humidity,constants/lexiconBatch1.ts,97,Columnea,Columnea gloriosa,"Die Columnea ist eine haengende Zimmerpflanze mit kleinen, behaarten Blaettern und leuchtend roten, roehrenfoermigen Blueten.",Helles indirektes Licht,18-25 °C,7,flowering|hanging|high_humidity,,,,, -high_humidity,constants/lexiconBatch2.ts,39,Cryptanthus,Cryptanthus bivittatus,Cryptanthus ist eine niedrig wachsende Bromelie mit sternfoermigen Rosetten und gemusterten Blaettern. Fuer Terrarien.,Helles indirektes Licht,18-27 °C,7,patterned|high_humidity,,,,, -high_humidity,constants/lexiconBatch1.ts,53,Ctenanthe,Ctenanthe burle-marxii,Die Ctenanthe hat faszinierend gemusterte Blaetter mit dunkelgruunem Fischgraetenmuster auf hellgruunem Hintergrund.,Indirektes Licht,18-25 °C,5,patterned|high_humidity,,,,, -high_humidity,constants/lexiconBatch2.ts,74,Kurkuma,Curcuma longa,Kurkuma ist eine tropische Gewuerzpflanze mit breiten Blaettern und leuchtend gelber Wurzel. Wichtiges Heilgewuerz.,Helles bis volles Licht,20-30 °C,7,medicinal|high_humidity,medicinal_requires_external_evidence,,,, -high_humidity,constants/lexiconBatch2.ts,9,Paragraphenpflanze,Cyperus alternifolius,"Die Paragraphenpflanze hat lange, grasartige Blaetter, die sternfoermig vom Stiel abstehen. Sie liebt viel Wasser.",Helles bis volles Licht,18-27 °C,3,high_humidity,,,,, -high_humidity,constants/lexiconBatch1.ts,70,Dendrobium,Dendrobium nobile,"Das Dendrobium ist eine beliebte Zimmerorchidee mit langen Pseudobulben, die im Winter mit Blueten besetzt werden.",Helles indirektes Licht,15-28 °C,10,flowering|high_humidity,,,,, -high_humidity,constants/lexiconBatch2.ts,80,Sonnentau,Drosera capensis,Der Sonnentau faengt Insekten mit klebrigen Tropfen auf seinen Blaettern. Eine faszinierende fleischfressende Pflanze.,Volles Sonnenlicht,15-25 °C,5,high_humidity|sun,,,,, -high_humidity,constants/lexiconBatch2.ts,137,Wasabi,Eutrema japonicum,"Wasabi ist ein seltenes Wuerzkraut, das gleichmaessige Feuchte und eher kuehle Bedingungen bevorzugt.",Helles indirektes Licht,8-20 C,4,bright_light|high_humidity,,,,, -high_humidity,constants/lexiconBatch2.ts,226,Nervenpflanze,Fittonia albivenis,Nervenpflanze ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5,patterned|high_humidity,,,,, -high_humidity,constants/lexiconBatch1.ts,22,Gardenie,Gardenia jasminoides,"Die Gardenie fasziniert mit cremefarbenen, intensiv duftenden Blueten. Anspruchsvoll in der Pflege.",Helles indirektes Licht,18-23 °C,5,flowering|high_humidity,,,,, -high_humidity,constants/lexiconBatch1.ts,96,Gloxinie,Gloxinia speciosa,"Die Gloxinie hat grosse, samtartige Blueten in Violett, Rosa oder Weiss mit farbigen Raendern.",Helles indirektes Licht,18-25 °C,5,flowering|high_humidity,,,,, -high_humidity,constants/lexiconBatch2.ts,240,Calathea lancifolia,Goeppertia insignis,Calathea lancifolia ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5,pet_friendly|patterned|high_humidity,pet_friendly_requires_external_evidence,,,, -high_humidity,constants/lexiconBatch2.ts,241,Calathea ornata,Goeppertia ornata,Calathea ornata ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5,pet_friendly|patterned|high_humidity,pet_friendly_requires_external_evidence,,,, -high_humidity,constants/lexiconBatch2.ts,36,Guzmania,Guzmania lingulata,"Die Guzmania ist eine Bromelie mit glänzenden, gruenen Blaettern und einem leuchtend roten, sternfoermigen Bluetenstand.",Helles indirektes Licht,18-27 °C,7,flowering|high_humidity,,,,, -high_humidity,constants/lexiconBatch2.ts,83,Heliamphora,Heliamphora nutans,Heliamphora ist eine urtuemliche Kannenpflanze aus den Tafelbergen Venezuelas. Sehr dekorativ und selten.,Helles indirektes Licht,15-25 °C,5,high_humidity,,,,, -high_humidity,constants/lexiconBatch2.ts,72,Heliconia,Heliconia psittacorum,"Die Heliconia hat leuchtend orangefarbe oder rote, bootsfoermige Hochblaetter. Eine exotische Tropenpflanze.",Helles bis volles Licht,20-30 °C,5,flowering|bright_light|high_humidity,,,,, -high_humidity,constants/lexiconBatch1.ts,51,Gebet-Pflanze,Maranta leuconeura,Die Gebet-Pflanze faltet ihre gemusterten Blaetter nachts wie Haende zusammen. Faszinierende rote und gruene Muster.,Indirektes Licht,18-27 °C,5,pet_friendly|patterned|high_humidity,pet_friendly_requires_external_evidence,,,, -high_humidity,constants/lexiconBatch2.ts,46,Tueipelfarn (Microsorum),Microsorum punctatum,"Microsorum punctatum ist ein tropischer Farn mit langen, ungeteilten, glaenzenden Wedeln. Fuer feuchte Standorte.",Helles indirektes Licht,18-27 °C,7,high_humidity,,,,, -high_humidity,constants/lexiconBatch1.ts,75,Stiefmuetterchen-Orchidee,Miltoniopsis roezlii,"Die Stiefmuetterchen-Orchidee hat grosse, flache Blueten. Bevorzugt kuehle Temperaturen und hohe Luftfeuchtigkeit.",Indirektes Licht,15-22 °C,5,flowering|high_humidity,,,,, -high_humidity,constants/lexiconBatch2.ts,2,Bananenpflanze,Musa acuminata,"Die Bananenpflanze ist eine tropische Staude mit riesigen, glaenzenden Blaettern. Im Zimmer selten fruechttragend.",Helles bis volles Licht,20-30 °C,5,large|high_humidity,,,,, -high_humidity,constants/lexiconBatch2.ts,79,Kannenpflanze,Nepenthes alata,"Die Kannenpflanze bildet grosse, gefuellte Kannen als Insekten­fallen. Eine faszinierende, tropische Pflanze.",Helles indirektes Licht,20-30 °C,5,hanging|high_humidity,,,,, -high_humidity,constants/lexiconBatch1.ts,74,Tanzerinnen-Orchidee,Oncidium sphacelatum,"Die Tanzerinnen-Orchidee traegt lange Rispen mit Hunderten kleiner, gelb-brauner Blueten. Sehr reichliche Bluetracht.",Helles indirektes Licht,18-27 °C,7,flowering|high_humidity,,,,, -high_humidity,constants/lexiconBatch1.ts,69,Schmetterlingsorchidee,Phalaenopsis amabilis,Die Schmetterlingsorchidee ist die bekannteste Zimmerorchidee. Sie bluet bei guter Pflege monatelang.,Helles indirektes Licht,18-28 °C,10,flowering|high_humidity,,,,, -high_humidity,constants/lexiconBatch2.ts,49,Philodendron gloriosum,Philodendron gloriosum,"Philodendron gloriosum hat grosse, samtige, herzfoermige Blaetter mit weissen Rippen. Eine atemberaubende Pflanze.",Helles indirektes Licht,18-27 °C,7,patterned|large|high_humidity,,,,, -high_humidity,constants/lexiconBatch2.ts,40,Blaues Kanaelfarn,Phlebodium aureum,"Der Blaue Kanaelfarn hat wachsartige, blaugruene Wedel und glaenzende Wurzelstaemme. Sehr dekorativ.",Helles indirektes Licht,18-27 °C,7,high_humidity,,,,, -high_humidity,constants/lexiconBatch2.ts,81,Fettkraut,Pinguicula grandiflora,"Das Fettkraut faengt Insekten mit klebrigen Blaettern. Es bluet mit violetten, sporenartigen Blueten.",Helles indirektes Licht,10-20 °C,5,flowering|high_humidity,,,,, -high_humidity,constants/lexiconBatch2.ts,41,Geweihfarn,Platycerium bifurcatum,"Der Geweihfarn hat gespaltene Wedel, die einem Hirschgeweih aehneln. Er ist ein epiphytischer Farn fuer Holz.",Helles indirektes Licht,15-25 °C,7,hanging|high_humidity,,,,, -high_humidity,constants/lexiconBatch2.ts,78,Purpursonnentau,Sarracenia purpurea,Der Purpursonnentau ist eine fleischfressende Kannenpflanze mit purpurroten Kannen. Faengt Insekten.,Volles Sonnenlicht,5-25 °C,3,high_humidity|sun,,,,, -high_humidity,constants/lexiconBatch2.ts,45,Regenbogenmoos,Selaginella uncinata,"Das Regenbogenmoos hat schuppenfoermige Blaetter, die im Licht schillernd irisieren. Dekorativ fuer Terrarien.",Helles indirektes Licht,18-27 °C,5,patterned|high_humidity,,,,, -high_humidity,constants/lexiconBatch2.ts,238,Bubikopf,Soleirolia soleirolii,Bubikopf ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,15-24 C,4,pet_friendly|high_humidity,pet_friendly_requires_external_evidence,,,, -high_humidity,constants/lexiconBatch1.ts,52,Stromanthe,Stromanthe sanguinea,Die Stromanthe hat dekorative Blaetter mit weissem Muster und leuchtend roter Unterseite. Familie der Marantaceen.,Helles indirektes Licht,18-25 °C,5,patterned|high_humidity,,,,, -high_humidity,constants/lexiconBatch2.ts,82,Wasserschlauch,Utricularia gibba,Der Wasserschlauch ist eine wasserbewohnende fleischfressende Pflanze mit Schlaeuchen als Insekten­fallen.,Helles bis volles Licht,15-25 °C,2,high_humidity|sun,,,,, -high_humidity,constants/lexiconBatch1.ts,72,Vanda-Orchidee,Vanda coerulea,Die Vanda-Orchidee ist bekannt fuer ihre seltene blaue Bluetenfarbe. Epiphytische Orchidee mit grossen Blueten.,Helles bis volles Licht,20-30 °C,3,flowering|bright_light|high_humidity,,,,, -high_humidity,constants/lexiconBatch1.ts,76,Vanille,Vanilla planifolia,"Die Vanille ist eine kletternde Orchidee, aus deren Fruechten das beliebte Gewuerz gewonnen wird.",Helles indirektes Licht,20-30 °C,5,flowering|high_humidity,,,,, -high_humidity,constants/lexiconBatch2.ts,35,Flammen-Bromelie,Vriesea splendens,"Die Flammen-Bromelie hat gebänderte, dunkelgruene Blaetter und einen spektakulaeren, roten Bluetenstand.",Helles indirektes Licht,18-25 °C,7,flowering|patterned|high_humidity,,,,, -high_humidity,constants/lexiconBatch2.ts,70,Calla,Zantedeschia aethiopica,"Die Calla hat elegante, trichterfoermige weisse Hochblaetter und glaenzende, herzfoermige Blaetter. Sehr edel.",Helles indirektes Licht,15-24 °C,7,flowering|high_humidity,,,,, -high_humidity,constants/lexiconBatch2.ts,75,Ingwer,Zingiber officinale,Ingwer ist eine tropische Gewuerzpflanze mit aromatischen Knollen. Die Blaetter sind schilfartig.,Helles indirektes Licht,20-30 °C,5,medicinal|high_humidity,medicinal_requires_external_evidence,,,, +category,source_file,source_index,name,botanical_name,description,light,temp,water_interval_days,all_categories,risk_flags,audit_status,evidence_source,evidence_url,notes +high_humidity,constants/lexiconBatch2.ts,42,Frauenhaarfarn,Adiantum raddianum,"Der Frauenhaarfarn hat zarte, feingliedrige Wedel auf schwarzen, draht­aehnlichen Stielen. Liebt Feuchtigkeit.",Helles indirektes Licht,18-27 °C,3,high_humidity,,,,, +high_humidity,constants/lexiconBatch1.ts,98,Lippenstiftpflanze,Aeschynanthus radicans,Die Lippenstiftpflanze hat haengende Triebe mit glaenzenden Blaettern und leuchtend roten Roehrenbluten.,Helles indirektes Licht,18-27 °C,7,flowering|hanging|high_humidity,,,,, +high_humidity,constants/lexiconBatch1.ts,46,Amazona-Taro,Alocasia amazonica,"Der Amazona-Taro besticht mit dunkelgruenen, pfeilfoermigen Blaettern mit markant weissen Rippen.",Indirektes Licht,18-27 °C,5,patterned|large|high_humidity,,,,, +high_humidity,constants/lexiconBatch2.ts,225,Alocasia zebrina,Alocasia zebrina,Alocasia zebrina ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5,bright_light|high_humidity,,,,, +high_humidity,constants/lexiconBatch2.ts,73,Muschelingwer,Alpinia zerumbet,"Der Muschelingwer hat lange, elegante Blaetter und haengende Bluetenrispen mit weiss-rosa Bluetchen.",Helles bis volles Licht,20-30 °C,5,flowering|large|high_humidity,,,,, +high_humidity,constants/lexiconBatch2.ts,233,Samt-Anthurie,Anthurium clarinervium,Samt-Anthurie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5,patterned|high_humidity,,,,, +high_humidity,constants/lexiconBatch2.ts,234,Kristall-Anthurie,Anthurium crystallinum,Kristall-Anthurie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5,patterned|high_humidity,,,,, +high_humidity,constants/lexiconBatch2.ts,43,Vogelnest-Farn,Asplenium nidus,"Der Vogelnest-Farn hat ganzrandige, glaenzende Wedel, die eine Nestform bilden. Sehr dekorativ und robust.",Helles indirektes Licht,18-27 °C,5,easy|low_light|high_humidity,,,,, +high_humidity,constants/lexiconBatch2.ts,57,Forellen-Begonie,Begonia maculata,Die Forellen-Begonie hat olivgruene Blaetter mit silbernen Punkten und einer roten Unterseite. Atemberaubend.,Helles indirektes Licht,18-27 °C,7,patterned|high_humidity,,,,, +high_humidity,constants/lexiconBatch1.ts,18,Koenigsbegonie,Begonia rex,"Die Koenigsbegonie beeindruckt mit prachtvoll gemusterten Blaettern in Silber, Rot und Gruen.",Indirektes Licht,18-25 °C,5,patterned|high_humidity,,,,, +high_humidity,constants/lexiconBatch2.ts,58,Knollen-Begonie,Begonia tuberhybrida,"Die Knollen-Begonie hat riesige, rosenaehnliche Blueten in leuchtendem Rot, Orange, Gelb oder Weiss.",Helles indirektes Licht,15-22 °C,5,flowering|high_humidity,,,,, +high_humidity,constants/lexiconBatch1.ts,49,Buntblatt,Caladium bicolor,"Das Buntblatt beeindruckt mit transparenten, bunt gemusterten Blaettern in Pink, Rot, Weiss und Gruen.",Indirektes Licht,20-30 °C,5,patterned|high_humidity,,,,, +high_humidity,constants/lexiconBatch1.ts,73,Cattleya-Orchidee,Cattleya labiata,"Die Cattleya ist die Koenigin der Orchideen mit ueppigen, duftenden Blueten in Lila, Rosa und Weiss.",Helles indirektes Licht,18-28 °C,7,flowering|high_humidity,,,,, +high_humidity,constants/lexiconBatch1.ts,47,Taro,Colocasia esculenta,"Der Taro ist eine tropische Pflanze mit grossen, herzfoermigen Blaettern. Die Knollen sind Nahrungsquelle.",Helles indirektes Licht,18-30 °C,3,large|high_humidity,,,,, +high_humidity,constants/lexiconBatch1.ts,97,Columnea,Columnea gloriosa,"Die Columnea ist eine haengende Zimmerpflanze mit kleinen, behaarten Blaettern und leuchtend roten, roehrenfoermigen Blueten.",Helles indirektes Licht,18-25 °C,7,flowering|hanging|high_humidity,,,,, +high_humidity,constants/lexiconBatch2.ts,39,Cryptanthus,Cryptanthus bivittatus,Cryptanthus ist eine niedrig wachsende Bromelie mit sternfoermigen Rosetten und gemusterten Blaettern. Fuer Terrarien.,Helles indirektes Licht,18-27 °C,7,patterned|high_humidity,,,,, +high_humidity,constants/lexiconBatch1.ts,53,Ctenanthe,Ctenanthe burle-marxii,Die Ctenanthe hat faszinierend gemusterte Blaetter mit dunkelgruunem Fischgraetenmuster auf hellgruunem Hintergrund.,Indirektes Licht,18-25 °C,5,patterned|high_humidity,,,,, +high_humidity,constants/lexiconBatch2.ts,74,Kurkuma,Curcuma longa,Kurkuma ist eine tropische Gewuerzpflanze mit breiten Blaettern und leuchtend gelber Wurzel. Wichtiges Heilgewuerz.,Helles bis volles Licht,20-30 °C,7,medicinal|high_humidity,medicinal_requires_external_evidence,,,, +high_humidity,constants/lexiconBatch2.ts,9,Paragraphenpflanze,Cyperus alternifolius,"Die Paragraphenpflanze hat lange, grasartige Blaetter, die sternfoermig vom Stiel abstehen. Sie liebt viel Wasser.",Helles bis volles Licht,18-27 °C,3,high_humidity,,,,, +high_humidity,constants/lexiconBatch1.ts,70,Dendrobium,Dendrobium nobile,"Das Dendrobium ist eine beliebte Zimmerorchidee mit langen Pseudobulben, die im Winter mit Blueten besetzt werden.",Helles indirektes Licht,15-28 °C,10,flowering|high_humidity,,,,, +high_humidity,constants/lexiconBatch2.ts,80,Sonnentau,Drosera capensis,Der Sonnentau faengt Insekten mit klebrigen Tropfen auf seinen Blaettern. Eine faszinierende fleischfressende Pflanze.,Volles Sonnenlicht,15-25 °C,5,high_humidity|sun,,,,, +high_humidity,constants/lexiconBatch2.ts,137,Wasabi,Eutrema japonicum,"Wasabi ist ein seltenes Wuerzkraut, das gleichmaessige Feuchte und eher kuehle Bedingungen bevorzugt.",Helles indirektes Licht,8-20 C,4,bright_light|high_humidity,,,,, +high_humidity,constants/lexiconBatch2.ts,226,Nervenpflanze,Fittonia albivenis,Nervenpflanze ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5,patterned|high_humidity,,,,, +high_humidity,constants/lexiconBatch1.ts,22,Gardenie,Gardenia jasminoides,"Die Gardenie fasziniert mit cremefarbenen, intensiv duftenden Blueten. Anspruchsvoll in der Pflege.",Helles indirektes Licht,18-23 °C,5,flowering|high_humidity,,,,, +high_humidity,constants/lexiconBatch1.ts,96,Gloxinie,Gloxinia speciosa,"Die Gloxinie hat grosse, samtartige Blueten in Violett, Rosa oder Weiss mit farbigen Raendern.",Helles indirektes Licht,18-25 °C,5,flowering|high_humidity,,,,, +high_humidity,constants/lexiconBatch2.ts,240,Calathea lancifolia,Goeppertia insignis,Calathea lancifolia ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5,pet_friendly|patterned|high_humidity,pet_friendly_requires_external_evidence,,,, +high_humidity,constants/lexiconBatch2.ts,241,Calathea ornata,Goeppertia ornata,Calathea ornata ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5,pet_friendly|patterned|high_humidity,pet_friendly_requires_external_evidence,,,, +high_humidity,constants/lexiconBatch2.ts,36,Guzmania,Guzmania lingulata,"Die Guzmania ist eine Bromelie mit glänzenden, gruenen Blaettern und einem leuchtend roten, sternfoermigen Bluetenstand.",Helles indirektes Licht,18-27 °C,7,flowering|high_humidity,,,,, +high_humidity,constants/lexiconBatch2.ts,83,Heliamphora,Heliamphora nutans,Heliamphora ist eine urtuemliche Kannenpflanze aus den Tafelbergen Venezuelas. Sehr dekorativ und selten.,Helles indirektes Licht,15-25 °C,5,high_humidity,,,,, +high_humidity,constants/lexiconBatch2.ts,72,Heliconia,Heliconia psittacorum,"Die Heliconia hat leuchtend orangefarbe oder rote, bootsfoermige Hochblaetter. Eine exotische Tropenpflanze.",Helles bis volles Licht,20-30 °C,5,flowering|bright_light|high_humidity,,,,, +high_humidity,constants/lexiconBatch1.ts,51,Gebet-Pflanze,Maranta leuconeura,Die Gebet-Pflanze faltet ihre gemusterten Blaetter nachts wie Haende zusammen. Faszinierende rote und gruene Muster.,Indirektes Licht,18-27 °C,5,pet_friendly|patterned|high_humidity,pet_friendly_requires_external_evidence,,,, +high_humidity,constants/lexiconBatch2.ts,46,Tueipelfarn (Microsorum),Microsorum punctatum,"Microsorum punctatum ist ein tropischer Farn mit langen, ungeteilten, glaenzenden Wedeln. Fuer feuchte Standorte.",Helles indirektes Licht,18-27 °C,7,high_humidity,,,,, +high_humidity,constants/lexiconBatch1.ts,75,Stiefmuetterchen-Orchidee,Miltoniopsis roezlii,"Die Stiefmuetterchen-Orchidee hat grosse, flache Blueten. Bevorzugt kuehle Temperaturen und hohe Luftfeuchtigkeit.",Indirektes Licht,15-22 °C,5,flowering|high_humidity,,,,, +high_humidity,constants/lexiconBatch2.ts,2,Bananenpflanze,Musa acuminata,"Die Bananenpflanze ist eine tropische Staude mit riesigen, glaenzenden Blaettern. Im Zimmer selten fruechttragend.",Helles bis volles Licht,20-30 °C,5,large|high_humidity,,,,, +high_humidity,constants/lexiconBatch2.ts,79,Kannenpflanze,Nepenthes alata,"Die Kannenpflanze bildet grosse, gefuellte Kannen als Insekten­fallen. Eine faszinierende, tropische Pflanze.",Helles indirektes Licht,20-30 °C,5,hanging|high_humidity,,,,, +high_humidity,constants/lexiconBatch1.ts,74,Tanzerinnen-Orchidee,Oncidium sphacelatum,"Die Tanzerinnen-Orchidee traegt lange Rispen mit Hunderten kleiner, gelb-brauner Blueten. Sehr reichliche Bluetracht.",Helles indirektes Licht,18-27 °C,7,flowering|high_humidity,,,,, +high_humidity,constants/lexiconBatch1.ts,69,Schmetterlingsorchidee,Phalaenopsis amabilis,Die Schmetterlingsorchidee ist die bekannteste Zimmerorchidee. Sie bluet bei guter Pflege monatelang.,Helles indirektes Licht,18-28 °C,10,flowering|high_humidity,,,,, +high_humidity,constants/lexiconBatch2.ts,49,Philodendron gloriosum,Philodendron gloriosum,"Philodendron gloriosum hat grosse, samtige, herzfoermige Blaetter mit weissen Rippen. Eine atemberaubende Pflanze.",Helles indirektes Licht,18-27 °C,7,patterned|large|high_humidity,,,,, +high_humidity,constants/lexiconBatch2.ts,40,Blaues Kanaelfarn,Phlebodium aureum,"Der Blaue Kanaelfarn hat wachsartige, blaugruene Wedel und glaenzende Wurzelstaemme. Sehr dekorativ.",Helles indirektes Licht,18-27 °C,7,high_humidity,,,,, +high_humidity,constants/lexiconBatch2.ts,81,Fettkraut,Pinguicula grandiflora,"Das Fettkraut faengt Insekten mit klebrigen Blaettern. Es bluet mit violetten, sporenartigen Blueten.",Helles indirektes Licht,10-20 °C,5,flowering|high_humidity,,,,, +high_humidity,constants/lexiconBatch2.ts,41,Geweihfarn,Platycerium bifurcatum,"Der Geweihfarn hat gespaltene Wedel, die einem Hirschgeweih aehneln. Er ist ein epiphytischer Farn fuer Holz.",Helles indirektes Licht,15-25 °C,7,hanging|high_humidity,,,,, +high_humidity,constants/lexiconBatch2.ts,78,Purpursonnentau,Sarracenia purpurea,Der Purpursonnentau ist eine fleischfressende Kannenpflanze mit purpurroten Kannen. Faengt Insekten.,Volles Sonnenlicht,5-25 °C,3,high_humidity|sun,,,,, +high_humidity,constants/lexiconBatch2.ts,45,Regenbogenmoos,Selaginella uncinata,"Das Regenbogenmoos hat schuppenfoermige Blaetter, die im Licht schillernd irisieren. Dekorativ fuer Terrarien.",Helles indirektes Licht,18-27 °C,5,patterned|high_humidity,,,,, +high_humidity,constants/lexiconBatch2.ts,238,Bubikopf,Soleirolia soleirolii,Bubikopf ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,15-24 C,4,pet_friendly|high_humidity,pet_friendly_requires_external_evidence,,,, +high_humidity,constants/lexiconBatch1.ts,52,Stromanthe,Stromanthe sanguinea,Die Stromanthe hat dekorative Blaetter mit weissem Muster und leuchtend roter Unterseite. Familie der Marantaceen.,Helles indirektes Licht,18-25 °C,5,patterned|high_humidity,,,,, +high_humidity,constants/lexiconBatch2.ts,82,Wasserschlauch,Utricularia gibba,Der Wasserschlauch ist eine wasserbewohnende fleischfressende Pflanze mit Schlaeuchen als Insekten­fallen.,Helles bis volles Licht,15-25 °C,2,high_humidity|sun,,,,, +high_humidity,constants/lexiconBatch1.ts,72,Vanda-Orchidee,Vanda coerulea,Die Vanda-Orchidee ist bekannt fuer ihre seltene blaue Bluetenfarbe. Epiphytische Orchidee mit grossen Blueten.,Helles bis volles Licht,20-30 °C,3,flowering|bright_light|high_humidity,,,,, +high_humidity,constants/lexiconBatch1.ts,76,Vanille,Vanilla planifolia,"Die Vanille ist eine kletternde Orchidee, aus deren Fruechten das beliebte Gewuerz gewonnen wird.",Helles indirektes Licht,20-30 °C,5,flowering|high_humidity,,,,, +high_humidity,constants/lexiconBatch2.ts,35,Flammen-Bromelie,Vriesea splendens,"Die Flammen-Bromelie hat gebänderte, dunkelgruene Blaetter und einen spektakulaeren, roten Bluetenstand.",Helles indirektes Licht,18-25 °C,7,flowering|patterned|high_humidity,,,,, +high_humidity,constants/lexiconBatch2.ts,70,Calla,Zantedeschia aethiopica,"Die Calla hat elegante, trichterfoermige weisse Hochblaetter und glaenzende, herzfoermige Blaetter. Sehr edel.",Helles indirektes Licht,15-24 °C,7,flowering|high_humidity,,,,, +high_humidity,constants/lexiconBatch2.ts,75,Ingwer,Zingiber officinale,Ingwer ist eine tropische Gewuerzpflanze mit aromatischen Knollen. Die Blaetter sind schilfartig.,Helles indirektes Licht,20-30 °C,5,medicinal|high_humidity,medicinal_requires_external_evidence,,,, diff --git a/audits/semantic-search/categories/large.csv b/audits/semantic-search/categories/large.csv index 61eb1e7..1eb583a 100644 --- a/audits/semantic-search/categories/large.csv +++ b/audits/semantic-search/categories/large.csv @@ -1,36 +1,36 @@ -category,source_file,source_index,name,botanical_name,description,light,temp,water_interval_days,all_categories,risk_flags,audit_status,evidence_source,evidence_url,notes -large,constants/lexiconBatch2.ts,212,Spitzahorn,Acer platanoides,Spitzahorn ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, -large,constants/lexiconBatch1.ts,11,Agave,Agave americana,"Die Agave ist eine imposante Sukkulente mit steifen, blaugruenen Blaettern mit Stacheln. Sie bluet nur einmal.",Volles Sonnenlicht,10-35 °C,21,succulent|large|sun,,,,, -large,constants/lexiconBatch1.ts,46,Amazona-Taro,Alocasia amazonica,"Der Amazona-Taro besticht mit dunkelgruenen, pfeilfoermigen Blaettern mit markant weissen Rippen.",Indirektes Licht,18-27 °C,5,patterned|large|high_humidity,,,,, -large,constants/lexiconBatch2.ts,18,Kap-Aloe (ferox),Aloe ferox,"Aloe ferox ist eine grosse, imposante Aloe mit stachligen, blaugruenen Blaettern und leuchtend roten Bluetenaehren.",Volles Sonnenlicht,10-30 °C,14,succulent|large|medicinal|sun,medicinal_requires_external_evidence,,,, -large,constants/lexiconBatch2.ts,73,Muschelingwer,Alpinia zerumbet,"Der Muschelingwer hat lange, elegante Blaetter und haengende Bluetenrispen mit weiss-rosa Bluetchen.",Helles bis volles Licht,20-30 °C,5,flowering|large|high_humidity,,,,, -large,constants/lexiconBatch2.ts,7,Bambusrohr,Bambusa vulgaris,Das Bambusrohr ist eine schnell wachsende Bambusart mit gelbgruenen Halmen. Sehr dekorativ und vielseitig nutzbar.,Helles bis volles Licht,15-30 °C,5,easy|large,,,,, -large,constants/lexiconBatch2.ts,114,Hange-Birke,Betula pendula,Die Haenge-Birke hat charakteristisch weisse Rinde und haengende Zweige. Die Blaetter werden in der Heilkunde genutzt.,Volles Sonnenlicht,10-25 °C,7,tree|large|medicinal,medicinal_requires_external_evidence,,,, -large,constants/lexiconBatch2.ts,67,Blumenschilfrohr,Canna indica,"Das Blumenschilfrohr hat grosse, tropisch wirkende Blaetter und auffaellige Blueten in Rot, Orange oder Gelb.",Volles Sonnenlicht,18-28 °C,5,flowering|large|sun,,,,, -large,constants/lexiconBatch2.ts,90,Papaya,Carica papaya,"Die Papaya ist eine tropische Fruchtpflanze mit grossen, gelappten Blaettern und orangen Fruechten.",Volles Sonnenlicht,20-35 °C,5,large|sun,,,,, -large,constants/lexiconBatch2.ts,217,Trompetenbaum,Catalpa bignonioides,Trompetenbaum ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, -large,constants/lexiconBatch2.ts,208,Zeder,Cedrus libani,Zeder ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, -large,constants/lexiconBatch1.ts,81,Peruanischer Fackelkaktus,Cereus peruvianus,"Der Peruanische Fackelkaktus ist ein saeulenfoermiger Kaktus, der im Innenraum bis zu 2 m hoch werden kann.",Volles Sonnenlicht,15-35 °C,21,easy|succulent|large|sun,,,,, -large,constants/lexiconBatch1.ts,47,Taro,Colocasia esculenta,"Der Taro ist eine tropische Pflanze mit grossen, herzfoermigen Blaettern. Die Knollen sind Nahrungsquelle.",Helles indirektes Licht,18-30 °C,3,large|high_humidity,,,,, -large,constants/lexiconBatch2.ts,209,Zypresse,Cupressus sempervirens,Zypresse ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, -large,constants/lexiconBatch2.ts,239,Palmfarn,Cycas revoluta,Palmfarn ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles bis volles Licht,18-30 C,10,tree|large|sun,,,,, -large,constants/lexiconBatch2.ts,215,Flammenbaum,Delonix regia,Flammenbaum ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|large,,,,, -large,constants/lexiconBatch1.ts,39,Geigenfeige,Ficus lyrata,"Die Geigenfeige ist ein Trendbaum mit grossen, geigenfoermigen Blaettern. Benoetigt viel Licht.",Helles indirektes Licht,18-27 °C,7,tree|large|bright_light,,,,, -large,constants/lexiconBatch2.ts,211,Jacaranda,Jacaranda mimosifolia,Jacaranda ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|large,,,,, -large,constants/lexiconBatch2.ts,204,Magnolie,Magnolia grandiflora,Magnolie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|large,,,,, -large,constants/lexiconBatch2.ts,2,Bananenpflanze,Musa acuminata,"Die Bananenpflanze ist eine tropische Staude mit riesigen, glaenzenden Blaettern. Im Zimmer selten fruechttragend.",Helles bis volles Licht,20-30 °C,5,large|high_humidity,,,,, -large,constants/lexiconBatch2.ts,50,Philodendron bipinnatifidum,Philodendron bipinnatifidum,"Philodendron bipinnatifidum hat grosse, tief gelappte Blaetter. Er entwickelt einen beeindruckenden, baumfoermigen Wuchs.",Helles indirektes Licht,18-27 °C,7,easy|large,,,,, -large,constants/lexiconBatch2.ts,49,Philodendron gloriosum,Philodendron gloriosum,"Philodendron gloriosum hat grosse, samtige, herzfoermige Blaetter mit weissen Rippen. Eine atemberaubende Pflanze.",Helles indirektes Licht,18-27 °C,7,patterned|large|high_humidity,,,,, -large,constants/lexiconBatch2.ts,8,Goldener Bambus,Phyllostachys aurea,"Der Goldene Bambus hat elegante, goldgelbe Halme mit engstehenden Knoten. Sehr dekorativ als Sichtschutz.",Helles bis volles Licht,10-30 °C,5,easy|large,,,,, -large,constants/lexiconBatch2.ts,207,Fichte,Picea abies,Fichte ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, -large,constants/lexiconBatch2.ts,206,Kiefer,Pinus sylvestris,Kiefer ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, -large,constants/lexiconBatch2.ts,71,Koenigs-Protea,Protea cynaroides,"Die Koenigs-Protea ist die Nationalblume Suedafrikas mit riesigen, imposanten Bluetenkoepfen. Eine echte Besonderheit.",Volles Sonnenlicht,10-25 °C,7,flowering|large|sun,,,,, -large,constants/lexiconBatch2.ts,205,Eiche,Quercus robur,Eiche ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, -large,constants/lexiconBatch2.ts,214,Robinie,Robinia pseudoacacia,Robinie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, -large,constants/lexiconBatch2.ts,113,Silber-Weide,Salix alba,"Die Silber-Weide hat silbrig-glaenzende Blaetter. Weidenrinde enthält Salicylsaeure, die Grundlage von Aspirin.",Helles bis volles Licht,10-25 °C,7,tree|large|medicinal,medicinal_requires_external_evidence,,,, -large,constants/lexiconBatch2.ts,11,Grosse Strahlenaralie,Schefflera actinophylla,"Die Grosse Strahlenaralie kann grosse, handfoermige Blaetter entwickeln. Sie ist ideal als Zimmerstrauch.",Helles indirektes Licht,18-27 °C,7,easy|tree|large,,,,, -large,constants/lexiconBatch2.ts,213,Eberesche,Sorbus aucuparia,Eberesche ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, -large,constants/lexiconBatch2.ts,1,Weisse Strelitzie,Strelitzia nicolai,"Die Weisse Strelitzie ist ein beeindruckender Zimmerstrauch mit grossen, blaugruenen Blaettern und weiss-blauen Blueten.",Helles bis volles Licht,18-27 °C,7,tree|large|bright_light,,,,, -large,constants/lexiconBatch1.ts,3,Paradiesvogelblume,Strelitzia reginae,"Die Paradiesvogelblume beeindruckt mit leuchtend orangefarbenen und blauen Blueten, die einem Vogel aehneln.",Volles Sonnenlicht,18-26 °C,7,flowering|large|sun,,,,, -large,constants/lexiconBatch2.ts,5,Mexikanische Fächerpalme,Washingtonia robusta,"Die Mexikanische Fächerpalme ist eine schlanke, hohe Palme mit faecher­foermigen Blaettern. Sehr hitzetolerant.",Volles Sonnenlicht,15-35 °C,10,tree|large|sun,,,,, -large,constants/lexiconBatch1.ts,65,Chinesischer Blauregen,Wisteria sinensis,"Der Chinesische Blauregen ist ein ueppiger Kletterkuenstler mit langen, duftenden Bluetentrauben in Lila.",Volles Sonnenlicht,10-25 °C,7,flowering|large|sun,,,,, +category,source_file,source_index,name,botanical_name,description,light,temp,water_interval_days,all_categories,risk_flags,audit_status,evidence_source,evidence_url,notes +large,constants/lexiconBatch2.ts,212,Spitzahorn,Acer platanoides,Spitzahorn ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, +large,constants/lexiconBatch1.ts,11,Agave,Agave americana,"Die Agave ist eine imposante Sukkulente mit steifen, blaugruenen Blaettern mit Stacheln. Sie bluet nur einmal.",Volles Sonnenlicht,10-35 °C,21,succulent|large|sun,,,,, +large,constants/lexiconBatch1.ts,46,Amazona-Taro,Alocasia amazonica,"Der Amazona-Taro besticht mit dunkelgruenen, pfeilfoermigen Blaettern mit markant weissen Rippen.",Indirektes Licht,18-27 °C,5,patterned|large|high_humidity,,,,, +large,constants/lexiconBatch2.ts,18,Kap-Aloe (ferox),Aloe ferox,"Aloe ferox ist eine grosse, imposante Aloe mit stachligen, blaugruenen Blaettern und leuchtend roten Bluetenaehren.",Volles Sonnenlicht,10-30 °C,14,succulent|large|medicinal|sun,medicinal_requires_external_evidence,,,, +large,constants/lexiconBatch2.ts,73,Muschelingwer,Alpinia zerumbet,"Der Muschelingwer hat lange, elegante Blaetter und haengende Bluetenrispen mit weiss-rosa Bluetchen.",Helles bis volles Licht,20-30 °C,5,flowering|large|high_humidity,,,,, +large,constants/lexiconBatch2.ts,7,Bambusrohr,Bambusa vulgaris,Das Bambusrohr ist eine schnell wachsende Bambusart mit gelbgruenen Halmen. Sehr dekorativ und vielseitig nutzbar.,Helles bis volles Licht,15-30 °C,5,easy|large,,,,, +large,constants/lexiconBatch2.ts,114,Hange-Birke,Betula pendula,Die Haenge-Birke hat charakteristisch weisse Rinde und haengende Zweige. Die Blaetter werden in der Heilkunde genutzt.,Volles Sonnenlicht,10-25 °C,7,tree|large|medicinal,medicinal_requires_external_evidence,,,, +large,constants/lexiconBatch2.ts,67,Blumenschilfrohr,Canna indica,"Das Blumenschilfrohr hat grosse, tropisch wirkende Blaetter und auffaellige Blueten in Rot, Orange oder Gelb.",Volles Sonnenlicht,18-28 °C,5,flowering|large|sun,,,,, +large,constants/lexiconBatch2.ts,90,Papaya,Carica papaya,"Die Papaya ist eine tropische Fruchtpflanze mit grossen, gelappten Blaettern und orangen Fruechten.",Volles Sonnenlicht,20-35 °C,5,large|sun,,,,, +large,constants/lexiconBatch2.ts,217,Trompetenbaum,Catalpa bignonioides,Trompetenbaum ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, +large,constants/lexiconBatch2.ts,208,Zeder,Cedrus libani,Zeder ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, +large,constants/lexiconBatch1.ts,81,Peruanischer Fackelkaktus,Cereus peruvianus,"Der Peruanische Fackelkaktus ist ein saeulenfoermiger Kaktus, der im Innenraum bis zu 2 m hoch werden kann.",Volles Sonnenlicht,15-35 °C,21,easy|succulent|large|sun,,,,, +large,constants/lexiconBatch1.ts,47,Taro,Colocasia esculenta,"Der Taro ist eine tropische Pflanze mit grossen, herzfoermigen Blaettern. Die Knollen sind Nahrungsquelle.",Helles indirektes Licht,18-30 °C,3,large|high_humidity,,,,, +large,constants/lexiconBatch2.ts,209,Zypresse,Cupressus sempervirens,Zypresse ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, +large,constants/lexiconBatch2.ts,239,Palmfarn,Cycas revoluta,Palmfarn ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles bis volles Licht,18-30 C,10,tree|large|sun,,,,, +large,constants/lexiconBatch2.ts,215,Flammenbaum,Delonix regia,Flammenbaum ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|large,,,,, +large,constants/lexiconBatch1.ts,39,Geigenfeige,Ficus lyrata,"Die Geigenfeige ist ein Trendbaum mit grossen, geigenfoermigen Blaettern. Benoetigt viel Licht.",Helles indirektes Licht,18-27 °C,7,tree|large|bright_light,,,,, +large,constants/lexiconBatch2.ts,211,Jacaranda,Jacaranda mimosifolia,Jacaranda ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|large,,,,, +large,constants/lexiconBatch2.ts,204,Magnolie,Magnolia grandiflora,Magnolie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|large,,,,, +large,constants/lexiconBatch2.ts,2,Bananenpflanze,Musa acuminata,"Die Bananenpflanze ist eine tropische Staude mit riesigen, glaenzenden Blaettern. Im Zimmer selten fruechttragend.",Helles bis volles Licht,20-30 °C,5,large|high_humidity,,,,, +large,constants/lexiconBatch2.ts,50,Philodendron bipinnatifidum,Philodendron bipinnatifidum,"Philodendron bipinnatifidum hat grosse, tief gelappte Blaetter. Er entwickelt einen beeindruckenden, baumfoermigen Wuchs.",Helles indirektes Licht,18-27 °C,7,easy|large,,,,, +large,constants/lexiconBatch2.ts,49,Philodendron gloriosum,Philodendron gloriosum,"Philodendron gloriosum hat grosse, samtige, herzfoermige Blaetter mit weissen Rippen. Eine atemberaubende Pflanze.",Helles indirektes Licht,18-27 °C,7,patterned|large|high_humidity,,,,, +large,constants/lexiconBatch2.ts,8,Goldener Bambus,Phyllostachys aurea,"Der Goldene Bambus hat elegante, goldgelbe Halme mit engstehenden Knoten. Sehr dekorativ als Sichtschutz.",Helles bis volles Licht,10-30 °C,5,easy|large,,,,, +large,constants/lexiconBatch2.ts,207,Fichte,Picea abies,Fichte ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, +large,constants/lexiconBatch2.ts,206,Kiefer,Pinus sylvestris,Kiefer ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, +large,constants/lexiconBatch2.ts,71,Koenigs-Protea,Protea cynaroides,"Die Koenigs-Protea ist die Nationalblume Suedafrikas mit riesigen, imposanten Bluetenkoepfen. Eine echte Besonderheit.",Volles Sonnenlicht,10-25 °C,7,flowering|large|sun,,,,, +large,constants/lexiconBatch2.ts,205,Eiche,Quercus robur,Eiche ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, +large,constants/lexiconBatch2.ts,214,Robinie,Robinia pseudoacacia,Robinie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, +large,constants/lexiconBatch2.ts,113,Silber-Weide,Salix alba,"Die Silber-Weide hat silbrig-glaenzende Blaetter. Weidenrinde enthält Salicylsaeure, die Grundlage von Aspirin.",Helles bis volles Licht,10-25 °C,7,tree|large|medicinal,medicinal_requires_external_evidence,,,, +large,constants/lexiconBatch2.ts,11,Grosse Strahlenaralie,Schefflera actinophylla,"Die Grosse Strahlenaralie kann grosse, handfoermige Blaetter entwickeln. Sie ist ideal als Zimmerstrauch.",Helles indirektes Licht,18-27 °C,7,easy|tree|large,,,,, +large,constants/lexiconBatch2.ts,213,Eberesche,Sorbus aucuparia,Eberesche ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, +large,constants/lexiconBatch2.ts,1,Weisse Strelitzie,Strelitzia nicolai,"Die Weisse Strelitzie ist ein beeindruckender Zimmerstrauch mit grossen, blaugruenen Blaettern und weiss-blauen Blueten.",Helles bis volles Licht,18-27 °C,7,tree|large|bright_light,,,,, +large,constants/lexiconBatch1.ts,3,Paradiesvogelblume,Strelitzia reginae,"Die Paradiesvogelblume beeindruckt mit leuchtend orangefarbenen und blauen Blueten, die einem Vogel aehneln.",Volles Sonnenlicht,18-26 °C,7,flowering|large|sun,,,,, +large,constants/lexiconBatch2.ts,5,Mexikanische Fächerpalme,Washingtonia robusta,"Die Mexikanische Fächerpalme ist eine schlanke, hohe Palme mit faecher­foermigen Blaettern. Sehr hitzetolerant.",Volles Sonnenlicht,15-35 °C,10,tree|large|sun,,,,, +large,constants/lexiconBatch1.ts,65,Chinesischer Blauregen,Wisteria sinensis,"Der Chinesische Blauregen ist ein ueppiger Kletterkuenstler mit langen, duftenden Bluetentrauben in Lila.",Volles Sonnenlicht,10-25 °C,7,flowering|large|sun,,,,, diff --git a/audits/semantic-search/categories/low_light.csv b/audits/semantic-search/categories/low_light.csv index 7e04e9b..85fcd8a 100644 --- a/audits/semantic-search/categories/low_light.csv +++ b/audits/semantic-search/categories/low_light.csv @@ -1,17 +1,17 @@ -category,source_file,source_index,name,botanical_name,description,light,temp,water_interval_days,all_categories,risk_flags,audit_status,evidence_source,evidence_url,notes -low_light,constants/lexiconBatch1.ts,50,Aglaoneme,Aglaonema commutatum,Die Aglaoneme ist eine dekorative Zimmerpflanze mit silbrig-gruen gemusterten Blaettern. Tolerant gegenueber wenig Licht.,Wenig bis helles Licht,15-26 °C,7,easy|patterned|low_light,,,,, -low_light,constants/lexiconBatch2.ts,16,Schusterpflanze,Aspidistra elatior,"Die Schusterpflanze ist eine extrem robuste Zimmerpflanze mit langen, dunkelgruenen Blaettern. Vertraegt tiefe Temperaturen.",Wenig bis helles Licht,10-20 °C,14,easy|low_light,,,,, -low_light,constants/lexiconBatch2.ts,43,Vogelnest-Farn,Asplenium nidus,"Der Vogelnest-Farn hat ganzrandige, glaenzende Wedel, die eine Nestform bilden. Sehr dekorativ und robust.",Helles indirektes Licht,18-27 °C,5,easy|low_light|high_humidity,,,,, -low_light,constants/lexiconBatch2.ts,13,Japanische Aucube,Aucuba japonica,"Die Japanische Aucube hat glaenzende, gruene oder gelbgefleckte Blaetter. Sehr schattenvertraeglich.",Wenig bis helles Licht,10-20 °C,7,easy|low_light,,,,, -low_light,constants/lexiconBatch1.ts,43,Bergpalme,Chamaedorea elegans,Die Bergpalme ist eine kompakte Zimmerpalme fuer schattigere Standorte. Ideal fuer dunkle Innenraeume.,Wenig bis helles Licht,15-25 °C,7,easy|pet_friendly|tree|air_purifier|low_light,air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence,,,, -low_light,constants/lexiconBatch1.ts,48,Dieffenbachie,Dieffenbachia seguine,"Die Dieffenbachie ist eine tropische Blattschmuckpflanze mit grossen, gruen-weiss gefleckten Blaettern.",Helles indirektes Licht,18-26 °C,7,easy|air_purifier|low_light,air_purifier_requires_external_evidence,,,, -low_light,constants/lexiconBatch1.ts,14,Maisstrauch,Dracaena fragrans,"Der Maisstrauch ist eine robuste Zimmerpflanze mit breiten, gestreiften Blaettern. Gedeiht auch bei wenig Licht.",Helles indirektes Licht,15-25 °C,10,easy|tree|air_purifier|low_light,air_purifier_requires_external_evidence,,,, -low_light,constants/lexiconBatch2.ts,12,Fatsia,Fatsia japonica,"Die Fatsia ist ein dekorativer Zimmerstrauch mit grossen, handfoermigen, glaenzenden Blaettern. Sehr robust.",Helles indirektes Licht,10-20 °C,7,easy|low_light,,,,, -low_light,constants/lexiconBatch1.ts,90,Gasteria,Gasteria carinata,"Die Gasteria ist eine kleine Sukkulente mit zweireihig angeordneten, zungenfoermigen, gefleckten Blaettern.",Helles indirektes Licht,15-25 °C,14,easy|succulent|low_light,,,,, -low_light,constants/lexiconBatch1.ts,6,Zebra-Haworthie,Haworthia fasciata,Die Zebra-Haworthie ist eine kompakte Sukkulente mit weissen Querstreifen auf dunkelgruenen Blaettern.,Helles indirektes Licht,15-25 °C,14,easy|succulent|low_light,,,,, -low_light,constants/lexiconBatch1.ts,37,Efeu,Hedera helix,"Efeu ist eine robuste Kletter- und Haengepflanze mit charakteristischen, dreilappigen Blaettern. Sehr langlebig.",Wenig bis helles Licht,10-20 °C,7,easy|hanging|air_purifier|low_light,air_purifier_requires_external_evidence,,,, -low_light,constants/lexiconBatch2.ts,3,Kentia-Palme,Howea forsteriana,"Die Kentia-Palme ist eine der elegantesten Zimmerpalmen mit langen, herabhängenden Fiederblaettern.",Helles indirektes Licht,18-25 °C,7,pet_friendly|tree|low_light,pet_friendly_requires_external_evidence,,,, -low_light,constants/lexiconBatch1.ts,103,Spiegelpeperomie,Peperomia obtusifolia,"Die Spiegelpeperomie hat glaenzende, lederartige, oval-runde Blaetter in tiefem Gruen. Sehr robust.",Helles indirektes Licht,16-26 °C,10,easy|pet_friendly|low_light,pet_friendly_requires_external_evidence,,,, -low_light,constants/lexiconBatch1.ts,15,Herzblatt-Philodendron,Philodendron hederaceum,Der Herzblatt-Philodendron ist eine pflegeleichte Kletter- oder Haengepflanze mit herzfoermigen Blaettern.,Indirektes Licht,18-28 °C,7,easy|hanging|low_light,,,,, -low_light,constants/lexiconBatch2.ts,242,Philodendron Brasil,Philodendron hederaceum Brasil,Philodendron Brasil ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,easy|hanging|low_light,,,,, -low_light,constants/lexiconBatch1.ts,45,Stab-Palme,Rhapis excelsa,"Die Stab-Palme ist eine elegante Zimmerpalme mit faecher­foermigen Blaettern auf duennen, bambusartigen Staemmen.",Helles indirektes Licht,15-25 °C,7,tree|low_light,,,,, +category,source_file,source_index,name,botanical_name,description,light,temp,water_interval_days,all_categories,risk_flags,audit_status,evidence_source,evidence_url,notes +low_light,constants/lexiconBatch1.ts,50,Aglaoneme,Aglaonema commutatum,Die Aglaoneme ist eine dekorative Zimmerpflanze mit silbrig-gruen gemusterten Blaettern. Tolerant gegenueber wenig Licht.,Wenig bis helles Licht,15-26 °C,7,easy|patterned|low_light,,,,, +low_light,constants/lexiconBatch2.ts,16,Schusterpflanze,Aspidistra elatior,"Die Schusterpflanze ist eine extrem robuste Zimmerpflanze mit langen, dunkelgruenen Blaettern. Vertraegt tiefe Temperaturen.",Wenig bis helles Licht,10-20 °C,14,easy|low_light,,,,, +low_light,constants/lexiconBatch2.ts,43,Vogelnest-Farn,Asplenium nidus,"Der Vogelnest-Farn hat ganzrandige, glaenzende Wedel, die eine Nestform bilden. Sehr dekorativ und robust.",Helles indirektes Licht,18-27 °C,5,easy|low_light|high_humidity,,,,, +low_light,constants/lexiconBatch2.ts,13,Japanische Aucube,Aucuba japonica,"Die Japanische Aucube hat glaenzende, gruene oder gelbgefleckte Blaetter. Sehr schattenvertraeglich.",Wenig bis helles Licht,10-20 °C,7,easy|low_light,,,,, +low_light,constants/lexiconBatch1.ts,43,Bergpalme,Chamaedorea elegans,Die Bergpalme ist eine kompakte Zimmerpalme fuer schattigere Standorte. Ideal fuer dunkle Innenraeume.,Wenig bis helles Licht,15-25 °C,7,easy|pet_friendly|tree|air_purifier|low_light,air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence,,,, +low_light,constants/lexiconBatch1.ts,48,Dieffenbachie,Dieffenbachia seguine,"Die Dieffenbachie ist eine tropische Blattschmuckpflanze mit grossen, gruen-weiss gefleckten Blaettern.",Helles indirektes Licht,18-26 °C,7,easy|air_purifier|low_light,air_purifier_requires_external_evidence,,,, +low_light,constants/lexiconBatch1.ts,14,Maisstrauch,Dracaena fragrans,"Der Maisstrauch ist eine robuste Zimmerpflanze mit breiten, gestreiften Blaettern. Gedeiht auch bei wenig Licht.",Helles indirektes Licht,15-25 °C,10,easy|tree|air_purifier|low_light,air_purifier_requires_external_evidence,,,, +low_light,constants/lexiconBatch2.ts,12,Fatsia,Fatsia japonica,"Die Fatsia ist ein dekorativer Zimmerstrauch mit grossen, handfoermigen, glaenzenden Blaettern. Sehr robust.",Helles indirektes Licht,10-20 °C,7,easy|low_light,,,,, +low_light,constants/lexiconBatch1.ts,90,Gasteria,Gasteria carinata,"Die Gasteria ist eine kleine Sukkulente mit zweireihig angeordneten, zungenfoermigen, gefleckten Blaettern.",Helles indirektes Licht,15-25 °C,14,easy|succulent|low_light,,,,, +low_light,constants/lexiconBatch1.ts,6,Zebra-Haworthie,Haworthia fasciata,Die Zebra-Haworthie ist eine kompakte Sukkulente mit weissen Querstreifen auf dunkelgruenen Blaettern.,Helles indirektes Licht,15-25 °C,14,easy|succulent|low_light,,,,, +low_light,constants/lexiconBatch1.ts,37,Efeu,Hedera helix,"Efeu ist eine robuste Kletter- und Haengepflanze mit charakteristischen, dreilappigen Blaettern. Sehr langlebig.",Wenig bis helles Licht,10-20 °C,7,easy|hanging|air_purifier|low_light,air_purifier_requires_external_evidence,,,, +low_light,constants/lexiconBatch2.ts,3,Kentia-Palme,Howea forsteriana,"Die Kentia-Palme ist eine der elegantesten Zimmerpalmen mit langen, herabhängenden Fiederblaettern.",Helles indirektes Licht,18-25 °C,7,pet_friendly|tree|low_light,pet_friendly_requires_external_evidence,,,, +low_light,constants/lexiconBatch1.ts,103,Spiegelpeperomie,Peperomia obtusifolia,"Die Spiegelpeperomie hat glaenzende, lederartige, oval-runde Blaetter in tiefem Gruen. Sehr robust.",Helles indirektes Licht,16-26 °C,10,easy|pet_friendly|low_light,pet_friendly_requires_external_evidence,,,, +low_light,constants/lexiconBatch1.ts,15,Herzblatt-Philodendron,Philodendron hederaceum,Der Herzblatt-Philodendron ist eine pflegeleichte Kletter- oder Haengepflanze mit herzfoermigen Blaettern.,Indirektes Licht,18-28 °C,7,easy|hanging|low_light,,,,, +low_light,constants/lexiconBatch2.ts,242,Philodendron Brasil,Philodendron hederaceum Brasil,Philodendron Brasil ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,easy|hanging|low_light,,,,, +low_light,constants/lexiconBatch1.ts,45,Stab-Palme,Rhapis excelsa,"Die Stab-Palme ist eine elegante Zimmerpalme mit faecher­foermigen Blaettern auf duennen, bambusartigen Staemmen.",Helles indirektes Licht,15-25 °C,7,tree|low_light,,,,, diff --git a/audits/semantic-search/categories/medicinal.csv b/audits/semantic-search/categories/medicinal.csv index 0746445..a4bc2a1 100644 --- a/audits/semantic-search/categories/medicinal.csv +++ b/audits/semantic-search/categories/medicinal.csv @@ -1,33 +1,33 @@ -category,source_file,source_index,name,botanical_name,description,light,temp,water_interval_days,all_categories,risk_flags,audit_status,evidence_source,evidence_url,notes -medicinal,constants/lexiconBatch2.ts,108,Schafgarbe,Achillea millefolium,Die Schafgarbe hat weisse oder rosafarbene Bluetenschirme und fein gefiederte Blaetter. Wichtige Heilpflanze.,Volles Sonnenlicht,10-25 °C,7,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, -medicinal,constants/lexiconBatch1.ts,89,Kap-Aloe,Aloe arborescens,"Die Kap-Aloe ist eine strauchige Aloe mit schmalen, gezaehnten Blaettern und leuchtend roten Bluetenaehren im Winter.",Volles Sonnenlicht,10-30 °C,14,easy|succulent|medicinal|sun,medicinal_requires_external_evidence,,,, -medicinal,constants/lexiconBatch2.ts,18,Kap-Aloe (ferox),Aloe ferox,"Aloe ferox ist eine grosse, imposante Aloe mit stachligen, blaugruenen Blaettern und leuchtend roten Bluetenaehren.",Volles Sonnenlicht,10-30 °C,14,succulent|large|medicinal|sun,medicinal_requires_external_evidence,,,, -medicinal,constants/lexiconBatch2.ts,107,Arnika,Arnica montana,Arnika ist eine bekannte Heilpflanze aus den Alpen mit goldgelben Korbbluten. Sie wird fuer Muskeln und Gelenke verwendet.,Volles Sonnenlicht,10-20 °C,7,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, -medicinal,constants/lexiconBatch2.ts,110,Wermut,Artemisia absinthium,"Wermut ist ein stark aromatisches Heilkraut mit silbrig-gruenen, tief eingeschnittenen Blaettern. Fuer Kraeuterlikoere.",Volles Sonnenlicht,10-25 °C,14,medicinal|sun,medicinal_requires_external_evidence,,,, -medicinal,constants/lexiconBatch2.ts,114,Hange-Birke,Betula pendula,Die Haenge-Birke hat charakteristisch weisse Rinde und haengende Zweige. Die Blaetter werden in der Heilkunde genutzt.,Volles Sonnenlicht,10-25 °C,7,tree|large|medicinal,medicinal_requires_external_evidence,,,, -medicinal,constants/lexiconBatch2.ts,187,Ringelblume,Calendula officinalis,"Ringelblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, -medicinal,constants/lexiconBatch2.ts,92,Chili,Capsicum annuum,"Chili ist eine beliebte Gemuese- und Zierpflanze mit leuchtenden, roten oder orangen Fruechten. Im Topf kultivierbar.",Volles Sonnenlicht,20-30 °C,4,easy|medicinal|sun,medicinal_requires_external_evidence,,,, -medicinal,constants/lexiconBatch2.ts,138,Roemische Kamille,Chamaemelum nobile,Roemische Kamille ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|medicinal|sun,medicinal_requires_external_evidence,,,, -medicinal,constants/lexiconBatch2.ts,101,Kamille,Chamomilla recutita,"Die Kamille ist ein beliebtes Heilkraut mit kleinen, weiss-gelben Blueten. Das aetherische Oel wirkt beruhigend.",Volles Sonnenlicht,15-25 °C,5,easy|medicinal|sun,medicinal_requires_external_evidence,,,, -medicinal,constants/lexiconBatch2.ts,160,Maigloeckchen,Convallaria majalis,"Maigloeckchen ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|medicinal,medicinal_requires_external_evidence,,,, -medicinal,constants/lexiconBatch2.ts,74,Kurkuma,Curcuma longa,Kurkuma ist eine tropische Gewuerzpflanze mit breiten Blaettern und leuchtend gelber Wurzel. Wichtiges Heilgewuerz.,Helles bis volles Licht,20-30 °C,7,medicinal|high_humidity,medicinal_requires_external_evidence,,,, -medicinal,constants/lexiconBatch2.ts,109,Roter Fingerhut,Digitalis purpurea,"Der Rote Fingerhut hat hohe Bluetenstaende mit roehrenfoermigen, gepunkteten Blueten in Rosa. Wichtige Arzneipflanze.",Helles bis volles Licht,10-20 °C,7,flowering|medicinal,medicinal_requires_external_evidence,,,, -medicinal,constants/lexiconBatch2.ts,106,Sonnenhut,Echinacea purpurea,"Der Sonnenhut ist eine beliebte Heilpflanze mit grossen, pinkfarbenen Blueten. Er staerkt das Immunsystem.",Helles bis volles Licht,15-25 °C,7,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, -medicinal,constants/lexiconBatch2.ts,210,Eukalyptus,Eucalyptus globulus,Eukalyptus ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|medicinal|sun,medicinal_requires_external_evidence,,,, -medicinal,constants/lexiconBatch2.ts,216,Ginkgo,Ginkgo biloba,Ginkgo ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|medicinal|sun,medicinal_requires_external_evidence,,,, -medicinal,constants/lexiconBatch2.ts,119,Zaubernuss,Hamamelis mollis,"Die Zaubernuss bluet im Winter mit fadendunnen, gelben Bluetenkranzeln, die bis -10 Grad standhalten.",Helles bis volles Licht,10-20 °C,10,flowering|medicinal,medicinal_requires_external_evidence,,,, -medicinal,constants/lexiconBatch2.ts,105,Johanniskraut,Hypericum perforatum,Das Johanniskraut hat leuchtend gelbe Blueten und ist ein wichtiges Heilkraut gegen Depressionen und Stimmungstiefs.,Volles Sonnenlicht,10-25 °C,7,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, -medicinal,constants/lexiconBatch1.ts,23,Echter Lavendel,Lavandula angustifolia,Der Echte Lavendel ist ein aromatischer Halbstrauch mit lilafarbenen Bluetenaehren. Herrlicher Duft.,Volles Sonnenlicht,10-25 °C,10,medicinal|bright_light|sun,medicinal_requires_external_evidence,,,, -medicinal,constants/lexiconBatch2.ts,102,Zitronenmelisse,Melissa officinalis,Die Zitronenmelisse ist ein zitronig duftendes Heilkraut. Sie beruhigt die Nerven und foerdert den Schlaf.,Helles bis volles Licht,15-25 °C,5,easy|medicinal,medicinal_requires_external_evidence,,,, -medicinal,constants/lexiconBatch1.ts,25,Basilikum,Ocimum basilicum,"Basilikum ist das beliebteste Kuechenkraut mit intensiv aromatischen, gruenen Blaettern. Fuer Pesto verwendet.",Volles Sonnenlicht,18-30 °C,2,easy|medicinal|sun,medicinal_requires_external_evidence,,,, -medicinal,constants/lexiconBatch1.ts,28,Oregano,Origanum vulgare,"Oregano ist ein aromatisches Kuechenkraut mit runden, behaarten Blaettern. In mediterraner Kueche beliebt.",Volles Sonnenlicht,15-25 °C,7,easy|medicinal|sun,medicinal_requires_external_evidence,,,, -medicinal,constants/lexiconBatch1.ts,31,Rosengeranie,Pelargonium graveolens,Die Rosengeranie ist eine Duftpflanze mit tief eingeschnittenen Blaettern und rosaenlichem Aroma.,Volles Sonnenlicht,15-25 °C,7,easy|medicinal|sun,medicinal_requires_external_evidence,,,, -medicinal,constants/lexiconBatch1.ts,24,Rosmarin,Rosmarinus officinalis,Rosmarin ist ein aromatisches Kraut mit nadelartigen Blaettern und blauen Blueten. In der Kueche unverzichtbar.,Volles Sonnenlicht,10-25 °C,7,easy|medicinal|sun,medicinal_requires_external_evidence,,,, -medicinal,constants/lexiconBatch2.ts,113,Silber-Weide,Salix alba,"Die Silber-Weide hat silbrig-glaenzende Blaetter. Weidenrinde enthält Salicylsaeure, die Grundlage von Aspirin.",Helles bis volles Licht,10-25 °C,7,tree|large|medicinal,medicinal_requires_external_evidence,,,, -medicinal,constants/lexiconBatch2.ts,103,Salbei,Salvia officinalis,Salbei ist ein aromatisches Heilkraut mit silbrig-gruenen Blaettern. Er hat antibakterielle und entzuendungshem­mende Wirkung.,Volles Sonnenlicht,10-25 °C,7,easy|medicinal|sun,medicinal_requires_external_evidence,,,, -medicinal,constants/lexiconBatch2.ts,112,Schwarzer Holunder,Sambucus nigra,Der Schwarze Holunder hat weisse Doldenbluten und schwarze Beeren. Die Fruechte werden fuer Sirup und Saft verwendet.,Helles bis volles Licht,10-25 °C,7,flowering|tree|medicinal,medicinal_requires_external_evidence,,,, -medicinal,constants/lexiconBatch1.ts,27,Thymian,Thymus vulgaris,"Thymian ist ein kleiner, aromatischer Strauch mit winzigen Blaettern und rosa Blueten. Wichtiges Kuechenkraut.",Volles Sonnenlicht,10-25 °C,7,easy|medicinal|sun,medicinal_requires_external_evidence,,,, -medicinal,constants/lexiconBatch2.ts,111,Grosse Brennessel,Urtica dioica,Die Grosse Brennessel ist eine Heilpflanze mit brennenden Haaren. Die Blaetter sind reich an Vitaminen und Mineralien.,Helles bis volles Licht,10-25 °C,7,medicinal,medicinal_requires_external_evidence,,,, -medicinal,constants/lexiconBatch2.ts,104,Baldrian,Valeriana officinalis,Baldrian ist ein bekanntes Heilkraut mit weissen bis roeslichen Blueten. Die Wurzeln werden zur Schlaffoerderung verwendet.,Helles bis volles Licht,15-25 °C,7,flowering|medicinal,medicinal_requires_external_evidence,,,, -medicinal,constants/lexiconBatch2.ts,192,Koenigskerze,Verbascum thapsus,"Koenigskerze ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, -medicinal,constants/lexiconBatch2.ts,75,Ingwer,Zingiber officinale,Ingwer ist eine tropische Gewuerzpflanze mit aromatischen Knollen. Die Blaetter sind schilfartig.,Helles indirektes Licht,20-30 °C,5,medicinal|high_humidity,medicinal_requires_external_evidence,,,, +category,source_file,source_index,name,botanical_name,description,light,temp,water_interval_days,all_categories,risk_flags,audit_status,evidence_source,evidence_url,notes +medicinal,constants/lexiconBatch2.ts,108,Schafgarbe,Achillea millefolium,Die Schafgarbe hat weisse oder rosafarbene Bluetenschirme und fein gefiederte Blaetter. Wichtige Heilpflanze.,Volles Sonnenlicht,10-25 °C,7,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, +medicinal,constants/lexiconBatch1.ts,89,Kap-Aloe,Aloe arborescens,"Die Kap-Aloe ist eine strauchige Aloe mit schmalen, gezaehnten Blaettern und leuchtend roten Bluetenaehren im Winter.",Volles Sonnenlicht,10-30 °C,14,easy|succulent|medicinal|sun,medicinal_requires_external_evidence,,,, +medicinal,constants/lexiconBatch2.ts,18,Kap-Aloe (ferox),Aloe ferox,"Aloe ferox ist eine grosse, imposante Aloe mit stachligen, blaugruenen Blaettern und leuchtend roten Bluetenaehren.",Volles Sonnenlicht,10-30 °C,14,succulent|large|medicinal|sun,medicinal_requires_external_evidence,,,, +medicinal,constants/lexiconBatch2.ts,107,Arnika,Arnica montana,Arnika ist eine bekannte Heilpflanze aus den Alpen mit goldgelben Korbbluten. Sie wird fuer Muskeln und Gelenke verwendet.,Volles Sonnenlicht,10-20 °C,7,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, +medicinal,constants/lexiconBatch2.ts,110,Wermut,Artemisia absinthium,"Wermut ist ein stark aromatisches Heilkraut mit silbrig-gruenen, tief eingeschnittenen Blaettern. Fuer Kraeuterlikoere.",Volles Sonnenlicht,10-25 °C,14,medicinal|sun,medicinal_requires_external_evidence,,,, +medicinal,constants/lexiconBatch2.ts,114,Hange-Birke,Betula pendula,Die Haenge-Birke hat charakteristisch weisse Rinde und haengende Zweige. Die Blaetter werden in der Heilkunde genutzt.,Volles Sonnenlicht,10-25 °C,7,tree|large|medicinal,medicinal_requires_external_evidence,,,, +medicinal,constants/lexiconBatch2.ts,187,Ringelblume,Calendula officinalis,"Ringelblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, +medicinal,constants/lexiconBatch2.ts,92,Chili,Capsicum annuum,"Chili ist eine beliebte Gemuese- und Zierpflanze mit leuchtenden, roten oder orangen Fruechten. Im Topf kultivierbar.",Volles Sonnenlicht,20-30 °C,4,easy|medicinal|sun,medicinal_requires_external_evidence,,,, +medicinal,constants/lexiconBatch2.ts,138,Roemische Kamille,Chamaemelum nobile,Roemische Kamille ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|medicinal|sun,medicinal_requires_external_evidence,,,, +medicinal,constants/lexiconBatch2.ts,101,Kamille,Chamomilla recutita,"Die Kamille ist ein beliebtes Heilkraut mit kleinen, weiss-gelben Blueten. Das aetherische Oel wirkt beruhigend.",Volles Sonnenlicht,15-25 °C,5,easy|medicinal|sun,medicinal_requires_external_evidence,,,, +medicinal,constants/lexiconBatch2.ts,160,Maigloeckchen,Convallaria majalis,"Maigloeckchen ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|medicinal,medicinal_requires_external_evidence,,,, +medicinal,constants/lexiconBatch2.ts,74,Kurkuma,Curcuma longa,Kurkuma ist eine tropische Gewuerzpflanze mit breiten Blaettern und leuchtend gelber Wurzel. Wichtiges Heilgewuerz.,Helles bis volles Licht,20-30 °C,7,medicinal|high_humidity,medicinal_requires_external_evidence,,,, +medicinal,constants/lexiconBatch2.ts,109,Roter Fingerhut,Digitalis purpurea,"Der Rote Fingerhut hat hohe Bluetenstaende mit roehrenfoermigen, gepunkteten Blueten in Rosa. Wichtige Arzneipflanze.",Helles bis volles Licht,10-20 °C,7,flowering|medicinal,medicinal_requires_external_evidence,,,, +medicinal,constants/lexiconBatch2.ts,106,Sonnenhut,Echinacea purpurea,"Der Sonnenhut ist eine beliebte Heilpflanze mit grossen, pinkfarbenen Blueten. Er staerkt das Immunsystem.",Helles bis volles Licht,15-25 °C,7,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, +medicinal,constants/lexiconBatch2.ts,210,Eukalyptus,Eucalyptus globulus,Eukalyptus ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|medicinal|sun,medicinal_requires_external_evidence,,,, +medicinal,constants/lexiconBatch2.ts,216,Ginkgo,Ginkgo biloba,Ginkgo ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|medicinal|sun,medicinal_requires_external_evidence,,,, +medicinal,constants/lexiconBatch2.ts,119,Zaubernuss,Hamamelis mollis,"Die Zaubernuss bluet im Winter mit fadendunnen, gelben Bluetenkranzeln, die bis -10 Grad standhalten.",Helles bis volles Licht,10-20 °C,10,flowering|medicinal,medicinal_requires_external_evidence,,,, +medicinal,constants/lexiconBatch2.ts,105,Johanniskraut,Hypericum perforatum,Das Johanniskraut hat leuchtend gelbe Blueten und ist ein wichtiges Heilkraut gegen Depressionen und Stimmungstiefs.,Volles Sonnenlicht,10-25 °C,7,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, +medicinal,constants/lexiconBatch1.ts,23,Echter Lavendel,Lavandula angustifolia,Der Echte Lavendel ist ein aromatischer Halbstrauch mit lilafarbenen Bluetenaehren. Herrlicher Duft.,Volles Sonnenlicht,10-25 °C,10,medicinal|bright_light|sun,medicinal_requires_external_evidence,,,, +medicinal,constants/lexiconBatch2.ts,102,Zitronenmelisse,Melissa officinalis,Die Zitronenmelisse ist ein zitronig duftendes Heilkraut. Sie beruhigt die Nerven und foerdert den Schlaf.,Helles bis volles Licht,15-25 °C,5,easy|medicinal,medicinal_requires_external_evidence,,,, +medicinal,constants/lexiconBatch1.ts,25,Basilikum,Ocimum basilicum,"Basilikum ist das beliebteste Kuechenkraut mit intensiv aromatischen, gruenen Blaettern. Fuer Pesto verwendet.",Volles Sonnenlicht,18-30 °C,2,easy|medicinal|sun,medicinal_requires_external_evidence,,,, +medicinal,constants/lexiconBatch1.ts,28,Oregano,Origanum vulgare,"Oregano ist ein aromatisches Kuechenkraut mit runden, behaarten Blaettern. In mediterraner Kueche beliebt.",Volles Sonnenlicht,15-25 °C,7,easy|medicinal|sun,medicinal_requires_external_evidence,,,, +medicinal,constants/lexiconBatch1.ts,31,Rosengeranie,Pelargonium graveolens,Die Rosengeranie ist eine Duftpflanze mit tief eingeschnittenen Blaettern und rosaenlichem Aroma.,Volles Sonnenlicht,15-25 °C,7,easy|medicinal|sun,medicinal_requires_external_evidence,,,, +medicinal,constants/lexiconBatch1.ts,24,Rosmarin,Rosmarinus officinalis,Rosmarin ist ein aromatisches Kraut mit nadelartigen Blaettern und blauen Blueten. In der Kueche unverzichtbar.,Volles Sonnenlicht,10-25 °C,7,easy|medicinal|sun,medicinal_requires_external_evidence,,,, +medicinal,constants/lexiconBatch2.ts,113,Silber-Weide,Salix alba,"Die Silber-Weide hat silbrig-glaenzende Blaetter. Weidenrinde enthält Salicylsaeure, die Grundlage von Aspirin.",Helles bis volles Licht,10-25 °C,7,tree|large|medicinal,medicinal_requires_external_evidence,,,, +medicinal,constants/lexiconBatch2.ts,103,Salbei,Salvia officinalis,Salbei ist ein aromatisches Heilkraut mit silbrig-gruenen Blaettern. Er hat antibakterielle und entzuendungshem­mende Wirkung.,Volles Sonnenlicht,10-25 °C,7,easy|medicinal|sun,medicinal_requires_external_evidence,,,, +medicinal,constants/lexiconBatch2.ts,112,Schwarzer Holunder,Sambucus nigra,Der Schwarze Holunder hat weisse Doldenbluten und schwarze Beeren. Die Fruechte werden fuer Sirup und Saft verwendet.,Helles bis volles Licht,10-25 °C,7,flowering|tree|medicinal,medicinal_requires_external_evidence,,,, +medicinal,constants/lexiconBatch1.ts,27,Thymian,Thymus vulgaris,"Thymian ist ein kleiner, aromatischer Strauch mit winzigen Blaettern und rosa Blueten. Wichtiges Kuechenkraut.",Volles Sonnenlicht,10-25 °C,7,easy|medicinal|sun,medicinal_requires_external_evidence,,,, +medicinal,constants/lexiconBatch2.ts,111,Grosse Brennessel,Urtica dioica,Die Grosse Brennessel ist eine Heilpflanze mit brennenden Haaren. Die Blaetter sind reich an Vitaminen und Mineralien.,Helles bis volles Licht,10-25 °C,7,medicinal,medicinal_requires_external_evidence,,,, +medicinal,constants/lexiconBatch2.ts,104,Baldrian,Valeriana officinalis,Baldrian ist ein bekanntes Heilkraut mit weissen bis roeslichen Blueten. Die Wurzeln werden zur Schlaffoerderung verwendet.,Helles bis volles Licht,15-25 °C,7,flowering|medicinal,medicinal_requires_external_evidence,,,, +medicinal,constants/lexiconBatch2.ts,192,Koenigskerze,Verbascum thapsus,"Koenigskerze ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, +medicinal,constants/lexiconBatch2.ts,75,Ingwer,Zingiber officinale,Ingwer ist eine tropische Gewuerzpflanze mit aromatischen Knollen. Die Blaetter sind schilfartig.,Helles indirektes Licht,20-30 °C,5,medicinal|high_humidity,medicinal_requires_external_evidence,,,, diff --git a/audits/semantic-search/categories/patterned.csv b/audits/semantic-search/categories/patterned.csv index 1dc8895..318601e 100644 --- a/audits/semantic-search/categories/patterned.csv +++ b/audits/semantic-search/categories/patterned.csv @@ -1,32 +1,32 @@ -category,source_file,source_index,name,botanical_name,description,light,temp,water_interval_days,all_categories,risk_flags,audit_status,evidence_source,evidence_url,notes -patterned,constants/lexiconBatch2.ts,34,Silbervase,Aechmea fasciata,Die Silbervase ist eine Bromelie mit silbrig gebänderten Blaettern und einem rosafarbenen Bluetenstand.,Helles indirektes Licht,18-25 °C,10,flowering|patterned,,,,, -patterned,constants/lexiconBatch1.ts,50,Aglaoneme,Aglaonema commutatum,Die Aglaoneme ist eine dekorative Zimmerpflanze mit silbrig-gruen gemusterten Blaettern. Tolerant gegenueber wenig Licht.,Wenig bis helles Licht,15-26 °C,7,easy|patterned|low_light,,,,, -patterned,constants/lexiconBatch1.ts,46,Amazona-Taro,Alocasia amazonica,"Der Amazona-Taro besticht mit dunkelgruenen, pfeilfoermigen Blaettern mit markant weissen Rippen.",Indirektes Licht,18-27 °C,5,patterned|large|high_humidity,,,,, -patterned,constants/lexiconBatch2.ts,233,Samt-Anthurie,Anthurium clarinervium,Samt-Anthurie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5,patterned|high_humidity,,,,, -patterned,constants/lexiconBatch2.ts,234,Kristall-Anthurie,Anthurium crystallinum,Kristall-Anthurie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5,patterned|high_humidity,,,,, -patterned,constants/lexiconBatch2.ts,57,Forellen-Begonie,Begonia maculata,Die Forellen-Begonie hat olivgruene Blaetter mit silbernen Punkten und einer roten Unterseite. Atemberaubend.,Helles indirektes Licht,18-27 °C,7,patterned|high_humidity,,,,, -patterned,constants/lexiconBatch1.ts,18,Koenigsbegonie,Begonia rex,"Die Koenigsbegonie beeindruckt mit prachtvoll gemusterten Blaettern in Silber, Rot und Gruen.",Indirektes Licht,18-25 °C,5,patterned|high_humidity,,,,, -patterned,constants/lexiconBatch1.ts,49,Buntblatt,Caladium bicolor,"Das Buntblatt beeindruckt mit transparenten, bunt gemusterten Blaettern in Pink, Rot, Weiss und Gruen.",Indirektes Licht,20-30 °C,5,patterned|high_humidity,,,,, -patterned,constants/lexiconBatch1.ts,99,Herzkette,Ceropegia woodii,"Die Herzkette hat duenne, haengende Ranken mit herzfoermigen, silbergrau gemusterten Blaettchen.",Helles indirektes Licht,15-27 °C,14,easy|succulent|patterned|hanging,,,,, -patterned,constants/lexiconBatch2.ts,224,Kroton,Codiaeum variegatum,Kroton ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,patterned|bright_light,,,,, -patterned,constants/lexiconBatch2.ts,39,Cryptanthus,Cryptanthus bivittatus,Cryptanthus ist eine niedrig wachsende Bromelie mit sternfoermigen Rosetten und gemusterten Blaettern. Fuer Terrarien.,Helles indirektes Licht,18-27 °C,7,patterned|high_humidity,,,,, -patterned,constants/lexiconBatch1.ts,53,Ctenanthe,Ctenanthe burle-marxii,Die Ctenanthe hat faszinierend gemusterte Blaetter mit dunkelgruunem Fischgraetenmuster auf hellgruunem Hintergrund.,Indirektes Licht,18-25 °C,5,patterned|high_humidity,,,,, -patterned,constants/lexiconBatch2.ts,226,Nervenpflanze,Fittonia albivenis,Nervenpflanze ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5,patterned|high_humidity,,,,, -patterned,constants/lexiconBatch2.ts,240,Calathea lancifolia,Goeppertia insignis,Calathea lancifolia ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5,pet_friendly|patterned|high_humidity,pet_friendly_requires_external_evidence,,,, -patterned,constants/lexiconBatch2.ts,241,Calathea ornata,Goeppertia ornata,Calathea ornata ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5,pet_friendly|patterned|high_humidity,pet_friendly_requires_external_evidence,,,, -patterned,constants/lexiconBatch2.ts,227,Punktblatt,Hypoestes phyllostachya,Punktblatt ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,patterned|bright_light,,,,, -patterned,constants/lexiconBatch1.ts,51,Gebet-Pflanze,Maranta leuconeura,Die Gebet-Pflanze faltet ihre gemusterten Blaetter nachts wie Haende zusammen. Faszinierende rote und gruene Muster.,Indirektes Licht,18-27 °C,5,pet_friendly|patterned|high_humidity,pet_friendly_requires_external_evidence,,,, -patterned,constants/lexiconBatch2.ts,48,Monstera obliqua,Monstera obliqua,"Monstera obliqua ist eine seltene Monstera-Art mit filigranen Blaettern, die hauptsaechlich aus Lochern bestehen.",Helles indirektes Licht,18-27 °C,7,patterned|hanging,,,,, -patterned,constants/lexiconBatch2.ts,37,Neoregelia,Neoregelia carolinae,"Die Neoregelia ist eine Bromelie, bei der das Herzblatt zur Bluetzeit leuchtend rot wird. Sehr dekorativ.",Helles bis volles Licht,18-27 °C,7,flowering|patterned|bright_light,,,,, -patterned,constants/lexiconBatch1.ts,54,Kleeblume,Oxalis triangularis,"Die Kleeblume hat tiefviolette, dreieckige Blaetter und zarte rosa Blueten. Sie faltet die Blaetter bei Dunkelheit.",Helles indirektes Licht,15-24 °C,7,flowering|patterned,,,,, -patterned,constants/lexiconBatch2.ts,6,Schraubenbaum,Pandanus veitchii,"Der Schraubenbaum hat spiralfoermig angeordnete, gruenweiss gestreifte Blaetter. Sehr dekorativ und exotisch.",Helles bis volles Licht,18-27 °C,7,patterned|bright_light,,,,, -patterned,constants/lexiconBatch2.ts,229,Wassermelonen-Peperomie,Peperomia argyreia,Wassermelonen-Peperomie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,pet_friendly|patterned,pet_friendly_requires_external_evidence,,,, -patterned,constants/lexiconBatch2.ts,243,Philodendron Pink Princess,Philodendron erubescens Pink Princess,Philodendron Pink Princess ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,patterned|bright_light,,,,, -patterned,constants/lexiconBatch2.ts,49,Philodendron gloriosum,Philodendron gloriosum,"Philodendron gloriosum hat grosse, samtige, herzfoermige Blaetter mit weissen Rippen. Eine atemberaubende Pflanze.",Helles indirektes Licht,18-27 °C,7,patterned|large|high_humidity,,,,, -patterned,constants/lexiconBatch2.ts,228,Aluminium-Pflanze,Pilea cadierei,Aluminium-Pflanze ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,easy|pet_friendly|patterned,pet_friendly_requires_external_evidence,,,, -patterned,constants/lexiconBatch2.ts,152,Buntnessel,Plectranthus scutellarioides,"Buntnessel ist eine farbstarke Zierpflanze, die vor allem fuer ihr dekoratives Laub beliebt ist.",Volles bis helles Licht,10-24 C,4,patterned|bright_light,,,,, -patterned,constants/lexiconBatch1.ts,55,Satinpothos,Scindapsus pictus,"Der Satinpothos hat samtig-glaenzende, silbrig gefleckte Blaetter auf langen, haengenden Ranken.",Helles indirektes Licht,18-28 °C,7,easy|patterned|hanging,,,,, -patterned,constants/lexiconBatch2.ts,45,Regenbogenmoos,Selaginella uncinata,"Das Regenbogenmoos hat schuppenfoermige Blaetter, die im Licht schillernd irisieren. Dekorativ fuer Terrarien.",Helles indirektes Licht,18-27 °C,5,patterned|high_humidity,,,,, -patterned,constants/lexiconBatch1.ts,52,Stromanthe,Stromanthe sanguinea,Die Stromanthe hat dekorative Blaetter mit weissem Muster und leuchtend roter Unterseite. Familie der Marantaceen.,Helles indirektes Licht,18-25 °C,5,patterned|high_humidity,,,,, -patterned,constants/lexiconBatch1.ts,17,Zebrakraut,Tradescantia zebrina,Das Zebrakraut faellt durch seine silbrig-lila gestreiften Blaetter auf. Schnellwachsende Haengepflanze.,Helles indirektes Licht,15-25 °C,5,easy|patterned|hanging,,,,, -patterned,constants/lexiconBatch2.ts,35,Flammen-Bromelie,Vriesea splendens,"Die Flammen-Bromelie hat gebänderte, dunkelgruene Blaetter und einen spektakulaeren, roten Bluetenstand.",Helles indirektes Licht,18-25 °C,7,flowering|patterned|high_humidity,,,,, +category,source_file,source_index,name,botanical_name,description,light,temp,water_interval_days,all_categories,risk_flags,audit_status,evidence_source,evidence_url,notes +patterned,constants/lexiconBatch2.ts,34,Silbervase,Aechmea fasciata,Die Silbervase ist eine Bromelie mit silbrig gebänderten Blaettern und einem rosafarbenen Bluetenstand.,Helles indirektes Licht,18-25 °C,10,flowering|patterned,,,,, +patterned,constants/lexiconBatch1.ts,50,Aglaoneme,Aglaonema commutatum,Die Aglaoneme ist eine dekorative Zimmerpflanze mit silbrig-gruen gemusterten Blaettern. Tolerant gegenueber wenig Licht.,Wenig bis helles Licht,15-26 °C,7,easy|patterned|low_light,,,,, +patterned,constants/lexiconBatch1.ts,46,Amazona-Taro,Alocasia amazonica,"Der Amazona-Taro besticht mit dunkelgruenen, pfeilfoermigen Blaettern mit markant weissen Rippen.",Indirektes Licht,18-27 °C,5,patterned|large|high_humidity,,,,, +patterned,constants/lexiconBatch2.ts,233,Samt-Anthurie,Anthurium clarinervium,Samt-Anthurie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5,patterned|high_humidity,,,,, +patterned,constants/lexiconBatch2.ts,234,Kristall-Anthurie,Anthurium crystallinum,Kristall-Anthurie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5,patterned|high_humidity,,,,, +patterned,constants/lexiconBatch2.ts,57,Forellen-Begonie,Begonia maculata,Die Forellen-Begonie hat olivgruene Blaetter mit silbernen Punkten und einer roten Unterseite. Atemberaubend.,Helles indirektes Licht,18-27 °C,7,patterned|high_humidity,,,,, +patterned,constants/lexiconBatch1.ts,18,Koenigsbegonie,Begonia rex,"Die Koenigsbegonie beeindruckt mit prachtvoll gemusterten Blaettern in Silber, Rot und Gruen.",Indirektes Licht,18-25 °C,5,patterned|high_humidity,,,,, +patterned,constants/lexiconBatch1.ts,49,Buntblatt,Caladium bicolor,"Das Buntblatt beeindruckt mit transparenten, bunt gemusterten Blaettern in Pink, Rot, Weiss und Gruen.",Indirektes Licht,20-30 °C,5,patterned|high_humidity,,,,, +patterned,constants/lexiconBatch1.ts,99,Herzkette,Ceropegia woodii,"Die Herzkette hat duenne, haengende Ranken mit herzfoermigen, silbergrau gemusterten Blaettchen.",Helles indirektes Licht,15-27 °C,14,easy|succulent|patterned|hanging,,,,, +patterned,constants/lexiconBatch2.ts,224,Kroton,Codiaeum variegatum,Kroton ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,patterned|bright_light,,,,, +patterned,constants/lexiconBatch2.ts,39,Cryptanthus,Cryptanthus bivittatus,Cryptanthus ist eine niedrig wachsende Bromelie mit sternfoermigen Rosetten und gemusterten Blaettern. Fuer Terrarien.,Helles indirektes Licht,18-27 °C,7,patterned|high_humidity,,,,, +patterned,constants/lexiconBatch1.ts,53,Ctenanthe,Ctenanthe burle-marxii,Die Ctenanthe hat faszinierend gemusterte Blaetter mit dunkelgruunem Fischgraetenmuster auf hellgruunem Hintergrund.,Indirektes Licht,18-25 °C,5,patterned|high_humidity,,,,, +patterned,constants/lexiconBatch2.ts,226,Nervenpflanze,Fittonia albivenis,Nervenpflanze ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5,patterned|high_humidity,,,,, +patterned,constants/lexiconBatch2.ts,240,Calathea lancifolia,Goeppertia insignis,Calathea lancifolia ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5,pet_friendly|patterned|high_humidity,pet_friendly_requires_external_evidence,,,, +patterned,constants/lexiconBatch2.ts,241,Calathea ornata,Goeppertia ornata,Calathea ornata ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5,pet_friendly|patterned|high_humidity,pet_friendly_requires_external_evidence,,,, +patterned,constants/lexiconBatch2.ts,227,Punktblatt,Hypoestes phyllostachya,Punktblatt ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,patterned|bright_light,,,,, +patterned,constants/lexiconBatch1.ts,51,Gebet-Pflanze,Maranta leuconeura,Die Gebet-Pflanze faltet ihre gemusterten Blaetter nachts wie Haende zusammen. Faszinierende rote und gruene Muster.,Indirektes Licht,18-27 °C,5,pet_friendly|patterned|high_humidity,pet_friendly_requires_external_evidence,,,, +patterned,constants/lexiconBatch2.ts,48,Monstera obliqua,Monstera obliqua,"Monstera obliqua ist eine seltene Monstera-Art mit filigranen Blaettern, die hauptsaechlich aus Lochern bestehen.",Helles indirektes Licht,18-27 °C,7,patterned|hanging,,,,, +patterned,constants/lexiconBatch2.ts,37,Neoregelia,Neoregelia carolinae,"Die Neoregelia ist eine Bromelie, bei der das Herzblatt zur Bluetzeit leuchtend rot wird. Sehr dekorativ.",Helles bis volles Licht,18-27 °C,7,flowering|patterned|bright_light,,,,, +patterned,constants/lexiconBatch1.ts,54,Kleeblume,Oxalis triangularis,"Die Kleeblume hat tiefviolette, dreieckige Blaetter und zarte rosa Blueten. Sie faltet die Blaetter bei Dunkelheit.",Helles indirektes Licht,15-24 °C,7,flowering|patterned,,,,, +patterned,constants/lexiconBatch2.ts,6,Schraubenbaum,Pandanus veitchii,"Der Schraubenbaum hat spiralfoermig angeordnete, gruenweiss gestreifte Blaetter. Sehr dekorativ und exotisch.",Helles bis volles Licht,18-27 °C,7,patterned|bright_light,,,,, +patterned,constants/lexiconBatch2.ts,229,Wassermelonen-Peperomie,Peperomia argyreia,Wassermelonen-Peperomie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,pet_friendly|patterned,pet_friendly_requires_external_evidence,,,, +patterned,constants/lexiconBatch2.ts,243,Philodendron Pink Princess,Philodendron erubescens Pink Princess,Philodendron Pink Princess ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,patterned|bright_light,,,,, +patterned,constants/lexiconBatch2.ts,49,Philodendron gloriosum,Philodendron gloriosum,"Philodendron gloriosum hat grosse, samtige, herzfoermige Blaetter mit weissen Rippen. Eine atemberaubende Pflanze.",Helles indirektes Licht,18-27 °C,7,patterned|large|high_humidity,,,,, +patterned,constants/lexiconBatch2.ts,228,Aluminium-Pflanze,Pilea cadierei,Aluminium-Pflanze ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,easy|pet_friendly|patterned,pet_friendly_requires_external_evidence,,,, +patterned,constants/lexiconBatch2.ts,152,Buntnessel,Plectranthus scutellarioides,"Buntnessel ist eine farbstarke Zierpflanze, die vor allem fuer ihr dekoratives Laub beliebt ist.",Volles bis helles Licht,10-24 C,4,patterned|bright_light,,,,, +patterned,constants/lexiconBatch1.ts,55,Satinpothos,Scindapsus pictus,"Der Satinpothos hat samtig-glaenzende, silbrig gefleckte Blaetter auf langen, haengenden Ranken.",Helles indirektes Licht,18-28 °C,7,easy|patterned|hanging,,,,, +patterned,constants/lexiconBatch2.ts,45,Regenbogenmoos,Selaginella uncinata,"Das Regenbogenmoos hat schuppenfoermige Blaetter, die im Licht schillernd irisieren. Dekorativ fuer Terrarien.",Helles indirektes Licht,18-27 °C,5,patterned|high_humidity,,,,, +patterned,constants/lexiconBatch1.ts,52,Stromanthe,Stromanthe sanguinea,Die Stromanthe hat dekorative Blaetter mit weissem Muster und leuchtend roter Unterseite. Familie der Marantaceen.,Helles indirektes Licht,18-25 °C,5,patterned|high_humidity,,,,, +patterned,constants/lexiconBatch1.ts,17,Zebrakraut,Tradescantia zebrina,Das Zebrakraut faellt durch seine silbrig-lila gestreiften Blaetter auf. Schnellwachsende Haengepflanze.,Helles indirektes Licht,15-25 °C,5,easy|patterned|hanging,,,,, +patterned,constants/lexiconBatch2.ts,35,Flammen-Bromelie,Vriesea splendens,"Die Flammen-Bromelie hat gebänderte, dunkelgruene Blaetter und einen spektakulaeren, roten Bluetenstand.",Helles indirektes Licht,18-25 °C,7,flowering|patterned|high_humidity,,,,, diff --git a/audits/semantic-search/categories/pet_friendly.csv b/audits/semantic-search/categories/pet_friendly.csv index 748faa2..544434b 100644 --- a/audits/semantic-search/categories/pet_friendly.csv +++ b/audits/semantic-search/categories/pet_friendly.csv @@ -1,16 +1,16 @@ -category,source_file,source_index,name,botanical_name,description,light,temp,water_interval_days,all_categories,risk_flags,audit_status,evidence_source,evidence_url,notes -pet_friendly,constants/lexiconBatch1.ts,43,Bergpalme,Chamaedorea elegans,Die Bergpalme ist eine kompakte Zimmerpalme fuer schattigere Standorte. Ideal fuer dunkle Innenraeume.,Wenig bis helles Licht,15-25 °C,7,easy|pet_friendly|tree|air_purifier|low_light,air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence,,,, -pet_friendly,constants/lexiconBatch1.ts,42,Goldfruchtpalme,Dypsis lutescens,Die Goldfruchtpalme ist eine elegante Zimmerpalme mit gelblich-gruenen Stielen und gefiederten Wedeln.,Helles indirektes Licht,18-27 °C,5,pet_friendly|tree|air_purifier,air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence,,,, -pet_friendly,constants/lexiconBatch2.ts,100,Erdbeere,Fragaria ananassa,"Die Erdbeere ist ein beliebtes Obst fuer Balkon und Terrasse mit aromatischen, roten Fruechten.",Helles bis volles Licht,15-25 °C,3,easy|pet_friendly|sun,pet_friendly_requires_external_evidence,,,, -pet_friendly,constants/lexiconBatch2.ts,240,Calathea lancifolia,Goeppertia insignis,Calathea lancifolia ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5,pet_friendly|patterned|high_humidity,pet_friendly_requires_external_evidence,,,, -pet_friendly,constants/lexiconBatch2.ts,241,Calathea ornata,Goeppertia ornata,Calathea ornata ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5,pet_friendly|patterned|high_humidity,pet_friendly_requires_external_evidence,,,, -pet_friendly,constants/lexiconBatch2.ts,3,Kentia-Palme,Howea forsteriana,"Die Kentia-Palme ist eine der elegantesten Zimmerpalmen mit langen, herabhängenden Fiederblaettern.",Helles indirektes Licht,18-25 °C,7,pet_friendly|tree|low_light,pet_friendly_requires_external_evidence,,,, -pet_friendly,constants/lexiconBatch1.ts,51,Gebet-Pflanze,Maranta leuconeura,Die Gebet-Pflanze faltet ihre gemusterten Blaetter nachts wie Haende zusammen. Faszinierende rote und gruene Muster.,Indirektes Licht,18-27 °C,5,pet_friendly|patterned|high_humidity,pet_friendly_requires_external_evidence,,,, -pet_friendly,constants/lexiconBatch2.ts,229,Wassermelonen-Peperomie,Peperomia argyreia,Wassermelonen-Peperomie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,pet_friendly|patterned,pet_friendly_requires_external_evidence,,,, -pet_friendly,constants/lexiconBatch1.ts,102,Rippenpeperomie,Peperomia caperata,"Die Rippenpeperomie hat tief gerippte, dunkelgruene bis violette Blaetter mit einer samtigen Textur.",Helles indirektes Licht,18-26 °C,10,easy|pet_friendly,pet_friendly_requires_external_evidence,,,, -pet_friendly,constants/lexiconBatch1.ts,103,Spiegelpeperomie,Peperomia obtusifolia,"Die Spiegelpeperomie hat glaenzende, lederartige, oval-runde Blaetter in tiefem Gruen. Sehr robust.",Helles indirektes Licht,16-26 °C,10,easy|pet_friendly|low_light,pet_friendly_requires_external_evidence,,,, -pet_friendly,constants/lexiconBatch2.ts,230,Raindrop-Peperomie,Peperomia polybotrya,Raindrop-Peperomie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,easy|pet_friendly,pet_friendly_requires_external_evidence,,,, -pet_friendly,constants/lexiconBatch1.ts,34,Petunie,Petunia hybrida,Die Petunie ist eine der beliebtesten Balkonpflanzen mit trichterfoermigen Blueten in unzaehligen Farben.,Volles Sonnenlicht,15-25 °C,2,easy|pet_friendly|flowering|sun,pet_friendly_requires_external_evidence,,,, -pet_friendly,constants/lexiconBatch2.ts,228,Aluminium-Pflanze,Pilea cadierei,Aluminium-Pflanze ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,easy|pet_friendly|patterned,pet_friendly_requires_external_evidence,,,, -pet_friendly,constants/lexiconBatch1.ts,2,Ufopflanze,Pilea peperomioides,"Die Ufopflanze hat unverwechselbare, runde Blaetter auf langen Stielen. Bildet leicht Ableger zum Verschenken.",Helles indirektes Licht,13-30 °C,7,easy|pet_friendly,pet_friendly_requires_external_evidence,,,, -pet_friendly,constants/lexiconBatch2.ts,238,Bubikopf,Soleirolia soleirolii,Bubikopf ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,15-24 C,4,pet_friendly|high_humidity,pet_friendly_requires_external_evidence,,,, +category,source_file,source_index,name,botanical_name,description,light,temp,water_interval_days,all_categories,risk_flags,audit_status,evidence_source,evidence_url,notes +pet_friendly,constants/lexiconBatch1.ts,43,Bergpalme,Chamaedorea elegans,Die Bergpalme ist eine kompakte Zimmerpalme fuer schattigere Standorte. Ideal fuer dunkle Innenraeume.,Wenig bis helles Licht,15-25 °C,7,easy|pet_friendly|tree|air_purifier|low_light,air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence,,,, +pet_friendly,constants/lexiconBatch1.ts,42,Goldfruchtpalme,Dypsis lutescens,Die Goldfruchtpalme ist eine elegante Zimmerpalme mit gelblich-gruenen Stielen und gefiederten Wedeln.,Helles indirektes Licht,18-27 °C,5,pet_friendly|tree|air_purifier,air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence,,,, +pet_friendly,constants/lexiconBatch2.ts,100,Erdbeere,Fragaria ananassa,"Die Erdbeere ist ein beliebtes Obst fuer Balkon und Terrasse mit aromatischen, roten Fruechten.",Helles bis volles Licht,15-25 °C,3,easy|pet_friendly|sun,pet_friendly_requires_external_evidence,,,, +pet_friendly,constants/lexiconBatch2.ts,240,Calathea lancifolia,Goeppertia insignis,Calathea lancifolia ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5,pet_friendly|patterned|high_humidity,pet_friendly_requires_external_evidence,,,, +pet_friendly,constants/lexiconBatch2.ts,241,Calathea ornata,Goeppertia ornata,Calathea ornata ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5,pet_friendly|patterned|high_humidity,pet_friendly_requires_external_evidence,,,, +pet_friendly,constants/lexiconBatch2.ts,3,Kentia-Palme,Howea forsteriana,"Die Kentia-Palme ist eine der elegantesten Zimmerpalmen mit langen, herabhängenden Fiederblaettern.",Helles indirektes Licht,18-25 °C,7,pet_friendly|tree|low_light,pet_friendly_requires_external_evidence,,,, +pet_friendly,constants/lexiconBatch1.ts,51,Gebet-Pflanze,Maranta leuconeura,Die Gebet-Pflanze faltet ihre gemusterten Blaetter nachts wie Haende zusammen. Faszinierende rote und gruene Muster.,Indirektes Licht,18-27 °C,5,pet_friendly|patterned|high_humidity,pet_friendly_requires_external_evidence,,,, +pet_friendly,constants/lexiconBatch2.ts,229,Wassermelonen-Peperomie,Peperomia argyreia,Wassermelonen-Peperomie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,pet_friendly|patterned,pet_friendly_requires_external_evidence,,,, +pet_friendly,constants/lexiconBatch1.ts,102,Rippenpeperomie,Peperomia caperata,"Die Rippenpeperomie hat tief gerippte, dunkelgruene bis violette Blaetter mit einer samtigen Textur.",Helles indirektes Licht,18-26 °C,10,easy|pet_friendly,pet_friendly_requires_external_evidence,,,, +pet_friendly,constants/lexiconBatch1.ts,103,Spiegelpeperomie,Peperomia obtusifolia,"Die Spiegelpeperomie hat glaenzende, lederartige, oval-runde Blaetter in tiefem Gruen. Sehr robust.",Helles indirektes Licht,16-26 °C,10,easy|pet_friendly|low_light,pet_friendly_requires_external_evidence,,,, +pet_friendly,constants/lexiconBatch2.ts,230,Raindrop-Peperomie,Peperomia polybotrya,Raindrop-Peperomie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,easy|pet_friendly,pet_friendly_requires_external_evidence,,,, +pet_friendly,constants/lexiconBatch1.ts,34,Petunie,Petunia hybrida,Die Petunie ist eine der beliebtesten Balkonpflanzen mit trichterfoermigen Blueten in unzaehligen Farben.,Volles Sonnenlicht,15-25 °C,2,easy|pet_friendly|flowering|sun,pet_friendly_requires_external_evidence,,,, +pet_friendly,constants/lexiconBatch2.ts,228,Aluminium-Pflanze,Pilea cadierei,Aluminium-Pflanze ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,easy|pet_friendly|patterned,pet_friendly_requires_external_evidence,,,, +pet_friendly,constants/lexiconBatch1.ts,2,Ufopflanze,Pilea peperomioides,"Die Ufopflanze hat unverwechselbare, runde Blaetter auf langen Stielen. Bildet leicht Ableger zum Verschenken.",Helles indirektes Licht,13-30 °C,7,easy|pet_friendly,pet_friendly_requires_external_evidence,,,, +pet_friendly,constants/lexiconBatch2.ts,238,Bubikopf,Soleirolia soleirolii,Bubikopf ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,15-24 C,4,pet_friendly|high_humidity,pet_friendly_requires_external_evidence,,,, diff --git a/audits/semantic-search/categories/succulent.csv b/audits/semantic-search/categories/succulent.csv index aef06dc..6cf9ea7 100644 --- a/audits/semantic-search/categories/succulent.csv +++ b/audits/semantic-search/categories/succulent.csv @@ -1,47 +1,47 @@ -category,source_file,source_index,name,botanical_name,description,light,temp,water_interval_days,all_categories,risk_flags,audit_status,evidence_source,evidence_url,notes -succulent,constants/lexiconBatch1.ts,86,Wuestenrose,Adenium obesum,Die Wuestenrose ist eine sukkulente Zimmerpflanze mit dickem Stamm und leuchtend pinken Blueten.,Volles Sonnenlicht,20-35 °C,10,flowering|succulent|sun,,,,, -succulent,constants/lexiconBatch2.ts,117,Socotra-Wuestenrose,Adenium socotranum,"Die Socotra-Wuestenrose ist eine seltene, endemische Art mit einem sehr dicken, knolligen Stamm und rosa Blueten.",Volles Sonnenlicht,20-35 °C,14,flowering|succulent|sun,,,,, -succulent,constants/lexiconBatch2.ts,31,Adromischus,Adromischus cristatus,Adromischus ist eine kompakte Sukkulente mit ungewoehnlich wellenrandigen Blaettern auf kurzen Staengeln.,Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, -succulent,constants/lexiconBatch1.ts,10,Schwarze Rose (Aeonium),Aeonium arboreum,"Das Aeonium bildet dekorative, rosettenfoermige Sukkulenten an verzweigten Stielen.",Volles Sonnenlicht,10-25 °C,10,succulent|sun,,,,, -succulent,constants/lexiconBatch1.ts,11,Agave,Agave americana,"Die Agave ist eine imposante Sukkulente mit steifen, blaugruenen Blaettern mit Stacheln. Sie bluet nur einmal.",Volles Sonnenlicht,10-35 °C,21,succulent|large|sun,,,,, -succulent,constants/lexiconBatch1.ts,89,Kap-Aloe,Aloe arborescens,"Die Kap-Aloe ist eine strauchige Aloe mit schmalen, gezaehnten Blaettern und leuchtend roten Bluetenaehren im Winter.",Volles Sonnenlicht,10-30 °C,14,easy|succulent|medicinal|sun,medicinal_requires_external_evidence,,,, -succulent,constants/lexiconBatch2.ts,18,Kap-Aloe (ferox),Aloe ferox,"Aloe ferox ist eine grosse, imposante Aloe mit stachligen, blaugruenen Blaettern und leuchtend roten Bluetenaehren.",Volles Sonnenlicht,10-30 °C,14,succulent|large|medicinal|sun,medicinal_requires_external_evidence,,,, -succulent,constants/lexiconBatch1.ts,41,Pferdeschwanzpalme,Beaucarnea recurvata,"Die Pferdeschwanzpalme hat einen verdickten Stammbasis als Wasserspeicher und lange, schmale Blaetter.",Volles Sonnenlicht,15-30 °C,21,easy|succulent|tree|sun,,,,, -succulent,constants/lexiconBatch1.ts,81,Peruanischer Fackelkaktus,Cereus peruvianus,"Der Peruanische Fackelkaktus ist ein saeulenfoermiger Kaktus, der im Innenraum bis zu 2 m hoch werden kann.",Volles Sonnenlicht,15-35 °C,21,easy|succulent|large|sun,,,,, -succulent,constants/lexiconBatch1.ts,99,Herzkette,Ceropegia woodii,"Die Herzkette hat duenne, haengende Ranken mit herzfoermigen, silbergrau gemusterten Blaettchen.",Helles indirektes Licht,15-27 °C,14,easy|succulent|patterned|hanging,,,,, -succulent,constants/lexiconBatch2.ts,24,Konophytum,Conophytum calculus,"Das Konophytum ist eine sehr kompakte Sukkulente, die zwei Blaetter zu einer kugelfoermigen Form verschmilzt.",Volles Sonnenlicht,10-25 °C,21,succulent|sun,,,,, -succulent,constants/lexiconBatch2.ts,29,Kotyledon,Cotyledon orbiculata,"Kotyledon hat dickfleischige, runde Blaetter mit einem mehligen, weisslichen Belag. Sehr trockenheitsresistent.",Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, -succulent,constants/lexiconBatch2.ts,26,Moos-Crassula,Crassula muscosa,"Die Moos-Crassula hat dicht aneinandergereihte, winzige gruene Blaetter auf unverzweigten Trieben. Sieht aus wie Moos.",Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, -succulent,constants/lexiconBatch1.ts,5,Jadepflanze,Crassula ovata,"Die Jadepflanze ist eine langlebige Sukkulente mit dicken, ovalen Blaettern. In Japan gilt sie als Gluecksbringer.",Helles bis volles Licht,15-24 °C,14,easy|succulent|sun,,,,, -succulent,constants/lexiconBatch2.ts,236,String of Bananas,Curio radicans,String of Bananas ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles bis volles Licht,18-30 C,10,succulent|hanging|sun,,,,, -succulent,constants/lexiconBatch2.ts,237,String of Dolphins,Curio x peregrinus,String of Dolphins ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles bis volles Licht,18-30 C,10,succulent|hanging|sun,,,,, -succulent,constants/lexiconBatch1.ts,101,Dischidia,Dischidia ruscifolia,"Die Dischidia ist eine epiphytische Haengepflanze mit kleinen, runden Blaettern entlang duenner Ranken.",Helles indirektes Licht,18-27 °C,7,succulent|hanging,,,,, -succulent,constants/lexiconBatch2.ts,30,Dudleya,Dudleya brittonii,"Dudleya ist eine rosetten­bildende Sukkulente mit silbrig-weissen, mehligen Blaettern. Sehr elegant.",Volles Sonnenlicht,10-25 °C,14,easy|succulent|sun,,,,, -succulent,constants/lexiconBatch1.ts,4,Echeverie,Echeveria elegans,"Die Echeverie bildet symmetrische, rosettenfoermige Sukkulenten mit blaugruenen Blaettern. Pflegeleicht.",Volles Sonnenlicht,15-25 °C,14,easy|succulent|sun,,,,, -succulent,constants/lexiconBatch1.ts,77,Goldene Tonne,Echinocactus grusonii,Die Goldene Tonne ist ein ikonischer kugelfoermiger Kaktus mit goldgelben Stacheln. Waechst langsam aber imposant.,Volles Sonnenlicht,15-35 °C,21,easy|succulent|sun,,,,, -succulent,constants/lexiconBatch1.ts,83,San-Pedro-Kaktus,Echinopsis pachanoi,"Der San-Pedro-Kaktus ist ein schnell wachsender, saeulenfoermiger Kaktus aus den Anden.",Volles Sonnenlicht,10-35 °C,14,easy|succulent|sun,,,,, -succulent,constants/lexiconBatch1.ts,84,Koenigin der Nacht,Epiphyllum oxypetalum,"Die Koenigin der Nacht bluet nur eine einzige Nacht lang mit riesigen, intensiv duftenden weissen Blueten.",Indirektes Licht,18-27 °C,7,flowering|succulent,,,,, -succulent,constants/lexiconBatch2.ts,19,Christusdorn,Euphorbia milii,Der Christusdorn ist eine sukkulente Wolfsmilch mit stacheligen Zweigen und kleinen roten oder gelben Hochblaettern.,Helles bis volles Licht,15-28 °C,10,easy|flowering|succulent|sun,,,,, -succulent,constants/lexiconBatch1.ts,12,Bleistiftkaktus,Euphorbia tirucalli,"Der Bleistiftkaktus ist eine sukkulente Wolfsmilch mit duennen, zylindrischen Zweigen ohne Blaetter.",Volles Sonnenlicht,18-30 °C,14,easy|succulent|sun,,,,, -succulent,constants/lexiconBatch1.ts,78,Fass-Kaktus,Ferocactus cylindraceus,"Der Fass-Kaktus ist ein zylindrischer Wuestenkaktus mit langen, roten Stacheln. Sehr langlebig.",Volles Sonnenlicht,15-35 °C,21,easy|succulent|sun,,,,, -succulent,constants/lexiconBatch1.ts,90,Gasteria,Gasteria carinata,"Die Gasteria ist eine kleine Sukkulente mit zweireihig angeordneten, zungenfoermigen, gefleckten Blaettern.",Helles indirektes Licht,15-25 °C,14,easy|succulent|low_light,,,,, -succulent,constants/lexiconBatch1.ts,87,Geisterpflanze,Graptopetalum paraguayense,"Die Geisterpflanze hat zartgraue bis perlmutt-rosafarbene, rosettenfoermige Blaetter. Sehr robuste Sukkulente.",Volles Sonnenlicht,15-25 °C,14,easy|succulent|sun,,,,, -succulent,constants/lexiconBatch1.ts,80,Mond-Kaktus,Gymnocalycium mihanovichii,Der Mond-Kaktus ist eine farbenfrohe Veredelung eines chlorophylllosen Kaktus auf einem gruenen Unterlagekaktus.,Indirektes Licht,15-30 °C,14,easy|succulent,,,,, -succulent,constants/lexiconBatch1.ts,6,Zebra-Haworthie,Haworthia fasciata,Die Zebra-Haworthie ist eine kompakte Sukkulente mit weissen Querstreifen auf dunkelgruenen Blaettern.,Helles indirektes Licht,15-25 °C,14,easy|succulent|low_light,,,,, -succulent,constants/lexiconBatch1.ts,58,Kleine Wachsblume,Hoya bella,"Die Kleine Wachsblume traegt zierliche, sternfoermige weisse Blueten mit rosa Mitte. Haengende Sukkulente.",Helles indirektes Licht,18-27 °C,10,flowering|succulent|hanging,,,,, -succulent,constants/lexiconBatch1.ts,57,Wachsblume,Hoya carnosa,"Die Wachsblume ist eine Kletterpflanze mit dicken, wachsartigen Blaettern und sternfoermigen, duftenden Blueten.",Helles indirektes Licht,16-27 °C,10,easy|flowering|succulent|hanging,,,,, -succulent,constants/lexiconBatch1.ts,9,Kalanchoe,Kalanchoe blossfeldiana,"Die Kalanchoe ist eine beliebte Bluehpflanze mit leuchtenden Blueten in Rot, Orange, Gelb oder Rosa.",Helles bis volles Licht,15-25 °C,10,easy|flowering|succulent|sun,,,,, -succulent,constants/lexiconBatch2.ts,22,Brutblatt,Kalanchoe daigremontiana,Das Brutblatt bildet entlang des Blattrandes zahlreiche kleine Jungpflanzen. Eine faszinierende Sukkulente.,Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, -succulent,constants/lexiconBatch2.ts,21,Kaninchen-Ohren,Kalanchoe tomentosa,"Kaninchen-Ohren haben weisslich-filzige Blaetter mit braunen Raendern, die Kaninchen­ohren aehneln. Sehr dekorativ.",Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, -succulent,constants/lexiconBatch2.ts,23,Lebende Steine,Lithops julii,"Lebende Steine sind faszinierende Mimikry-Sukkulenten, die Kieselsteinen taeuschen aehnlich sehen. Sehr trockenheitsresistent.",Volles Sonnenlicht,10-30 °C,21,succulent|sun,,,,, -succulent,constants/lexiconBatch1.ts,79,Mammillaria,Mammillaria zeilmanniana,"Die Mammillaria ist ein kompakter, kugelfoermiger Kaktus, der im Fruehling einen Kranz aus rosa Blueten traegt.",Volles Sonnenlicht,15-35 °C,14,easy|flowering|succulent|sun,,,,, -succulent,constants/lexiconBatch1.ts,82,Hasenohren-Kaktus,Opuntia microdasys,"Der Hasenohren-Kaktus hat flache, ovale Triebe mit dichten weissen Glochiden. Klassischer Zimmerkaktus.",Volles Sonnenlicht,10-35 °C,21,easy|succulent|sun,,,,, -succulent,constants/lexiconBatch1.ts,88,Mondstein-Pflanze,Pachyphytum oviferum,"Die Mondstein-Pflanze hat dicke, ovale Blaetter mit einem pastellrosafarbenen, mehligen Ueberzug.",Volles Sonnenlicht,15-25 °C,14,easy|succulent|sun,,,,, -succulent,constants/lexiconBatch2.ts,27,Speckbaum,Portulacaria afra,"Der Speckbaum ist eine sukkulente Pflanze mit roten Stielen und kleinen, runden, glaenzenden Blaettern.",Helles bis volles Licht,15-30 °C,14,easy|succulent|sun,,,,, -succulent,constants/lexiconBatch1.ts,85,Korallenkaktus,Rhipsalis baccifera,"Der Korallenkaktus ist ein epiphytischer Kaktus mit duennen, haengenden Trieben und kleinen weissen Beeren.",Indirektes Licht,18-27 °C,7,succulent|hanging,,,,, -succulent,constants/lexiconBatch2.ts,17,Zylindrischer Bogenhanf,Sansevieria cylindrica,"Der Zylindrische Bogenhanf hat zylindrische, aufrechte Blaetter, die sich nach oben verjuengen. Sehr pflegeleicht.",Helles bis volles Licht,15-27 °C,14,easy|succulent|sun,,,,, -succulent,constants/lexiconBatch1.ts,8,Weihnachtskaktus,Schlumbergera truncata,"Der Weihnachtskaktus erfreut zur Weihnachtszeit mit leuchtenden Blueten in Rosa, Rot oder Weiss.",Helles indirektes Licht,15-21 °C,7,easy|flowering|succulent,,,,, -succulent,constants/lexiconBatch1.ts,7,Eselschwanz,Sedum morganianum,"Der Eselschwanz ist eine haengende Sukkulente mit langen Trieben aus dichten, blaugruenen Blaettchen.",Volles Sonnenlicht,15-25 °C,14,easy|succulent|hanging|sun,,,,, -succulent,constants/lexiconBatch1.ts,100,Perlenschnur-Pflanze,Senecio rowleyanus,"Die Perlenschnur-Pflanze hat haengende Ranken mit kugelfoermigen, perlenaehnlichen Blaettern. Einzigartige Sukkulente.",Helles bis volles Licht,15-27 °C,14,easy|succulent|hanging,,,,, -succulent,constants/lexiconBatch2.ts,28,Blauer Kreuzkraut,Senecio serpens,"Der Blaue Kreuzkraut hat zylindrische, blaublaugruene Blaetter und einen kriechenden Wuchs. Sehr dekorativ.",Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, -succulent,constants/lexiconBatch2.ts,25,Aasblume,Stapelia grandiflora,"Die Aasblume hat fleischige, gruene Staengel und riesige, sternfoermige Blueten mit aasartigem Duft.",Helles bis volles Licht,18-30 °C,14,flowering|succulent|sun,,,,, +category,source_file,source_index,name,botanical_name,description,light,temp,water_interval_days,all_categories,risk_flags,audit_status,evidence_source,evidence_url,notes +succulent,constants/lexiconBatch1.ts,86,Wuestenrose,Adenium obesum,Die Wuestenrose ist eine sukkulente Zimmerpflanze mit dickem Stamm und leuchtend pinken Blueten.,Volles Sonnenlicht,20-35 °C,10,flowering|succulent|sun,,,,, +succulent,constants/lexiconBatch2.ts,117,Socotra-Wuestenrose,Adenium socotranum,"Die Socotra-Wuestenrose ist eine seltene, endemische Art mit einem sehr dicken, knolligen Stamm und rosa Blueten.",Volles Sonnenlicht,20-35 °C,14,flowering|succulent|sun,,,,, +succulent,constants/lexiconBatch2.ts,31,Adromischus,Adromischus cristatus,Adromischus ist eine kompakte Sukkulente mit ungewoehnlich wellenrandigen Blaettern auf kurzen Staengeln.,Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, +succulent,constants/lexiconBatch1.ts,10,Schwarze Rose (Aeonium),Aeonium arboreum,"Das Aeonium bildet dekorative, rosettenfoermige Sukkulenten an verzweigten Stielen.",Volles Sonnenlicht,10-25 °C,10,succulent|sun,,,,, +succulent,constants/lexiconBatch1.ts,11,Agave,Agave americana,"Die Agave ist eine imposante Sukkulente mit steifen, blaugruenen Blaettern mit Stacheln. Sie bluet nur einmal.",Volles Sonnenlicht,10-35 °C,21,succulent|large|sun,,,,, +succulent,constants/lexiconBatch1.ts,89,Kap-Aloe,Aloe arborescens,"Die Kap-Aloe ist eine strauchige Aloe mit schmalen, gezaehnten Blaettern und leuchtend roten Bluetenaehren im Winter.",Volles Sonnenlicht,10-30 °C,14,easy|succulent|medicinal|sun,medicinal_requires_external_evidence,,,, +succulent,constants/lexiconBatch2.ts,18,Kap-Aloe (ferox),Aloe ferox,"Aloe ferox ist eine grosse, imposante Aloe mit stachligen, blaugruenen Blaettern und leuchtend roten Bluetenaehren.",Volles Sonnenlicht,10-30 °C,14,succulent|large|medicinal|sun,medicinal_requires_external_evidence,,,, +succulent,constants/lexiconBatch1.ts,41,Pferdeschwanzpalme,Beaucarnea recurvata,"Die Pferdeschwanzpalme hat einen verdickten Stammbasis als Wasserspeicher und lange, schmale Blaetter.",Volles Sonnenlicht,15-30 °C,21,easy|succulent|tree|sun,,,,, +succulent,constants/lexiconBatch1.ts,81,Peruanischer Fackelkaktus,Cereus peruvianus,"Der Peruanische Fackelkaktus ist ein saeulenfoermiger Kaktus, der im Innenraum bis zu 2 m hoch werden kann.",Volles Sonnenlicht,15-35 °C,21,easy|succulent|large|sun,,,,, +succulent,constants/lexiconBatch1.ts,99,Herzkette,Ceropegia woodii,"Die Herzkette hat duenne, haengende Ranken mit herzfoermigen, silbergrau gemusterten Blaettchen.",Helles indirektes Licht,15-27 °C,14,easy|succulent|patterned|hanging,,,,, +succulent,constants/lexiconBatch2.ts,24,Konophytum,Conophytum calculus,"Das Konophytum ist eine sehr kompakte Sukkulente, die zwei Blaetter zu einer kugelfoermigen Form verschmilzt.",Volles Sonnenlicht,10-25 °C,21,succulent|sun,,,,, +succulent,constants/lexiconBatch2.ts,29,Kotyledon,Cotyledon orbiculata,"Kotyledon hat dickfleischige, runde Blaetter mit einem mehligen, weisslichen Belag. Sehr trockenheitsresistent.",Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, +succulent,constants/lexiconBatch2.ts,26,Moos-Crassula,Crassula muscosa,"Die Moos-Crassula hat dicht aneinandergereihte, winzige gruene Blaetter auf unverzweigten Trieben. Sieht aus wie Moos.",Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, +succulent,constants/lexiconBatch1.ts,5,Jadepflanze,Crassula ovata,"Die Jadepflanze ist eine langlebige Sukkulente mit dicken, ovalen Blaettern. In Japan gilt sie als Gluecksbringer.",Helles bis volles Licht,15-24 °C,14,easy|succulent|sun,,,,, +succulent,constants/lexiconBatch2.ts,236,String of Bananas,Curio radicans,String of Bananas ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles bis volles Licht,18-30 C,10,succulent|hanging|sun,,,,, +succulent,constants/lexiconBatch2.ts,237,String of Dolphins,Curio x peregrinus,String of Dolphins ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles bis volles Licht,18-30 C,10,succulent|hanging|sun,,,,, +succulent,constants/lexiconBatch1.ts,101,Dischidia,Dischidia ruscifolia,"Die Dischidia ist eine epiphytische Haengepflanze mit kleinen, runden Blaettern entlang duenner Ranken.",Helles indirektes Licht,18-27 °C,7,succulent|hanging,,,,, +succulent,constants/lexiconBatch2.ts,30,Dudleya,Dudleya brittonii,"Dudleya ist eine rosetten­bildende Sukkulente mit silbrig-weissen, mehligen Blaettern. Sehr elegant.",Volles Sonnenlicht,10-25 °C,14,easy|succulent|sun,,,,, +succulent,constants/lexiconBatch1.ts,4,Echeverie,Echeveria elegans,"Die Echeverie bildet symmetrische, rosettenfoermige Sukkulenten mit blaugruenen Blaettern. Pflegeleicht.",Volles Sonnenlicht,15-25 °C,14,easy|succulent|sun,,,,, +succulent,constants/lexiconBatch1.ts,77,Goldene Tonne,Echinocactus grusonii,Die Goldene Tonne ist ein ikonischer kugelfoermiger Kaktus mit goldgelben Stacheln. Waechst langsam aber imposant.,Volles Sonnenlicht,15-35 °C,21,easy|succulent|sun,,,,, +succulent,constants/lexiconBatch1.ts,83,San-Pedro-Kaktus,Echinopsis pachanoi,"Der San-Pedro-Kaktus ist ein schnell wachsender, saeulenfoermiger Kaktus aus den Anden.",Volles Sonnenlicht,10-35 °C,14,easy|succulent|sun,,,,, +succulent,constants/lexiconBatch1.ts,84,Koenigin der Nacht,Epiphyllum oxypetalum,"Die Koenigin der Nacht bluet nur eine einzige Nacht lang mit riesigen, intensiv duftenden weissen Blueten.",Indirektes Licht,18-27 °C,7,flowering|succulent,,,,, +succulent,constants/lexiconBatch2.ts,19,Christusdorn,Euphorbia milii,Der Christusdorn ist eine sukkulente Wolfsmilch mit stacheligen Zweigen und kleinen roten oder gelben Hochblaettern.,Helles bis volles Licht,15-28 °C,10,easy|flowering|succulent|sun,,,,, +succulent,constants/lexiconBatch1.ts,12,Bleistiftkaktus,Euphorbia tirucalli,"Der Bleistiftkaktus ist eine sukkulente Wolfsmilch mit duennen, zylindrischen Zweigen ohne Blaetter.",Volles Sonnenlicht,18-30 °C,14,easy|succulent|sun,,,,, +succulent,constants/lexiconBatch1.ts,78,Fass-Kaktus,Ferocactus cylindraceus,"Der Fass-Kaktus ist ein zylindrischer Wuestenkaktus mit langen, roten Stacheln. Sehr langlebig.",Volles Sonnenlicht,15-35 °C,21,easy|succulent|sun,,,,, +succulent,constants/lexiconBatch1.ts,90,Gasteria,Gasteria carinata,"Die Gasteria ist eine kleine Sukkulente mit zweireihig angeordneten, zungenfoermigen, gefleckten Blaettern.",Helles indirektes Licht,15-25 °C,14,easy|succulent|low_light,,,,, +succulent,constants/lexiconBatch1.ts,87,Geisterpflanze,Graptopetalum paraguayense,"Die Geisterpflanze hat zartgraue bis perlmutt-rosafarbene, rosettenfoermige Blaetter. Sehr robuste Sukkulente.",Volles Sonnenlicht,15-25 °C,14,easy|succulent|sun,,,,, +succulent,constants/lexiconBatch1.ts,80,Mond-Kaktus,Gymnocalycium mihanovichii,Der Mond-Kaktus ist eine farbenfrohe Veredelung eines chlorophylllosen Kaktus auf einem gruenen Unterlagekaktus.,Indirektes Licht,15-30 °C,14,easy|succulent,,,,, +succulent,constants/lexiconBatch1.ts,6,Zebra-Haworthie,Haworthia fasciata,Die Zebra-Haworthie ist eine kompakte Sukkulente mit weissen Querstreifen auf dunkelgruenen Blaettern.,Helles indirektes Licht,15-25 °C,14,easy|succulent|low_light,,,,, +succulent,constants/lexiconBatch1.ts,58,Kleine Wachsblume,Hoya bella,"Die Kleine Wachsblume traegt zierliche, sternfoermige weisse Blueten mit rosa Mitte. Haengende Sukkulente.",Helles indirektes Licht,18-27 °C,10,flowering|succulent|hanging,,,,, +succulent,constants/lexiconBatch1.ts,57,Wachsblume,Hoya carnosa,"Die Wachsblume ist eine Kletterpflanze mit dicken, wachsartigen Blaettern und sternfoermigen, duftenden Blueten.",Helles indirektes Licht,16-27 °C,10,easy|flowering|succulent|hanging,,,,, +succulent,constants/lexiconBatch1.ts,9,Kalanchoe,Kalanchoe blossfeldiana,"Die Kalanchoe ist eine beliebte Bluehpflanze mit leuchtenden Blueten in Rot, Orange, Gelb oder Rosa.",Helles bis volles Licht,15-25 °C,10,easy|flowering|succulent|sun,,,,, +succulent,constants/lexiconBatch2.ts,22,Brutblatt,Kalanchoe daigremontiana,Das Brutblatt bildet entlang des Blattrandes zahlreiche kleine Jungpflanzen. Eine faszinierende Sukkulente.,Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, +succulent,constants/lexiconBatch2.ts,21,Kaninchen-Ohren,Kalanchoe tomentosa,"Kaninchen-Ohren haben weisslich-filzige Blaetter mit braunen Raendern, die Kaninchen­ohren aehneln. Sehr dekorativ.",Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, +succulent,constants/lexiconBatch2.ts,23,Lebende Steine,Lithops julii,"Lebende Steine sind faszinierende Mimikry-Sukkulenten, die Kieselsteinen taeuschen aehnlich sehen. Sehr trockenheitsresistent.",Volles Sonnenlicht,10-30 °C,21,succulent|sun,,,,, +succulent,constants/lexiconBatch1.ts,79,Mammillaria,Mammillaria zeilmanniana,"Die Mammillaria ist ein kompakter, kugelfoermiger Kaktus, der im Fruehling einen Kranz aus rosa Blueten traegt.",Volles Sonnenlicht,15-35 °C,14,easy|flowering|succulent|sun,,,,, +succulent,constants/lexiconBatch1.ts,82,Hasenohren-Kaktus,Opuntia microdasys,"Der Hasenohren-Kaktus hat flache, ovale Triebe mit dichten weissen Glochiden. Klassischer Zimmerkaktus.",Volles Sonnenlicht,10-35 °C,21,easy|succulent|sun,,,,, +succulent,constants/lexiconBatch1.ts,88,Mondstein-Pflanze,Pachyphytum oviferum,"Die Mondstein-Pflanze hat dicke, ovale Blaetter mit einem pastellrosafarbenen, mehligen Ueberzug.",Volles Sonnenlicht,15-25 °C,14,easy|succulent|sun,,,,, +succulent,constants/lexiconBatch2.ts,27,Speckbaum,Portulacaria afra,"Der Speckbaum ist eine sukkulente Pflanze mit roten Stielen und kleinen, runden, glaenzenden Blaettern.",Helles bis volles Licht,15-30 °C,14,easy|succulent|sun,,,,, +succulent,constants/lexiconBatch1.ts,85,Korallenkaktus,Rhipsalis baccifera,"Der Korallenkaktus ist ein epiphytischer Kaktus mit duennen, haengenden Trieben und kleinen weissen Beeren.",Indirektes Licht,18-27 °C,7,succulent|hanging,,,,, +succulent,constants/lexiconBatch2.ts,17,Zylindrischer Bogenhanf,Sansevieria cylindrica,"Der Zylindrische Bogenhanf hat zylindrische, aufrechte Blaetter, die sich nach oben verjuengen. Sehr pflegeleicht.",Helles bis volles Licht,15-27 °C,14,easy|succulent|sun,,,,, +succulent,constants/lexiconBatch1.ts,8,Weihnachtskaktus,Schlumbergera truncata,"Der Weihnachtskaktus erfreut zur Weihnachtszeit mit leuchtenden Blueten in Rosa, Rot oder Weiss.",Helles indirektes Licht,15-21 °C,7,easy|flowering|succulent,,,,, +succulent,constants/lexiconBatch1.ts,7,Eselschwanz,Sedum morganianum,"Der Eselschwanz ist eine haengende Sukkulente mit langen Trieben aus dichten, blaugruenen Blaettchen.",Volles Sonnenlicht,15-25 °C,14,easy|succulent|hanging|sun,,,,, +succulent,constants/lexiconBatch1.ts,100,Perlenschnur-Pflanze,Senecio rowleyanus,"Die Perlenschnur-Pflanze hat haengende Ranken mit kugelfoermigen, perlenaehnlichen Blaettern. Einzigartige Sukkulente.",Helles bis volles Licht,15-27 °C,14,easy|succulent|hanging,,,,, +succulent,constants/lexiconBatch2.ts,28,Blauer Kreuzkraut,Senecio serpens,"Der Blaue Kreuzkraut hat zylindrische, blaublaugruene Blaetter und einen kriechenden Wuchs. Sehr dekorativ.",Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, +succulent,constants/lexiconBatch2.ts,25,Aasblume,Stapelia grandiflora,"Die Aasblume hat fleischige, gruene Staengel und riesige, sternfoermige Blueten mit aasartigem Duft.",Helles bis volles Licht,18-30 °C,14,flowering|succulent|sun,,,,, diff --git a/audits/semantic-search/categories/sun.csv b/audits/semantic-search/categories/sun.csv index e617d0b..2476599 100644 --- a/audits/semantic-search/categories/sun.csv +++ b/audits/semantic-search/categories/sun.csv @@ -1,173 +1,173 @@ -category,source_file,source_index,name,botanical_name,description,light,temp,water_interval_days,all_categories,risk_flags,audit_status,evidence_source,evidence_url,notes -sun,constants/lexiconBatch2.ts,212,Spitzahorn,Acer platanoides,Spitzahorn ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, -sun,constants/lexiconBatch2.ts,108,Schafgarbe,Achillea millefolium,Die Schafgarbe hat weisse oder rosafarbene Bluetenschirme und fein gefiederte Blaetter. Wichtige Heilpflanze.,Volles Sonnenlicht,10-25 °C,7,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, -sun,constants/lexiconBatch1.ts,86,Wuestenrose,Adenium obesum,Die Wuestenrose ist eine sukkulente Zimmerpflanze mit dickem Stamm und leuchtend pinken Blueten.,Volles Sonnenlicht,20-35 °C,10,flowering|succulent|sun,,,,, -sun,constants/lexiconBatch2.ts,117,Socotra-Wuestenrose,Adenium socotranum,"Die Socotra-Wuestenrose ist eine seltene, endemische Art mit einem sehr dicken, knolligen Stamm und rosa Blueten.",Volles Sonnenlicht,20-35 °C,14,flowering|succulent|sun,,,,, -sun,constants/lexiconBatch2.ts,31,Adromischus,Adromischus cristatus,Adromischus ist eine kompakte Sukkulente mit ungewoehnlich wellenrandigen Blaettern auf kurzen Staengeln.,Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, -sun,constants/lexiconBatch1.ts,10,Schwarze Rose (Aeonium),Aeonium arboreum,"Das Aeonium bildet dekorative, rosettenfoermige Sukkulenten an verzweigten Stielen.",Volles Sonnenlicht,10-25 °C,10,succulent|sun,,,,, -sun,constants/lexiconBatch1.ts,11,Agave,Agave americana,"Die Agave ist eine imposante Sukkulente mit steifen, blaugruenen Blaettern mit Stacheln. Sie bluet nur einmal.",Volles Sonnenlicht,10-35 °C,21,succulent|large|sun,,,,, -sun,constants/lexiconBatch2.ts,155,Stockrose,Alcea rosea,"Stockrose ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,135,Schnittknoblauch,Allium tuberosum,Schnittknoblauch ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -sun,constants/lexiconBatch1.ts,89,Kap-Aloe,Aloe arborescens,"Die Kap-Aloe ist eine strauchige Aloe mit schmalen, gezaehnten Blaettern und leuchtend roten Bluetenaehren im Winter.",Volles Sonnenlicht,10-30 °C,14,easy|succulent|medicinal|sun,medicinal_requires_external_evidence,,,, -sun,constants/lexiconBatch2.ts,18,Kap-Aloe (ferox),Aloe ferox,"Aloe ferox ist eine grosse, imposante Aloe mit stachligen, blaugruenen Blaettern und leuchtend roten Bluetenaehren.",Volles Sonnenlicht,10-30 °C,14,succulent|large|medicinal|sun,medicinal_requires_external_evidence,,,, -sun,constants/lexiconBatch2.ts,128,Zitronenverbene,Aloysia citrodora,Zitronenverbene ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -sun,constants/lexiconBatch2.ts,194,Fuchsschwanz,Amaranthus caudatus,"Fuchsschwanz ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,163,Anemone,Anemone coronaria,"Anemone ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,140,Dill,Anethum graveolens,Dill ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -sun,constants/lexiconBatch2.ts,125,Kerbel,Anthriscus cerefolium,Kerbel ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -sun,constants/lexiconBatch2.ts,147,Loewenmaeulchen,Antirrhinum majus,"Loewenmaeulchen ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,107,Arnika,Arnica montana,Arnika ist eine bekannte Heilpflanze aus den Alpen mit goldgelben Korbbluten. Sie wird fuer Muskeln und Gelenke verwendet.,Volles Sonnenlicht,10-20 °C,7,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, -sun,constants/lexiconBatch2.ts,110,Wermut,Artemisia absinthium,"Wermut ist ein stark aromatisches Heilkraut mit silbrig-gruenen, tief eingeschnittenen Blaettern. Fuer Kraeuterlikoere.",Volles Sonnenlicht,10-25 °C,14,medicinal|sun,medicinal_requires_external_evidence,,,, -sun,constants/lexiconBatch2.ts,122,Estragon,Artemisia dracunculus,Estragon ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -sun,constants/lexiconBatch2.ts,178,Seidenpflanze,Asclepias tuberosa,"Seidenpflanze ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch1.ts,41,Pferdeschwanzpalme,Beaucarnea recurvata,"Die Pferdeschwanzpalme hat einen verdickten Stammbasis als Wasserspeicher und lange, schmale Blaetter.",Volles Sonnenlicht,15-30 °C,21,easy|succulent|tree|sun,,,,, -sun,constants/lexiconBatch2.ts,145,Gaensebluemchen,Bellis perennis,"Gaensebluemchen ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,129,Borretsch,Borago officinalis,Borretsch ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -sun,constants/lexiconBatch1.ts,62,Bougainvillea,Bougainvillea spectabilis,"Die Bougainvillea ist eine rankenreiche Kletterpflanze mit leuchtend farbigen Hochblaettern in Rot, Orange oder Pink.",Volles Sonnenlicht,18-30 °C,5,flowering|bright_light|sun,,,,, -sun,constants/lexiconBatch2.ts,223,Schmetterlingsflieder,Buddleja davidii,Schmetterlingsflieder ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|sun,,,,, -sun,constants/lexiconBatch2.ts,202,Buchsbaum,Buxus sempervirens,Buchsbaum ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|sun,,,,, -sun,constants/lexiconBatch2.ts,187,Ringelblume,Calendula officinalis,"Ringelblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, -sun,constants/lexiconBatch2.ts,63,Calibrachoa,Calibrachoa hybrida,"Calibrachoa ist eine petunienaehnliche Haengepflanze mit unzaehligen, kleinen Trichterbluten in allen Farben.",Volles Sonnenlicht,15-25 °C,2,easy|flowering|hanging|sun,,,,, -sun,constants/lexiconBatch2.ts,67,Blumenschilfrohr,Canna indica,"Das Blumenschilfrohr hat grosse, tropisch wirkende Blaetter und auffaellige Blueten in Rot, Orange oder Gelb.",Volles Sonnenlicht,18-28 °C,5,flowering|large|sun,,,,, -sun,constants/lexiconBatch2.ts,92,Chili,Capsicum annuum,"Chili ist eine beliebte Gemuese- und Zierpflanze mit leuchtenden, roten oder orangen Fruechten. Im Topf kultivierbar.",Volles Sonnenlicht,20-30 °C,4,easy|medicinal|sun,medicinal_requires_external_evidence,,,, -sun,constants/lexiconBatch2.ts,90,Papaya,Carica papaya,"Die Papaya ist eine tropische Fruchtpflanze mit grossen, gelappten Blaettern und orangen Fruechten.",Volles Sonnenlicht,20-35 °C,5,large|sun,,,,, -sun,constants/lexiconBatch2.ts,217,Trompetenbaum,Catalpa bignonioides,Trompetenbaum ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, -sun,constants/lexiconBatch2.ts,208,Zeder,Cedrus libani,Zeder ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, -sun,constants/lexiconBatch2.ts,188,Kornblume,Centaurea cyanus,"Kornblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch1.ts,81,Peruanischer Fackelkaktus,Cereus peruvianus,"Der Peruanische Fackelkaktus ist ein saeulenfoermiger Kaktus, der im Innenraum bis zu 2 m hoch werden kann.",Volles Sonnenlicht,15-35 °C,21,easy|succulent|large|sun,,,,, -sun,constants/lexiconBatch2.ts,138,Roemische Kamille,Chamaemelum nobile,Roemische Kamille ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|medicinal|sun,medicinal_requires_external_evidence,,,, -sun,constants/lexiconBatch2.ts,101,Kamille,Chamomilla recutita,"Die Kamille ist ein beliebtes Heilkraut mit kleinen, weiss-gelben Blueten. Das aetherische Oel wirkt beruhigend.",Volles Sonnenlicht,15-25 °C,5,easy|medicinal|sun,medicinal_requires_external_evidence,,,, -sun,constants/lexiconBatch2.ts,86,Zitronenbaum,Citrus limon,"Der Zitronenbaum ist ein kleiner, immergruener Baum mit weissen, duftenden Blueten und gelben Fruechten.",Volles Sonnenlicht,18-28 °C,5,tree|sun,,,,, -sun,constants/lexiconBatch2.ts,87,Orangenbaum,Citrus sinensis,"Der Orangenbaum ist ein kleiner, immergruener Baum mit weissen Blueten und orangen Fruechten.",Volles Sonnenlicht,18-28 °C,5,tree|sun,,,,, -sun,constants/lexiconBatch2.ts,24,Konophytum,Conophytum calculus,"Das Konophytum ist eine sehr kompakte Sukkulente, die zwei Blaetter zu einer kugelfoermigen Form verschmilzt.",Volles Sonnenlicht,10-25 °C,21,succulent|sun,,,,, -sun,constants/lexiconBatch2.ts,14,Keulenlilie,Cordyline australis,"Die Keulenlilie hat lange, schmale, gruene oder rotbraune Blaetter in einem dekorativen Schopf.",Helles bis volles Licht,10-25 °C,7,easy|tree|sun,,,,, -sun,constants/lexiconBatch2.ts,181,Maedchenauge,Coreopsis tinctoria,"Maedchenauge ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,139,Koriander,Coriandrum sativum,Koriander ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -sun,constants/lexiconBatch2.ts,150,Kosmee,Cosmos bipinnatus,"Kosmee ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,29,Kotyledon,Cotyledon orbiculata,"Kotyledon hat dickfleischige, runde Blaetter mit einem mehligen, weisslichen Belag. Sehr trockenheitsresistent.",Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, -sun,constants/lexiconBatch2.ts,26,Moos-Crassula,Crassula muscosa,"Die Moos-Crassula hat dicht aneinandergereihte, winzige gruene Blaetter auf unverzweigten Trieben. Sieht aus wie Moos.",Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, -sun,constants/lexiconBatch1.ts,5,Jadepflanze,Crassula ovata,"Die Jadepflanze ist eine langlebige Sukkulente mit dicken, ovalen Blaettern. In Japan gilt sie als Gluecksbringer.",Helles bis volles Licht,15-24 °C,14,easy|succulent|sun,,,,, -sun,constants/lexiconBatch2.ts,94,Gurke,Cucumis sativus,"Die Gurke ist eine rankende Gemuese­pflanze mit gruenen, erfrischenden Fruechten. Im Balkonkasten kultivierbar.",Volles Sonnenlicht,18-28 °C,3,easy|sun,,,,, -sun,constants/lexiconBatch2.ts,209,Zypresse,Cupressus sempervirens,Zypresse ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, -sun,constants/lexiconBatch2.ts,236,String of Bananas,Curio radicans,String of Bananas ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles bis volles Licht,18-30 C,10,succulent|hanging|sun,,,,, -sun,constants/lexiconBatch2.ts,237,String of Dolphins,Curio x peregrinus,String of Dolphins ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles bis volles Licht,18-30 C,10,succulent|hanging|sun,,,,, -sun,constants/lexiconBatch2.ts,239,Palmfarn,Cycas revoluta,Palmfarn ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles bis volles Licht,18-30 C,10,tree|large|sun,,,,, -sun,constants/lexiconBatch2.ts,127,Zitronengras,Cymbopogon citratus,Zitronengras ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -sun,constants/lexiconBatch2.ts,68,Dahlie,Dahlia pinnata,Die Dahlie ist eine prachtvolle Sommerblume mit Blueten in allen Groessen und Formen. Sie wird aus Knollen gezogen.,Volles Sonnenlicht,15-25 °C,5,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,153,Rittersporn,Delphinium elatum,"Rittersporn ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,189,Bartnelke,Dianthus barbatus,"Bartnelke ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,146,Nelke,Dianthus caryophyllus,"Nelke ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,77,Venusfliegenfalle,Dionaea muscipula,Die Venusfliegenfalle ist eine fleischfressende Pflanze mit klappfallartigen Blaettern. Faengt Insekten.,Volles Sonnenlicht,15-30 °C,5,sun,,,,, -sun,constants/lexiconBatch2.ts,80,Sonnentau,Drosera capensis,Der Sonnentau faengt Insekten mit klebrigen Tropfen auf seinen Blaettern. Eine faszinierende fleischfressende Pflanze.,Volles Sonnenlicht,15-25 °C,5,high_humidity|sun,,,,, -sun,constants/lexiconBatch2.ts,30,Dudleya,Dudleya brittonii,"Dudleya ist eine rosetten­bildende Sukkulente mit silbrig-weissen, mehligen Blaettern. Sehr elegant.",Volles Sonnenlicht,10-25 °C,14,easy|succulent|sun,,,,, -sun,constants/lexiconBatch1.ts,4,Echeverie,Echeveria elegans,"Die Echeverie bildet symmetrische, rosettenfoermige Sukkulenten mit blaugruenen Blaettern. Pflegeleicht.",Volles Sonnenlicht,15-25 °C,14,easy|succulent|sun,,,,, -sun,constants/lexiconBatch2.ts,106,Sonnenhut,Echinacea purpurea,"Der Sonnenhut ist eine beliebte Heilpflanze mit grossen, pinkfarbenen Blueten. Er staerkt das Immunsystem.",Helles bis volles Licht,15-25 °C,7,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, -sun,constants/lexiconBatch1.ts,77,Goldene Tonne,Echinocactus grusonii,Die Goldene Tonne ist ein ikonischer kugelfoermiger Kaktus mit goldgelben Stacheln. Waechst langsam aber imposant.,Volles Sonnenlicht,15-35 °C,21,easy|succulent|sun,,,,, -sun,constants/lexiconBatch1.ts,83,San-Pedro-Kaktus,Echinopsis pachanoi,"Der San-Pedro-Kaktus ist ein schnell wachsender, saeulenfoermiger Kaktus aus den Anden.",Volles Sonnenlicht,10-35 °C,14,easy|succulent|sun,,,,, -sun,constants/lexiconBatch2.ts,186,Kalifornischer Mohn,Eschscholzia californica,"Kalifornischer Mohn ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,210,Eukalyptus,Eucalyptus globulus,Eukalyptus ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|medicinal|sun,medicinal_requires_external_evidence,,,, -sun,constants/lexiconBatch2.ts,19,Christusdorn,Euphorbia milii,Der Christusdorn ist eine sukkulente Wolfsmilch mit stacheligen Zweigen und kleinen roten oder gelben Hochblaettern.,Helles bis volles Licht,15-28 °C,10,easy|flowering|succulent|sun,,,,, -sun,constants/lexiconBatch1.ts,12,Bleistiftkaktus,Euphorbia tirucalli,"Der Bleistiftkaktus ist eine sukkulente Wolfsmilch mit duennen, zylindrischen Zweigen ohne Blaetter.",Volles Sonnenlicht,18-30 °C,14,easy|succulent|sun,,,,, -sun,constants/lexiconBatch1.ts,78,Fass-Kaktus,Ferocactus cylindraceus,"Der Fass-Kaktus ist ein zylindrischer Wuestenkaktus mit langen, roten Stacheln. Sehr langlebig.",Volles Sonnenlicht,15-35 °C,21,easy|succulent|sun,,,,, -sun,constants/lexiconBatch2.ts,219,Forsythie,Forsythia x intermedia,Forsythie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|sun,,,,, -sun,constants/lexiconBatch2.ts,100,Erdbeere,Fragaria ananassa,"Die Erdbeere ist ein beliebtes Obst fuer Balkon und Terrasse mit aromatischen, roten Fruechten.",Helles bis volles Licht,15-25 °C,3,easy|pet_friendly|sun,pet_friendly_requires_external_evidence,,,, -sun,constants/lexiconBatch2.ts,169,Freesie,Freesia refracta,"Freesie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,196,Kokardenblume,Gaillardia aristata,"Kokardenblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,190,Mittagsgold,Gazania rigens,"Mittagsgold ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,216,Ginkgo,Ginkgo biloba,Ginkgo ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|medicinal|sun,medicinal_requires_external_evidence,,,, -sun,constants/lexiconBatch2.ts,161,Gladiole,Gladiolus hortulanus,"Gladiole ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch1.ts,87,Geisterpflanze,Graptopetalum paraguayense,"Die Geisterpflanze hat zartgraue bis perlmutt-rosafarbene, rosettenfoermige Blaetter. Sehr robuste Sukkulente.",Volles Sonnenlicht,15-25 °C,14,easy|succulent|sun,,,,, -sun,constants/lexiconBatch2.ts,141,Sonnenblume,Helianthus annuus,"Sonnenblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,133,Currykraut,Helichrysum italicum,Currykraut ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -sun,constants/lexiconBatch2.ts,191,Heliotrop,Heliotropium arborescens,"Heliotrop ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,182,Taglilie,Hemerocallis fulva,"Taglilie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch1.ts,21,Hibiskus,Hibiscus rosa-sinensis,"Der Hibiskus begeistert mit grossen, trompetenfoermigen Blueten in Rot, Orange und Rosa.",Volles Sonnenlicht,18-28 °C,3,flowering|bright_light|sun,,,,, -sun,constants/lexiconBatch2.ts,220,Gartenhibiskus,Hibiscus syriacus,Gartenhibiskus ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|sun,,,,, -sun,constants/lexiconBatch2.ts,159,Hasengloeckchen,Hyacinthoides non-scripta,"Hasengloeckchen ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,105,Johanniskraut,Hypericum perforatum,Das Johanniskraut hat leuchtend gelbe Blueten und ist ein wichtiges Heilkraut gegen Depressionen und Stimmungstiefs.,Volles Sonnenlicht,10-25 °C,7,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, -sun,constants/lexiconBatch2.ts,136,Ysop,Hyssopus officinalis,Ysop ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -sun,constants/lexiconBatch2.ts,203,Stechpalme,Ilex aquifolium,Stechpalme ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|sun,,,,, -sun,constants/lexiconBatch1.ts,64,Suesskartoffel,Ipomoea batatas,"Die Suesskartoffel-Zierpflanze hat dekorative, herzfoermige Blaetter in gruen oder dunkelviolett. Ideal als Haengepflanze.",Volles Sonnenlicht,20-30 °C,5,easy|hanging|sun,,,,, -sun,constants/lexiconBatch2.ts,156,Prunkwinde,Ipomoea purpurea,"Prunkwinde ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,144,Bart-Iris,Iris germanica,"Bart-Iris ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch1.ts,9,Kalanchoe,Kalanchoe blossfeldiana,"Die Kalanchoe ist eine beliebte Bluehpflanze mit leuchtenden Blueten in Rot, Orange, Gelb oder Rosa.",Helles bis volles Licht,15-25 °C,10,easy|flowering|succulent|sun,,,,, -sun,constants/lexiconBatch2.ts,22,Brutblatt,Kalanchoe daigremontiana,Das Brutblatt bildet entlang des Blattrandes zahlreiche kleine Jungpflanzen. Eine faszinierende Sukkulente.,Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, -sun,constants/lexiconBatch2.ts,21,Kaninchen-Ohren,Kalanchoe tomentosa,"Kaninchen-Ohren haben weisslich-filzige Blaetter mit braunen Raendern, die Kaninchen­ohren aehneln. Sehr dekorativ.",Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, -sun,constants/lexiconBatch2.ts,64,Wandelroeschen,Lantana camara,"Das Wandelroeschen hat kugelige Bluetenkoepfe, die die Farbe von Gelb ueber Orange zu Rot wechseln. Sehr attraktiv.",Volles Sonnenlicht,18-28 °C,5,flowering|bright_light|sun,,,,, -sun,constants/lexiconBatch2.ts,158,Duftwicke,Lathyrus odoratus,"Duftwicke ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,121,Lorbeer,Laurus nobilis,Lorbeer ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -sun,constants/lexiconBatch1.ts,23,Echter Lavendel,Lavandula angustifolia,Der Echte Lavendel ist ein aromatischer Halbstrauch mit lilafarbenen Bluetenaehren. Herrlicher Duft.,Volles Sonnenlicht,10-25 °C,10,medicinal|bright_light|sun,medicinal_requires_external_evidence,,,, -sun,constants/lexiconBatch2.ts,180,Bechermalve,Lavatera trimestris,"Bechermalve ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,173,Margerite,Leucanthemum vulgare,"Margerite ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,201,Shasta-Margerite,Leucanthemum x superbum,"Shasta-Margerite ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,126,Liebstoeckel,Levisticum officinale,Liebstoeckel ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -sun,constants/lexiconBatch2.ts,23,Lebende Steine,Lithops julii,"Lebende Steine sind faszinierende Mimikry-Sukkulenten, die Kieselsteinen taeuschen aehnlich sehen. Sehr trockenheitsresistent.",Volles Sonnenlicht,10-30 °C,21,succulent|sun,,,,, -sun,constants/lexiconBatch2.ts,154,Lupine,Lupinus polyphyllus,"Lupine ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch1.ts,79,Mammillaria,Mammillaria zeilmanniana,"Die Mammillaria ist ein kompakter, kugelfoermiger Kaktus, der im Fruehling einen Kranz aus rosa Blueten traegt.",Volles Sonnenlicht,15-35 °C,14,easy|flowering|succulent|sun,,,,, -sun,constants/lexiconBatch2.ts,179,Indianernessel,Monarda didyma,"Indianernessel ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,177,Vergissmeinnicht,Myosotis sylvatica,"Vergissmeinnicht ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,199,Nemesie,Nemesia strumosa,"Nemesie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,132,Katzenminze,Nepeta cataria,Katzenminze ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -sun,constants/lexiconBatch2.ts,120,Oleander,Nerium oleander,"Der Oleander ist ein mediteraner Strauch mit leuchtend roten, rosa oder weissen Blueten. Sehr hitzetolerant.",Volles Sonnenlicht,15-28 °C,7,flowering|bright_light|sun,,,,, -sun,constants/lexiconBatch2.ts,193,Ziertabak,Nicotiana alata,"Ziertabak ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch1.ts,25,Basilikum,Ocimum basilicum,"Basilikum ist das beliebteste Kuechenkraut mit intensiv aromatischen, gruenen Blaettern. Fuer Pesto verwendet.",Volles Sonnenlicht,18-30 °C,2,easy|medicinal|sun,medicinal_requires_external_evidence,,,, -sun,constants/lexiconBatch1.ts,82,Hasenohren-Kaktus,Opuntia microdasys,"Der Hasenohren-Kaktus hat flache, ovale Triebe mit dichten weissen Glochiden. Klassischer Zimmerkaktus.",Volles Sonnenlicht,10-35 °C,21,easy|succulent|sun,,,,, -sun,constants/lexiconBatch2.ts,124,Majoran,Origanum majorana,Majoran ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -sun,constants/lexiconBatch1.ts,28,Oregano,Origanum vulgare,"Oregano ist ein aromatisches Kuechenkraut mit runden, behaarten Blaettern. In mediterraner Kueche beliebt.",Volles Sonnenlicht,15-25 °C,7,easy|medicinal|sun,medicinal_requires_external_evidence,,,, -sun,constants/lexiconBatch2.ts,200,Kapmargerite,Osteospermum ecklonis,"Kapmargerite ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch1.ts,88,Mondstein-Pflanze,Pachyphytum oviferum,"Die Mondstein-Pflanze hat dicke, ovale Blaetter mit einem pastellrosafarbenen, mehligen Ueberzug.",Volles Sonnenlicht,15-25 °C,14,easy|succulent|sun,,,,, -sun,constants/lexiconBatch2.ts,143,Pfingstrose,Paeonia lactiflora,"Pfingstrose ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,185,Mohn,Papaver rhoeas,"Mohn ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch1.ts,31,Rosengeranie,Pelargonium graveolens,Die Rosengeranie ist eine Duftpflanze mit tief eingeschnittenen Blaettern und rosaenlichem Aroma.,Volles Sonnenlicht,15-25 °C,7,easy|medicinal|sun,medicinal_requires_external_evidence,,,, -sun,constants/lexiconBatch2.ts,61,Efeu-Geranie,Pelargonium peltatum,"Die Efeu-Geranie hat efeufoermige, glaenzende Blaetter und bluet den ganzen Sommer in leuchtenden Farben.",Helles bis volles Licht,15-25 °C,5,easy|flowering|hanging|sun,,,,, -sun,constants/lexiconBatch2.ts,174,Stehende Geranie,Pelargonium zonale,"Stehende Geranie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,134,Shiso,Perilla frutescens,Shiso ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -sun,constants/lexiconBatch1.ts,34,Petunie,Petunia hybrida,Die Petunie ist eine der beliebtesten Balkonpflanzen mit trichterfoermigen Blueten in unzaehligen Farben.,Volles Sonnenlicht,15-25 °C,2,easy|pet_friendly|flowering|sun,pet_friendly_requires_external_evidence,,,, -sun,constants/lexiconBatch2.ts,165,Flammenblume,Phlox paniculata,"Flammenblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,207,Fichte,Picea abies,Fichte ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, -sun,constants/lexiconBatch2.ts,206,Kiefer,Pinus sylvestris,Kiefer ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, -sun,constants/lexiconBatch1.ts,61,Bleiwurz,Plumbago auriculata,"Die Bleiwurz ist ein halbimmergruener Strauch mit himmelblauen Blueten, der fast das ganze Jahr bluet.",Volles Sonnenlicht,15-27 °C,5,flowering|bright_light|sun,,,,, -sun,constants/lexiconBatch2.ts,118,Tempel-Baum,Plumeria rubra,"Der Tempel-Baum hat intensiv duftende, sternfoermige Blueten in Weiss, Gelb oder Rosa. Klassische Tropenblume.",Volles Sonnenlicht,20-30 °C,7,flowering|tree|sun,,,,, -sun,constants/lexiconBatch2.ts,27,Speckbaum,Portulacaria afra,"Der Speckbaum ist eine sukkulente Pflanze mit roten Stielen und kleinen, runden, glaenzenden Blaettern.",Helles bis volles Licht,15-30 °C,14,easy|succulent|sun,,,,, -sun,constants/lexiconBatch2.ts,71,Koenigs-Protea,Protea cynaroides,"Die Koenigs-Protea ist die Nationalblume Suedafrikas mit riesigen, imposanten Bluetenkoepfen. Eine echte Besonderheit.",Volles Sonnenlicht,10-25 °C,7,flowering|large|sun,,,,, -sun,constants/lexiconBatch2.ts,218,Kirschlorbeer,Prunus laurocerasus,Kirschlorbeer ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|sun,,,,, -sun,constants/lexiconBatch2.ts,89,Guave,Psidium guajava,Die Guave ist ein tropischer Obstbaum mit gelblich-weissen Fruechten. Sie ist reich an Vitamin C.,Volles Sonnenlicht,18-30 °C,7,tree|sun,,,,, -sun,constants/lexiconBatch2.ts,88,Granatapfelbaum,Punica granatum,"Der Granatapfelbaum hat leuchtend rote Blueten und rote, essbare Fruechte mit rubinroten Kernen.",Volles Sonnenlicht,15-28 °C,7,flowering|tree|sun,,,,, -sun,constants/lexiconBatch2.ts,205,Eiche,Quercus robur,Eiche ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, -sun,constants/lexiconBatch2.ts,162,Ranunkel,Ranunculus asiaticus,"Ranunkel ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,214,Robinie,Robinia pseudoacacia,Robinie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, -sun,constants/lexiconBatch1.ts,66,Chinesische Rose,Rosa chinensis,Die Chinesische Rose ist eine der Stammarten vieler Gartenrosen und bluet fast ununterbrochen.,Volles Sonnenlicht,15-25 °C,5,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,142,Rose,Rosa x hybrida,"Rose ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light|sun,,,,, -sun,constants/lexiconBatch1.ts,24,Rosmarin,Rosmarinus officinalis,Rosmarin ist ein aromatisches Kraut mit nadelartigen Blaettern und blauen Blueten. In der Kueche unverzichtbar.,Volles Sonnenlicht,10-25 °C,7,easy|medicinal|sun,medicinal_requires_external_evidence,,,, -sun,constants/lexiconBatch2.ts,167,Rudbeckie,Rudbeckia hirta,"Rudbeckie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,130,Sauerampfer,Rumex acetosa,Sauerampfer ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -sun,constants/lexiconBatch2.ts,195,Mehlsalbei,Salvia farinacea,"Mehlsalbei ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,103,Salbei,Salvia officinalis,Salbei ist ein aromatisches Heilkraut mit silbrig-gruenen Blaettern. Er hat antibakterielle und entzuendungshem­mende Wirkung.,Volles Sonnenlicht,10-25 °C,7,easy|medicinal|sun,medicinal_requires_external_evidence,,,, -sun,constants/lexiconBatch2.ts,168,Feuersalbei,Salvia splendens,"Feuersalbei ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,17,Zylindrischer Bogenhanf,Sansevieria cylindrica,"Der Zylindrische Bogenhanf hat zylindrische, aufrechte Blaetter, die sich nach oben verjuengen. Sehr pflegeleicht.",Helles bis volles Licht,15-27 °C,14,easy|succulent|sun,,,,, -sun,constants/lexiconBatch2.ts,78,Purpursonnentau,Sarracenia purpurea,Der Purpursonnentau ist eine fleischfressende Kannenpflanze mit purpurroten Kannen. Faengt Insekten.,Volles Sonnenlicht,5-25 °C,3,high_humidity|sun,,,,, -sun,constants/lexiconBatch2.ts,123,Bohnenkraut,Satureja hortensis,Bohnenkraut ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -sun,constants/lexiconBatch1.ts,7,Eselschwanz,Sedum morganianum,"Der Eselschwanz ist eine haengende Sukkulente mit langen Trieben aus dichten, blaugruenen Blaettchen.",Volles Sonnenlicht,15-25 °C,14,easy|succulent|hanging|sun,,,,, -sun,constants/lexiconBatch2.ts,28,Blauer Kreuzkraut,Senecio serpens,"Der Blaue Kreuzkraut hat zylindrische, blaublaugruene Blaetter und einen kriechenden Wuchs. Sehr dekorativ.",Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, -sun,constants/lexiconBatch2.ts,93,Aubergine,Solanum melongena,"Die Aubergine ist eine Gemuese­pflanze mit grossen, violetten Fruechten. Sie benoetigt viel Waerme und Sonne.",Volles Sonnenlicht,20-30 °C,5,bright_light|sun,,,,, -sun,constants/lexiconBatch2.ts,213,Eberesche,Sorbus aucuparia,Eberesche ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, -sun,constants/lexiconBatch2.ts,222,Spierstrauch,Spiraea japonica,Spierstrauch ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|sun,,,,, -sun,constants/lexiconBatch2.ts,25,Aasblume,Stapelia grandiflora,"Die Aasblume hat fleischige, gruene Staengel und riesige, sternfoermige Blueten mit aasartigem Duft.",Helles bis volles Licht,18-30 °C,14,flowering|succulent|sun,,,,, -sun,constants/lexiconBatch2.ts,131,Stevia,Stevia rebaudiana,Stevia ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -sun,constants/lexiconBatch1.ts,3,Paradiesvogelblume,Strelitzia reginae,"Die Paradiesvogelblume beeindruckt mit leuchtend orangefarbenen und blauen Blueten, die einem Vogel aehneln.",Volles Sonnenlicht,18-26 °C,7,flowering|large|sun,,,,, -sun,constants/lexiconBatch2.ts,166,Herbstaster,Symphyotrichum novi-belgii,"Herbstaster ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,149,Flieder,Syringa vulgaris,"Flieder ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|tree|sun,,,,, -sun,constants/lexiconBatch2.ts,66,Studentenblume,Tagetes patula,Die Studentenblume ist eine robuste Sommerblume mit orangen oder gelben Blueten. Sie haelt Schadlinge fern.,Volles Sonnenlicht,15-28 °C,3,easy|flowering|sun,,,,, -sun,constants/lexiconBatch1.ts,27,Thymian,Thymus vulgaris,"Thymian ist ein kleiner, aromatischer Strauch mit winzigen Blaettern und rosa Blueten. Wichtiges Kuechenkraut.",Volles Sonnenlicht,10-25 °C,7,easy|medicinal|sun,medicinal_requires_external_evidence,,,, -sun,constants/lexiconBatch2.ts,54,Lila Tradescantia,Tradescantia pallida,Die Lila Tradescantia hat leuchtend purpurrote Blaetter und ist sehr auffaellig. Sie liebt viel Licht.,Helles bis volles Licht,15-25 °C,5,easy|hanging|sun,,,,, -sun,constants/lexiconBatch2.ts,151,Kapuzinerkresse,Tropaeolum majus,"Kapuzinerkresse ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,82,Wasserschlauch,Utricularia gibba,Der Wasserschlauch ist eine wasserbewohnende fleischfressende Pflanze mit Schlaeuchen als Insekten­fallen.,Helles bis volles Licht,15-25 °C,2,high_humidity|sun,,,,, -sun,constants/lexiconBatch2.ts,192,Koenigskerze,Verbascum thapsus,"Koenigskerze ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, -sun,constants/lexiconBatch2.ts,164,Eisenkraut,Verbena bonariensis,"Eisenkraut ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,198,Hornveilchen,Viola cornuta,"Hornveilchen ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,5,Mexikanische Fächerpalme,Washingtonia robusta,"Die Mexikanische Fächerpalme ist eine schlanke, hohe Palme mit faecher­foermigen Blaettern. Sehr hitzetolerant.",Volles Sonnenlicht,15-35 °C,10,tree|large|sun,,,,, -sun,constants/lexiconBatch2.ts,221,Weigelie,Weigela florida,Weigelie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|sun,,,,, -sun,constants/lexiconBatch1.ts,65,Chinesischer Blauregen,Wisteria sinensis,"Der Chinesische Blauregen ist ein ueppiger Kletterkuenstler mit langen, duftenden Bluetentrauben in Lila.",Volles Sonnenlicht,10-25 °C,7,flowering|large|sun,,,,, -sun,constants/lexiconBatch2.ts,246,Yucca aloifolia,Yucca aloifolia,Yucca aloifolia ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Volles Sonnenlicht,18-30 C,10,easy|tree|sun,,,,, -sun,constants/lexiconBatch1.ts,40,Yucca-Palme,Yucca elephantipes,"Die Yucca-Palme ist eine robuste Zimmerpflanze mit starrem, immergruenem Blaetterschopf auf einem dicken Stamm.",Helles bis volles Licht,15-28 °C,14,easy|tree|sun,,,,, -sun,constants/lexiconBatch2.ts,65,Zinnie,Zinnia elegans,"Die Zinnie ist eine leuchtende Sommerblume mit grossen, dahlienaehnlichen Blueten. Sehr robust und hitzetolerant.",Volles Sonnenlicht,18-30 °C,3,easy|flowering|sun,,,,, +category,source_file,source_index,name,botanical_name,description,light,temp,water_interval_days,all_categories,risk_flags,audit_status,evidence_source,evidence_url,notes +sun,constants/lexiconBatch2.ts,212,Spitzahorn,Acer platanoides,Spitzahorn ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, +sun,constants/lexiconBatch2.ts,108,Schafgarbe,Achillea millefolium,Die Schafgarbe hat weisse oder rosafarbene Bluetenschirme und fein gefiederte Blaetter. Wichtige Heilpflanze.,Volles Sonnenlicht,10-25 °C,7,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, +sun,constants/lexiconBatch1.ts,86,Wuestenrose,Adenium obesum,Die Wuestenrose ist eine sukkulente Zimmerpflanze mit dickem Stamm und leuchtend pinken Blueten.,Volles Sonnenlicht,20-35 °C,10,flowering|succulent|sun,,,,, +sun,constants/lexiconBatch2.ts,117,Socotra-Wuestenrose,Adenium socotranum,"Die Socotra-Wuestenrose ist eine seltene, endemische Art mit einem sehr dicken, knolligen Stamm und rosa Blueten.",Volles Sonnenlicht,20-35 °C,14,flowering|succulent|sun,,,,, +sun,constants/lexiconBatch2.ts,31,Adromischus,Adromischus cristatus,Adromischus ist eine kompakte Sukkulente mit ungewoehnlich wellenrandigen Blaettern auf kurzen Staengeln.,Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, +sun,constants/lexiconBatch1.ts,10,Schwarze Rose (Aeonium),Aeonium arboreum,"Das Aeonium bildet dekorative, rosettenfoermige Sukkulenten an verzweigten Stielen.",Volles Sonnenlicht,10-25 °C,10,succulent|sun,,,,, +sun,constants/lexiconBatch1.ts,11,Agave,Agave americana,"Die Agave ist eine imposante Sukkulente mit steifen, blaugruenen Blaettern mit Stacheln. Sie bluet nur einmal.",Volles Sonnenlicht,10-35 °C,21,succulent|large|sun,,,,, +sun,constants/lexiconBatch2.ts,155,Stockrose,Alcea rosea,"Stockrose ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,135,Schnittknoblauch,Allium tuberosum,Schnittknoblauch ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +sun,constants/lexiconBatch1.ts,89,Kap-Aloe,Aloe arborescens,"Die Kap-Aloe ist eine strauchige Aloe mit schmalen, gezaehnten Blaettern und leuchtend roten Bluetenaehren im Winter.",Volles Sonnenlicht,10-30 °C,14,easy|succulent|medicinal|sun,medicinal_requires_external_evidence,,,, +sun,constants/lexiconBatch2.ts,18,Kap-Aloe (ferox),Aloe ferox,"Aloe ferox ist eine grosse, imposante Aloe mit stachligen, blaugruenen Blaettern und leuchtend roten Bluetenaehren.",Volles Sonnenlicht,10-30 °C,14,succulent|large|medicinal|sun,medicinal_requires_external_evidence,,,, +sun,constants/lexiconBatch2.ts,128,Zitronenverbene,Aloysia citrodora,Zitronenverbene ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +sun,constants/lexiconBatch2.ts,194,Fuchsschwanz,Amaranthus caudatus,"Fuchsschwanz ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,163,Anemone,Anemone coronaria,"Anemone ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,140,Dill,Anethum graveolens,Dill ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +sun,constants/lexiconBatch2.ts,125,Kerbel,Anthriscus cerefolium,Kerbel ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +sun,constants/lexiconBatch2.ts,147,Loewenmaeulchen,Antirrhinum majus,"Loewenmaeulchen ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,107,Arnika,Arnica montana,Arnika ist eine bekannte Heilpflanze aus den Alpen mit goldgelben Korbbluten. Sie wird fuer Muskeln und Gelenke verwendet.,Volles Sonnenlicht,10-20 °C,7,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, +sun,constants/lexiconBatch2.ts,110,Wermut,Artemisia absinthium,"Wermut ist ein stark aromatisches Heilkraut mit silbrig-gruenen, tief eingeschnittenen Blaettern. Fuer Kraeuterlikoere.",Volles Sonnenlicht,10-25 °C,14,medicinal|sun,medicinal_requires_external_evidence,,,, +sun,constants/lexiconBatch2.ts,122,Estragon,Artemisia dracunculus,Estragon ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +sun,constants/lexiconBatch2.ts,178,Seidenpflanze,Asclepias tuberosa,"Seidenpflanze ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch1.ts,41,Pferdeschwanzpalme,Beaucarnea recurvata,"Die Pferdeschwanzpalme hat einen verdickten Stammbasis als Wasserspeicher und lange, schmale Blaetter.",Volles Sonnenlicht,15-30 °C,21,easy|succulent|tree|sun,,,,, +sun,constants/lexiconBatch2.ts,145,Gaensebluemchen,Bellis perennis,"Gaensebluemchen ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,129,Borretsch,Borago officinalis,Borretsch ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +sun,constants/lexiconBatch1.ts,62,Bougainvillea,Bougainvillea spectabilis,"Die Bougainvillea ist eine rankenreiche Kletterpflanze mit leuchtend farbigen Hochblaettern in Rot, Orange oder Pink.",Volles Sonnenlicht,18-30 °C,5,flowering|bright_light|sun,,,,, +sun,constants/lexiconBatch2.ts,223,Schmetterlingsflieder,Buddleja davidii,Schmetterlingsflieder ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|sun,,,,, +sun,constants/lexiconBatch2.ts,202,Buchsbaum,Buxus sempervirens,Buchsbaum ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|sun,,,,, +sun,constants/lexiconBatch2.ts,187,Ringelblume,Calendula officinalis,"Ringelblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, +sun,constants/lexiconBatch2.ts,63,Calibrachoa,Calibrachoa hybrida,"Calibrachoa ist eine petunienaehnliche Haengepflanze mit unzaehligen, kleinen Trichterbluten in allen Farben.",Volles Sonnenlicht,15-25 °C,2,easy|flowering|hanging|sun,,,,, +sun,constants/lexiconBatch2.ts,67,Blumenschilfrohr,Canna indica,"Das Blumenschilfrohr hat grosse, tropisch wirkende Blaetter und auffaellige Blueten in Rot, Orange oder Gelb.",Volles Sonnenlicht,18-28 °C,5,flowering|large|sun,,,,, +sun,constants/lexiconBatch2.ts,92,Chili,Capsicum annuum,"Chili ist eine beliebte Gemuese- und Zierpflanze mit leuchtenden, roten oder orangen Fruechten. Im Topf kultivierbar.",Volles Sonnenlicht,20-30 °C,4,easy|medicinal|sun,medicinal_requires_external_evidence,,,, +sun,constants/lexiconBatch2.ts,90,Papaya,Carica papaya,"Die Papaya ist eine tropische Fruchtpflanze mit grossen, gelappten Blaettern und orangen Fruechten.",Volles Sonnenlicht,20-35 °C,5,large|sun,,,,, +sun,constants/lexiconBatch2.ts,217,Trompetenbaum,Catalpa bignonioides,Trompetenbaum ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, +sun,constants/lexiconBatch2.ts,208,Zeder,Cedrus libani,Zeder ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, +sun,constants/lexiconBatch2.ts,188,Kornblume,Centaurea cyanus,"Kornblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch1.ts,81,Peruanischer Fackelkaktus,Cereus peruvianus,"Der Peruanische Fackelkaktus ist ein saeulenfoermiger Kaktus, der im Innenraum bis zu 2 m hoch werden kann.",Volles Sonnenlicht,15-35 °C,21,easy|succulent|large|sun,,,,, +sun,constants/lexiconBatch2.ts,138,Roemische Kamille,Chamaemelum nobile,Roemische Kamille ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|medicinal|sun,medicinal_requires_external_evidence,,,, +sun,constants/lexiconBatch2.ts,101,Kamille,Chamomilla recutita,"Die Kamille ist ein beliebtes Heilkraut mit kleinen, weiss-gelben Blueten. Das aetherische Oel wirkt beruhigend.",Volles Sonnenlicht,15-25 °C,5,easy|medicinal|sun,medicinal_requires_external_evidence,,,, +sun,constants/lexiconBatch2.ts,86,Zitronenbaum,Citrus limon,"Der Zitronenbaum ist ein kleiner, immergruener Baum mit weissen, duftenden Blueten und gelben Fruechten.",Volles Sonnenlicht,18-28 °C,5,tree|sun,,,,, +sun,constants/lexiconBatch2.ts,87,Orangenbaum,Citrus sinensis,"Der Orangenbaum ist ein kleiner, immergruener Baum mit weissen Blueten und orangen Fruechten.",Volles Sonnenlicht,18-28 °C,5,tree|sun,,,,, +sun,constants/lexiconBatch2.ts,24,Konophytum,Conophytum calculus,"Das Konophytum ist eine sehr kompakte Sukkulente, die zwei Blaetter zu einer kugelfoermigen Form verschmilzt.",Volles Sonnenlicht,10-25 °C,21,succulent|sun,,,,, +sun,constants/lexiconBatch2.ts,14,Keulenlilie,Cordyline australis,"Die Keulenlilie hat lange, schmale, gruene oder rotbraune Blaetter in einem dekorativen Schopf.",Helles bis volles Licht,10-25 °C,7,easy|tree|sun,,,,, +sun,constants/lexiconBatch2.ts,181,Maedchenauge,Coreopsis tinctoria,"Maedchenauge ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,139,Koriander,Coriandrum sativum,Koriander ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +sun,constants/lexiconBatch2.ts,150,Kosmee,Cosmos bipinnatus,"Kosmee ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,29,Kotyledon,Cotyledon orbiculata,"Kotyledon hat dickfleischige, runde Blaetter mit einem mehligen, weisslichen Belag. Sehr trockenheitsresistent.",Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, +sun,constants/lexiconBatch2.ts,26,Moos-Crassula,Crassula muscosa,"Die Moos-Crassula hat dicht aneinandergereihte, winzige gruene Blaetter auf unverzweigten Trieben. Sieht aus wie Moos.",Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, +sun,constants/lexiconBatch1.ts,5,Jadepflanze,Crassula ovata,"Die Jadepflanze ist eine langlebige Sukkulente mit dicken, ovalen Blaettern. In Japan gilt sie als Gluecksbringer.",Helles bis volles Licht,15-24 °C,14,easy|succulent|sun,,,,, +sun,constants/lexiconBatch2.ts,94,Gurke,Cucumis sativus,"Die Gurke ist eine rankende Gemuese­pflanze mit gruenen, erfrischenden Fruechten. Im Balkonkasten kultivierbar.",Volles Sonnenlicht,18-28 °C,3,easy|sun,,,,, +sun,constants/lexiconBatch2.ts,209,Zypresse,Cupressus sempervirens,Zypresse ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, +sun,constants/lexiconBatch2.ts,236,String of Bananas,Curio radicans,String of Bananas ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles bis volles Licht,18-30 C,10,succulent|hanging|sun,,,,, +sun,constants/lexiconBatch2.ts,237,String of Dolphins,Curio x peregrinus,String of Dolphins ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles bis volles Licht,18-30 C,10,succulent|hanging|sun,,,,, +sun,constants/lexiconBatch2.ts,239,Palmfarn,Cycas revoluta,Palmfarn ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles bis volles Licht,18-30 C,10,tree|large|sun,,,,, +sun,constants/lexiconBatch2.ts,127,Zitronengras,Cymbopogon citratus,Zitronengras ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +sun,constants/lexiconBatch2.ts,68,Dahlie,Dahlia pinnata,Die Dahlie ist eine prachtvolle Sommerblume mit Blueten in allen Groessen und Formen. Sie wird aus Knollen gezogen.,Volles Sonnenlicht,15-25 °C,5,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,153,Rittersporn,Delphinium elatum,"Rittersporn ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,189,Bartnelke,Dianthus barbatus,"Bartnelke ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,146,Nelke,Dianthus caryophyllus,"Nelke ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,77,Venusfliegenfalle,Dionaea muscipula,Die Venusfliegenfalle ist eine fleischfressende Pflanze mit klappfallartigen Blaettern. Faengt Insekten.,Volles Sonnenlicht,15-30 °C,5,sun,,,,, +sun,constants/lexiconBatch2.ts,80,Sonnentau,Drosera capensis,Der Sonnentau faengt Insekten mit klebrigen Tropfen auf seinen Blaettern. Eine faszinierende fleischfressende Pflanze.,Volles Sonnenlicht,15-25 °C,5,high_humidity|sun,,,,, +sun,constants/lexiconBatch2.ts,30,Dudleya,Dudleya brittonii,"Dudleya ist eine rosetten­bildende Sukkulente mit silbrig-weissen, mehligen Blaettern. Sehr elegant.",Volles Sonnenlicht,10-25 °C,14,easy|succulent|sun,,,,, +sun,constants/lexiconBatch1.ts,4,Echeverie,Echeveria elegans,"Die Echeverie bildet symmetrische, rosettenfoermige Sukkulenten mit blaugruenen Blaettern. Pflegeleicht.",Volles Sonnenlicht,15-25 °C,14,easy|succulent|sun,,,,, +sun,constants/lexiconBatch2.ts,106,Sonnenhut,Echinacea purpurea,"Der Sonnenhut ist eine beliebte Heilpflanze mit grossen, pinkfarbenen Blueten. Er staerkt das Immunsystem.",Helles bis volles Licht,15-25 °C,7,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, +sun,constants/lexiconBatch1.ts,77,Goldene Tonne,Echinocactus grusonii,Die Goldene Tonne ist ein ikonischer kugelfoermiger Kaktus mit goldgelben Stacheln. Waechst langsam aber imposant.,Volles Sonnenlicht,15-35 °C,21,easy|succulent|sun,,,,, +sun,constants/lexiconBatch1.ts,83,San-Pedro-Kaktus,Echinopsis pachanoi,"Der San-Pedro-Kaktus ist ein schnell wachsender, saeulenfoermiger Kaktus aus den Anden.",Volles Sonnenlicht,10-35 °C,14,easy|succulent|sun,,,,, +sun,constants/lexiconBatch2.ts,186,Kalifornischer Mohn,Eschscholzia californica,"Kalifornischer Mohn ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,210,Eukalyptus,Eucalyptus globulus,Eukalyptus ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|medicinal|sun,medicinal_requires_external_evidence,,,, +sun,constants/lexiconBatch2.ts,19,Christusdorn,Euphorbia milii,Der Christusdorn ist eine sukkulente Wolfsmilch mit stacheligen Zweigen und kleinen roten oder gelben Hochblaettern.,Helles bis volles Licht,15-28 °C,10,easy|flowering|succulent|sun,,,,, +sun,constants/lexiconBatch1.ts,12,Bleistiftkaktus,Euphorbia tirucalli,"Der Bleistiftkaktus ist eine sukkulente Wolfsmilch mit duennen, zylindrischen Zweigen ohne Blaetter.",Volles Sonnenlicht,18-30 °C,14,easy|succulent|sun,,,,, +sun,constants/lexiconBatch1.ts,78,Fass-Kaktus,Ferocactus cylindraceus,"Der Fass-Kaktus ist ein zylindrischer Wuestenkaktus mit langen, roten Stacheln. Sehr langlebig.",Volles Sonnenlicht,15-35 °C,21,easy|succulent|sun,,,,, +sun,constants/lexiconBatch2.ts,219,Forsythie,Forsythia x intermedia,Forsythie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|sun,,,,, +sun,constants/lexiconBatch2.ts,100,Erdbeere,Fragaria ananassa,"Die Erdbeere ist ein beliebtes Obst fuer Balkon und Terrasse mit aromatischen, roten Fruechten.",Helles bis volles Licht,15-25 °C,3,easy|pet_friendly|sun,pet_friendly_requires_external_evidence,,,, +sun,constants/lexiconBatch2.ts,169,Freesie,Freesia refracta,"Freesie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,196,Kokardenblume,Gaillardia aristata,"Kokardenblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,190,Mittagsgold,Gazania rigens,"Mittagsgold ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,216,Ginkgo,Ginkgo biloba,Ginkgo ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|medicinal|sun,medicinal_requires_external_evidence,,,, +sun,constants/lexiconBatch2.ts,161,Gladiole,Gladiolus hortulanus,"Gladiole ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch1.ts,87,Geisterpflanze,Graptopetalum paraguayense,"Die Geisterpflanze hat zartgraue bis perlmutt-rosafarbene, rosettenfoermige Blaetter. Sehr robuste Sukkulente.",Volles Sonnenlicht,15-25 °C,14,easy|succulent|sun,,,,, +sun,constants/lexiconBatch2.ts,141,Sonnenblume,Helianthus annuus,"Sonnenblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,133,Currykraut,Helichrysum italicum,Currykraut ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +sun,constants/lexiconBatch2.ts,191,Heliotrop,Heliotropium arborescens,"Heliotrop ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,182,Taglilie,Hemerocallis fulva,"Taglilie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch1.ts,21,Hibiskus,Hibiscus rosa-sinensis,"Der Hibiskus begeistert mit grossen, trompetenfoermigen Blueten in Rot, Orange und Rosa.",Volles Sonnenlicht,18-28 °C,3,flowering|bright_light|sun,,,,, +sun,constants/lexiconBatch2.ts,220,Gartenhibiskus,Hibiscus syriacus,Gartenhibiskus ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|sun,,,,, +sun,constants/lexiconBatch2.ts,159,Hasengloeckchen,Hyacinthoides non-scripta,"Hasengloeckchen ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,105,Johanniskraut,Hypericum perforatum,Das Johanniskraut hat leuchtend gelbe Blueten und ist ein wichtiges Heilkraut gegen Depressionen und Stimmungstiefs.,Volles Sonnenlicht,10-25 °C,7,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, +sun,constants/lexiconBatch2.ts,136,Ysop,Hyssopus officinalis,Ysop ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +sun,constants/lexiconBatch2.ts,203,Stechpalme,Ilex aquifolium,Stechpalme ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|sun,,,,, +sun,constants/lexiconBatch1.ts,64,Suesskartoffel,Ipomoea batatas,"Die Suesskartoffel-Zierpflanze hat dekorative, herzfoermige Blaetter in gruen oder dunkelviolett. Ideal als Haengepflanze.",Volles Sonnenlicht,20-30 °C,5,easy|hanging|sun,,,,, +sun,constants/lexiconBatch2.ts,156,Prunkwinde,Ipomoea purpurea,"Prunkwinde ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,144,Bart-Iris,Iris germanica,"Bart-Iris ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch1.ts,9,Kalanchoe,Kalanchoe blossfeldiana,"Die Kalanchoe ist eine beliebte Bluehpflanze mit leuchtenden Blueten in Rot, Orange, Gelb oder Rosa.",Helles bis volles Licht,15-25 °C,10,easy|flowering|succulent|sun,,,,, +sun,constants/lexiconBatch2.ts,22,Brutblatt,Kalanchoe daigremontiana,Das Brutblatt bildet entlang des Blattrandes zahlreiche kleine Jungpflanzen. Eine faszinierende Sukkulente.,Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, +sun,constants/lexiconBatch2.ts,21,Kaninchen-Ohren,Kalanchoe tomentosa,"Kaninchen-Ohren haben weisslich-filzige Blaetter mit braunen Raendern, die Kaninchen­ohren aehneln. Sehr dekorativ.",Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, +sun,constants/lexiconBatch2.ts,64,Wandelroeschen,Lantana camara,"Das Wandelroeschen hat kugelige Bluetenkoepfe, die die Farbe von Gelb ueber Orange zu Rot wechseln. Sehr attraktiv.",Volles Sonnenlicht,18-28 °C,5,flowering|bright_light|sun,,,,, +sun,constants/lexiconBatch2.ts,158,Duftwicke,Lathyrus odoratus,"Duftwicke ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,121,Lorbeer,Laurus nobilis,Lorbeer ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +sun,constants/lexiconBatch1.ts,23,Echter Lavendel,Lavandula angustifolia,Der Echte Lavendel ist ein aromatischer Halbstrauch mit lilafarbenen Bluetenaehren. Herrlicher Duft.,Volles Sonnenlicht,10-25 °C,10,medicinal|bright_light|sun,medicinal_requires_external_evidence,,,, +sun,constants/lexiconBatch2.ts,180,Bechermalve,Lavatera trimestris,"Bechermalve ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,173,Margerite,Leucanthemum vulgare,"Margerite ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,201,Shasta-Margerite,Leucanthemum x superbum,"Shasta-Margerite ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,126,Liebstoeckel,Levisticum officinale,Liebstoeckel ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +sun,constants/lexiconBatch2.ts,23,Lebende Steine,Lithops julii,"Lebende Steine sind faszinierende Mimikry-Sukkulenten, die Kieselsteinen taeuschen aehnlich sehen. Sehr trockenheitsresistent.",Volles Sonnenlicht,10-30 °C,21,succulent|sun,,,,, +sun,constants/lexiconBatch2.ts,154,Lupine,Lupinus polyphyllus,"Lupine ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch1.ts,79,Mammillaria,Mammillaria zeilmanniana,"Die Mammillaria ist ein kompakter, kugelfoermiger Kaktus, der im Fruehling einen Kranz aus rosa Blueten traegt.",Volles Sonnenlicht,15-35 °C,14,easy|flowering|succulent|sun,,,,, +sun,constants/lexiconBatch2.ts,179,Indianernessel,Monarda didyma,"Indianernessel ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,177,Vergissmeinnicht,Myosotis sylvatica,"Vergissmeinnicht ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,199,Nemesie,Nemesia strumosa,"Nemesie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,132,Katzenminze,Nepeta cataria,Katzenminze ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +sun,constants/lexiconBatch2.ts,120,Oleander,Nerium oleander,"Der Oleander ist ein mediteraner Strauch mit leuchtend roten, rosa oder weissen Blueten. Sehr hitzetolerant.",Volles Sonnenlicht,15-28 °C,7,flowering|bright_light|sun,,,,, +sun,constants/lexiconBatch2.ts,193,Ziertabak,Nicotiana alata,"Ziertabak ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch1.ts,25,Basilikum,Ocimum basilicum,"Basilikum ist das beliebteste Kuechenkraut mit intensiv aromatischen, gruenen Blaettern. Fuer Pesto verwendet.",Volles Sonnenlicht,18-30 °C,2,easy|medicinal|sun,medicinal_requires_external_evidence,,,, +sun,constants/lexiconBatch1.ts,82,Hasenohren-Kaktus,Opuntia microdasys,"Der Hasenohren-Kaktus hat flache, ovale Triebe mit dichten weissen Glochiden. Klassischer Zimmerkaktus.",Volles Sonnenlicht,10-35 °C,21,easy|succulent|sun,,,,, +sun,constants/lexiconBatch2.ts,124,Majoran,Origanum majorana,Majoran ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +sun,constants/lexiconBatch1.ts,28,Oregano,Origanum vulgare,"Oregano ist ein aromatisches Kuechenkraut mit runden, behaarten Blaettern. In mediterraner Kueche beliebt.",Volles Sonnenlicht,15-25 °C,7,easy|medicinal|sun,medicinal_requires_external_evidence,,,, +sun,constants/lexiconBatch2.ts,200,Kapmargerite,Osteospermum ecklonis,"Kapmargerite ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch1.ts,88,Mondstein-Pflanze,Pachyphytum oviferum,"Die Mondstein-Pflanze hat dicke, ovale Blaetter mit einem pastellrosafarbenen, mehligen Ueberzug.",Volles Sonnenlicht,15-25 °C,14,easy|succulent|sun,,,,, +sun,constants/lexiconBatch2.ts,143,Pfingstrose,Paeonia lactiflora,"Pfingstrose ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,185,Mohn,Papaver rhoeas,"Mohn ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch1.ts,31,Rosengeranie,Pelargonium graveolens,Die Rosengeranie ist eine Duftpflanze mit tief eingeschnittenen Blaettern und rosaenlichem Aroma.,Volles Sonnenlicht,15-25 °C,7,easy|medicinal|sun,medicinal_requires_external_evidence,,,, +sun,constants/lexiconBatch2.ts,61,Efeu-Geranie,Pelargonium peltatum,"Die Efeu-Geranie hat efeufoermige, glaenzende Blaetter und bluet den ganzen Sommer in leuchtenden Farben.",Helles bis volles Licht,15-25 °C,5,easy|flowering|hanging|sun,,,,, +sun,constants/lexiconBatch2.ts,174,Stehende Geranie,Pelargonium zonale,"Stehende Geranie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,134,Shiso,Perilla frutescens,Shiso ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +sun,constants/lexiconBatch1.ts,34,Petunie,Petunia hybrida,Die Petunie ist eine der beliebtesten Balkonpflanzen mit trichterfoermigen Blueten in unzaehligen Farben.,Volles Sonnenlicht,15-25 °C,2,easy|pet_friendly|flowering|sun,pet_friendly_requires_external_evidence,,,, +sun,constants/lexiconBatch2.ts,165,Flammenblume,Phlox paniculata,"Flammenblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,207,Fichte,Picea abies,Fichte ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, +sun,constants/lexiconBatch2.ts,206,Kiefer,Pinus sylvestris,Kiefer ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, +sun,constants/lexiconBatch1.ts,61,Bleiwurz,Plumbago auriculata,"Die Bleiwurz ist ein halbimmergruener Strauch mit himmelblauen Blueten, der fast das ganze Jahr bluet.",Volles Sonnenlicht,15-27 °C,5,flowering|bright_light|sun,,,,, +sun,constants/lexiconBatch2.ts,118,Tempel-Baum,Plumeria rubra,"Der Tempel-Baum hat intensiv duftende, sternfoermige Blueten in Weiss, Gelb oder Rosa. Klassische Tropenblume.",Volles Sonnenlicht,20-30 °C,7,flowering|tree|sun,,,,, +sun,constants/lexiconBatch2.ts,27,Speckbaum,Portulacaria afra,"Der Speckbaum ist eine sukkulente Pflanze mit roten Stielen und kleinen, runden, glaenzenden Blaettern.",Helles bis volles Licht,15-30 °C,14,easy|succulent|sun,,,,, +sun,constants/lexiconBatch2.ts,71,Koenigs-Protea,Protea cynaroides,"Die Koenigs-Protea ist die Nationalblume Suedafrikas mit riesigen, imposanten Bluetenkoepfen. Eine echte Besonderheit.",Volles Sonnenlicht,10-25 °C,7,flowering|large|sun,,,,, +sun,constants/lexiconBatch2.ts,218,Kirschlorbeer,Prunus laurocerasus,Kirschlorbeer ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|sun,,,,, +sun,constants/lexiconBatch2.ts,89,Guave,Psidium guajava,Die Guave ist ein tropischer Obstbaum mit gelblich-weissen Fruechten. Sie ist reich an Vitamin C.,Volles Sonnenlicht,18-30 °C,7,tree|sun,,,,, +sun,constants/lexiconBatch2.ts,88,Granatapfelbaum,Punica granatum,"Der Granatapfelbaum hat leuchtend rote Blueten und rote, essbare Fruechte mit rubinroten Kernen.",Volles Sonnenlicht,15-28 °C,7,flowering|tree|sun,,,,, +sun,constants/lexiconBatch2.ts,205,Eiche,Quercus robur,Eiche ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, +sun,constants/lexiconBatch2.ts,162,Ranunkel,Ranunculus asiaticus,"Ranunkel ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,214,Robinie,Robinia pseudoacacia,Robinie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, +sun,constants/lexiconBatch1.ts,66,Chinesische Rose,Rosa chinensis,Die Chinesische Rose ist eine der Stammarten vieler Gartenrosen und bluet fast ununterbrochen.,Volles Sonnenlicht,15-25 °C,5,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,142,Rose,Rosa x hybrida,"Rose ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light|sun,,,,, +sun,constants/lexiconBatch1.ts,24,Rosmarin,Rosmarinus officinalis,Rosmarin ist ein aromatisches Kraut mit nadelartigen Blaettern und blauen Blueten. In der Kueche unverzichtbar.,Volles Sonnenlicht,10-25 °C,7,easy|medicinal|sun,medicinal_requires_external_evidence,,,, +sun,constants/lexiconBatch2.ts,167,Rudbeckie,Rudbeckia hirta,"Rudbeckie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,130,Sauerampfer,Rumex acetosa,Sauerampfer ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +sun,constants/lexiconBatch2.ts,195,Mehlsalbei,Salvia farinacea,"Mehlsalbei ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,103,Salbei,Salvia officinalis,Salbei ist ein aromatisches Heilkraut mit silbrig-gruenen Blaettern. Er hat antibakterielle und entzuendungshem­mende Wirkung.,Volles Sonnenlicht,10-25 °C,7,easy|medicinal|sun,medicinal_requires_external_evidence,,,, +sun,constants/lexiconBatch2.ts,168,Feuersalbei,Salvia splendens,"Feuersalbei ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,17,Zylindrischer Bogenhanf,Sansevieria cylindrica,"Der Zylindrische Bogenhanf hat zylindrische, aufrechte Blaetter, die sich nach oben verjuengen. Sehr pflegeleicht.",Helles bis volles Licht,15-27 °C,14,easy|succulent|sun,,,,, +sun,constants/lexiconBatch2.ts,78,Purpursonnentau,Sarracenia purpurea,Der Purpursonnentau ist eine fleischfressende Kannenpflanze mit purpurroten Kannen. Faengt Insekten.,Volles Sonnenlicht,5-25 °C,3,high_humidity|sun,,,,, +sun,constants/lexiconBatch2.ts,123,Bohnenkraut,Satureja hortensis,Bohnenkraut ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +sun,constants/lexiconBatch1.ts,7,Eselschwanz,Sedum morganianum,"Der Eselschwanz ist eine haengende Sukkulente mit langen Trieben aus dichten, blaugruenen Blaettchen.",Volles Sonnenlicht,15-25 °C,14,easy|succulent|hanging|sun,,,,, +sun,constants/lexiconBatch2.ts,28,Blauer Kreuzkraut,Senecio serpens,"Der Blaue Kreuzkraut hat zylindrische, blaublaugruene Blaetter und einen kriechenden Wuchs. Sehr dekorativ.",Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, +sun,constants/lexiconBatch2.ts,93,Aubergine,Solanum melongena,"Die Aubergine ist eine Gemuese­pflanze mit grossen, violetten Fruechten. Sie benoetigt viel Waerme und Sonne.",Volles Sonnenlicht,20-30 °C,5,bright_light|sun,,,,, +sun,constants/lexiconBatch2.ts,213,Eberesche,Sorbus aucuparia,Eberesche ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, +sun,constants/lexiconBatch2.ts,222,Spierstrauch,Spiraea japonica,Spierstrauch ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|sun,,,,, +sun,constants/lexiconBatch2.ts,25,Aasblume,Stapelia grandiflora,"Die Aasblume hat fleischige, gruene Staengel und riesige, sternfoermige Blueten mit aasartigem Duft.",Helles bis volles Licht,18-30 °C,14,flowering|succulent|sun,,,,, +sun,constants/lexiconBatch2.ts,131,Stevia,Stevia rebaudiana,Stevia ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +sun,constants/lexiconBatch1.ts,3,Paradiesvogelblume,Strelitzia reginae,"Die Paradiesvogelblume beeindruckt mit leuchtend orangefarbenen und blauen Blueten, die einem Vogel aehneln.",Volles Sonnenlicht,18-26 °C,7,flowering|large|sun,,,,, +sun,constants/lexiconBatch2.ts,166,Herbstaster,Symphyotrichum novi-belgii,"Herbstaster ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,149,Flieder,Syringa vulgaris,"Flieder ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|tree|sun,,,,, +sun,constants/lexiconBatch2.ts,66,Studentenblume,Tagetes patula,Die Studentenblume ist eine robuste Sommerblume mit orangen oder gelben Blueten. Sie haelt Schadlinge fern.,Volles Sonnenlicht,15-28 °C,3,easy|flowering|sun,,,,, +sun,constants/lexiconBatch1.ts,27,Thymian,Thymus vulgaris,"Thymian ist ein kleiner, aromatischer Strauch mit winzigen Blaettern und rosa Blueten. Wichtiges Kuechenkraut.",Volles Sonnenlicht,10-25 °C,7,easy|medicinal|sun,medicinal_requires_external_evidence,,,, +sun,constants/lexiconBatch2.ts,54,Lila Tradescantia,Tradescantia pallida,Die Lila Tradescantia hat leuchtend purpurrote Blaetter und ist sehr auffaellig. Sie liebt viel Licht.,Helles bis volles Licht,15-25 °C,5,easy|hanging|sun,,,,, +sun,constants/lexiconBatch2.ts,151,Kapuzinerkresse,Tropaeolum majus,"Kapuzinerkresse ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,82,Wasserschlauch,Utricularia gibba,Der Wasserschlauch ist eine wasserbewohnende fleischfressende Pflanze mit Schlaeuchen als Insekten­fallen.,Helles bis volles Licht,15-25 °C,2,high_humidity|sun,,,,, +sun,constants/lexiconBatch2.ts,192,Koenigskerze,Verbascum thapsus,"Koenigskerze ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, +sun,constants/lexiconBatch2.ts,164,Eisenkraut,Verbena bonariensis,"Eisenkraut ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,198,Hornveilchen,Viola cornuta,"Hornveilchen ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,5,Mexikanische Fächerpalme,Washingtonia robusta,"Die Mexikanische Fächerpalme ist eine schlanke, hohe Palme mit faecher­foermigen Blaettern. Sehr hitzetolerant.",Volles Sonnenlicht,15-35 °C,10,tree|large|sun,,,,, +sun,constants/lexiconBatch2.ts,221,Weigelie,Weigela florida,Weigelie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|sun,,,,, +sun,constants/lexiconBatch1.ts,65,Chinesischer Blauregen,Wisteria sinensis,"Der Chinesische Blauregen ist ein ueppiger Kletterkuenstler mit langen, duftenden Bluetentrauben in Lila.",Volles Sonnenlicht,10-25 °C,7,flowering|large|sun,,,,, +sun,constants/lexiconBatch2.ts,246,Yucca aloifolia,Yucca aloifolia,Yucca aloifolia ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Volles Sonnenlicht,18-30 C,10,easy|tree|sun,,,,, +sun,constants/lexiconBatch1.ts,40,Yucca-Palme,Yucca elephantipes,"Die Yucca-Palme ist eine robuste Zimmerpflanze mit starrem, immergruenem Blaetterschopf auf einem dicken Stamm.",Helles bis volles Licht,15-28 °C,14,easy|tree|sun,,,,, +sun,constants/lexiconBatch2.ts,65,Zinnie,Zinnia elegans,"Die Zinnie ist eine leuchtende Sommerblume mit grossen, dahlienaehnlichen Blueten. Sehr robust und hitzetolerant.",Volles Sonnenlicht,18-30 °C,3,easy|flowering|sun,,,,, diff --git a/audits/semantic-search/categories/tree.csv b/audits/semantic-search/categories/tree.csv index bdddaba..e15db22 100644 --- a/audits/semantic-search/categories/tree.csv +++ b/audits/semantic-search/categories/tree.csv @@ -1,60 +1,60 @@ -category,source_file,source_index,name,botanical_name,description,light,temp,water_interval_days,all_categories,risk_flags,audit_status,evidence_source,evidence_url,notes -tree,constants/lexiconBatch2.ts,115,Faecherahorn,Acer palmatum,"Der Faecherahorn ist ein japanischer Zierahorn mit feingeschnittenen, faecherfoermigen Blaettern in Gruen oder Rot.",Helles bis volles Licht,10-22 °C,5,tree,,,,, -tree,constants/lexiconBatch2.ts,212,Spitzahorn,Acer platanoides,Spitzahorn ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, -tree,constants/lexiconBatch2.ts,232,Norfolk-Tanne,Araucaria heterophylla,Norfolk-Tanne ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,tree|bright_light,,,,, -tree,constants/lexiconBatch1.ts,41,Pferdeschwanzpalme,Beaucarnea recurvata,"Die Pferdeschwanzpalme hat einen verdickten Stammbasis als Wasserspeicher und lange, schmale Blaetter.",Volles Sonnenlicht,15-30 °C,21,easy|succulent|tree|sun,,,,, -tree,constants/lexiconBatch2.ts,114,Hange-Birke,Betula pendula,Die Haenge-Birke hat charakteristisch weisse Rinde und haengende Zweige. Die Blaetter werden in der Heilkunde genutzt.,Volles Sonnenlicht,10-25 °C,7,tree|large|medicinal,medicinal_requires_external_evidence,,,, -tree,constants/lexiconBatch2.ts,223,Schmetterlingsflieder,Buddleja davidii,Schmetterlingsflieder ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|sun,,,,, -tree,constants/lexiconBatch2.ts,202,Buchsbaum,Buxus sempervirens,Buchsbaum ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|sun,,,,, -tree,constants/lexiconBatch2.ts,217,Trompetenbaum,Catalpa bignonioides,Trompetenbaum ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, -tree,constants/lexiconBatch2.ts,208,Zeder,Cedrus libani,Zeder ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, -tree,constants/lexiconBatch1.ts,43,Bergpalme,Chamaedorea elegans,Die Bergpalme ist eine kompakte Zimmerpalme fuer schattigere Standorte. Ideal fuer dunkle Innenraeume.,Wenig bis helles Licht,15-25 °C,7,easy|pet_friendly|tree|air_purifier|low_light,air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence,,,, -tree,constants/lexiconBatch2.ts,86,Zitronenbaum,Citrus limon,"Der Zitronenbaum ist ein kleiner, immergruener Baum mit weissen, duftenden Blueten und gelben Fruechten.",Volles Sonnenlicht,18-28 °C,5,tree|sun,,,,, -tree,constants/lexiconBatch2.ts,87,Orangenbaum,Citrus sinensis,"Der Orangenbaum ist ein kleiner, immergruener Baum mit weissen Blueten und orangen Fruechten.",Volles Sonnenlicht,18-28 °C,5,tree|sun,,,,, -tree,constants/lexiconBatch2.ts,14,Keulenlilie,Cordyline australis,"Die Keulenlilie hat lange, schmale, gruene oder rotbraune Blaetter in einem dekorativen Schopf.",Helles bis volles Licht,10-25 °C,7,easy|tree|sun,,,,, -tree,constants/lexiconBatch2.ts,209,Zypresse,Cupressus sempervirens,Zypresse ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, -tree,constants/lexiconBatch2.ts,239,Palmfarn,Cycas revoluta,Palmfarn ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles bis volles Licht,18-30 C,10,tree|large|sun,,,,, -tree,constants/lexiconBatch2.ts,215,Flammenbaum,Delonix regia,Flammenbaum ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|large,,,,, -tree,constants/lexiconBatch1.ts,14,Maisstrauch,Dracaena fragrans,"Der Maisstrauch ist eine robuste Zimmerpflanze mit breiten, gestreiften Blaettern. Gedeiht auch bei wenig Licht.",Helles indirektes Licht,15-25 °C,10,easy|tree|air_purifier|low_light,air_purifier_requires_external_evidence,,,, -tree,constants/lexiconBatch1.ts,13,Drachenbaum,Dracaena marginata,"Der Drachenbaum ist eine schlanke Zimmerpflanze mit roten, schmalen Blaettern auf langen Staemmen.",Helles indirektes Licht,15-25 °C,10,easy|tree|air_purifier,air_purifier_requires_external_evidence,,,, -tree,constants/lexiconBatch1.ts,42,Goldfruchtpalme,Dypsis lutescens,Die Goldfruchtpalme ist eine elegante Zimmerpalme mit gelblich-gruenen Stielen und gefiederten Wedeln.,Helles indirektes Licht,18-27 °C,5,pet_friendly|tree|air_purifier,air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence,,,, -tree,constants/lexiconBatch2.ts,210,Eukalyptus,Eucalyptus globulus,Eukalyptus ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|medicinal|sun,medicinal_requires_external_evidence,,,, -tree,constants/lexiconBatch2.ts,248,Ficus altissima,Ficus altissima,Ficus altissima ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,tree|bright_light,,,,, -tree,constants/lexiconBatch1.ts,1,Birkenfeige,Ficus benjamina,"Die Birkenfeige ist ein eleganter Zimmerstrauch mit haengenden Aesten und kleinen, glaenzenden Blaettern.",Helles indirektes Licht,16-24 °C,7,tree|air_purifier,air_purifier_requires_external_evidence,,,, -tree,constants/lexiconBatch1.ts,38,Gummibaum,Ficus elastica,"Der Gummibaum ist eine imposante Zimmerpflanze mit grossen, glaenzenden, lederartigen Blaettern. Reinigt die Luft.",Helles indirektes Licht,16-24 °C,10,easy|tree|air_purifier,air_purifier_requires_external_evidence,,,, -tree,constants/lexiconBatch1.ts,39,Geigenfeige,Ficus lyrata,"Die Geigenfeige ist ein Trendbaum mit grossen, geigenfoermigen Blaettern. Benoetigt viel Licht.",Helles indirektes Licht,18-27 °C,7,tree|large|bright_light,,,,, -tree,constants/lexiconBatch2.ts,247,Ficus microcarpa,Ficus microcarpa,Ficus microcarpa ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,easy|tree|bright_light,,,,, -tree,constants/lexiconBatch2.ts,116,Bonsai-Feige,Ficus retusa,"Die Bonsai-Feige ist eine klassische Bonsai-Art mit kleinen, elliptischen Blaettern. Sehr formbar.",Helles indirektes Licht,16-24 °C,7,tree,,,,, -tree,constants/lexiconBatch2.ts,219,Forsythie,Forsythia x intermedia,Forsythie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|sun,,,,, -tree,constants/lexiconBatch2.ts,216,Ginkgo,Ginkgo biloba,Ginkgo ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|medicinal|sun,medicinal_requires_external_evidence,,,, -tree,constants/lexiconBatch2.ts,220,Gartenhibiskus,Hibiscus syriacus,Gartenhibiskus ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|sun,,,,, -tree,constants/lexiconBatch2.ts,3,Kentia-Palme,Howea forsteriana,"Die Kentia-Palme ist eine der elegantesten Zimmerpalmen mit langen, herabhängenden Fiederblaettern.",Helles indirektes Licht,18-25 °C,7,pet_friendly|tree|low_light,pet_friendly_requires_external_evidence,,,, -tree,constants/lexiconBatch2.ts,203,Stechpalme,Ilex aquifolium,Stechpalme ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|sun,,,,, -tree,constants/lexiconBatch2.ts,211,Jacaranda,Jacaranda mimosifolia,Jacaranda ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|large,,,,, -tree,constants/lexiconBatch2.ts,4,Chinesische Fächerpalme,Livistona chinensis,"Die Chinesische Fächerpalme hat grosse, faecher­foermige Blaetter auf einem einzelnen Stamm. Sehr dekorativ.",Helles bis volles Licht,15-25 °C,7,tree|bright_light,,,,, -tree,constants/lexiconBatch2.ts,204,Magnolie,Magnolia grandiflora,Magnolie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|large,,,,, -tree,constants/lexiconBatch2.ts,231,Glueckskastanie,Pachira aquatica,Glueckskastanie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,easy|tree|bright_light,,,,, -tree,constants/lexiconBatch1.ts,44,Zwergdattelpalme,Phoenix roebelenii,"Die Zwergdattelpalme ist eine zierliche Palme mit eleganten, gebogenen Fiederblaettern. Tropisches Flair.",Helles bis volles Licht,18-27 °C,7,tree|bright_light,,,,, -tree,constants/lexiconBatch2.ts,207,Fichte,Picea abies,Fichte ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, -tree,constants/lexiconBatch2.ts,206,Kiefer,Pinus sylvestris,Kiefer ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, -tree,constants/lexiconBatch2.ts,118,Tempel-Baum,Plumeria rubra,"Der Tempel-Baum hat intensiv duftende, sternfoermige Blueten in Weiss, Gelb oder Rosa. Klassische Tropenblume.",Volles Sonnenlicht,20-30 °C,7,flowering|tree|sun,,,,, -tree,constants/lexiconBatch2.ts,218,Kirschlorbeer,Prunus laurocerasus,Kirschlorbeer ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|sun,,,,, -tree,constants/lexiconBatch2.ts,89,Guave,Psidium guajava,Die Guave ist ein tropischer Obstbaum mit gelblich-weissen Fruechten. Sie ist reich an Vitamin C.,Volles Sonnenlicht,18-30 °C,7,tree|sun,,,,, -tree,constants/lexiconBatch2.ts,88,Granatapfelbaum,Punica granatum,"Der Granatapfelbaum hat leuchtend rote Blueten und rote, essbare Fruechte mit rubinroten Kernen.",Volles Sonnenlicht,15-28 °C,7,flowering|tree|sun,,,,, -tree,constants/lexiconBatch2.ts,205,Eiche,Quercus robur,Eiche ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, -tree,constants/lexiconBatch1.ts,45,Stab-Palme,Rhapis excelsa,"Die Stab-Palme ist eine elegante Zimmerpalme mit faecher­foermigen Blaettern auf duennen, bambusartigen Staemmen.",Helles indirektes Licht,15-25 °C,7,tree|low_light,,,,, -tree,constants/lexiconBatch2.ts,170,Rhododendron,Rhododendron catawbiense,"Rhododendron ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|tree|bright_light,,,,, -tree,constants/lexiconBatch2.ts,214,Robinie,Robinia pseudoacacia,Robinie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, -tree,constants/lexiconBatch2.ts,113,Silber-Weide,Salix alba,"Die Silber-Weide hat silbrig-glaenzende Blaetter. Weidenrinde enthält Salicylsaeure, die Grundlage von Aspirin.",Helles bis volles Licht,10-25 °C,7,tree|large|medicinal,medicinal_requires_external_evidence,,,, -tree,constants/lexiconBatch2.ts,112,Schwarzer Holunder,Sambucus nigra,Der Schwarze Holunder hat weisse Doldenbluten und schwarze Beeren. Die Fruechte werden fuer Sirup und Saft verwendet.,Helles bis volles Licht,10-25 °C,7,flowering|tree|medicinal,medicinal_requires_external_evidence,,,, -tree,constants/lexiconBatch2.ts,11,Grosse Strahlenaralie,Schefflera actinophylla,"Die Grosse Strahlenaralie kann grosse, handfoermige Blaetter entwickeln. Sie ist ideal als Zimmerstrauch.",Helles indirektes Licht,18-27 °C,7,easy|tree|large,,,,, -tree,constants/lexiconBatch2.ts,10,Strahlenaralie,Schefflera arboricola,"Die Strahlenaralie hat fingerfoermig angeordnete, glaenzende Blaetter auf langen Stielen. Sehr robuste Zimmerpflanze.",Helles indirektes Licht,15-25 °C,7,easy|tree|air_purifier,air_purifier_requires_external_evidence,,,, -tree,constants/lexiconBatch2.ts,235,Falsche Aralie,Schefflera elegantissima,Falsche Aralie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,tree|bright_light,,,,, -tree,constants/lexiconBatch2.ts,213,Eberesche,Sorbus aucuparia,Eberesche ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, -tree,constants/lexiconBatch2.ts,222,Spierstrauch,Spiraea japonica,Spierstrauch ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|sun,,,,, -tree,constants/lexiconBatch2.ts,1,Weisse Strelitzie,Strelitzia nicolai,"Die Weisse Strelitzie ist ein beeindruckender Zimmerstrauch mit grossen, blaugruenen Blaettern und weiss-blauen Blueten.",Helles bis volles Licht,18-27 °C,7,tree|large|bright_light,,,,, -tree,constants/lexiconBatch2.ts,149,Flieder,Syringa vulgaris,"Flieder ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|tree|sun,,,,, -tree,constants/lexiconBatch2.ts,5,Mexikanische Fächerpalme,Washingtonia robusta,"Die Mexikanische Fächerpalme ist eine schlanke, hohe Palme mit faecher­foermigen Blaettern. Sehr hitzetolerant.",Volles Sonnenlicht,15-35 °C,10,tree|large|sun,,,,, -tree,constants/lexiconBatch2.ts,221,Weigelie,Weigela florida,Weigelie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|sun,,,,, -tree,constants/lexiconBatch2.ts,246,Yucca aloifolia,Yucca aloifolia,Yucca aloifolia ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Volles Sonnenlicht,18-30 C,10,easy|tree|sun,,,,, -tree,constants/lexiconBatch1.ts,40,Yucca-Palme,Yucca elephantipes,"Die Yucca-Palme ist eine robuste Zimmerpflanze mit starrem, immergruenem Blaetterschopf auf einem dicken Stamm.",Helles bis volles Licht,15-28 °C,14,easy|tree|sun,,,,, +category,source_file,source_index,name,botanical_name,description,light,temp,water_interval_days,all_categories,risk_flags,audit_status,evidence_source,evidence_url,notes +tree,constants/lexiconBatch2.ts,115,Faecherahorn,Acer palmatum,"Der Faecherahorn ist ein japanischer Zierahorn mit feingeschnittenen, faecherfoermigen Blaettern in Gruen oder Rot.",Helles bis volles Licht,10-22 °C,5,tree,,,,, +tree,constants/lexiconBatch2.ts,212,Spitzahorn,Acer platanoides,Spitzahorn ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, +tree,constants/lexiconBatch2.ts,232,Norfolk-Tanne,Araucaria heterophylla,Norfolk-Tanne ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,tree|bright_light,,,,, +tree,constants/lexiconBatch1.ts,41,Pferdeschwanzpalme,Beaucarnea recurvata,"Die Pferdeschwanzpalme hat einen verdickten Stammbasis als Wasserspeicher und lange, schmale Blaetter.",Volles Sonnenlicht,15-30 °C,21,easy|succulent|tree|sun,,,,, +tree,constants/lexiconBatch2.ts,114,Hange-Birke,Betula pendula,Die Haenge-Birke hat charakteristisch weisse Rinde und haengende Zweige. Die Blaetter werden in der Heilkunde genutzt.,Volles Sonnenlicht,10-25 °C,7,tree|large|medicinal,medicinal_requires_external_evidence,,,, +tree,constants/lexiconBatch2.ts,223,Schmetterlingsflieder,Buddleja davidii,Schmetterlingsflieder ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|sun,,,,, +tree,constants/lexiconBatch2.ts,202,Buchsbaum,Buxus sempervirens,Buchsbaum ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|sun,,,,, +tree,constants/lexiconBatch2.ts,217,Trompetenbaum,Catalpa bignonioides,Trompetenbaum ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, +tree,constants/lexiconBatch2.ts,208,Zeder,Cedrus libani,Zeder ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, +tree,constants/lexiconBatch1.ts,43,Bergpalme,Chamaedorea elegans,Die Bergpalme ist eine kompakte Zimmerpalme fuer schattigere Standorte. Ideal fuer dunkle Innenraeume.,Wenig bis helles Licht,15-25 °C,7,easy|pet_friendly|tree|air_purifier|low_light,air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence,,,, +tree,constants/lexiconBatch2.ts,86,Zitronenbaum,Citrus limon,"Der Zitronenbaum ist ein kleiner, immergruener Baum mit weissen, duftenden Blueten und gelben Fruechten.",Volles Sonnenlicht,18-28 °C,5,tree|sun,,,,, +tree,constants/lexiconBatch2.ts,87,Orangenbaum,Citrus sinensis,"Der Orangenbaum ist ein kleiner, immergruener Baum mit weissen Blueten und orangen Fruechten.",Volles Sonnenlicht,18-28 °C,5,tree|sun,,,,, +tree,constants/lexiconBatch2.ts,14,Keulenlilie,Cordyline australis,"Die Keulenlilie hat lange, schmale, gruene oder rotbraune Blaetter in einem dekorativen Schopf.",Helles bis volles Licht,10-25 °C,7,easy|tree|sun,,,,, +tree,constants/lexiconBatch2.ts,209,Zypresse,Cupressus sempervirens,Zypresse ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, +tree,constants/lexiconBatch2.ts,239,Palmfarn,Cycas revoluta,Palmfarn ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles bis volles Licht,18-30 C,10,tree|large|sun,,,,, +tree,constants/lexiconBatch2.ts,215,Flammenbaum,Delonix regia,Flammenbaum ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|large,,,,, +tree,constants/lexiconBatch1.ts,14,Maisstrauch,Dracaena fragrans,"Der Maisstrauch ist eine robuste Zimmerpflanze mit breiten, gestreiften Blaettern. Gedeiht auch bei wenig Licht.",Helles indirektes Licht,15-25 °C,10,easy|tree|air_purifier|low_light,air_purifier_requires_external_evidence,,,, +tree,constants/lexiconBatch1.ts,13,Drachenbaum,Dracaena marginata,"Der Drachenbaum ist eine schlanke Zimmerpflanze mit roten, schmalen Blaettern auf langen Staemmen.",Helles indirektes Licht,15-25 °C,10,easy|tree|air_purifier,air_purifier_requires_external_evidence,,,, +tree,constants/lexiconBatch1.ts,42,Goldfruchtpalme,Dypsis lutescens,Die Goldfruchtpalme ist eine elegante Zimmerpalme mit gelblich-gruenen Stielen und gefiederten Wedeln.,Helles indirektes Licht,18-27 °C,5,pet_friendly|tree|air_purifier,air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence,,,, +tree,constants/lexiconBatch2.ts,210,Eukalyptus,Eucalyptus globulus,Eukalyptus ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|medicinal|sun,medicinal_requires_external_evidence,,,, +tree,constants/lexiconBatch2.ts,248,Ficus altissima,Ficus altissima,Ficus altissima ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,tree|bright_light,,,,, +tree,constants/lexiconBatch1.ts,1,Birkenfeige,Ficus benjamina,"Die Birkenfeige ist ein eleganter Zimmerstrauch mit haengenden Aesten und kleinen, glaenzenden Blaettern.",Helles indirektes Licht,16-24 °C,7,tree|air_purifier,air_purifier_requires_external_evidence,,,, +tree,constants/lexiconBatch1.ts,38,Gummibaum,Ficus elastica,"Der Gummibaum ist eine imposante Zimmerpflanze mit grossen, glaenzenden, lederartigen Blaettern. Reinigt die Luft.",Helles indirektes Licht,16-24 °C,10,easy|tree|air_purifier,air_purifier_requires_external_evidence,,,, +tree,constants/lexiconBatch1.ts,39,Geigenfeige,Ficus lyrata,"Die Geigenfeige ist ein Trendbaum mit grossen, geigenfoermigen Blaettern. Benoetigt viel Licht.",Helles indirektes Licht,18-27 °C,7,tree|large|bright_light,,,,, +tree,constants/lexiconBatch2.ts,247,Ficus microcarpa,Ficus microcarpa,Ficus microcarpa ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,easy|tree|bright_light,,,,, +tree,constants/lexiconBatch2.ts,116,Bonsai-Feige,Ficus retusa,"Die Bonsai-Feige ist eine klassische Bonsai-Art mit kleinen, elliptischen Blaettern. Sehr formbar.",Helles indirektes Licht,16-24 °C,7,tree,,,,, +tree,constants/lexiconBatch2.ts,219,Forsythie,Forsythia x intermedia,Forsythie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|sun,,,,, +tree,constants/lexiconBatch2.ts,216,Ginkgo,Ginkgo biloba,Ginkgo ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|medicinal|sun,medicinal_requires_external_evidence,,,, +tree,constants/lexiconBatch2.ts,220,Gartenhibiskus,Hibiscus syriacus,Gartenhibiskus ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|sun,,,,, +tree,constants/lexiconBatch2.ts,3,Kentia-Palme,Howea forsteriana,"Die Kentia-Palme ist eine der elegantesten Zimmerpalmen mit langen, herabhängenden Fiederblaettern.",Helles indirektes Licht,18-25 °C,7,pet_friendly|tree|low_light,pet_friendly_requires_external_evidence,,,, +tree,constants/lexiconBatch2.ts,203,Stechpalme,Ilex aquifolium,Stechpalme ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|sun,,,,, +tree,constants/lexiconBatch2.ts,211,Jacaranda,Jacaranda mimosifolia,Jacaranda ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|large,,,,, +tree,constants/lexiconBatch2.ts,4,Chinesische Fächerpalme,Livistona chinensis,"Die Chinesische Fächerpalme hat grosse, faecher­foermige Blaetter auf einem einzelnen Stamm. Sehr dekorativ.",Helles bis volles Licht,15-25 °C,7,tree|bright_light,,,,, +tree,constants/lexiconBatch2.ts,204,Magnolie,Magnolia grandiflora,Magnolie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|large,,,,, +tree,constants/lexiconBatch2.ts,231,Glueckskastanie,Pachira aquatica,Glueckskastanie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,easy|tree|bright_light,,,,, +tree,constants/lexiconBatch1.ts,44,Zwergdattelpalme,Phoenix roebelenii,"Die Zwergdattelpalme ist eine zierliche Palme mit eleganten, gebogenen Fiederblaettern. Tropisches Flair.",Helles bis volles Licht,18-27 °C,7,tree|bright_light,,,,, +tree,constants/lexiconBatch2.ts,207,Fichte,Picea abies,Fichte ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, +tree,constants/lexiconBatch2.ts,206,Kiefer,Pinus sylvestris,Kiefer ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, +tree,constants/lexiconBatch2.ts,118,Tempel-Baum,Plumeria rubra,"Der Tempel-Baum hat intensiv duftende, sternfoermige Blueten in Weiss, Gelb oder Rosa. Klassische Tropenblume.",Volles Sonnenlicht,20-30 °C,7,flowering|tree|sun,,,,, +tree,constants/lexiconBatch2.ts,218,Kirschlorbeer,Prunus laurocerasus,Kirschlorbeer ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|sun,,,,, +tree,constants/lexiconBatch2.ts,89,Guave,Psidium guajava,Die Guave ist ein tropischer Obstbaum mit gelblich-weissen Fruechten. Sie ist reich an Vitamin C.,Volles Sonnenlicht,18-30 °C,7,tree|sun,,,,, +tree,constants/lexiconBatch2.ts,88,Granatapfelbaum,Punica granatum,"Der Granatapfelbaum hat leuchtend rote Blueten und rote, essbare Fruechte mit rubinroten Kernen.",Volles Sonnenlicht,15-28 °C,7,flowering|tree|sun,,,,, +tree,constants/lexiconBatch2.ts,205,Eiche,Quercus robur,Eiche ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, +tree,constants/lexiconBatch1.ts,45,Stab-Palme,Rhapis excelsa,"Die Stab-Palme ist eine elegante Zimmerpalme mit faecher­foermigen Blaettern auf duennen, bambusartigen Staemmen.",Helles indirektes Licht,15-25 °C,7,tree|low_light,,,,, +tree,constants/lexiconBatch2.ts,170,Rhododendron,Rhododendron catawbiense,"Rhododendron ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|tree|bright_light,,,,, +tree,constants/lexiconBatch2.ts,214,Robinie,Robinia pseudoacacia,Robinie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, +tree,constants/lexiconBatch2.ts,113,Silber-Weide,Salix alba,"Die Silber-Weide hat silbrig-glaenzende Blaetter. Weidenrinde enthält Salicylsaeure, die Grundlage von Aspirin.",Helles bis volles Licht,10-25 °C,7,tree|large|medicinal,medicinal_requires_external_evidence,,,, +tree,constants/lexiconBatch2.ts,112,Schwarzer Holunder,Sambucus nigra,Der Schwarze Holunder hat weisse Doldenbluten und schwarze Beeren. Die Fruechte werden fuer Sirup und Saft verwendet.,Helles bis volles Licht,10-25 °C,7,flowering|tree|medicinal,medicinal_requires_external_evidence,,,, +tree,constants/lexiconBatch2.ts,11,Grosse Strahlenaralie,Schefflera actinophylla,"Die Grosse Strahlenaralie kann grosse, handfoermige Blaetter entwickeln. Sie ist ideal als Zimmerstrauch.",Helles indirektes Licht,18-27 °C,7,easy|tree|large,,,,, +tree,constants/lexiconBatch2.ts,10,Strahlenaralie,Schefflera arboricola,"Die Strahlenaralie hat fingerfoermig angeordnete, glaenzende Blaetter auf langen Stielen. Sehr robuste Zimmerpflanze.",Helles indirektes Licht,15-25 °C,7,easy|tree|air_purifier,air_purifier_requires_external_evidence,,,, +tree,constants/lexiconBatch2.ts,235,Falsche Aralie,Schefflera elegantissima,Falsche Aralie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,tree|bright_light,,,,, +tree,constants/lexiconBatch2.ts,213,Eberesche,Sorbus aucuparia,Eberesche ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, +tree,constants/lexiconBatch2.ts,222,Spierstrauch,Spiraea japonica,Spierstrauch ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|sun,,,,, +tree,constants/lexiconBatch2.ts,1,Weisse Strelitzie,Strelitzia nicolai,"Die Weisse Strelitzie ist ein beeindruckender Zimmerstrauch mit grossen, blaugruenen Blaettern und weiss-blauen Blueten.",Helles bis volles Licht,18-27 °C,7,tree|large|bright_light,,,,, +tree,constants/lexiconBatch2.ts,149,Flieder,Syringa vulgaris,"Flieder ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|tree|sun,,,,, +tree,constants/lexiconBatch2.ts,5,Mexikanische Fächerpalme,Washingtonia robusta,"Die Mexikanische Fächerpalme ist eine schlanke, hohe Palme mit faecher­foermigen Blaettern. Sehr hitzetolerant.",Volles Sonnenlicht,15-35 °C,10,tree|large|sun,,,,, +tree,constants/lexiconBatch2.ts,221,Weigelie,Weigela florida,Weigelie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|sun,,,,, +tree,constants/lexiconBatch2.ts,246,Yucca aloifolia,Yucca aloifolia,Yucca aloifolia ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Volles Sonnenlicht,18-30 C,10,easy|tree|sun,,,,, +tree,constants/lexiconBatch1.ts,40,Yucca-Palme,Yucca elephantipes,"Die Yucca-Palme ist eine robuste Zimmerpflanze mit starrem, immergruenem Blaetterschopf auf einem dicken Stamm.",Helles bis volles Licht,15-28 °C,14,easy|tree|sun,,,,, diff --git a/audits/semantic-search/master.csv b/audits/semantic-search/master.csv index 5b9caae..3991625 100644 --- a/audits/semantic-search/master.csv +++ b/audits/semantic-search/master.csv @@ -1,835 +1,835 @@ -category,source_file,source_index,name,botanical_name,description,light,temp,water_interval_days,all_categories,risk_flags,audit_status,evidence_source,evidence_url,notes -air_purifier,constants/lexiconBatch1.ts,43,Bergpalme,Chamaedorea elegans,Die Bergpalme ist eine kompakte Zimmerpalme fuer schattigere Standorte. Ideal fuer dunkle Innenraeume.,Wenig bis helles Licht,15-25 °C,7,easy|pet_friendly|tree|air_purifier|low_light,air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence,,,, -air_purifier,constants/lexiconBatch1.ts,48,Dieffenbachie,Dieffenbachia seguine,"Die Dieffenbachie ist eine tropische Blattschmuckpflanze mit grossen, gruen-weiss gefleckten Blaettern.",Helles indirektes Licht,18-26 °C,7,easy|air_purifier|low_light,air_purifier_requires_external_evidence,,,, -air_purifier,constants/lexiconBatch1.ts,14,Maisstrauch,Dracaena fragrans,"Der Maisstrauch ist eine robuste Zimmerpflanze mit breiten, gestreiften Blaettern. Gedeiht auch bei wenig Licht.",Helles indirektes Licht,15-25 °C,10,easy|tree|air_purifier|low_light,air_purifier_requires_external_evidence,,,, -air_purifier,constants/lexiconBatch1.ts,13,Drachenbaum,Dracaena marginata,"Der Drachenbaum ist eine schlanke Zimmerpflanze mit roten, schmalen Blaettern auf langen Staemmen.",Helles indirektes Licht,15-25 °C,10,easy|tree|air_purifier,air_purifier_requires_external_evidence,,,, -air_purifier,constants/lexiconBatch1.ts,42,Goldfruchtpalme,Dypsis lutescens,Die Goldfruchtpalme ist eine elegante Zimmerpalme mit gelblich-gruenen Stielen und gefiederten Wedeln.,Helles indirektes Licht,18-27 °C,5,pet_friendly|tree|air_purifier,air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence,,,, -air_purifier,constants/lexiconBatch1.ts,16,Marmor-Efeutute,Epipremnum aureum Marble Queen,Die Marmor-Efeutute hat cremeweiss-gruen marmorierte Blaetter. Eine dekorative Variante der klassischen Efeutute.,Helles indirektes Licht,15-30 °C,7,easy|hanging|air_purifier,air_purifier_requires_external_evidence,,,, -air_purifier,constants/lexiconBatch2.ts,53,Neon-Efeutute,Epipremnum pinnatum Neon,Die Neon-Efeutute hat leuchtend limonengruene Blaetter. Sehr auffaellig und pflegeleicht.,Helles indirektes Licht,15-30 °C,7,easy|hanging|air_purifier,air_purifier_requires_external_evidence,,,, -air_purifier,constants/lexiconBatch1.ts,1,Birkenfeige,Ficus benjamina,"Die Birkenfeige ist ein eleganter Zimmerstrauch mit haengenden Aesten und kleinen, glaenzenden Blaettern.",Helles indirektes Licht,16-24 °C,7,tree|air_purifier,air_purifier_requires_external_evidence,,,, -air_purifier,constants/lexiconBatch1.ts,38,Gummibaum,Ficus elastica,"Der Gummibaum ist eine imposante Zimmerpflanze mit grossen, glaenzenden, lederartigen Blaettern. Reinigt die Luft.",Helles indirektes Licht,16-24 °C,10,easy|tree|air_purifier,air_purifier_requires_external_evidence,,,, -air_purifier,constants/lexiconBatch1.ts,68,Gerbera,Gerbera jamesonii,"Die Gerbera ist eine farbenfrohe Schnittblume mit grossen, sonnenblumenaehnlichen Blueten. Sehr beliebt.",Helles bis volles Licht,15-25 °C,5,flowering|air_purifier|bright_light,air_purifier_requires_external_evidence,,,, -air_purifier,constants/lexiconBatch1.ts,37,Efeu,Hedera helix,"Efeu ist eine robuste Kletter- und Haengepflanze mit charakteristischen, dreilappigen Blaettern. Sehr langlebig.",Wenig bis helles Licht,10-20 °C,7,easy|hanging|air_purifier|low_light,air_purifier_requires_external_evidence,,,, -air_purifier,constants/lexiconBatch2.ts,10,Strahlenaralie,Schefflera arboricola,"Die Strahlenaralie hat fingerfoermig angeordnete, glaenzende Blaetter auf langen Stielen. Sehr robuste Zimmerpflanze.",Helles indirektes Licht,15-25 °C,7,easy|tree|air_purifier,air_purifier_requires_external_evidence,,,, -bright_light,constants/lexiconBatch2.ts,225,Alocasia zebrina,Alocasia zebrina,Alocasia zebrina ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5,bright_light|high_humidity,,,,, -bright_light,constants/lexiconBatch2.ts,232,Norfolk-Tanne,Araucaria heterophylla,Norfolk-Tanne ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,tree|bright_light,,,,, -bright_light,constants/lexiconBatch2.ts,175,Eisbegonie,Begonia semperflorens-cultorum,"Eisbegonie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light,,,,, -bright_light,constants/lexiconBatch1.ts,62,Bougainvillea,Bougainvillea spectabilis,"Die Bougainvillea ist eine rankenreiche Kletterpflanze mit leuchtend farbigen Hochblaettern in Rot, Orange oder Pink.",Volles Sonnenlicht,18-30 °C,5,flowering|bright_light|sun,,,,, -bright_light,constants/lexiconBatch2.ts,184,Trompetenwinde,Campsis radicans,"Trompetenwinde ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light,,,,, -bright_light,constants/lexiconBatch2.ts,157,Clematis,Clematis viticella,"Clematis ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light,,,,, -bright_light,constants/lexiconBatch2.ts,224,Kroton,Codiaeum variegatum,Kroton ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,patterned|bright_light,,,,, -bright_light,constants/lexiconBatch2.ts,245,Kaffeepflanze arabica nana,Coffea arabica Nana,Kaffeepflanze arabica nana ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,bright_light,,,,, -bright_light,constants/lexiconBatch2.ts,137,Wasabi,Eutrema japonicum,"Wasabi ist ein seltenes Wuerzkraut, das gleichmaessige Feuchte und eher kuehle Bedingungen bevorzugt.",Helles indirektes Licht,8-20 C,4,bright_light|high_humidity,,,,, -bright_light,constants/lexiconBatch2.ts,248,Ficus altissima,Ficus altissima,Ficus altissima ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,tree|bright_light,,,,, -bright_light,constants/lexiconBatch1.ts,39,Geigenfeige,Ficus lyrata,"Die Geigenfeige ist ein Trendbaum mit grossen, geigenfoermigen Blaettern. Benoetigt viel Licht.",Helles indirektes Licht,18-27 °C,7,tree|large|bright_light,,,,, -bright_light,constants/lexiconBatch2.ts,247,Ficus microcarpa,Ficus microcarpa,Ficus microcarpa ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,easy|tree|bright_light,,,,, -bright_light,constants/lexiconBatch1.ts,68,Gerbera,Gerbera jamesonii,"Die Gerbera ist eine farbenfrohe Schnittblume mit grossen, sonnenblumenaehnlichen Blueten. Sehr beliebt.",Helles bis volles Licht,15-25 °C,5,flowering|air_purifier|bright_light,air_purifier_requires_external_evidence,,,, -bright_light,constants/lexiconBatch2.ts,72,Heliconia,Heliconia psittacorum,"Die Heliconia hat leuchtend orangefarbe oder rote, bootsfoermige Hochblaetter. Eine exotische Tropenpflanze.",Helles bis volles Licht,20-30 °C,5,flowering|bright_light|high_humidity,,,,, -bright_light,constants/lexiconBatch1.ts,21,Hibiskus,Hibiscus rosa-sinensis,"Der Hibiskus begeistert mit grossen, trompetenfoermigen Blueten in Rot, Orange und Rosa.",Volles Sonnenlicht,18-28 °C,3,flowering|bright_light|sun,,,,, -bright_light,constants/lexiconBatch1.ts,105,Ritterstern,Hippeastrum hybrid,"Der Ritterstern beeindruckt im Winter mit riesigen, trompetenfoermigen Blueten in Rot, Pink oder Weiss.",Helles bis volles Licht,18-25 °C,7,flowering|bright_light,,,,, -bright_light,constants/lexiconBatch2.ts,148,Hortensie,Hydrangea macrophylla,"Hortensie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Helles bis halbschattiges Licht,8-24 C,4,flowering|bright_light,,,,, -bright_light,constants/lexiconBatch2.ts,227,Punktblatt,Hypoestes phyllostachya,Punktblatt ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,patterned|bright_light,,,,, -bright_light,constants/lexiconBatch2.ts,176,Gartenbalsamine,Impatiens balsamina,"Gartenbalsamine ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light,,,,, -bright_light,constants/lexiconBatch2.ts,172,Arabischer Jasmin,Jasminum sambac,"Arabischer Jasmin ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light,,,,, -bright_light,constants/lexiconBatch2.ts,197,Traenendes Herz,Lamprocapnos spectabilis,"Traenendes Herz ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light,,,,, -bright_light,constants/lexiconBatch2.ts,64,Wandelroeschen,Lantana camara,"Das Wandelroeschen hat kugelige Bluetenkoepfe, die die Farbe von Gelb ueber Orange zu Rot wechseln. Sehr attraktiv.",Volles Sonnenlicht,18-28 °C,5,flowering|bright_light|sun,,,,, -bright_light,constants/lexiconBatch1.ts,23,Echter Lavendel,Lavandula angustifolia,Der Echte Lavendel ist ein aromatischer Halbstrauch mit lilafarbenen Bluetenaehren. Herrlicher Duft.,Volles Sonnenlicht,10-25 °C,10,medicinal|bright_light|sun,medicinal_requires_external_evidence,,,, -bright_light,constants/lexiconBatch2.ts,69,Ostertrompete,Lilium longiflorum,"Die Ostertrompete hat grosse, weisse, trichterfoermige Blueten mit intensivem Duft. Klassische Osterblume.",Helles bis volles Licht,15-25 °C,5,flowering|bright_light,,,,, -bright_light,constants/lexiconBatch2.ts,4,Chinesische Fächerpalme,Livistona chinensis,"Die Chinesische Fächerpalme hat grosse, faecher­foermige Blaetter auf einem einzelnen Stamm. Sehr dekorativ.",Helles bis volles Licht,15-25 °C,7,tree|bright_light,,,,, -bright_light,constants/lexiconBatch2.ts,171,Geissblatt,Lonicera japonica,"Geissblatt ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light,,,,, -bright_light,constants/lexiconBatch2.ts,76,Schamkraut,Mimosa pudica,"Das Schamkraut faltet seine Blaettchen blitzschnell zusammen, wenn man sie beruehrt. Ein faszinierendes Erlebnis.",Helles bis volles Licht,20-28 °C,5,flowering|bright_light,,,,, -bright_light,constants/lexiconBatch2.ts,37,Neoregelia,Neoregelia carolinae,"Die Neoregelia ist eine Bromelie, bei der das Herzblatt zur Bluetzeit leuchtend rot wird. Sehr dekorativ.",Helles bis volles Licht,18-27 °C,7,flowering|patterned|bright_light,,,,, -bright_light,constants/lexiconBatch2.ts,120,Oleander,Nerium oleander,"Der Oleander ist ein mediteraner Strauch mit leuchtend roten, rosa oder weissen Blueten. Sehr hitzetolerant.",Volles Sonnenlicht,15-28 °C,7,flowering|bright_light|sun,,,,, -bright_light,constants/lexiconBatch2.ts,231,Glueckskastanie,Pachira aquatica,Glueckskastanie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,easy|tree|bright_light,,,,, -bright_light,constants/lexiconBatch2.ts,6,Schraubenbaum,Pandanus veitchii,"Der Schraubenbaum hat spiralfoermig angeordnete, gruenweiss gestreifte Blaetter. Sehr dekorativ und exotisch.",Helles bis volles Licht,18-27 °C,7,patterned|bright_light,,,,, -bright_light,constants/lexiconBatch2.ts,243,Philodendron Pink Princess,Philodendron erubescens Pink Princess,Philodendron Pink Princess ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,patterned|bright_light,,,,, -bright_light,constants/lexiconBatch1.ts,44,Zwergdattelpalme,Phoenix roebelenii,"Die Zwergdattelpalme ist eine zierliche Palme mit eleganten, gebogenen Fiederblaettern. Tropisches Flair.",Helles bis volles Licht,18-27 °C,7,tree|bright_light,,,,, -bright_light,constants/lexiconBatch2.ts,152,Buntnessel,Plectranthus scutellarioides,"Buntnessel ist eine farbstarke Zierpflanze, die vor allem fuer ihr dekoratives Laub beliebt ist.",Volles bis helles Licht,10-24 C,4,patterned|bright_light,,,,, -bright_light,constants/lexiconBatch1.ts,61,Bleiwurz,Plumbago auriculata,"Die Bleiwurz ist ein halbimmergruener Strauch mit himmelblauen Blueten, der fast das ganze Jahr bluet.",Volles Sonnenlicht,15-27 °C,5,flowering|bright_light|sun,,,,, -bright_light,constants/lexiconBatch2.ts,170,Rhododendron,Rhododendron catawbiense,"Rhododendron ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|tree|bright_light,,,,, -bright_light,constants/lexiconBatch2.ts,142,Rose,Rosa x hybrida,"Rose ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light|sun,,,,, -bright_light,constants/lexiconBatch2.ts,235,Falsche Aralie,Schefflera elegantissima,Falsche Aralie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,tree|bright_light,,,,, -bright_light,constants/lexiconBatch2.ts,93,Aubergine,Solanum melongena,"Die Aubergine ist eine Gemuese­pflanze mit grossen, violetten Fruechten. Sie benoetigt viel Waerme und Sonne.",Volles Sonnenlicht,20-30 °C,5,bright_light|sun,,,,, -bright_light,constants/lexiconBatch2.ts,1,Weisse Strelitzie,Strelitzia nicolai,"Die Weisse Strelitzie ist ein beeindruckender Zimmerstrauch mit grossen, blaugruenen Blaettern und weiss-blauen Blueten.",Helles bis volles Licht,18-27 °C,7,tree|large|bright_light,,,,, -bright_light,constants/lexiconBatch2.ts,244,Philodendron Xanadu,Thaumatophyllum xanadu,Philodendron Xanadu ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,bright_light,,,,, -bright_light,constants/lexiconBatch1.ts,72,Vanda-Orchidee,Vanda coerulea,Die Vanda-Orchidee ist bekannt fuer ihre seltene blaue Bluetenfarbe. Epiphytische Orchidee mit grossen Blueten.,Helles bis volles Licht,20-30 °C,3,flowering|bright_light|high_humidity,,,,, -easy,constants/lexiconBatch2.ts,31,Adromischus,Adromischus cristatus,Adromischus ist eine kompakte Sukkulente mit ungewoehnlich wellenrandigen Blaettern auf kurzen Staengeln.,Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, -easy,constants/lexiconBatch1.ts,50,Aglaoneme,Aglaonema commutatum,Die Aglaoneme ist eine dekorative Zimmerpflanze mit silbrig-gruen gemusterten Blaettern. Tolerant gegenueber wenig Licht.,Wenig bis helles Licht,15-26 °C,7,easy|patterned|low_light,,,,, -easy,constants/lexiconBatch1.ts,30,Schnittlauch,Allium schoenoprasum,Schnittlauch ist ein beliebtes Kuechenkraut mit roehrenfoermigen Blaettern und lila Blueten.,Helles bis volles Licht,10-25 °C,3,easy,,,,, -easy,constants/lexiconBatch2.ts,135,Schnittknoblauch,Allium tuberosum,Schnittknoblauch ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -easy,constants/lexiconBatch1.ts,89,Kap-Aloe,Aloe arborescens,"Die Kap-Aloe ist eine strauchige Aloe mit schmalen, gezaehnten Blaettern und leuchtend roten Bluetenaehren im Winter.",Volles Sonnenlicht,10-30 °C,14,easy|succulent|medicinal|sun,medicinal_requires_external_evidence,,,, -easy,constants/lexiconBatch2.ts,128,Zitronenverbene,Aloysia citrodora,Zitronenverbene ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -easy,constants/lexiconBatch2.ts,140,Dill,Anethum graveolens,Dill ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -easy,constants/lexiconBatch2.ts,125,Kerbel,Anthriscus cerefolium,Kerbel ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -easy,constants/lexiconBatch2.ts,122,Estragon,Artemisia dracunculus,Estragon ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -easy,constants/lexiconBatch2.ts,16,Schusterpflanze,Aspidistra elatior,"Die Schusterpflanze ist eine extrem robuste Zimmerpflanze mit langen, dunkelgruenen Blaettern. Vertraegt tiefe Temperaturen.",Wenig bis helles Licht,10-20 °C,14,easy|low_light,,,,, -easy,constants/lexiconBatch2.ts,43,Vogelnest-Farn,Asplenium nidus,"Der Vogelnest-Farn hat ganzrandige, glaenzende Wedel, die eine Nestform bilden. Sehr dekorativ und robust.",Helles indirektes Licht,18-27 °C,5,easy|low_light|high_humidity,,,,, -easy,constants/lexiconBatch2.ts,13,Japanische Aucube,Aucuba japonica,"Die Japanische Aucube hat glaenzende, gruene oder gelbgefleckte Blaetter. Sehr schattenvertraeglich.",Wenig bis helles Licht,10-20 °C,7,easy|low_light,,,,, -easy,constants/lexiconBatch2.ts,7,Bambusrohr,Bambusa vulgaris,Das Bambusrohr ist eine schnell wachsende Bambusart mit gelbgruenen Halmen. Sehr dekorativ und vielseitig nutzbar.,Helles bis volles Licht,15-30 °C,5,easy|large,,,,, -easy,constants/lexiconBatch1.ts,41,Pferdeschwanzpalme,Beaucarnea recurvata,"Die Pferdeschwanzpalme hat einen verdickten Stammbasis als Wasserspeicher und lange, schmale Blaetter.",Volles Sonnenlicht,15-30 °C,21,easy|succulent|tree|sun,,,,, -easy,constants/lexiconBatch2.ts,97,Mangold,Beta vulgaris,"Mangold ist ein farbenfrohes Blattgemuese mit bunten Stielen in Rot, Gelb, Orange und Weiss.",Helles bis volles Licht,10-25 °C,3,easy,,,,, -easy,constants/lexiconBatch2.ts,38,Billbergia,Billbergia nutans,"Die Billbergia ist eine robuste Bromelie mit schmalen, gruenen Blaettern und hängenden, blauen und gruenen Blueten.",Helles indirektes Licht,15-25 °C,7,easy|flowering,,,,, -easy,constants/lexiconBatch2.ts,129,Borretsch,Borago officinalis,Borretsch ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -easy,constants/lexiconBatch2.ts,63,Calibrachoa,Calibrachoa hybrida,"Calibrachoa ist eine petunienaehnliche Haengepflanze mit unzaehligen, kleinen Trichterbluten in allen Farben.",Volles Sonnenlicht,15-25 °C,2,easy|flowering|hanging|sun,,,,, -easy,constants/lexiconBatch2.ts,56,Callisia,Callisia repens,"Callisia repens ist ein kleines, kriechendes Kraut mit winzigen, gruenen Blaettern. Ideal fuer haengende Behaelter.",Helles indirektes Licht,15-25 °C,5,easy|hanging,,,,, -easy,constants/lexiconBatch2.ts,92,Chili,Capsicum annuum,"Chili ist eine beliebte Gemuese- und Zierpflanze mit leuchtenden, roten oder orangen Fruechten. Im Topf kultivierbar.",Volles Sonnenlicht,20-30 °C,4,easy|medicinal|sun,medicinal_requires_external_evidence,,,, -easy,constants/lexiconBatch1.ts,81,Peruanischer Fackelkaktus,Cereus peruvianus,"Der Peruanische Fackelkaktus ist ein saeulenfoermiger Kaktus, der im Innenraum bis zu 2 m hoch werden kann.",Volles Sonnenlicht,15-35 °C,21,easy|succulent|large|sun,,,,, -easy,constants/lexiconBatch1.ts,99,Herzkette,Ceropegia woodii,"Die Herzkette hat duenne, haengende Ranken mit herzfoermigen, silbergrau gemusterten Blaettchen.",Helles indirektes Licht,15-27 °C,14,easy|succulent|patterned|hanging,,,,, -easy,constants/lexiconBatch1.ts,43,Bergpalme,Chamaedorea elegans,Die Bergpalme ist eine kompakte Zimmerpalme fuer schattigere Standorte. Ideal fuer dunkle Innenraeume.,Wenig bis helles Licht,15-25 °C,7,easy|pet_friendly|tree|air_purifier|low_light,air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence,,,, -easy,constants/lexiconBatch2.ts,138,Roemische Kamille,Chamaemelum nobile,Roemische Kamille ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|medicinal|sun,medicinal_requires_external_evidence,,,, -easy,constants/lexiconBatch2.ts,101,Kamille,Chamomilla recutita,"Die Kamille ist ein beliebtes Heilkraut mit kleinen, weiss-gelben Blueten. Das aetherische Oel wirkt beruhigend.",Volles Sonnenlicht,15-25 °C,5,easy|medicinal|sun,medicinal_requires_external_evidence,,,, -easy,constants/lexiconBatch2.ts,84,Kaffeestrauch,Coffea arabica,"Der Kaffeestrauch hat glaenzende, dunkelgruene Blaetter und entwickelt rote Kaffe­ekirschen. Kann im Topf gehalten werden.",Helles indirektes Licht,18-25 °C,7,easy,,,,, -easy,constants/lexiconBatch2.ts,14,Keulenlilie,Cordyline australis,"Die Keulenlilie hat lange, schmale, gruene oder rotbraune Blaetter in einem dekorativen Schopf.",Helles bis volles Licht,10-25 °C,7,easy|tree|sun,,,,, -easy,constants/lexiconBatch2.ts,15,Tiroler Keulenlilie,Cordyline fruticosa,"Die Tiroler Keulenlilie hat leuchtend rote, gruene oder buntlaubige Blaetter. Eine exotische Zimmerpflanze.",Helles indirektes Licht,18-27 °C,7,easy,,,,, -easy,constants/lexiconBatch2.ts,139,Koriander,Coriandrum sativum,Koriander ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -easy,constants/lexiconBatch2.ts,29,Kotyledon,Cotyledon orbiculata,"Kotyledon hat dickfleischige, runde Blaetter mit einem mehligen, weisslichen Belag. Sehr trockenheitsresistent.",Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, -easy,constants/lexiconBatch2.ts,26,Moos-Crassula,Crassula muscosa,"Die Moos-Crassula hat dicht aneinandergereihte, winzige gruene Blaetter auf unverzweigten Trieben. Sieht aus wie Moos.",Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, -easy,constants/lexiconBatch1.ts,5,Jadepflanze,Crassula ovata,"Die Jadepflanze ist eine langlebige Sukkulente mit dicken, ovalen Blaettern. In Japan gilt sie als Gluecksbringer.",Helles bis volles Licht,15-24 °C,14,easy|succulent|sun,,,,, -easy,constants/lexiconBatch1.ts,110,Krokus,Crocus vernus,"Der Krokus ist einer der ersten Fruehjahrs­boten mit kelchfoermigen Blueten in Lila, Weiss und Gelb.",Helles bis volles Licht,5-15 °C,7,easy|flowering,,,,, -easy,constants/lexiconBatch2.ts,94,Gurke,Cucumis sativus,"Die Gurke ist eine rankende Gemuese­pflanze mit gruenen, erfrischenden Fruechten. Im Balkonkasten kultivierbar.",Volles Sonnenlicht,18-28 °C,3,easy|sun,,,,, -easy,constants/lexiconBatch2.ts,127,Zitronengras,Cymbopogon citratus,Zitronengras ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -easy,constants/lexiconBatch2.ts,99,Karotte,Daucus carota,Die Karotte ist eine beliebte Gemuese­pflanze mit orangefarbenen Wurzeln. Im tiefen Topf kultivierbar.,Helles bis volles Licht,15-22 °C,5,easy,,,,, -easy,constants/lexiconBatch1.ts,48,Dieffenbachie,Dieffenbachia seguine,"Die Dieffenbachie ist eine tropische Blattschmuckpflanze mit grossen, gruen-weiss gefleckten Blaettern.",Helles indirektes Licht,18-26 °C,7,easy|air_purifier|low_light,air_purifier_requires_external_evidence,,,, -easy,constants/lexiconBatch1.ts,14,Maisstrauch,Dracaena fragrans,"Der Maisstrauch ist eine robuste Zimmerpflanze mit breiten, gestreiften Blaettern. Gedeiht auch bei wenig Licht.",Helles indirektes Licht,15-25 °C,10,easy|tree|air_purifier|low_light,air_purifier_requires_external_evidence,,,, -easy,constants/lexiconBatch1.ts,13,Drachenbaum,Dracaena marginata,"Der Drachenbaum ist eine schlanke Zimmerpflanze mit roten, schmalen Blaettern auf langen Staemmen.",Helles indirektes Licht,15-25 °C,10,easy|tree|air_purifier,air_purifier_requires_external_evidence,,,, -easy,constants/lexiconBatch2.ts,30,Dudleya,Dudleya brittonii,"Dudleya ist eine rosetten­bildende Sukkulente mit silbrig-weissen, mehligen Blaettern. Sehr elegant.",Volles Sonnenlicht,10-25 °C,14,easy|succulent|sun,,,,, -easy,constants/lexiconBatch1.ts,4,Echeverie,Echeveria elegans,"Die Echeverie bildet symmetrische, rosettenfoermige Sukkulenten mit blaugruenen Blaettern. Pflegeleicht.",Volles Sonnenlicht,15-25 °C,14,easy|succulent|sun,,,,, -easy,constants/lexiconBatch1.ts,77,Goldene Tonne,Echinocactus grusonii,Die Goldene Tonne ist ein ikonischer kugelfoermiger Kaktus mit goldgelben Stacheln. Waechst langsam aber imposant.,Volles Sonnenlicht,15-35 °C,21,easy|succulent|sun,,,,, -easy,constants/lexiconBatch1.ts,83,San-Pedro-Kaktus,Echinopsis pachanoi,"Der San-Pedro-Kaktus ist ein schnell wachsender, saeulenfoermiger Kaktus aus den Anden.",Volles Sonnenlicht,10-35 °C,14,easy|succulent|sun,,,,, -easy,constants/lexiconBatch1.ts,16,Marmor-Efeutute,Epipremnum aureum Marble Queen,Die Marmor-Efeutute hat cremeweiss-gruen marmorierte Blaetter. Eine dekorative Variante der klassischen Efeutute.,Helles indirektes Licht,15-30 °C,7,easy|hanging|air_purifier,air_purifier_requires_external_evidence,,,, -easy,constants/lexiconBatch2.ts,53,Neon-Efeutute,Epipremnum pinnatum Neon,Die Neon-Efeutute hat leuchtend limonengruene Blaetter. Sehr auffaellig und pflegeleicht.,Helles indirektes Licht,15-30 °C,7,easy|hanging|air_purifier,air_purifier_requires_external_evidence,,,, -easy,constants/lexiconBatch2.ts,19,Christusdorn,Euphorbia milii,Der Christusdorn ist eine sukkulente Wolfsmilch mit stacheligen Zweigen und kleinen roten oder gelben Hochblaettern.,Helles bis volles Licht,15-28 °C,10,easy|flowering|succulent|sun,,,,, -easy,constants/lexiconBatch1.ts,12,Bleistiftkaktus,Euphorbia tirucalli,"Der Bleistiftkaktus ist eine sukkulente Wolfsmilch mit duennen, zylindrischen Zweigen ohne Blaetter.",Volles Sonnenlicht,18-30 °C,14,easy|succulent|sun,,,,, -easy,constants/lexiconBatch2.ts,12,Fatsia,Fatsia japonica,"Die Fatsia ist ein dekorativer Zimmerstrauch mit grossen, handfoermigen, glaenzenden Blaettern. Sehr robust.",Helles indirektes Licht,10-20 °C,7,easy|low_light,,,,, -easy,constants/lexiconBatch1.ts,78,Fass-Kaktus,Ferocactus cylindraceus,"Der Fass-Kaktus ist ein zylindrischer Wuestenkaktus mit langen, roten Stacheln. Sehr langlebig.",Volles Sonnenlicht,15-35 °C,21,easy|succulent|sun,,,,, -easy,constants/lexiconBatch1.ts,38,Gummibaum,Ficus elastica,"Der Gummibaum ist eine imposante Zimmerpflanze mit grossen, glaenzenden, lederartigen Blaettern. Reinigt die Luft.",Helles indirektes Licht,16-24 °C,10,easy|tree|air_purifier,air_purifier_requires_external_evidence,,,, -easy,constants/lexiconBatch2.ts,247,Ficus microcarpa,Ficus microcarpa,Ficus microcarpa ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,easy|tree|bright_light,,,,, -easy,constants/lexiconBatch2.ts,100,Erdbeere,Fragaria ananassa,"Die Erdbeere ist ein beliebtes Obst fuer Balkon und Terrasse mit aromatischen, roten Fruechten.",Helles bis volles Licht,15-25 °C,3,easy|pet_friendly|sun,pet_friendly_requires_external_evidence,,,, -easy,constants/lexiconBatch1.ts,90,Gasteria,Gasteria carinata,"Die Gasteria ist eine kleine Sukkulente mit zweireihig angeordneten, zungenfoermigen, gefleckten Blaettern.",Helles indirektes Licht,15-25 °C,14,easy|succulent|low_light,,,,, -easy,constants/lexiconBatch1.ts,32,Blutroter Storchschnabel,Geranium sanguineum,Der Blutrote Storchschnabel ist ein zierlicher Storchschnabel mit intensiv magentafarbenen Blueten.,Helles bis volles Licht,10-25 °C,7,easy|flowering,,,,, -easy,constants/lexiconBatch1.ts,87,Geisterpflanze,Graptopetalum paraguayense,"Die Geisterpflanze hat zartgraue bis perlmutt-rosafarbene, rosettenfoermige Blaetter. Sehr robuste Sukkulente.",Volles Sonnenlicht,15-25 °C,14,easy|succulent|sun,,,,, -easy,constants/lexiconBatch1.ts,80,Mond-Kaktus,Gymnocalycium mihanovichii,Der Mond-Kaktus ist eine farbenfrohe Veredelung eines chlorophylllosen Kaktus auf einem gruenen Unterlagekaktus.,Indirektes Licht,15-30 °C,14,easy|succulent,,,,, -easy,constants/lexiconBatch1.ts,6,Zebra-Haworthie,Haworthia fasciata,Die Zebra-Haworthie ist eine kompakte Sukkulente mit weissen Querstreifen auf dunkelgruenen Blaettern.,Helles indirektes Licht,15-25 °C,14,easy|succulent|low_light,,,,, -easy,constants/lexiconBatch1.ts,37,Efeu,Hedera helix,"Efeu ist eine robuste Kletter- und Haengepflanze mit charakteristischen, dreilappigen Blaettern. Sehr langlebig.",Wenig bis helles Licht,10-20 °C,7,easy|hanging|air_purifier|low_light,air_purifier_requires_external_evidence,,,, -easy,constants/lexiconBatch2.ts,133,Currykraut,Helichrysum italicum,Currykraut ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -easy,constants/lexiconBatch1.ts,57,Wachsblume,Hoya carnosa,"Die Wachsblume ist eine Kletterpflanze mit dicken, wachsartigen Blaettern und sternfoermigen, duftenden Blueten.",Helles indirektes Licht,16-27 °C,10,easy|flowering|succulent|hanging,,,,, -easy,constants/lexiconBatch1.ts,108,Hyazinthe,Hyacinthus orientalis,"Die Hyazinthe bezaubert mit dichten Bluetenrispen und intensivem Duft in Blau, Rosa, Weiss oder Gelb.",Helles bis volles Licht,10-18 °C,5,easy|flowering,,,,, -easy,constants/lexiconBatch2.ts,136,Ysop,Hyssopus officinalis,Ysop ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -easy,constants/lexiconBatch2.ts,59,Neuguinea-Balsamine,Impatiens hawkeri,"Die Neuguinea-Balsamine hat grosse, leuchtende Blueten und ist sehr bluehfreudig. Ideal fuer Terrassen.",Helles indirektes Licht,18-27 °C,3,easy|flowering,,,,, -easy,constants/lexiconBatch1.ts,20,Fleissiges Lieschen,Impatiens walleriana,Das Fleissige Lieschen bluet von Fruehling bis Herbst unermudlich in vielen Farben.,Helles indirektes Licht,16-24 °C,2,easy|flowering,,,,, -easy,constants/lexiconBatch1.ts,64,Suesskartoffel,Ipomoea batatas,"Die Suesskartoffel-Zierpflanze hat dekorative, herzfoermige Blaetter in gruen oder dunkelviolett. Ideal als Haengepflanze.",Volles Sonnenlicht,20-30 °C,5,easy|hanging|sun,,,,, -easy,constants/lexiconBatch1.ts,9,Kalanchoe,Kalanchoe blossfeldiana,"Die Kalanchoe ist eine beliebte Bluehpflanze mit leuchtenden Blueten in Rot, Orange, Gelb oder Rosa.",Helles bis volles Licht,15-25 °C,10,easy|flowering|succulent|sun,,,,, -easy,constants/lexiconBatch2.ts,22,Brutblatt,Kalanchoe daigremontiana,Das Brutblatt bildet entlang des Blattrandes zahlreiche kleine Jungpflanzen. Eine faszinierende Sukkulente.,Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, -easy,constants/lexiconBatch2.ts,21,Kaninchen-Ohren,Kalanchoe tomentosa,"Kaninchen-Ohren haben weisslich-filzige Blaetter mit braunen Raendern, die Kaninchen­ohren aehneln. Sehr dekorativ.",Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, -easy,constants/lexiconBatch2.ts,95,Salat,Lactuca sativa,Salat ist eine schnell wachsende Blattgemuese­pflanze. Im Topf und Balkonkasten sehr gut zu kultivieren.,Helles bis volles Licht,10-22 °C,3,easy,,,,, -easy,constants/lexiconBatch2.ts,121,Lorbeer,Laurus nobilis,Lorbeer ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -easy,constants/lexiconBatch2.ts,126,Liebstoeckel,Levisticum officinale,Liebstoeckel ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -easy,constants/lexiconBatch2.ts,62,Duftsteinrich,Lobularia maritima,"Der Duftsteinrich ist ein niedrig wachsendes Pflanzchen mit winzigen, weissen oder lilafarbenen Blueten und suessem Duft.",Helles bis volles Licht,10-22 °C,3,easy|flowering,,,,, -easy,constants/lexiconBatch1.ts,79,Mammillaria,Mammillaria zeilmanniana,"Die Mammillaria ist ein kompakter, kugelfoermiger Kaktus, der im Fruehling einen Kranz aus rosa Blueten traegt.",Volles Sonnenlicht,15-35 °C,14,easy|flowering|succulent|sun,,,,, -easy,constants/lexiconBatch2.ts,102,Zitronenmelisse,Melissa officinalis,Die Zitronenmelisse ist ein zitronig duftendes Heilkraut. Sie beruhigt die Nerven und foerdert den Schlaf.,Helles bis volles Licht,15-25 °C,5,easy|medicinal,medicinal_requires_external_evidence,,,, -easy,constants/lexiconBatch1.ts,26,Gruene Minze,Mentha spicata,"Die Gruene Minze ist ein wuchsfreudiges Kuechenkraut mit frischem, minzigem Duft. Fuer Tee und Cocktails.",Helles bis volles Licht,15-25 °C,3,easy,,,,, -easy,constants/lexiconBatch2.ts,47,Monstera adansonii,Monstera adansonii,Monstera adansonii hat herzfoermige Blaetter mit zahlreichen runden Lochern. Eine rankende Zimmerpflanze.,Helles indirektes Licht,18-27 °C,7,easy|hanging,,,,, -easy,constants/lexiconBatch1.ts,109,Traubenhyazinthe,Muscari armeniacum,"Die Traubenhyazinthe bildet dichte Trauben aus kleinen, blauen bis violetten Gloeckchen. Zuverlaessige Fruejahrszwiebel.",Helles bis volles Licht,8-18 °C,7,easy|flowering,,,,, -easy,constants/lexiconBatch2.ts,132,Katzenminze,Nepeta cataria,Katzenminze ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -easy,constants/lexiconBatch1.ts,25,Basilikum,Ocimum basilicum,"Basilikum ist das beliebteste Kuechenkraut mit intensiv aromatischen, gruenen Blaettern. Fuer Pesto verwendet.",Volles Sonnenlicht,18-30 °C,2,easy|medicinal|sun,medicinal_requires_external_evidence,,,, -easy,constants/lexiconBatch1.ts,82,Hasenohren-Kaktus,Opuntia microdasys,"Der Hasenohren-Kaktus hat flache, ovale Triebe mit dichten weissen Glochiden. Klassischer Zimmerkaktus.",Volles Sonnenlicht,10-35 °C,21,easy|succulent|sun,,,,, -easy,constants/lexiconBatch2.ts,124,Majoran,Origanum majorana,Majoran ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -easy,constants/lexiconBatch1.ts,28,Oregano,Origanum vulgare,"Oregano ist ein aromatisches Kuechenkraut mit runden, behaarten Blaettern. In mediterraner Kueche beliebt.",Volles Sonnenlicht,15-25 °C,7,easy|medicinal|sun,medicinal_requires_external_evidence,,,, -easy,constants/lexiconBatch2.ts,231,Glueckskastanie,Pachira aquatica,Glueckskastanie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,easy|tree|bright_light,,,,, -easy,constants/lexiconBatch1.ts,88,Mondstein-Pflanze,Pachyphytum oviferum,"Die Mondstein-Pflanze hat dicke, ovale Blaetter mit einem pastellrosafarbenen, mehligen Ueberzug.",Volles Sonnenlicht,15-25 °C,14,easy|succulent|sun,,,,, -easy,constants/lexiconBatch1.ts,31,Rosengeranie,Pelargonium graveolens,Die Rosengeranie ist eine Duftpflanze mit tief eingeschnittenen Blaettern und rosaenlichem Aroma.,Volles Sonnenlicht,15-25 °C,7,easy|medicinal|sun,medicinal_requires_external_evidence,,,, -easy,constants/lexiconBatch2.ts,61,Efeu-Geranie,Pelargonium peltatum,"Die Efeu-Geranie hat efeufoermige, glaenzende Blaetter und bluet den ganzen Sommer in leuchtenden Farben.",Helles bis volles Licht,15-25 °C,5,easy|flowering|hanging|sun,,,,, -easy,constants/lexiconBatch1.ts,102,Rippenpeperomie,Peperomia caperata,"Die Rippenpeperomie hat tief gerippte, dunkelgruene bis violette Blaetter mit einer samtigen Textur.",Helles indirektes Licht,18-26 °C,10,easy|pet_friendly,pet_friendly_requires_external_evidence,,,, -easy,constants/lexiconBatch1.ts,103,Spiegelpeperomie,Peperomia obtusifolia,"Die Spiegelpeperomie hat glaenzende, lederartige, oval-runde Blaetter in tiefem Gruen. Sehr robust.",Helles indirektes Licht,16-26 °C,10,easy|pet_friendly|low_light,pet_friendly_requires_external_evidence,,,, -easy,constants/lexiconBatch2.ts,230,Raindrop-Peperomie,Peperomia polybotrya,Raindrop-Peperomie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,easy|pet_friendly,pet_friendly_requires_external_evidence,,,, -easy,constants/lexiconBatch2.ts,134,Shiso,Perilla frutescens,Shiso ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -easy,constants/lexiconBatch1.ts,29,Petersilie,Petroselinum crispum,Petersilie ist eines der meistgenutzten Kuechenkraeuter mit frisch-aromatischem Geschmack. Reich an Vitaminen.,Helles Licht,10-25 °C,3,easy,,,,, -easy,constants/lexiconBatch1.ts,34,Petunie,Petunia hybrida,Die Petunie ist eine der beliebtesten Balkonpflanzen mit trichterfoermigen Blueten in unzaehligen Farben.,Volles Sonnenlicht,15-25 °C,2,easy|pet_friendly|flowering|sun,pet_friendly_requires_external_evidence,,,, -easy,constants/lexiconBatch2.ts,50,Philodendron bipinnatifidum,Philodendron bipinnatifidum,"Philodendron bipinnatifidum hat grosse, tief gelappte Blaetter. Er entwickelt einen beeindruckenden, baumfoermigen Wuchs.",Helles indirektes Licht,18-27 °C,7,easy|large,,,,, -easy,constants/lexiconBatch2.ts,51,Roter Philodendron,Philodendron erubescens,"Der Rote Philodendron hat glaenzende, herzfoermige Blaetter, die jung roetrlich erscheinen. Sehr dekorativ.",Helles indirektes Licht,18-27 °C,7,easy|hanging,,,,, -easy,constants/lexiconBatch1.ts,15,Herzblatt-Philodendron,Philodendron hederaceum,Der Herzblatt-Philodendron ist eine pflegeleichte Kletter- oder Haengepflanze mit herzfoermigen Blaettern.,Indirektes Licht,18-28 °C,7,easy|hanging|low_light,,,,, -easy,constants/lexiconBatch2.ts,242,Philodendron Brasil,Philodendron hederaceum Brasil,Philodendron Brasil ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,easy|hanging|low_light,,,,, -easy,constants/lexiconBatch2.ts,8,Goldener Bambus,Phyllostachys aurea,"Der Goldene Bambus hat elegante, goldgelbe Halme mit engstehenden Knoten. Sehr dekorativ als Sichtschutz.",Helles bis volles Licht,10-30 °C,5,easy|large,,,,, -easy,constants/lexiconBatch2.ts,228,Aluminium-Pflanze,Pilea cadierei,Aluminium-Pflanze ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,easy|pet_friendly|patterned,pet_friendly_requires_external_evidence,,,, -easy,constants/lexiconBatch1.ts,2,Ufopflanze,Pilea peperomioides,"Die Ufopflanze hat unverwechselbare, runde Blaetter auf langen Stielen. Bildet leicht Ableger zum Verschenken.",Helles indirektes Licht,13-30 °C,7,easy|pet_friendly,pet_friendly_requires_external_evidence,,,, -easy,constants/lexiconBatch2.ts,44,Tueipelfarn,Polypodium vulgare,Der Tueipelfarn ist ein heimischer Farn mit gelappten Wedeln und runden Sporenhaeufchen auf der Unterseite.,Helles indirektes Licht,10-20 °C,7,easy,,,,, -easy,constants/lexiconBatch2.ts,27,Speckbaum,Portulacaria afra,"Der Speckbaum ist eine sukkulente Pflanze mit roten Stielen und kleinen, runden, glaenzenden Blaettern.",Helles bis volles Licht,15-30 °C,14,easy|succulent|sun,,,,, -easy,constants/lexiconBatch2.ts,98,Radieschen,Raphanus sativus,"Das Radieschen ist ein schnellwachsendes Gemuese mit runden, roten Knollen. Es reift in nur 3-4 Wochen.",Helles bis volles Licht,10-22 °C,2,easy,,,,, -easy,constants/lexiconBatch2.ts,52,Mini-Monstera,Rhaphidophora tetrasperma,"Die Mini-Monstera hat monstera­aehnliche, gelochte Blaetter auf einer kompakten, klettternden Pflanze. Sehr trendig.",Helles indirektes Licht,18-27 °C,7,easy|hanging,,,,, -easy,constants/lexiconBatch1.ts,24,Rosmarin,Rosmarinus officinalis,Rosmarin ist ein aromatisches Kraut mit nadelartigen Blaettern und blauen Blueten. In der Kueche unverzichtbar.,Volles Sonnenlicht,10-25 °C,7,easy|medicinal|sun,medicinal_requires_external_evidence,,,, -easy,constants/lexiconBatch2.ts,130,Sauerampfer,Rumex acetosa,Sauerampfer ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -easy,constants/lexiconBatch1.ts,94,Afrikanisches Veilchen,Saintpaulia ionantha,"Das Afrikanische Veilchen ist eine kleine, kompakte Bluehpflanze mit samtigen Blaettern und violetten Blueten.",Helles indirektes Licht,18-25 °C,7,easy|flowering,,,,, -easy,constants/lexiconBatch2.ts,103,Salbei,Salvia officinalis,Salbei ist ein aromatisches Heilkraut mit silbrig-gruenen Blaettern. Er hat antibakterielle und entzuendungshem­mende Wirkung.,Volles Sonnenlicht,10-25 °C,7,easy|medicinal|sun,medicinal_requires_external_evidence,,,, -easy,constants/lexiconBatch2.ts,17,Zylindrischer Bogenhanf,Sansevieria cylindrica,"Der Zylindrische Bogenhanf hat zylindrische, aufrechte Blaetter, die sich nach oben verjuengen. Sehr pflegeleicht.",Helles bis volles Licht,15-27 °C,14,easy|succulent|sun,,,,, -easy,constants/lexiconBatch2.ts,123,Bohnenkraut,Satureja hortensis,Bohnenkraut ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -easy,constants/lexiconBatch2.ts,11,Grosse Strahlenaralie,Schefflera actinophylla,"Die Grosse Strahlenaralie kann grosse, handfoermige Blaetter entwickeln. Sie ist ideal als Zimmerstrauch.",Helles indirektes Licht,18-27 °C,7,easy|tree|large,,,,, -easy,constants/lexiconBatch2.ts,10,Strahlenaralie,Schefflera arboricola,"Die Strahlenaralie hat fingerfoermig angeordnete, glaenzende Blaetter auf langen Stielen. Sehr robuste Zimmerpflanze.",Helles indirektes Licht,15-25 °C,7,easy|tree|air_purifier,air_purifier_requires_external_evidence,,,, -easy,constants/lexiconBatch1.ts,8,Weihnachtskaktus,Schlumbergera truncata,"Der Weihnachtskaktus erfreut zur Weihnachtszeit mit leuchtenden Blueten in Rosa, Rot oder Weiss.",Helles indirektes Licht,15-21 °C,7,easy|flowering|succulent,,,,, -easy,constants/lexiconBatch1.ts,55,Satinpothos,Scindapsus pictus,"Der Satinpothos hat samtig-glaenzende, silbrig gefleckte Blaetter auf langen, haengenden Ranken.",Helles indirektes Licht,18-28 °C,7,easy|patterned|hanging,,,,, -easy,constants/lexiconBatch1.ts,7,Eselschwanz,Sedum morganianum,"Der Eselschwanz ist eine haengende Sukkulente mit langen Trieben aus dichten, blaugruenen Blaettchen.",Volles Sonnenlicht,15-25 °C,14,easy|succulent|hanging|sun,,,,, -easy,constants/lexiconBatch1.ts,100,Perlenschnur-Pflanze,Senecio rowleyanus,"Die Perlenschnur-Pflanze hat haengende Ranken mit kugelfoermigen, perlenaehnlichen Blaettern. Einzigartige Sukkulente.",Helles bis volles Licht,15-27 °C,14,easy|succulent|hanging,,,,, -easy,constants/lexiconBatch2.ts,28,Blauer Kreuzkraut,Senecio serpens,"Der Blaue Kreuzkraut hat zylindrische, blaublaugruene Blaetter und einen kriechenden Wuchs. Sehr dekorativ.",Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, -easy,constants/lexiconBatch2.ts,91,Tomate,Solanum lycopersicum,"Die Tomate ist eine beliebte Gemuese- und Balkonpflanze mit roten, saftigen Fruechten. Im Topf kultivierbar.",Volles Sonnenlicht,18-28 °C,3,easy,,,,, -easy,constants/lexiconBatch2.ts,96,Spinat,Spinacia oleracea,Spinat ist ein naehrstoffreiches Blattgemuese mit dunkelgruenen Blaettern. Reich an Eisen und Vitaminen.,Helles bis volles Licht,10-20 °C,3,easy,,,,, -easy,constants/lexiconBatch2.ts,131,Stevia,Stevia rebaudiana,Stevia ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -easy,constants/lexiconBatch1.ts,56,Pfeilblatt,Syngonium podophyllum,"Das Pfeilblatt hat charakteristisch pfeilfoermige Blaetter, die sich mit dem Alter weiterentwickeln.",Helles indirektes Licht,16-27 °C,7,easy|hanging,,,,, -easy,constants/lexiconBatch2.ts,66,Studentenblume,Tagetes patula,Die Studentenblume ist eine robuste Sommerblume mit orangen oder gelben Blueten. Sie haelt Schadlinge fern.,Volles Sonnenlicht,15-28 °C,3,easy|flowering|sun,,,,, -easy,constants/lexiconBatch1.ts,27,Thymian,Thymus vulgaris,"Thymian ist ein kleiner, aromatischer Strauch mit winzigen Blaettern und rosa Blueten. Wichtiges Kuechenkraut.",Volles Sonnenlicht,10-25 °C,7,easy|medicinal|sun,medicinal_requires_external_evidence,,,, -easy,constants/lexiconBatch2.ts,33,Luftpflanze,Tillandsia ionantha,Die Luftpflanze ist eine kompakte Bromelie ohne Topferde. Sie nimmt Wasser und Naehrstoffe ueber die Blattschuppen auf.,Helles bis volles Licht,15-30 °C,3,easy,,,,, -easy,constants/lexiconBatch2.ts,32,Spanisches Moos,Tillandsia usneoides,"Das Spanische Moos ist eine epiphytische Bromelie ohne Wurzeln, die in der Luft haengt. Es benoetigt nur Feuchtigkeitsbespruehing.",Helles bis volles Licht,15-30 °C,3,easy|hanging,,,,, -easy,constants/lexiconBatch2.ts,55,Weisse Tradescantia,Tradescantia fluminensis,Die Weisse Tradescantia hat gruene Blaetter mit weisslichen Unterseiten. Sehr robust und schnellwachsend.,Helles indirektes Licht,15-25 °C,5,easy|hanging,,,,, -easy,constants/lexiconBatch2.ts,54,Lila Tradescantia,Tradescantia pallida,Die Lila Tradescantia hat leuchtend purpurrote Blaetter und ist sehr auffaellig. Sie liebt viel Licht.,Helles bis volles Licht,15-25 °C,5,easy|hanging|sun,,,,, -easy,constants/lexiconBatch1.ts,17,Zebrakraut,Tradescantia zebrina,Das Zebrakraut faellt durch seine silbrig-lila gestreiften Blaetter auf. Schnellwachsende Haengepflanze.,Helles indirektes Licht,15-25 °C,5,easy|patterned|hanging,,,,, -easy,constants/lexiconBatch1.ts,107,Tulpe,Tulipa gesneriana,Die Tulpe ist eine der beliebtesten Fruehjahrsblueher mit kelchfoermigen Blueten in unzaehligen Farben.,Helles bis volles Licht,8-18 °C,5,easy|flowering,,,,, -easy,constants/lexiconBatch1.ts,35,Stiefmuetterchen,Viola wittrockiana,Das Stiefmuetterchen ist ein bekannter Fruehjahrsblueher mit charakteristisch gezeichneten Blueten.,Helles bis volles Licht,5-18 °C,3,easy|flowering,,,,, -easy,constants/lexiconBatch2.ts,246,Yucca aloifolia,Yucca aloifolia,Yucca aloifolia ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Volles Sonnenlicht,18-30 C,10,easy|tree|sun,,,,, -easy,constants/lexiconBatch1.ts,40,Yucca-Palme,Yucca elephantipes,"Die Yucca-Palme ist eine robuste Zimmerpflanze mit starrem, immergruenem Blaetterschopf auf einem dicken Stamm.",Helles bis volles Licht,15-28 °C,14,easy|tree|sun,,,,, -easy,constants/lexiconBatch2.ts,65,Zinnie,Zinnia elegans,"Die Zinnie ist eine leuchtende Sommerblume mit grossen, dahlienaehnlichen Blueten. Sehr robust und hitzetolerant.",Volles Sonnenlicht,18-30 °C,3,easy|flowering|sun,,,,, -flowering,constants/lexiconBatch2.ts,108,Schafgarbe,Achillea millefolium,Die Schafgarbe hat weisse oder rosafarbene Bluetenschirme und fein gefiederte Blaetter. Wichtige Heilpflanze.,Volles Sonnenlicht,10-25 °C,7,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, -flowering,constants/lexiconBatch1.ts,86,Wuestenrose,Adenium obesum,Die Wuestenrose ist eine sukkulente Zimmerpflanze mit dickem Stamm und leuchtend pinken Blueten.,Volles Sonnenlicht,20-35 °C,10,flowering|succulent|sun,,,,, -flowering,constants/lexiconBatch2.ts,117,Socotra-Wuestenrose,Adenium socotranum,"Die Socotra-Wuestenrose ist eine seltene, endemische Art mit einem sehr dicken, knolligen Stamm und rosa Blueten.",Volles Sonnenlicht,20-35 °C,14,flowering|succulent|sun,,,,, -flowering,constants/lexiconBatch2.ts,34,Silbervase,Aechmea fasciata,Die Silbervase ist eine Bromelie mit silbrig gebänderten Blaettern und einem rosafarbenen Bluetenstand.,Helles indirektes Licht,18-25 °C,10,flowering|patterned,,,,, -flowering,constants/lexiconBatch1.ts,98,Lippenstiftpflanze,Aeschynanthus radicans,Die Lippenstiftpflanze hat haengende Triebe mit glaenzenden Blaettern und leuchtend roten Roehrenbluten.,Helles indirektes Licht,18-27 °C,7,flowering|hanging|high_humidity,,,,, -flowering,constants/lexiconBatch2.ts,155,Stockrose,Alcea rosea,"Stockrose ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch2.ts,73,Muschelingwer,Alpinia zerumbet,"Der Muschelingwer hat lange, elegante Blaetter und haengende Bluetenrispen mit weiss-rosa Bluetchen.",Helles bis volles Licht,20-30 °C,5,flowering|large|high_humidity,,,,, -flowering,constants/lexiconBatch2.ts,194,Fuchsschwanz,Amaranthus caudatus,"Fuchsschwanz ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch2.ts,163,Anemone,Anemone coronaria,"Anemone ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch2.ts,147,Loewenmaeulchen,Antirrhinum majus,"Loewenmaeulchen ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch2.ts,107,Arnika,Arnica montana,Arnika ist eine bekannte Heilpflanze aus den Alpen mit goldgelben Korbbluten. Sie wird fuer Muskeln und Gelenke verwendet.,Volles Sonnenlicht,10-20 °C,7,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, -flowering,constants/lexiconBatch2.ts,178,Seidenpflanze,Asclepias tuberosa,"Seidenpflanze ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch1.ts,92,Indische Azalee,Azalea indica,"Die Indische Azalee ist ein beliebter Zierstrauch mit grossen, auffaelligen Blueten in Rosa- und Rottönen.",Helles indirektes Licht,10-20 °C,4,flowering,,,,, -flowering,constants/lexiconBatch2.ts,175,Eisbegonie,Begonia semperflorens-cultorum,"Eisbegonie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light,,,,, -flowering,constants/lexiconBatch2.ts,58,Knollen-Begonie,Begonia tuberhybrida,"Die Knollen-Begonie hat riesige, rosenaehnliche Blueten in leuchtendem Rot, Orange, Gelb oder Weiss.",Helles indirektes Licht,15-22 °C,5,flowering|high_humidity,,,,, -flowering,constants/lexiconBatch2.ts,145,Gaensebluemchen,Bellis perennis,"Gaensebluemchen ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch2.ts,38,Billbergia,Billbergia nutans,"Die Billbergia ist eine robuste Bromelie mit schmalen, gruenen Blaettern und hängenden, blauen und gruenen Blueten.",Helles indirektes Licht,15-25 °C,7,easy|flowering,,,,, -flowering,constants/lexiconBatch1.ts,62,Bougainvillea,Bougainvillea spectabilis,"Die Bougainvillea ist eine rankenreiche Kletterpflanze mit leuchtend farbigen Hochblaettern in Rot, Orange oder Pink.",Volles Sonnenlicht,18-30 °C,5,flowering|bright_light|sun,,,,, -flowering,constants/lexiconBatch2.ts,223,Schmetterlingsflieder,Buddleja davidii,Schmetterlingsflieder ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|sun,,,,, -flowering,constants/lexiconBatch2.ts,187,Ringelblume,Calendula officinalis,"Ringelblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, -flowering,constants/lexiconBatch2.ts,63,Calibrachoa,Calibrachoa hybrida,"Calibrachoa ist eine petunienaehnliche Haengepflanze mit unzaehligen, kleinen Trichterbluten in allen Farben.",Volles Sonnenlicht,15-25 °C,2,easy|flowering|hanging|sun,,,,, -flowering,constants/lexiconBatch1.ts,93,Kamelie,Camellia japonica,Die Kamelie ist ein eleganter Zierstrauch mit glaenzenden Blaettern und rosenaehnlichen Blueten von Januar bis April.,Helles indirektes Licht,7-18 °C,5,flowering,,,,, -flowering,constants/lexiconBatch2.ts,85,Teestrauch,Camellia sinensis,"Der Teestrauch ist die Pflanze, aus deren Blaettern Tee gewonnen wird. Er hat weisse Blueten und glaenzende Blaetter.",Helles indirektes Licht,15-22 °C,7,flowering,,,,, -flowering,constants/lexiconBatch2.ts,184,Trompetenwinde,Campsis radicans,"Trompetenwinde ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light,,,,, -flowering,constants/lexiconBatch2.ts,67,Blumenschilfrohr,Canna indica,"Das Blumenschilfrohr hat grosse, tropisch wirkende Blaetter und auffaellige Blueten in Rot, Orange oder Gelb.",Volles Sonnenlicht,18-28 °C,5,flowering|large|sun,,,,, -flowering,constants/lexiconBatch1.ts,73,Cattleya-Orchidee,Cattleya labiata,"Die Cattleya ist die Koenigin der Orchideen mit ueppigen, duftenden Blueten in Lila, Rosa und Weiss.",Helles indirektes Licht,18-28 °C,7,flowering|high_humidity,,,,, -flowering,constants/lexiconBatch2.ts,188,Kornblume,Centaurea cyanus,"Kornblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch1.ts,67,Chrysantheme,Chrysanthemum indicum,"Die Chrysantheme ist die klassische Herbstblume mit ueppigen, dichten Blueten in vielen Farben.",Helles bis volles Licht,12-22 °C,4,flowering,,,,, -flowering,constants/lexiconBatch2.ts,157,Clematis,Clematis viticella,"Clematis ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light,,,,, -flowering,constants/lexiconBatch1.ts,104,Riemenblatt,Clivia miniata,Das Riemenblatt ist eine dekorative Zimmerpflanze mit leuchtend orangefarbenen Blueten im Fruehling.,Helles indirektes Licht,15-24 °C,10,flowering,,,,, -flowering,constants/lexiconBatch1.ts,97,Columnea,Columnea gloriosa,"Die Columnea ist eine haengende Zimmerpflanze mit kleinen, behaarten Blaettern und leuchtend roten, roehrenfoermigen Blueten.",Helles indirektes Licht,18-25 °C,7,flowering|hanging|high_humidity,,,,, -flowering,constants/lexiconBatch2.ts,160,Maigloeckchen,Convallaria majalis,"Maigloeckchen ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|medicinal,medicinal_requires_external_evidence,,,, -flowering,constants/lexiconBatch2.ts,181,Maedchenauge,Coreopsis tinctoria,"Maedchenauge ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch2.ts,150,Kosmee,Cosmos bipinnatus,"Kosmee ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch1.ts,110,Krokus,Crocus vernus,"Der Krokus ist einer der ersten Fruehjahrs­boten mit kelchfoermigen Blueten in Lila, Weiss und Gelb.",Helles bis volles Licht,5-15 °C,7,easy|flowering,,,,, -flowering,constants/lexiconBatch1.ts,19,Alpenveilchen,Cyclamen persicum,"Das Alpenveilchen bluet im Herbst und Winter mit eleganten Blueten in Rosa, Rot oder Weiss.",Helles indirektes Licht,12-18 °C,5,flowering,,,,, -flowering,constants/lexiconBatch1.ts,71,Zymbidium,Cymbidium lowianum,"Das Zymbidium ist eine robuste Orchidee mit langen, grassartigen Blaettern und eleganten Bluetenrispen.",Helles Licht,12-24 °C,7,flowering,,,,, -flowering,constants/lexiconBatch2.ts,68,Dahlie,Dahlia pinnata,Die Dahlie ist eine prachtvolle Sommerblume mit Blueten in allen Groessen und Formen. Sie wird aus Knollen gezogen.,Volles Sonnenlicht,15-25 °C,5,flowering|sun,,,,, -flowering,constants/lexiconBatch2.ts,215,Flammenbaum,Delonix regia,Flammenbaum ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|large,,,,, -flowering,constants/lexiconBatch2.ts,153,Rittersporn,Delphinium elatum,"Rittersporn ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch1.ts,70,Dendrobium,Dendrobium nobile,"Das Dendrobium ist eine beliebte Zimmerorchidee mit langen Pseudobulben, die im Winter mit Blueten besetzt werden.",Helles indirektes Licht,15-28 °C,10,flowering|high_humidity,,,,, -flowering,constants/lexiconBatch2.ts,189,Bartnelke,Dianthus barbatus,"Bartnelke ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch2.ts,146,Nelke,Dianthus caryophyllus,"Nelke ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch2.ts,109,Roter Fingerhut,Digitalis purpurea,"Der Rote Fingerhut hat hohe Bluetenstaende mit roehrenfoermigen, gepunkteten Blueten in Rosa. Wichtige Arzneipflanze.",Helles bis volles Licht,10-20 °C,7,flowering|medicinal,medicinal_requires_external_evidence,,,, -flowering,constants/lexiconBatch2.ts,106,Sonnenhut,Echinacea purpurea,"Der Sonnenhut ist eine beliebte Heilpflanze mit grossen, pinkfarbenen Blueten. Er staerkt das Immunsystem.",Helles bis volles Licht,15-25 °C,7,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, -flowering,constants/lexiconBatch1.ts,84,Koenigin der Nacht,Epiphyllum oxypetalum,"Die Koenigin der Nacht bluet nur eine einzige Nacht lang mit riesigen, intensiv duftenden weissen Blueten.",Indirektes Licht,18-27 °C,7,flowering|succulent,,,,, -flowering,constants/lexiconBatch2.ts,186,Kalifornischer Mohn,Eschscholzia californica,"Kalifornischer Mohn ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch2.ts,19,Christusdorn,Euphorbia milii,Der Christusdorn ist eine sukkulente Wolfsmilch mit stacheligen Zweigen und kleinen roten oder gelben Hochblaettern.,Helles bis volles Licht,15-28 °C,10,easy|flowering|succulent|sun,,,,, -flowering,constants/lexiconBatch2.ts,20,Weihnachtsstern,Euphorbia pulcherrima,Der Weihnachtsstern ist die klassische Winterpflanze mit leuchtend roten Hochblaettern. Er steht symbolisch fuer Weihnachten.,Helles indirektes Licht,15-22 °C,7,flowering,,,,, -flowering,constants/lexiconBatch2.ts,219,Forsythie,Forsythia x intermedia,Forsythie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|sun,,,,, -flowering,constants/lexiconBatch2.ts,169,Freesie,Freesia refracta,"Freesie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch1.ts,33,Fuchsie,Fuchsia hybrida,"Die Fuchsie haengt mit eleganten, zweifarbigen Blueten wie kleine Ohrringe herab. Ideal fuer Ampeln.",Helles indirektes Licht,14-22 °C,3,flowering|hanging,,,,, -flowering,constants/lexiconBatch2.ts,60,Triphylla-Fuchsie,Fuchsia triphylla,"Die Triphylla-Fuchsie hat lange, roehrenfoermige, orangefarbe Blueten in haengenden Trauben. Sehr exotisch.",Helles indirektes Licht,15-22 °C,3,flowering|hanging,,,,, -flowering,constants/lexiconBatch2.ts,196,Kokardenblume,Gaillardia aristata,"Kokardenblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch1.ts,22,Gardenie,Gardenia jasminoides,"Die Gardenie fasziniert mit cremefarbenen, intensiv duftenden Blueten. Anspruchsvoll in der Pflege.",Helles indirektes Licht,18-23 °C,5,flowering|high_humidity,,,,, -flowering,constants/lexiconBatch2.ts,190,Mittagsgold,Gazania rigens,"Mittagsgold ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch1.ts,32,Blutroter Storchschnabel,Geranium sanguineum,Der Blutrote Storchschnabel ist ein zierlicher Storchschnabel mit intensiv magentafarbenen Blueten.,Helles bis volles Licht,10-25 °C,7,easy|flowering,,,,, -flowering,constants/lexiconBatch1.ts,68,Gerbera,Gerbera jamesonii,"Die Gerbera ist eine farbenfrohe Schnittblume mit grossen, sonnenblumenaehnlichen Blueten. Sehr beliebt.",Helles bis volles Licht,15-25 °C,5,flowering|air_purifier|bright_light,air_purifier_requires_external_evidence,,,, -flowering,constants/lexiconBatch2.ts,161,Gladiole,Gladiolus hortulanus,"Gladiole ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch1.ts,96,Gloxinie,Gloxinia speciosa,"Die Gloxinie hat grosse, samtartige Blueten in Violett, Rosa oder Weiss mit farbigen Raendern.",Helles indirektes Licht,18-25 °C,5,flowering|high_humidity,,,,, -flowering,constants/lexiconBatch2.ts,36,Guzmania,Guzmania lingulata,"Die Guzmania ist eine Bromelie mit glänzenden, gruenen Blaettern und einem leuchtend roten, sternfoermigen Bluetenstand.",Helles indirektes Licht,18-27 °C,7,flowering|high_humidity,,,,, -flowering,constants/lexiconBatch2.ts,119,Zaubernuss,Hamamelis mollis,"Die Zaubernuss bluet im Winter mit fadendunnen, gelben Bluetenkranzeln, die bis -10 Grad standhalten.",Helles bis volles Licht,10-20 °C,10,flowering|medicinal,medicinal_requires_external_evidence,,,, -flowering,constants/lexiconBatch2.ts,141,Sonnenblume,Helianthus annuus,"Sonnenblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch2.ts,72,Heliconia,Heliconia psittacorum,"Die Heliconia hat leuchtend orangefarbe oder rote, bootsfoermige Hochblaetter. Eine exotische Tropenpflanze.",Helles bis volles Licht,20-30 °C,5,flowering|bright_light|high_humidity,,,,, -flowering,constants/lexiconBatch2.ts,191,Heliotrop,Heliotropium arborescens,"Heliotrop ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch2.ts,183,Lenzrose,Helleborus orientalis,"Lenzrose ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering,,,,, -flowering,constants/lexiconBatch2.ts,182,Taglilie,Hemerocallis fulva,"Taglilie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch1.ts,21,Hibiskus,Hibiscus rosa-sinensis,"Der Hibiskus begeistert mit grossen, trompetenfoermigen Blueten in Rot, Orange und Rosa.",Volles Sonnenlicht,18-28 °C,3,flowering|bright_light|sun,,,,, -flowering,constants/lexiconBatch2.ts,220,Gartenhibiskus,Hibiscus syriacus,Gartenhibiskus ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|sun,,,,, -flowering,constants/lexiconBatch1.ts,105,Ritterstern,Hippeastrum hybrid,"Der Ritterstern beeindruckt im Winter mit riesigen, trompetenfoermigen Blueten in Rot, Pink oder Weiss.",Helles bis volles Licht,18-25 °C,7,flowering|bright_light,,,,, -flowering,constants/lexiconBatch1.ts,58,Kleine Wachsblume,Hoya bella,"Die Kleine Wachsblume traegt zierliche, sternfoermige weisse Blueten mit rosa Mitte. Haengende Sukkulente.",Helles indirektes Licht,18-27 °C,10,flowering|succulent|hanging,,,,, -flowering,constants/lexiconBatch1.ts,57,Wachsblume,Hoya carnosa,"Die Wachsblume ist eine Kletterpflanze mit dicken, wachsartigen Blaettern und sternfoermigen, duftenden Blueten.",Helles indirektes Licht,16-27 °C,10,easy|flowering|succulent|hanging,,,,, -flowering,constants/lexiconBatch2.ts,159,Hasengloeckchen,Hyacinthoides non-scripta,"Hasengloeckchen ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch1.ts,108,Hyazinthe,Hyacinthus orientalis,"Die Hyazinthe bezaubert mit dichten Bluetenrispen und intensivem Duft in Blau, Rosa, Weiss oder Gelb.",Helles bis volles Licht,10-18 °C,5,easy|flowering,,,,, -flowering,constants/lexiconBatch2.ts,148,Hortensie,Hydrangea macrophylla,"Hortensie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Helles bis halbschattiges Licht,8-24 C,4,flowering|bright_light,,,,, -flowering,constants/lexiconBatch2.ts,105,Johanniskraut,Hypericum perforatum,Das Johanniskraut hat leuchtend gelbe Blueten und ist ein wichtiges Heilkraut gegen Depressionen und Stimmungstiefs.,Volles Sonnenlicht,10-25 °C,7,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, -flowering,constants/lexiconBatch2.ts,176,Gartenbalsamine,Impatiens balsamina,"Gartenbalsamine ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light,,,,, -flowering,constants/lexiconBatch2.ts,59,Neuguinea-Balsamine,Impatiens hawkeri,"Die Neuguinea-Balsamine hat grosse, leuchtende Blueten und ist sehr bluehfreudig. Ideal fuer Terrassen.",Helles indirektes Licht,18-27 °C,3,easy|flowering,,,,, -flowering,constants/lexiconBatch1.ts,20,Fleissiges Lieschen,Impatiens walleriana,Das Fleissige Lieschen bluet von Fruehling bis Herbst unermudlich in vielen Farben.,Helles indirektes Licht,16-24 °C,2,easy|flowering,,,,, -flowering,constants/lexiconBatch2.ts,156,Prunkwinde,Ipomoea purpurea,"Prunkwinde ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch2.ts,144,Bart-Iris,Iris germanica,"Bart-Iris ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch2.ts,211,Jacaranda,Jacaranda mimosifolia,Jacaranda ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|large,,,,, -flowering,constants/lexiconBatch1.ts,59,Jasmin,Jasminum polyanthum,"Der Jasmin ist eine Kletterpflanze mit intensiv duftenden, weissen Blueten. Er bluet im Winter und Fruehling.",Helles bis volles Licht,10-22 °C,5,flowering,,,,, -flowering,constants/lexiconBatch2.ts,172,Arabischer Jasmin,Jasminum sambac,"Arabischer Jasmin ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light,,,,, -flowering,constants/lexiconBatch1.ts,9,Kalanchoe,Kalanchoe blossfeldiana,"Die Kalanchoe ist eine beliebte Bluehpflanze mit leuchtenden Blueten in Rot, Orange, Gelb oder Rosa.",Helles bis volles Licht,15-25 °C,10,easy|flowering|succulent|sun,,,,, -flowering,constants/lexiconBatch2.ts,197,Traenendes Herz,Lamprocapnos spectabilis,"Traenendes Herz ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light,,,,, -flowering,constants/lexiconBatch2.ts,64,Wandelroeschen,Lantana camara,"Das Wandelroeschen hat kugelige Bluetenkoepfe, die die Farbe von Gelb ueber Orange zu Rot wechseln. Sehr attraktiv.",Volles Sonnenlicht,18-28 °C,5,flowering|bright_light|sun,,,,, -flowering,constants/lexiconBatch2.ts,158,Duftwicke,Lathyrus odoratus,"Duftwicke ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch2.ts,180,Bechermalve,Lavatera trimestris,"Bechermalve ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch2.ts,173,Margerite,Leucanthemum vulgare,"Margerite ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch2.ts,201,Shasta-Margerite,Leucanthemum x superbum,"Shasta-Margerite ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch2.ts,69,Ostertrompete,Lilium longiflorum,"Die Ostertrompete hat grosse, weisse, trichterfoermige Blueten mit intensivem Duft. Klassische Osterblume.",Helles bis volles Licht,15-25 °C,5,flowering|bright_light,,,,, -flowering,constants/lexiconBatch2.ts,62,Duftsteinrich,Lobularia maritima,"Der Duftsteinrich ist ein niedrig wachsendes Pflanzchen mit winzigen, weissen oder lilafarbenen Blueten und suessem Duft.",Helles bis volles Licht,10-22 °C,3,easy|flowering,,,,, -flowering,constants/lexiconBatch2.ts,171,Geissblatt,Lonicera japonica,"Geissblatt ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light,,,,, -flowering,constants/lexiconBatch2.ts,154,Lupine,Lupinus polyphyllus,"Lupine ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch2.ts,204,Magnolie,Magnolia grandiflora,Magnolie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|large,,,,, -flowering,constants/lexiconBatch1.ts,79,Mammillaria,Mammillaria zeilmanniana,"Die Mammillaria ist ein kompakter, kugelfoermiger Kaktus, der im Fruehling einen Kranz aus rosa Blueten traegt.",Volles Sonnenlicht,15-35 °C,14,easy|flowering|succulent|sun,,,,, -flowering,constants/lexiconBatch1.ts,75,Stiefmuetterchen-Orchidee,Miltoniopsis roezlii,"Die Stiefmuetterchen-Orchidee hat grosse, flache Blueten. Bevorzugt kuehle Temperaturen und hohe Luftfeuchtigkeit.",Indirektes Licht,15-22 °C,5,flowering|high_humidity,,,,, -flowering,constants/lexiconBatch2.ts,76,Schamkraut,Mimosa pudica,"Das Schamkraut faltet seine Blaettchen blitzschnell zusammen, wenn man sie beruehrt. Ein faszinierendes Erlebnis.",Helles bis volles Licht,20-28 °C,5,flowering|bright_light,,,,, -flowering,constants/lexiconBatch2.ts,179,Indianernessel,Monarda didyma,"Indianernessel ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch1.ts,109,Traubenhyazinthe,Muscari armeniacum,"Die Traubenhyazinthe bildet dichte Trauben aus kleinen, blauen bis violetten Gloeckchen. Zuverlaessige Fruejahrszwiebel.",Helles bis volles Licht,8-18 °C,7,easy|flowering,,,,, -flowering,constants/lexiconBatch2.ts,177,Vergissmeinnicht,Myosotis sylvatica,"Vergissmeinnicht ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch1.ts,106,Osterglocke,Narcissus pseudonarcissus,"Die Osterglocke ist der klassische Fruehjahrsblueher mit leuchtend gelben, trompetenfoermigen Blueten.",Helles bis volles Licht,10-18 °C,5,flowering,,,,, -flowering,constants/lexiconBatch2.ts,199,Nemesie,Nemesia strumosa,"Nemesie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch2.ts,37,Neoregelia,Neoregelia carolinae,"Die Neoregelia ist eine Bromelie, bei der das Herzblatt zur Bluetzeit leuchtend rot wird. Sehr dekorativ.",Helles bis volles Licht,18-27 °C,7,flowering|patterned|bright_light,,,,, -flowering,constants/lexiconBatch2.ts,120,Oleander,Nerium oleander,"Der Oleander ist ein mediteraner Strauch mit leuchtend roten, rosa oder weissen Blueten. Sehr hitzetolerant.",Volles Sonnenlicht,15-28 °C,7,flowering|bright_light|sun,,,,, -flowering,constants/lexiconBatch2.ts,193,Ziertabak,Nicotiana alata,"Ziertabak ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch1.ts,74,Tanzerinnen-Orchidee,Oncidium sphacelatum,"Die Tanzerinnen-Orchidee traegt lange Rispen mit Hunderten kleiner, gelb-brauner Blueten. Sehr reichliche Bluetracht.",Helles indirektes Licht,18-27 °C,7,flowering|high_humidity,,,,, -flowering,constants/lexiconBatch2.ts,200,Kapmargerite,Osteospermum ecklonis,"Kapmargerite ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch1.ts,54,Kleeblume,Oxalis triangularis,"Die Kleeblume hat tiefviolette, dreieckige Blaetter und zarte rosa Blueten. Sie faltet die Blaetter bei Dunkelheit.",Helles indirektes Licht,15-24 °C,7,flowering|patterned,,,,, -flowering,constants/lexiconBatch2.ts,143,Pfingstrose,Paeonia lactiflora,"Pfingstrose ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch2.ts,185,Mohn,Papaver rhoeas,"Mohn ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch1.ts,63,Passionsblume,Passiflora caerulea,"Die Passionsblume ist eine faszinierende Kletterpflanze mit komplex strukturierten, blau-weissen Blueten.",Helles bis volles Licht,15-27 °C,5,flowering,,,,, -flowering,constants/lexiconBatch2.ts,61,Efeu-Geranie,Pelargonium peltatum,"Die Efeu-Geranie hat efeufoermige, glaenzende Blaetter und bluet den ganzen Sommer in leuchtenden Farben.",Helles bis volles Licht,15-25 °C,5,easy|flowering|hanging|sun,,,,, -flowering,constants/lexiconBatch2.ts,174,Stehende Geranie,Pelargonium zonale,"Stehende Geranie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch1.ts,34,Petunie,Petunia hybrida,Die Petunie ist eine der beliebtesten Balkonpflanzen mit trichterfoermigen Blueten in unzaehligen Farben.,Volles Sonnenlicht,15-25 °C,2,easy|pet_friendly|flowering|sun,pet_friendly_requires_external_evidence,,,, -flowering,constants/lexiconBatch1.ts,69,Schmetterlingsorchidee,Phalaenopsis amabilis,Die Schmetterlingsorchidee ist die bekannteste Zimmerorchidee. Sie bluet bei guter Pflege monatelang.,Helles indirektes Licht,18-28 °C,10,flowering|high_humidity,,,,, -flowering,constants/lexiconBatch2.ts,165,Flammenblume,Phlox paniculata,"Flammenblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch2.ts,81,Fettkraut,Pinguicula grandiflora,"Das Fettkraut faengt Insekten mit klebrigen Blaettern. Es bluet mit violetten, sporenartigen Blueten.",Helles indirektes Licht,10-20 °C,5,flowering|high_humidity,,,,, -flowering,constants/lexiconBatch1.ts,61,Bleiwurz,Plumbago auriculata,"Die Bleiwurz ist ein halbimmergruener Strauch mit himmelblauen Blueten, der fast das ganze Jahr bluet.",Volles Sonnenlicht,15-27 °C,5,flowering|bright_light|sun,,,,, -flowering,constants/lexiconBatch2.ts,118,Tempel-Baum,Plumeria rubra,"Der Tempel-Baum hat intensiv duftende, sternfoermige Blueten in Weiss, Gelb oder Rosa. Klassische Tropenblume.",Volles Sonnenlicht,20-30 °C,7,flowering|tree|sun,,,,, -flowering,constants/lexiconBatch1.ts,36,Primel,Primula vulgaris,"Die Primel ist einer der ersten Fruehjahrs­boten mit lebhaften Blueten in Gelb, Pink, Rot und Lila.",Helles indirektes Licht,10-18 °C,4,flowering,,,,, -flowering,constants/lexiconBatch2.ts,71,Koenigs-Protea,Protea cynaroides,"Die Koenigs-Protea ist die Nationalblume Suedafrikas mit riesigen, imposanten Bluetenkoepfen. Eine echte Besonderheit.",Volles Sonnenlicht,10-25 °C,7,flowering|large|sun,,,,, -flowering,constants/lexiconBatch2.ts,88,Granatapfelbaum,Punica granatum,"Der Granatapfelbaum hat leuchtend rote Blueten und rote, essbare Fruechte mit rubinroten Kernen.",Volles Sonnenlicht,15-28 °C,7,flowering|tree|sun,,,,, -flowering,constants/lexiconBatch2.ts,162,Ranunkel,Ranunculus asiaticus,"Ranunkel ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch2.ts,170,Rhododendron,Rhododendron catawbiense,"Rhododendron ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|tree|bright_light,,,,, -flowering,constants/lexiconBatch1.ts,91,Japanische Azalee,Rhododendron simsii,"Die Japanische Azalee bluet im Winter und Fruehling ueppig mit leuchtend roten, rosa oder weissen Blueten.",Helles indirektes Licht,10-18 °C,4,flowering,,,,, -flowering,constants/lexiconBatch1.ts,66,Chinesische Rose,Rosa chinensis,Die Chinesische Rose ist eine der Stammarten vieler Gartenrosen und bluet fast ununterbrochen.,Volles Sonnenlicht,15-25 °C,5,flowering|sun,,,,, -flowering,constants/lexiconBatch2.ts,142,Rose,Rosa x hybrida,"Rose ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light|sun,,,,, -flowering,constants/lexiconBatch2.ts,167,Rudbeckie,Rudbeckia hirta,"Rudbeckie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch1.ts,94,Afrikanisches Veilchen,Saintpaulia ionantha,"Das Afrikanische Veilchen ist eine kleine, kompakte Bluehpflanze mit samtigen Blaettern und violetten Blueten.",Helles indirektes Licht,18-25 °C,7,easy|flowering,,,,, -flowering,constants/lexiconBatch2.ts,195,Mehlsalbei,Salvia farinacea,"Mehlsalbei ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch2.ts,168,Feuersalbei,Salvia splendens,"Feuersalbei ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch2.ts,112,Schwarzer Holunder,Sambucus nigra,Der Schwarze Holunder hat weisse Doldenbluten und schwarze Beeren. Die Fruechte werden fuer Sirup und Saft verwendet.,Helles bis volles Licht,10-25 °C,7,flowering|tree|medicinal,medicinal_requires_external_evidence,,,, -flowering,constants/lexiconBatch1.ts,8,Weihnachtskaktus,Schlumbergera truncata,"Der Weihnachtskaktus erfreut zur Weihnachtszeit mit leuchtenden Blueten in Rosa, Rot oder Weiss.",Helles indirektes Licht,15-21 °C,7,easy|flowering|succulent,,,,, -flowering,constants/lexiconBatch2.ts,222,Spierstrauch,Spiraea japonica,Spierstrauch ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|sun,,,,, -flowering,constants/lexiconBatch2.ts,25,Aasblume,Stapelia grandiflora,"Die Aasblume hat fleischige, gruene Staengel und riesige, sternfoermige Blueten mit aasartigem Duft.",Helles bis volles Licht,18-30 °C,14,flowering|succulent|sun,,,,, -flowering,constants/lexiconBatch1.ts,60,Madagaskar-Jasmin,Stephanotis floribunda,"Der Madagaskar-Jasmin hat dicke, glaenzende Blaetter und wachsweisse, intensiv duftende Blueten. Klassische Hochzeitsblume.",Helles indirektes Licht,18-25 °C,7,flowering,,,,, -flowering,constants/lexiconBatch1.ts,3,Paradiesvogelblume,Strelitzia reginae,"Die Paradiesvogelblume beeindruckt mit leuchtend orangefarbenen und blauen Blueten, die einem Vogel aehneln.",Volles Sonnenlicht,18-26 °C,7,flowering|large|sun,,,,, -flowering,constants/lexiconBatch1.ts,95,Drehfrucht,Streptocarpus hybridus,"Die Drehfrucht ist ein Gesneriengewaechs mit langen, gerippten Blaettern und trichterfoermigen Blueten in Lila oder Rosa.",Helles indirektes Licht,15-22 °C,7,flowering,,,,, -flowering,constants/lexiconBatch2.ts,166,Herbstaster,Symphyotrichum novi-belgii,"Herbstaster ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch2.ts,149,Flieder,Syringa vulgaris,"Flieder ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|tree|sun,,,,, -flowering,constants/lexiconBatch2.ts,66,Studentenblume,Tagetes patula,Die Studentenblume ist eine robuste Sommerblume mit orangen oder gelben Blueten. Sie haelt Schadlinge fern.,Volles Sonnenlicht,15-28 °C,3,easy|flowering|sun,,,,, -flowering,constants/lexiconBatch2.ts,151,Kapuzinerkresse,Tropaeolum majus,"Kapuzinerkresse ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch1.ts,107,Tulpe,Tulipa gesneriana,Die Tulpe ist eine der beliebtesten Fruehjahrsblueher mit kelchfoermigen Blueten in unzaehligen Farben.,Helles bis volles Licht,8-18 °C,5,easy|flowering,,,,, -flowering,constants/lexiconBatch2.ts,104,Baldrian,Valeriana officinalis,Baldrian ist ein bekanntes Heilkraut mit weissen bis roeslichen Blueten. Die Wurzeln werden zur Schlaffoerderung verwendet.,Helles bis volles Licht,15-25 °C,7,flowering|medicinal,medicinal_requires_external_evidence,,,, -flowering,constants/lexiconBatch1.ts,72,Vanda-Orchidee,Vanda coerulea,Die Vanda-Orchidee ist bekannt fuer ihre seltene blaue Bluetenfarbe. Epiphytische Orchidee mit grossen Blueten.,Helles bis volles Licht,20-30 °C,3,flowering|bright_light|high_humidity,,,,, -flowering,constants/lexiconBatch1.ts,76,Vanille,Vanilla planifolia,"Die Vanille ist eine kletternde Orchidee, aus deren Fruechten das beliebte Gewuerz gewonnen wird.",Helles indirektes Licht,20-30 °C,5,flowering|high_humidity,,,,, -flowering,constants/lexiconBatch2.ts,192,Koenigskerze,Verbascum thapsus,"Koenigskerze ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, -flowering,constants/lexiconBatch2.ts,164,Eisenkraut,Verbena bonariensis,"Eisenkraut ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch2.ts,198,Hornveilchen,Viola cornuta,"Hornveilchen ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -flowering,constants/lexiconBatch1.ts,35,Stiefmuetterchen,Viola wittrockiana,Das Stiefmuetterchen ist ein bekannter Fruehjahrsblueher mit charakteristisch gezeichneten Blueten.,Helles bis volles Licht,5-18 °C,3,easy|flowering,,,,, -flowering,constants/lexiconBatch2.ts,35,Flammen-Bromelie,Vriesea splendens,"Die Flammen-Bromelie hat gebänderte, dunkelgruene Blaetter und einen spektakulaeren, roten Bluetenstand.",Helles indirektes Licht,18-25 °C,7,flowering|patterned|high_humidity,,,,, -flowering,constants/lexiconBatch2.ts,221,Weigelie,Weigela florida,Weigelie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|sun,,,,, -flowering,constants/lexiconBatch1.ts,65,Chinesischer Blauregen,Wisteria sinensis,"Der Chinesische Blauregen ist ein ueppiger Kletterkuenstler mit langen, duftenden Bluetentrauben in Lila.",Volles Sonnenlicht,10-25 °C,7,flowering|large|sun,,,,, -flowering,constants/lexiconBatch2.ts,70,Calla,Zantedeschia aethiopica,"Die Calla hat elegante, trichterfoermige weisse Hochblaetter und glaenzende, herzfoermige Blaetter. Sehr edel.",Helles indirektes Licht,15-24 °C,7,flowering|high_humidity,,,,, -flowering,constants/lexiconBatch2.ts,65,Zinnie,Zinnia elegans,"Die Zinnie ist eine leuchtende Sommerblume mit grossen, dahlienaehnlichen Blueten. Sehr robust und hitzetolerant.",Volles Sonnenlicht,18-30 °C,3,easy|flowering|sun,,,,, -hanging,constants/lexiconBatch1.ts,98,Lippenstiftpflanze,Aeschynanthus radicans,Die Lippenstiftpflanze hat haengende Triebe mit glaenzenden Blaettern und leuchtend roten Roehrenbluten.,Helles indirektes Licht,18-27 °C,7,flowering|hanging|high_humidity,,,,, -hanging,constants/lexiconBatch2.ts,63,Calibrachoa,Calibrachoa hybrida,"Calibrachoa ist eine petunienaehnliche Haengepflanze mit unzaehligen, kleinen Trichterbluten in allen Farben.",Volles Sonnenlicht,15-25 °C,2,easy|flowering|hanging|sun,,,,, -hanging,constants/lexiconBatch2.ts,56,Callisia,Callisia repens,"Callisia repens ist ein kleines, kriechendes Kraut mit winzigen, gruenen Blaettern. Ideal fuer haengende Behaelter.",Helles indirektes Licht,15-25 °C,5,easy|hanging,,,,, -hanging,constants/lexiconBatch1.ts,99,Herzkette,Ceropegia woodii,"Die Herzkette hat duenne, haengende Ranken mit herzfoermigen, silbergrau gemusterten Blaettchen.",Helles indirektes Licht,15-27 °C,14,easy|succulent|patterned|hanging,,,,, -hanging,constants/lexiconBatch1.ts,97,Columnea,Columnea gloriosa,"Die Columnea ist eine haengende Zimmerpflanze mit kleinen, behaarten Blaettern und leuchtend roten, roehrenfoermigen Blueten.",Helles indirektes Licht,18-25 °C,7,flowering|hanging|high_humidity,,,,, -hanging,constants/lexiconBatch2.ts,236,String of Bananas,Curio radicans,String of Bananas ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles bis volles Licht,18-30 C,10,succulent|hanging|sun,,,,, -hanging,constants/lexiconBatch2.ts,237,String of Dolphins,Curio x peregrinus,String of Dolphins ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles bis volles Licht,18-30 C,10,succulent|hanging|sun,,,,, -hanging,constants/lexiconBatch1.ts,101,Dischidia,Dischidia ruscifolia,"Die Dischidia ist eine epiphytische Haengepflanze mit kleinen, runden Blaettern entlang duenner Ranken.",Helles indirektes Licht,18-27 °C,7,succulent|hanging,,,,, -hanging,constants/lexiconBatch1.ts,16,Marmor-Efeutute,Epipremnum aureum Marble Queen,Die Marmor-Efeutute hat cremeweiss-gruen marmorierte Blaetter. Eine dekorative Variante der klassischen Efeutute.,Helles indirektes Licht,15-30 °C,7,easy|hanging|air_purifier,air_purifier_requires_external_evidence,,,, -hanging,constants/lexiconBatch2.ts,53,Neon-Efeutute,Epipremnum pinnatum Neon,Die Neon-Efeutute hat leuchtend limonengruene Blaetter. Sehr auffaellig und pflegeleicht.,Helles indirektes Licht,15-30 °C,7,easy|hanging|air_purifier,air_purifier_requires_external_evidence,,,, -hanging,constants/lexiconBatch1.ts,33,Fuchsie,Fuchsia hybrida,"Die Fuchsie haengt mit eleganten, zweifarbigen Blueten wie kleine Ohrringe herab. Ideal fuer Ampeln.",Helles indirektes Licht,14-22 °C,3,flowering|hanging,,,,, -hanging,constants/lexiconBatch2.ts,60,Triphylla-Fuchsie,Fuchsia triphylla,"Die Triphylla-Fuchsie hat lange, roehrenfoermige, orangefarbe Blueten in haengenden Trauben. Sehr exotisch.",Helles indirektes Licht,15-22 °C,3,flowering|hanging,,,,, -hanging,constants/lexiconBatch1.ts,37,Efeu,Hedera helix,"Efeu ist eine robuste Kletter- und Haengepflanze mit charakteristischen, dreilappigen Blaettern. Sehr langlebig.",Wenig bis helles Licht,10-20 °C,7,easy|hanging|air_purifier|low_light,air_purifier_requires_external_evidence,,,, -hanging,constants/lexiconBatch1.ts,58,Kleine Wachsblume,Hoya bella,"Die Kleine Wachsblume traegt zierliche, sternfoermige weisse Blueten mit rosa Mitte. Haengende Sukkulente.",Helles indirektes Licht,18-27 °C,10,flowering|succulent|hanging,,,,, -hanging,constants/lexiconBatch1.ts,57,Wachsblume,Hoya carnosa,"Die Wachsblume ist eine Kletterpflanze mit dicken, wachsartigen Blaettern und sternfoermigen, duftenden Blueten.",Helles indirektes Licht,16-27 °C,10,easy|flowering|succulent|hanging,,,,, -hanging,constants/lexiconBatch1.ts,64,Suesskartoffel,Ipomoea batatas,"Die Suesskartoffel-Zierpflanze hat dekorative, herzfoermige Blaetter in gruen oder dunkelviolett. Ideal als Haengepflanze.",Volles Sonnenlicht,20-30 °C,5,easy|hanging|sun,,,,, -hanging,constants/lexiconBatch2.ts,47,Monstera adansonii,Monstera adansonii,Monstera adansonii hat herzfoermige Blaetter mit zahlreichen runden Lochern. Eine rankende Zimmerpflanze.,Helles indirektes Licht,18-27 °C,7,easy|hanging,,,,, -hanging,constants/lexiconBatch2.ts,48,Monstera obliqua,Monstera obliqua,"Monstera obliqua ist eine seltene Monstera-Art mit filigranen Blaettern, die hauptsaechlich aus Lochern bestehen.",Helles indirektes Licht,18-27 °C,7,patterned|hanging,,,,, -hanging,constants/lexiconBatch2.ts,79,Kannenpflanze,Nepenthes alata,"Die Kannenpflanze bildet grosse, gefuellte Kannen als Insekten­fallen. Eine faszinierende, tropische Pflanze.",Helles indirektes Licht,20-30 °C,5,hanging|high_humidity,,,,, -hanging,constants/lexiconBatch2.ts,61,Efeu-Geranie,Pelargonium peltatum,"Die Efeu-Geranie hat efeufoermige, glaenzende Blaetter und bluet den ganzen Sommer in leuchtenden Farben.",Helles bis volles Licht,15-25 °C,5,easy|flowering|hanging|sun,,,,, -hanging,constants/lexiconBatch2.ts,51,Roter Philodendron,Philodendron erubescens,"Der Rote Philodendron hat glaenzende, herzfoermige Blaetter, die jung roetrlich erscheinen. Sehr dekorativ.",Helles indirektes Licht,18-27 °C,7,easy|hanging,,,,, -hanging,constants/lexiconBatch1.ts,15,Herzblatt-Philodendron,Philodendron hederaceum,Der Herzblatt-Philodendron ist eine pflegeleichte Kletter- oder Haengepflanze mit herzfoermigen Blaettern.,Indirektes Licht,18-28 °C,7,easy|hanging|low_light,,,,, -hanging,constants/lexiconBatch2.ts,242,Philodendron Brasil,Philodendron hederaceum Brasil,Philodendron Brasil ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,easy|hanging|low_light,,,,, -hanging,constants/lexiconBatch2.ts,41,Geweihfarn,Platycerium bifurcatum,"Der Geweihfarn hat gespaltene Wedel, die einem Hirschgeweih aehneln. Er ist ein epiphytischer Farn fuer Holz.",Helles indirektes Licht,15-25 °C,7,hanging|high_humidity,,,,, -hanging,constants/lexiconBatch2.ts,52,Mini-Monstera,Rhaphidophora tetrasperma,"Die Mini-Monstera hat monstera­aehnliche, gelochte Blaetter auf einer kompakten, klettternden Pflanze. Sehr trendig.",Helles indirektes Licht,18-27 °C,7,easy|hanging,,,,, -hanging,constants/lexiconBatch1.ts,85,Korallenkaktus,Rhipsalis baccifera,"Der Korallenkaktus ist ein epiphytischer Kaktus mit duennen, haengenden Trieben und kleinen weissen Beeren.",Indirektes Licht,18-27 °C,7,succulent|hanging,,,,, -hanging,constants/lexiconBatch1.ts,55,Satinpothos,Scindapsus pictus,"Der Satinpothos hat samtig-glaenzende, silbrig gefleckte Blaetter auf langen, haengenden Ranken.",Helles indirektes Licht,18-28 °C,7,easy|patterned|hanging,,,,, -hanging,constants/lexiconBatch1.ts,7,Eselschwanz,Sedum morganianum,"Der Eselschwanz ist eine haengende Sukkulente mit langen Trieben aus dichten, blaugruenen Blaettchen.",Volles Sonnenlicht,15-25 °C,14,easy|succulent|hanging|sun,,,,, -hanging,constants/lexiconBatch1.ts,100,Perlenschnur-Pflanze,Senecio rowleyanus,"Die Perlenschnur-Pflanze hat haengende Ranken mit kugelfoermigen, perlenaehnlichen Blaettern. Einzigartige Sukkulente.",Helles bis volles Licht,15-27 °C,14,easy|succulent|hanging,,,,, -hanging,constants/lexiconBatch1.ts,56,Pfeilblatt,Syngonium podophyllum,"Das Pfeilblatt hat charakteristisch pfeilfoermige Blaetter, die sich mit dem Alter weiterentwickeln.",Helles indirektes Licht,16-27 °C,7,easy|hanging,,,,, -hanging,constants/lexiconBatch2.ts,32,Spanisches Moos,Tillandsia usneoides,"Das Spanische Moos ist eine epiphytische Bromelie ohne Wurzeln, die in der Luft haengt. Es benoetigt nur Feuchtigkeitsbespruehing.",Helles bis volles Licht,15-30 °C,3,easy|hanging,,,,, -hanging,constants/lexiconBatch2.ts,55,Weisse Tradescantia,Tradescantia fluminensis,Die Weisse Tradescantia hat gruene Blaetter mit weisslichen Unterseiten. Sehr robust und schnellwachsend.,Helles indirektes Licht,15-25 °C,5,easy|hanging,,,,, -hanging,constants/lexiconBatch2.ts,54,Lila Tradescantia,Tradescantia pallida,Die Lila Tradescantia hat leuchtend purpurrote Blaetter und ist sehr auffaellig. Sie liebt viel Licht.,Helles bis volles Licht,15-25 °C,5,easy|hanging|sun,,,,, -hanging,constants/lexiconBatch1.ts,17,Zebrakraut,Tradescantia zebrina,Das Zebrakraut faellt durch seine silbrig-lila gestreiften Blaetter auf. Schnellwachsende Haengepflanze.,Helles indirektes Licht,15-25 °C,5,easy|patterned|hanging,,,,, -high_humidity,constants/lexiconBatch2.ts,42,Frauenhaarfarn,Adiantum raddianum,"Der Frauenhaarfarn hat zarte, feingliedrige Wedel auf schwarzen, draht­aehnlichen Stielen. Liebt Feuchtigkeit.",Helles indirektes Licht,18-27 °C,3,high_humidity,,,,, -high_humidity,constants/lexiconBatch1.ts,98,Lippenstiftpflanze,Aeschynanthus radicans,Die Lippenstiftpflanze hat haengende Triebe mit glaenzenden Blaettern und leuchtend roten Roehrenbluten.,Helles indirektes Licht,18-27 °C,7,flowering|hanging|high_humidity,,,,, -high_humidity,constants/lexiconBatch1.ts,46,Amazona-Taro,Alocasia amazonica,"Der Amazona-Taro besticht mit dunkelgruenen, pfeilfoermigen Blaettern mit markant weissen Rippen.",Indirektes Licht,18-27 °C,5,patterned|large|high_humidity,,,,, -high_humidity,constants/lexiconBatch2.ts,225,Alocasia zebrina,Alocasia zebrina,Alocasia zebrina ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5,bright_light|high_humidity,,,,, -high_humidity,constants/lexiconBatch2.ts,73,Muschelingwer,Alpinia zerumbet,"Der Muschelingwer hat lange, elegante Blaetter und haengende Bluetenrispen mit weiss-rosa Bluetchen.",Helles bis volles Licht,20-30 °C,5,flowering|large|high_humidity,,,,, -high_humidity,constants/lexiconBatch2.ts,233,Samt-Anthurie,Anthurium clarinervium,Samt-Anthurie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5,patterned|high_humidity,,,,, -high_humidity,constants/lexiconBatch2.ts,234,Kristall-Anthurie,Anthurium crystallinum,Kristall-Anthurie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5,patterned|high_humidity,,,,, -high_humidity,constants/lexiconBatch2.ts,43,Vogelnest-Farn,Asplenium nidus,"Der Vogelnest-Farn hat ganzrandige, glaenzende Wedel, die eine Nestform bilden. Sehr dekorativ und robust.",Helles indirektes Licht,18-27 °C,5,easy|low_light|high_humidity,,,,, -high_humidity,constants/lexiconBatch2.ts,57,Forellen-Begonie,Begonia maculata,Die Forellen-Begonie hat olivgruene Blaetter mit silbernen Punkten und einer roten Unterseite. Atemberaubend.,Helles indirektes Licht,18-27 °C,7,patterned|high_humidity,,,,, -high_humidity,constants/lexiconBatch1.ts,18,Koenigsbegonie,Begonia rex,"Die Koenigsbegonie beeindruckt mit prachtvoll gemusterten Blaettern in Silber, Rot und Gruen.",Indirektes Licht,18-25 °C,5,patterned|high_humidity,,,,, -high_humidity,constants/lexiconBatch2.ts,58,Knollen-Begonie,Begonia tuberhybrida,"Die Knollen-Begonie hat riesige, rosenaehnliche Blueten in leuchtendem Rot, Orange, Gelb oder Weiss.",Helles indirektes Licht,15-22 °C,5,flowering|high_humidity,,,,, -high_humidity,constants/lexiconBatch1.ts,49,Buntblatt,Caladium bicolor,"Das Buntblatt beeindruckt mit transparenten, bunt gemusterten Blaettern in Pink, Rot, Weiss und Gruen.",Indirektes Licht,20-30 °C,5,patterned|high_humidity,,,,, -high_humidity,constants/lexiconBatch1.ts,73,Cattleya-Orchidee,Cattleya labiata,"Die Cattleya ist die Koenigin der Orchideen mit ueppigen, duftenden Blueten in Lila, Rosa und Weiss.",Helles indirektes Licht,18-28 °C,7,flowering|high_humidity,,,,, -high_humidity,constants/lexiconBatch1.ts,47,Taro,Colocasia esculenta,"Der Taro ist eine tropische Pflanze mit grossen, herzfoermigen Blaettern. Die Knollen sind Nahrungsquelle.",Helles indirektes Licht,18-30 °C,3,large|high_humidity,,,,, -high_humidity,constants/lexiconBatch1.ts,97,Columnea,Columnea gloriosa,"Die Columnea ist eine haengende Zimmerpflanze mit kleinen, behaarten Blaettern und leuchtend roten, roehrenfoermigen Blueten.",Helles indirektes Licht,18-25 °C,7,flowering|hanging|high_humidity,,,,, -high_humidity,constants/lexiconBatch2.ts,39,Cryptanthus,Cryptanthus bivittatus,Cryptanthus ist eine niedrig wachsende Bromelie mit sternfoermigen Rosetten und gemusterten Blaettern. Fuer Terrarien.,Helles indirektes Licht,18-27 °C,7,patterned|high_humidity,,,,, -high_humidity,constants/lexiconBatch1.ts,53,Ctenanthe,Ctenanthe burle-marxii,Die Ctenanthe hat faszinierend gemusterte Blaetter mit dunkelgruunem Fischgraetenmuster auf hellgruunem Hintergrund.,Indirektes Licht,18-25 °C,5,patterned|high_humidity,,,,, -high_humidity,constants/lexiconBatch2.ts,74,Kurkuma,Curcuma longa,Kurkuma ist eine tropische Gewuerzpflanze mit breiten Blaettern und leuchtend gelber Wurzel. Wichtiges Heilgewuerz.,Helles bis volles Licht,20-30 °C,7,medicinal|high_humidity,medicinal_requires_external_evidence,,,, -high_humidity,constants/lexiconBatch2.ts,9,Paragraphenpflanze,Cyperus alternifolius,"Die Paragraphenpflanze hat lange, grasartige Blaetter, die sternfoermig vom Stiel abstehen. Sie liebt viel Wasser.",Helles bis volles Licht,18-27 °C,3,high_humidity,,,,, -high_humidity,constants/lexiconBatch1.ts,70,Dendrobium,Dendrobium nobile,"Das Dendrobium ist eine beliebte Zimmerorchidee mit langen Pseudobulben, die im Winter mit Blueten besetzt werden.",Helles indirektes Licht,15-28 °C,10,flowering|high_humidity,,,,, -high_humidity,constants/lexiconBatch2.ts,80,Sonnentau,Drosera capensis,Der Sonnentau faengt Insekten mit klebrigen Tropfen auf seinen Blaettern. Eine faszinierende fleischfressende Pflanze.,Volles Sonnenlicht,15-25 °C,5,high_humidity|sun,,,,, -high_humidity,constants/lexiconBatch2.ts,137,Wasabi,Eutrema japonicum,"Wasabi ist ein seltenes Wuerzkraut, das gleichmaessige Feuchte und eher kuehle Bedingungen bevorzugt.",Helles indirektes Licht,8-20 C,4,bright_light|high_humidity,,,,, -high_humidity,constants/lexiconBatch2.ts,226,Nervenpflanze,Fittonia albivenis,Nervenpflanze ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5,patterned|high_humidity,,,,, -high_humidity,constants/lexiconBatch1.ts,22,Gardenie,Gardenia jasminoides,"Die Gardenie fasziniert mit cremefarbenen, intensiv duftenden Blueten. Anspruchsvoll in der Pflege.",Helles indirektes Licht,18-23 °C,5,flowering|high_humidity,,,,, -high_humidity,constants/lexiconBatch1.ts,96,Gloxinie,Gloxinia speciosa,"Die Gloxinie hat grosse, samtartige Blueten in Violett, Rosa oder Weiss mit farbigen Raendern.",Helles indirektes Licht,18-25 °C,5,flowering|high_humidity,,,,, -high_humidity,constants/lexiconBatch2.ts,240,Calathea lancifolia,Goeppertia insignis,Calathea lancifolia ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5,pet_friendly|patterned|high_humidity,pet_friendly_requires_external_evidence,,,, -high_humidity,constants/lexiconBatch2.ts,241,Calathea ornata,Goeppertia ornata,Calathea ornata ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5,pet_friendly|patterned|high_humidity,pet_friendly_requires_external_evidence,,,, -high_humidity,constants/lexiconBatch2.ts,36,Guzmania,Guzmania lingulata,"Die Guzmania ist eine Bromelie mit glänzenden, gruenen Blaettern und einem leuchtend roten, sternfoermigen Bluetenstand.",Helles indirektes Licht,18-27 °C,7,flowering|high_humidity,,,,, -high_humidity,constants/lexiconBatch2.ts,83,Heliamphora,Heliamphora nutans,Heliamphora ist eine urtuemliche Kannenpflanze aus den Tafelbergen Venezuelas. Sehr dekorativ und selten.,Helles indirektes Licht,15-25 °C,5,high_humidity,,,,, -high_humidity,constants/lexiconBatch2.ts,72,Heliconia,Heliconia psittacorum,"Die Heliconia hat leuchtend orangefarbe oder rote, bootsfoermige Hochblaetter. Eine exotische Tropenpflanze.",Helles bis volles Licht,20-30 °C,5,flowering|bright_light|high_humidity,,,,, -high_humidity,constants/lexiconBatch1.ts,51,Gebet-Pflanze,Maranta leuconeura,Die Gebet-Pflanze faltet ihre gemusterten Blaetter nachts wie Haende zusammen. Faszinierende rote und gruene Muster.,Indirektes Licht,18-27 °C,5,pet_friendly|patterned|high_humidity,pet_friendly_requires_external_evidence,,,, -high_humidity,constants/lexiconBatch2.ts,46,Tueipelfarn (Microsorum),Microsorum punctatum,"Microsorum punctatum ist ein tropischer Farn mit langen, ungeteilten, glaenzenden Wedeln. Fuer feuchte Standorte.",Helles indirektes Licht,18-27 °C,7,high_humidity,,,,, -high_humidity,constants/lexiconBatch1.ts,75,Stiefmuetterchen-Orchidee,Miltoniopsis roezlii,"Die Stiefmuetterchen-Orchidee hat grosse, flache Blueten. Bevorzugt kuehle Temperaturen und hohe Luftfeuchtigkeit.",Indirektes Licht,15-22 °C,5,flowering|high_humidity,,,,, -high_humidity,constants/lexiconBatch2.ts,2,Bananenpflanze,Musa acuminata,"Die Bananenpflanze ist eine tropische Staude mit riesigen, glaenzenden Blaettern. Im Zimmer selten fruechttragend.",Helles bis volles Licht,20-30 °C,5,large|high_humidity,,,,, -high_humidity,constants/lexiconBatch2.ts,79,Kannenpflanze,Nepenthes alata,"Die Kannenpflanze bildet grosse, gefuellte Kannen als Insekten­fallen. Eine faszinierende, tropische Pflanze.",Helles indirektes Licht,20-30 °C,5,hanging|high_humidity,,,,, -high_humidity,constants/lexiconBatch1.ts,74,Tanzerinnen-Orchidee,Oncidium sphacelatum,"Die Tanzerinnen-Orchidee traegt lange Rispen mit Hunderten kleiner, gelb-brauner Blueten. Sehr reichliche Bluetracht.",Helles indirektes Licht,18-27 °C,7,flowering|high_humidity,,,,, -high_humidity,constants/lexiconBatch1.ts,69,Schmetterlingsorchidee,Phalaenopsis amabilis,Die Schmetterlingsorchidee ist die bekannteste Zimmerorchidee. Sie bluet bei guter Pflege monatelang.,Helles indirektes Licht,18-28 °C,10,flowering|high_humidity,,,,, -high_humidity,constants/lexiconBatch2.ts,49,Philodendron gloriosum,Philodendron gloriosum,"Philodendron gloriosum hat grosse, samtige, herzfoermige Blaetter mit weissen Rippen. Eine atemberaubende Pflanze.",Helles indirektes Licht,18-27 °C,7,patterned|large|high_humidity,,,,, -high_humidity,constants/lexiconBatch2.ts,40,Blaues Kanaelfarn,Phlebodium aureum,"Der Blaue Kanaelfarn hat wachsartige, blaugruene Wedel und glaenzende Wurzelstaemme. Sehr dekorativ.",Helles indirektes Licht,18-27 °C,7,high_humidity,,,,, -high_humidity,constants/lexiconBatch2.ts,81,Fettkraut,Pinguicula grandiflora,"Das Fettkraut faengt Insekten mit klebrigen Blaettern. Es bluet mit violetten, sporenartigen Blueten.",Helles indirektes Licht,10-20 °C,5,flowering|high_humidity,,,,, -high_humidity,constants/lexiconBatch2.ts,41,Geweihfarn,Platycerium bifurcatum,"Der Geweihfarn hat gespaltene Wedel, die einem Hirschgeweih aehneln. Er ist ein epiphytischer Farn fuer Holz.",Helles indirektes Licht,15-25 °C,7,hanging|high_humidity,,,,, -high_humidity,constants/lexiconBatch2.ts,78,Purpursonnentau,Sarracenia purpurea,Der Purpursonnentau ist eine fleischfressende Kannenpflanze mit purpurroten Kannen. Faengt Insekten.,Volles Sonnenlicht,5-25 °C,3,high_humidity|sun,,,,, -high_humidity,constants/lexiconBatch2.ts,45,Regenbogenmoos,Selaginella uncinata,"Das Regenbogenmoos hat schuppenfoermige Blaetter, die im Licht schillernd irisieren. Dekorativ fuer Terrarien.",Helles indirektes Licht,18-27 °C,5,patterned|high_humidity,,,,, -high_humidity,constants/lexiconBatch2.ts,238,Bubikopf,Soleirolia soleirolii,Bubikopf ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,15-24 C,4,pet_friendly|high_humidity,pet_friendly_requires_external_evidence,,,, -high_humidity,constants/lexiconBatch1.ts,52,Stromanthe,Stromanthe sanguinea,Die Stromanthe hat dekorative Blaetter mit weissem Muster und leuchtend roter Unterseite. Familie der Marantaceen.,Helles indirektes Licht,18-25 °C,5,patterned|high_humidity,,,,, -high_humidity,constants/lexiconBatch2.ts,82,Wasserschlauch,Utricularia gibba,Der Wasserschlauch ist eine wasserbewohnende fleischfressende Pflanze mit Schlaeuchen als Insekten­fallen.,Helles bis volles Licht,15-25 °C,2,high_humidity|sun,,,,, -high_humidity,constants/lexiconBatch1.ts,72,Vanda-Orchidee,Vanda coerulea,Die Vanda-Orchidee ist bekannt fuer ihre seltene blaue Bluetenfarbe. Epiphytische Orchidee mit grossen Blueten.,Helles bis volles Licht,20-30 °C,3,flowering|bright_light|high_humidity,,,,, -high_humidity,constants/lexiconBatch1.ts,76,Vanille,Vanilla planifolia,"Die Vanille ist eine kletternde Orchidee, aus deren Fruechten das beliebte Gewuerz gewonnen wird.",Helles indirektes Licht,20-30 °C,5,flowering|high_humidity,,,,, -high_humidity,constants/lexiconBatch2.ts,35,Flammen-Bromelie,Vriesea splendens,"Die Flammen-Bromelie hat gebänderte, dunkelgruene Blaetter und einen spektakulaeren, roten Bluetenstand.",Helles indirektes Licht,18-25 °C,7,flowering|patterned|high_humidity,,,,, -high_humidity,constants/lexiconBatch2.ts,70,Calla,Zantedeschia aethiopica,"Die Calla hat elegante, trichterfoermige weisse Hochblaetter und glaenzende, herzfoermige Blaetter. Sehr edel.",Helles indirektes Licht,15-24 °C,7,flowering|high_humidity,,,,, -high_humidity,constants/lexiconBatch2.ts,75,Ingwer,Zingiber officinale,Ingwer ist eine tropische Gewuerzpflanze mit aromatischen Knollen. Die Blaetter sind schilfartig.,Helles indirektes Licht,20-30 °C,5,medicinal|high_humidity,medicinal_requires_external_evidence,,,, -large,constants/lexiconBatch2.ts,212,Spitzahorn,Acer platanoides,Spitzahorn ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, -large,constants/lexiconBatch1.ts,11,Agave,Agave americana,"Die Agave ist eine imposante Sukkulente mit steifen, blaugruenen Blaettern mit Stacheln. Sie bluet nur einmal.",Volles Sonnenlicht,10-35 °C,21,succulent|large|sun,,,,, -large,constants/lexiconBatch1.ts,46,Amazona-Taro,Alocasia amazonica,"Der Amazona-Taro besticht mit dunkelgruenen, pfeilfoermigen Blaettern mit markant weissen Rippen.",Indirektes Licht,18-27 °C,5,patterned|large|high_humidity,,,,, -large,constants/lexiconBatch2.ts,18,Kap-Aloe (ferox),Aloe ferox,"Aloe ferox ist eine grosse, imposante Aloe mit stachligen, blaugruenen Blaettern und leuchtend roten Bluetenaehren.",Volles Sonnenlicht,10-30 °C,14,succulent|large|medicinal|sun,medicinal_requires_external_evidence,,,, -large,constants/lexiconBatch2.ts,73,Muschelingwer,Alpinia zerumbet,"Der Muschelingwer hat lange, elegante Blaetter und haengende Bluetenrispen mit weiss-rosa Bluetchen.",Helles bis volles Licht,20-30 °C,5,flowering|large|high_humidity,,,,, -large,constants/lexiconBatch2.ts,7,Bambusrohr,Bambusa vulgaris,Das Bambusrohr ist eine schnell wachsende Bambusart mit gelbgruenen Halmen. Sehr dekorativ und vielseitig nutzbar.,Helles bis volles Licht,15-30 °C,5,easy|large,,,,, -large,constants/lexiconBatch2.ts,114,Hange-Birke,Betula pendula,Die Haenge-Birke hat charakteristisch weisse Rinde und haengende Zweige. Die Blaetter werden in der Heilkunde genutzt.,Volles Sonnenlicht,10-25 °C,7,tree|large|medicinal,medicinal_requires_external_evidence,,,, -large,constants/lexiconBatch2.ts,67,Blumenschilfrohr,Canna indica,"Das Blumenschilfrohr hat grosse, tropisch wirkende Blaetter und auffaellige Blueten in Rot, Orange oder Gelb.",Volles Sonnenlicht,18-28 °C,5,flowering|large|sun,,,,, -large,constants/lexiconBatch2.ts,90,Papaya,Carica papaya,"Die Papaya ist eine tropische Fruchtpflanze mit grossen, gelappten Blaettern und orangen Fruechten.",Volles Sonnenlicht,20-35 °C,5,large|sun,,,,, -large,constants/lexiconBatch2.ts,217,Trompetenbaum,Catalpa bignonioides,Trompetenbaum ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, -large,constants/lexiconBatch2.ts,208,Zeder,Cedrus libani,Zeder ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, -large,constants/lexiconBatch1.ts,81,Peruanischer Fackelkaktus,Cereus peruvianus,"Der Peruanische Fackelkaktus ist ein saeulenfoermiger Kaktus, der im Innenraum bis zu 2 m hoch werden kann.",Volles Sonnenlicht,15-35 °C,21,easy|succulent|large|sun,,,,, -large,constants/lexiconBatch1.ts,47,Taro,Colocasia esculenta,"Der Taro ist eine tropische Pflanze mit grossen, herzfoermigen Blaettern. Die Knollen sind Nahrungsquelle.",Helles indirektes Licht,18-30 °C,3,large|high_humidity,,,,, -large,constants/lexiconBatch2.ts,209,Zypresse,Cupressus sempervirens,Zypresse ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, -large,constants/lexiconBatch2.ts,239,Palmfarn,Cycas revoluta,Palmfarn ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles bis volles Licht,18-30 C,10,tree|large|sun,,,,, -large,constants/lexiconBatch2.ts,215,Flammenbaum,Delonix regia,Flammenbaum ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|large,,,,, -large,constants/lexiconBatch1.ts,39,Geigenfeige,Ficus lyrata,"Die Geigenfeige ist ein Trendbaum mit grossen, geigenfoermigen Blaettern. Benoetigt viel Licht.",Helles indirektes Licht,18-27 °C,7,tree|large|bright_light,,,,, -large,constants/lexiconBatch2.ts,211,Jacaranda,Jacaranda mimosifolia,Jacaranda ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|large,,,,, -large,constants/lexiconBatch2.ts,204,Magnolie,Magnolia grandiflora,Magnolie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|large,,,,, -large,constants/lexiconBatch2.ts,2,Bananenpflanze,Musa acuminata,"Die Bananenpflanze ist eine tropische Staude mit riesigen, glaenzenden Blaettern. Im Zimmer selten fruechttragend.",Helles bis volles Licht,20-30 °C,5,large|high_humidity,,,,, -large,constants/lexiconBatch2.ts,50,Philodendron bipinnatifidum,Philodendron bipinnatifidum,"Philodendron bipinnatifidum hat grosse, tief gelappte Blaetter. Er entwickelt einen beeindruckenden, baumfoermigen Wuchs.",Helles indirektes Licht,18-27 °C,7,easy|large,,,,, -large,constants/lexiconBatch2.ts,49,Philodendron gloriosum,Philodendron gloriosum,"Philodendron gloriosum hat grosse, samtige, herzfoermige Blaetter mit weissen Rippen. Eine atemberaubende Pflanze.",Helles indirektes Licht,18-27 °C,7,patterned|large|high_humidity,,,,, -large,constants/lexiconBatch2.ts,8,Goldener Bambus,Phyllostachys aurea,"Der Goldene Bambus hat elegante, goldgelbe Halme mit engstehenden Knoten. Sehr dekorativ als Sichtschutz.",Helles bis volles Licht,10-30 °C,5,easy|large,,,,, -large,constants/lexiconBatch2.ts,207,Fichte,Picea abies,Fichte ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, -large,constants/lexiconBatch2.ts,206,Kiefer,Pinus sylvestris,Kiefer ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, -large,constants/lexiconBatch2.ts,71,Koenigs-Protea,Protea cynaroides,"Die Koenigs-Protea ist die Nationalblume Suedafrikas mit riesigen, imposanten Bluetenkoepfen. Eine echte Besonderheit.",Volles Sonnenlicht,10-25 °C,7,flowering|large|sun,,,,, -large,constants/lexiconBatch2.ts,205,Eiche,Quercus robur,Eiche ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, -large,constants/lexiconBatch2.ts,214,Robinie,Robinia pseudoacacia,Robinie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, -large,constants/lexiconBatch2.ts,113,Silber-Weide,Salix alba,"Die Silber-Weide hat silbrig-glaenzende Blaetter. Weidenrinde enthält Salicylsaeure, die Grundlage von Aspirin.",Helles bis volles Licht,10-25 °C,7,tree|large|medicinal,medicinal_requires_external_evidence,,,, -large,constants/lexiconBatch2.ts,11,Grosse Strahlenaralie,Schefflera actinophylla,"Die Grosse Strahlenaralie kann grosse, handfoermige Blaetter entwickeln. Sie ist ideal als Zimmerstrauch.",Helles indirektes Licht,18-27 °C,7,easy|tree|large,,,,, -large,constants/lexiconBatch2.ts,213,Eberesche,Sorbus aucuparia,Eberesche ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, -large,constants/lexiconBatch2.ts,1,Weisse Strelitzie,Strelitzia nicolai,"Die Weisse Strelitzie ist ein beeindruckender Zimmerstrauch mit grossen, blaugruenen Blaettern und weiss-blauen Blueten.",Helles bis volles Licht,18-27 °C,7,tree|large|bright_light,,,,, -large,constants/lexiconBatch1.ts,3,Paradiesvogelblume,Strelitzia reginae,"Die Paradiesvogelblume beeindruckt mit leuchtend orangefarbenen und blauen Blueten, die einem Vogel aehneln.",Volles Sonnenlicht,18-26 °C,7,flowering|large|sun,,,,, -large,constants/lexiconBatch2.ts,5,Mexikanische Fächerpalme,Washingtonia robusta,"Die Mexikanische Fächerpalme ist eine schlanke, hohe Palme mit faecher­foermigen Blaettern. Sehr hitzetolerant.",Volles Sonnenlicht,15-35 °C,10,tree|large|sun,,,,, -large,constants/lexiconBatch1.ts,65,Chinesischer Blauregen,Wisteria sinensis,"Der Chinesische Blauregen ist ein ueppiger Kletterkuenstler mit langen, duftenden Bluetentrauben in Lila.",Volles Sonnenlicht,10-25 °C,7,flowering|large|sun,,,,, -low_light,constants/lexiconBatch1.ts,50,Aglaoneme,Aglaonema commutatum,Die Aglaoneme ist eine dekorative Zimmerpflanze mit silbrig-gruen gemusterten Blaettern. Tolerant gegenueber wenig Licht.,Wenig bis helles Licht,15-26 °C,7,easy|patterned|low_light,,,,, -low_light,constants/lexiconBatch2.ts,16,Schusterpflanze,Aspidistra elatior,"Die Schusterpflanze ist eine extrem robuste Zimmerpflanze mit langen, dunkelgruenen Blaettern. Vertraegt tiefe Temperaturen.",Wenig bis helles Licht,10-20 °C,14,easy|low_light,,,,, -low_light,constants/lexiconBatch2.ts,43,Vogelnest-Farn,Asplenium nidus,"Der Vogelnest-Farn hat ganzrandige, glaenzende Wedel, die eine Nestform bilden. Sehr dekorativ und robust.",Helles indirektes Licht,18-27 °C,5,easy|low_light|high_humidity,,,,, -low_light,constants/lexiconBatch2.ts,13,Japanische Aucube,Aucuba japonica,"Die Japanische Aucube hat glaenzende, gruene oder gelbgefleckte Blaetter. Sehr schattenvertraeglich.",Wenig bis helles Licht,10-20 °C,7,easy|low_light,,,,, -low_light,constants/lexiconBatch1.ts,43,Bergpalme,Chamaedorea elegans,Die Bergpalme ist eine kompakte Zimmerpalme fuer schattigere Standorte. Ideal fuer dunkle Innenraeume.,Wenig bis helles Licht,15-25 °C,7,easy|pet_friendly|tree|air_purifier|low_light,air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence,,,, -low_light,constants/lexiconBatch1.ts,48,Dieffenbachie,Dieffenbachia seguine,"Die Dieffenbachie ist eine tropische Blattschmuckpflanze mit grossen, gruen-weiss gefleckten Blaettern.",Helles indirektes Licht,18-26 °C,7,easy|air_purifier|low_light,air_purifier_requires_external_evidence,,,, -low_light,constants/lexiconBatch1.ts,14,Maisstrauch,Dracaena fragrans,"Der Maisstrauch ist eine robuste Zimmerpflanze mit breiten, gestreiften Blaettern. Gedeiht auch bei wenig Licht.",Helles indirektes Licht,15-25 °C,10,easy|tree|air_purifier|low_light,air_purifier_requires_external_evidence,,,, -low_light,constants/lexiconBatch2.ts,12,Fatsia,Fatsia japonica,"Die Fatsia ist ein dekorativer Zimmerstrauch mit grossen, handfoermigen, glaenzenden Blaettern. Sehr robust.",Helles indirektes Licht,10-20 °C,7,easy|low_light,,,,, -low_light,constants/lexiconBatch1.ts,90,Gasteria,Gasteria carinata,"Die Gasteria ist eine kleine Sukkulente mit zweireihig angeordneten, zungenfoermigen, gefleckten Blaettern.",Helles indirektes Licht,15-25 °C,14,easy|succulent|low_light,,,,, -low_light,constants/lexiconBatch1.ts,6,Zebra-Haworthie,Haworthia fasciata,Die Zebra-Haworthie ist eine kompakte Sukkulente mit weissen Querstreifen auf dunkelgruenen Blaettern.,Helles indirektes Licht,15-25 °C,14,easy|succulent|low_light,,,,, -low_light,constants/lexiconBatch1.ts,37,Efeu,Hedera helix,"Efeu ist eine robuste Kletter- und Haengepflanze mit charakteristischen, dreilappigen Blaettern. Sehr langlebig.",Wenig bis helles Licht,10-20 °C,7,easy|hanging|air_purifier|low_light,air_purifier_requires_external_evidence,,,, -low_light,constants/lexiconBatch2.ts,3,Kentia-Palme,Howea forsteriana,"Die Kentia-Palme ist eine der elegantesten Zimmerpalmen mit langen, herabhängenden Fiederblaettern.",Helles indirektes Licht,18-25 °C,7,pet_friendly|tree|low_light,pet_friendly_requires_external_evidence,,,, -low_light,constants/lexiconBatch1.ts,103,Spiegelpeperomie,Peperomia obtusifolia,"Die Spiegelpeperomie hat glaenzende, lederartige, oval-runde Blaetter in tiefem Gruen. Sehr robust.",Helles indirektes Licht,16-26 °C,10,easy|pet_friendly|low_light,pet_friendly_requires_external_evidence,,,, -low_light,constants/lexiconBatch1.ts,15,Herzblatt-Philodendron,Philodendron hederaceum,Der Herzblatt-Philodendron ist eine pflegeleichte Kletter- oder Haengepflanze mit herzfoermigen Blaettern.,Indirektes Licht,18-28 °C,7,easy|hanging|low_light,,,,, -low_light,constants/lexiconBatch2.ts,242,Philodendron Brasil,Philodendron hederaceum Brasil,Philodendron Brasil ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,easy|hanging|low_light,,,,, -low_light,constants/lexiconBatch1.ts,45,Stab-Palme,Rhapis excelsa,"Die Stab-Palme ist eine elegante Zimmerpalme mit faecher­foermigen Blaettern auf duennen, bambusartigen Staemmen.",Helles indirektes Licht,15-25 °C,7,tree|low_light,,,,, -medicinal,constants/lexiconBatch2.ts,108,Schafgarbe,Achillea millefolium,Die Schafgarbe hat weisse oder rosafarbene Bluetenschirme und fein gefiederte Blaetter. Wichtige Heilpflanze.,Volles Sonnenlicht,10-25 °C,7,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, -medicinal,constants/lexiconBatch1.ts,89,Kap-Aloe,Aloe arborescens,"Die Kap-Aloe ist eine strauchige Aloe mit schmalen, gezaehnten Blaettern und leuchtend roten Bluetenaehren im Winter.",Volles Sonnenlicht,10-30 °C,14,easy|succulent|medicinal|sun,medicinal_requires_external_evidence,,,, -medicinal,constants/lexiconBatch2.ts,18,Kap-Aloe (ferox),Aloe ferox,"Aloe ferox ist eine grosse, imposante Aloe mit stachligen, blaugruenen Blaettern und leuchtend roten Bluetenaehren.",Volles Sonnenlicht,10-30 °C,14,succulent|large|medicinal|sun,medicinal_requires_external_evidence,,,, -medicinal,constants/lexiconBatch2.ts,107,Arnika,Arnica montana,Arnika ist eine bekannte Heilpflanze aus den Alpen mit goldgelben Korbbluten. Sie wird fuer Muskeln und Gelenke verwendet.,Volles Sonnenlicht,10-20 °C,7,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, -medicinal,constants/lexiconBatch2.ts,110,Wermut,Artemisia absinthium,"Wermut ist ein stark aromatisches Heilkraut mit silbrig-gruenen, tief eingeschnittenen Blaettern. Fuer Kraeuterlikoere.",Volles Sonnenlicht,10-25 °C,14,medicinal|sun,medicinal_requires_external_evidence,,,, -medicinal,constants/lexiconBatch2.ts,114,Hange-Birke,Betula pendula,Die Haenge-Birke hat charakteristisch weisse Rinde und haengende Zweige. Die Blaetter werden in der Heilkunde genutzt.,Volles Sonnenlicht,10-25 °C,7,tree|large|medicinal,medicinal_requires_external_evidence,,,, -medicinal,constants/lexiconBatch2.ts,187,Ringelblume,Calendula officinalis,"Ringelblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, -medicinal,constants/lexiconBatch2.ts,92,Chili,Capsicum annuum,"Chili ist eine beliebte Gemuese- und Zierpflanze mit leuchtenden, roten oder orangen Fruechten. Im Topf kultivierbar.",Volles Sonnenlicht,20-30 °C,4,easy|medicinal|sun,medicinal_requires_external_evidence,,,, -medicinal,constants/lexiconBatch2.ts,138,Roemische Kamille,Chamaemelum nobile,Roemische Kamille ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|medicinal|sun,medicinal_requires_external_evidence,,,, -medicinal,constants/lexiconBatch2.ts,101,Kamille,Chamomilla recutita,"Die Kamille ist ein beliebtes Heilkraut mit kleinen, weiss-gelben Blueten. Das aetherische Oel wirkt beruhigend.",Volles Sonnenlicht,15-25 °C,5,easy|medicinal|sun,medicinal_requires_external_evidence,,,, -medicinal,constants/lexiconBatch2.ts,160,Maigloeckchen,Convallaria majalis,"Maigloeckchen ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|medicinal,medicinal_requires_external_evidence,,,, -medicinal,constants/lexiconBatch2.ts,74,Kurkuma,Curcuma longa,Kurkuma ist eine tropische Gewuerzpflanze mit breiten Blaettern und leuchtend gelber Wurzel. Wichtiges Heilgewuerz.,Helles bis volles Licht,20-30 °C,7,medicinal|high_humidity,medicinal_requires_external_evidence,,,, -medicinal,constants/lexiconBatch2.ts,109,Roter Fingerhut,Digitalis purpurea,"Der Rote Fingerhut hat hohe Bluetenstaende mit roehrenfoermigen, gepunkteten Blueten in Rosa. Wichtige Arzneipflanze.",Helles bis volles Licht,10-20 °C,7,flowering|medicinal,medicinal_requires_external_evidence,,,, -medicinal,constants/lexiconBatch2.ts,106,Sonnenhut,Echinacea purpurea,"Der Sonnenhut ist eine beliebte Heilpflanze mit grossen, pinkfarbenen Blueten. Er staerkt das Immunsystem.",Helles bis volles Licht,15-25 °C,7,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, -medicinal,constants/lexiconBatch2.ts,210,Eukalyptus,Eucalyptus globulus,Eukalyptus ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|medicinal|sun,medicinal_requires_external_evidence,,,, -medicinal,constants/lexiconBatch2.ts,216,Ginkgo,Ginkgo biloba,Ginkgo ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|medicinal|sun,medicinal_requires_external_evidence,,,, -medicinal,constants/lexiconBatch2.ts,119,Zaubernuss,Hamamelis mollis,"Die Zaubernuss bluet im Winter mit fadendunnen, gelben Bluetenkranzeln, die bis -10 Grad standhalten.",Helles bis volles Licht,10-20 °C,10,flowering|medicinal,medicinal_requires_external_evidence,,,, -medicinal,constants/lexiconBatch2.ts,105,Johanniskraut,Hypericum perforatum,Das Johanniskraut hat leuchtend gelbe Blueten und ist ein wichtiges Heilkraut gegen Depressionen und Stimmungstiefs.,Volles Sonnenlicht,10-25 °C,7,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, -medicinal,constants/lexiconBatch1.ts,23,Echter Lavendel,Lavandula angustifolia,Der Echte Lavendel ist ein aromatischer Halbstrauch mit lilafarbenen Bluetenaehren. Herrlicher Duft.,Volles Sonnenlicht,10-25 °C,10,medicinal|bright_light|sun,medicinal_requires_external_evidence,,,, -medicinal,constants/lexiconBatch2.ts,102,Zitronenmelisse,Melissa officinalis,Die Zitronenmelisse ist ein zitronig duftendes Heilkraut. Sie beruhigt die Nerven und foerdert den Schlaf.,Helles bis volles Licht,15-25 °C,5,easy|medicinal,medicinal_requires_external_evidence,,,, -medicinal,constants/lexiconBatch1.ts,25,Basilikum,Ocimum basilicum,"Basilikum ist das beliebteste Kuechenkraut mit intensiv aromatischen, gruenen Blaettern. Fuer Pesto verwendet.",Volles Sonnenlicht,18-30 °C,2,easy|medicinal|sun,medicinal_requires_external_evidence,,,, -medicinal,constants/lexiconBatch1.ts,28,Oregano,Origanum vulgare,"Oregano ist ein aromatisches Kuechenkraut mit runden, behaarten Blaettern. In mediterraner Kueche beliebt.",Volles Sonnenlicht,15-25 °C,7,easy|medicinal|sun,medicinal_requires_external_evidence,,,, -medicinal,constants/lexiconBatch1.ts,31,Rosengeranie,Pelargonium graveolens,Die Rosengeranie ist eine Duftpflanze mit tief eingeschnittenen Blaettern und rosaenlichem Aroma.,Volles Sonnenlicht,15-25 °C,7,easy|medicinal|sun,medicinal_requires_external_evidence,,,, -medicinal,constants/lexiconBatch1.ts,24,Rosmarin,Rosmarinus officinalis,Rosmarin ist ein aromatisches Kraut mit nadelartigen Blaettern und blauen Blueten. In der Kueche unverzichtbar.,Volles Sonnenlicht,10-25 °C,7,easy|medicinal|sun,medicinal_requires_external_evidence,,,, -medicinal,constants/lexiconBatch2.ts,113,Silber-Weide,Salix alba,"Die Silber-Weide hat silbrig-glaenzende Blaetter. Weidenrinde enthält Salicylsaeure, die Grundlage von Aspirin.",Helles bis volles Licht,10-25 °C,7,tree|large|medicinal,medicinal_requires_external_evidence,,,, -medicinal,constants/lexiconBatch2.ts,103,Salbei,Salvia officinalis,Salbei ist ein aromatisches Heilkraut mit silbrig-gruenen Blaettern. Er hat antibakterielle und entzuendungshem­mende Wirkung.,Volles Sonnenlicht,10-25 °C,7,easy|medicinal|sun,medicinal_requires_external_evidence,,,, -medicinal,constants/lexiconBatch2.ts,112,Schwarzer Holunder,Sambucus nigra,Der Schwarze Holunder hat weisse Doldenbluten und schwarze Beeren. Die Fruechte werden fuer Sirup und Saft verwendet.,Helles bis volles Licht,10-25 °C,7,flowering|tree|medicinal,medicinal_requires_external_evidence,,,, -medicinal,constants/lexiconBatch1.ts,27,Thymian,Thymus vulgaris,"Thymian ist ein kleiner, aromatischer Strauch mit winzigen Blaettern und rosa Blueten. Wichtiges Kuechenkraut.",Volles Sonnenlicht,10-25 °C,7,easy|medicinal|sun,medicinal_requires_external_evidence,,,, -medicinal,constants/lexiconBatch2.ts,111,Grosse Brennessel,Urtica dioica,Die Grosse Brennessel ist eine Heilpflanze mit brennenden Haaren. Die Blaetter sind reich an Vitaminen und Mineralien.,Helles bis volles Licht,10-25 °C,7,medicinal,medicinal_requires_external_evidence,,,, -medicinal,constants/lexiconBatch2.ts,104,Baldrian,Valeriana officinalis,Baldrian ist ein bekanntes Heilkraut mit weissen bis roeslichen Blueten. Die Wurzeln werden zur Schlaffoerderung verwendet.,Helles bis volles Licht,15-25 °C,7,flowering|medicinal,medicinal_requires_external_evidence,,,, -medicinal,constants/lexiconBatch2.ts,192,Koenigskerze,Verbascum thapsus,"Koenigskerze ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, -medicinal,constants/lexiconBatch2.ts,75,Ingwer,Zingiber officinale,Ingwer ist eine tropische Gewuerzpflanze mit aromatischen Knollen. Die Blaetter sind schilfartig.,Helles indirektes Licht,20-30 °C,5,medicinal|high_humidity,medicinal_requires_external_evidence,,,, -patterned,constants/lexiconBatch2.ts,34,Silbervase,Aechmea fasciata,Die Silbervase ist eine Bromelie mit silbrig gebänderten Blaettern und einem rosafarbenen Bluetenstand.,Helles indirektes Licht,18-25 °C,10,flowering|patterned,,,,, -patterned,constants/lexiconBatch1.ts,50,Aglaoneme,Aglaonema commutatum,Die Aglaoneme ist eine dekorative Zimmerpflanze mit silbrig-gruen gemusterten Blaettern. Tolerant gegenueber wenig Licht.,Wenig bis helles Licht,15-26 °C,7,easy|patterned|low_light,,,,, -patterned,constants/lexiconBatch1.ts,46,Amazona-Taro,Alocasia amazonica,"Der Amazona-Taro besticht mit dunkelgruenen, pfeilfoermigen Blaettern mit markant weissen Rippen.",Indirektes Licht,18-27 °C,5,patterned|large|high_humidity,,,,, -patterned,constants/lexiconBatch2.ts,233,Samt-Anthurie,Anthurium clarinervium,Samt-Anthurie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5,patterned|high_humidity,,,,, -patterned,constants/lexiconBatch2.ts,234,Kristall-Anthurie,Anthurium crystallinum,Kristall-Anthurie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5,patterned|high_humidity,,,,, -patterned,constants/lexiconBatch2.ts,57,Forellen-Begonie,Begonia maculata,Die Forellen-Begonie hat olivgruene Blaetter mit silbernen Punkten und einer roten Unterseite. Atemberaubend.,Helles indirektes Licht,18-27 °C,7,patterned|high_humidity,,,,, -patterned,constants/lexiconBatch1.ts,18,Koenigsbegonie,Begonia rex,"Die Koenigsbegonie beeindruckt mit prachtvoll gemusterten Blaettern in Silber, Rot und Gruen.",Indirektes Licht,18-25 °C,5,patterned|high_humidity,,,,, -patterned,constants/lexiconBatch1.ts,49,Buntblatt,Caladium bicolor,"Das Buntblatt beeindruckt mit transparenten, bunt gemusterten Blaettern in Pink, Rot, Weiss und Gruen.",Indirektes Licht,20-30 °C,5,patterned|high_humidity,,,,, -patterned,constants/lexiconBatch1.ts,99,Herzkette,Ceropegia woodii,"Die Herzkette hat duenne, haengende Ranken mit herzfoermigen, silbergrau gemusterten Blaettchen.",Helles indirektes Licht,15-27 °C,14,easy|succulent|patterned|hanging,,,,, -patterned,constants/lexiconBatch2.ts,224,Kroton,Codiaeum variegatum,Kroton ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,patterned|bright_light,,,,, -patterned,constants/lexiconBatch2.ts,39,Cryptanthus,Cryptanthus bivittatus,Cryptanthus ist eine niedrig wachsende Bromelie mit sternfoermigen Rosetten und gemusterten Blaettern. Fuer Terrarien.,Helles indirektes Licht,18-27 °C,7,patterned|high_humidity,,,,, -patterned,constants/lexiconBatch1.ts,53,Ctenanthe,Ctenanthe burle-marxii,Die Ctenanthe hat faszinierend gemusterte Blaetter mit dunkelgruunem Fischgraetenmuster auf hellgruunem Hintergrund.,Indirektes Licht,18-25 °C,5,patterned|high_humidity,,,,, -patterned,constants/lexiconBatch2.ts,226,Nervenpflanze,Fittonia albivenis,Nervenpflanze ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5,patterned|high_humidity,,,,, -patterned,constants/lexiconBatch2.ts,240,Calathea lancifolia,Goeppertia insignis,Calathea lancifolia ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5,pet_friendly|patterned|high_humidity,pet_friendly_requires_external_evidence,,,, -patterned,constants/lexiconBatch2.ts,241,Calathea ornata,Goeppertia ornata,Calathea ornata ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5,pet_friendly|patterned|high_humidity,pet_friendly_requires_external_evidence,,,, -patterned,constants/lexiconBatch2.ts,227,Punktblatt,Hypoestes phyllostachya,Punktblatt ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,patterned|bright_light,,,,, -patterned,constants/lexiconBatch1.ts,51,Gebet-Pflanze,Maranta leuconeura,Die Gebet-Pflanze faltet ihre gemusterten Blaetter nachts wie Haende zusammen. Faszinierende rote und gruene Muster.,Indirektes Licht,18-27 °C,5,pet_friendly|patterned|high_humidity,pet_friendly_requires_external_evidence,,,, -patterned,constants/lexiconBatch2.ts,48,Monstera obliqua,Monstera obliqua,"Monstera obliqua ist eine seltene Monstera-Art mit filigranen Blaettern, die hauptsaechlich aus Lochern bestehen.",Helles indirektes Licht,18-27 °C,7,patterned|hanging,,,,, -patterned,constants/lexiconBatch2.ts,37,Neoregelia,Neoregelia carolinae,"Die Neoregelia ist eine Bromelie, bei der das Herzblatt zur Bluetzeit leuchtend rot wird. Sehr dekorativ.",Helles bis volles Licht,18-27 °C,7,flowering|patterned|bright_light,,,,, -patterned,constants/lexiconBatch1.ts,54,Kleeblume,Oxalis triangularis,"Die Kleeblume hat tiefviolette, dreieckige Blaetter und zarte rosa Blueten. Sie faltet die Blaetter bei Dunkelheit.",Helles indirektes Licht,15-24 °C,7,flowering|patterned,,,,, -patterned,constants/lexiconBatch2.ts,6,Schraubenbaum,Pandanus veitchii,"Der Schraubenbaum hat spiralfoermig angeordnete, gruenweiss gestreifte Blaetter. Sehr dekorativ und exotisch.",Helles bis volles Licht,18-27 °C,7,patterned|bright_light,,,,, -patterned,constants/lexiconBatch2.ts,229,Wassermelonen-Peperomie,Peperomia argyreia,Wassermelonen-Peperomie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,pet_friendly|patterned,pet_friendly_requires_external_evidence,,,, -patterned,constants/lexiconBatch2.ts,243,Philodendron Pink Princess,Philodendron erubescens Pink Princess,Philodendron Pink Princess ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,patterned|bright_light,,,,, -patterned,constants/lexiconBatch2.ts,49,Philodendron gloriosum,Philodendron gloriosum,"Philodendron gloriosum hat grosse, samtige, herzfoermige Blaetter mit weissen Rippen. Eine atemberaubende Pflanze.",Helles indirektes Licht,18-27 °C,7,patterned|large|high_humidity,,,,, -patterned,constants/lexiconBatch2.ts,228,Aluminium-Pflanze,Pilea cadierei,Aluminium-Pflanze ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,easy|pet_friendly|patterned,pet_friendly_requires_external_evidence,,,, -patterned,constants/lexiconBatch2.ts,152,Buntnessel,Plectranthus scutellarioides,"Buntnessel ist eine farbstarke Zierpflanze, die vor allem fuer ihr dekoratives Laub beliebt ist.",Volles bis helles Licht,10-24 C,4,patterned|bright_light,,,,, -patterned,constants/lexiconBatch1.ts,55,Satinpothos,Scindapsus pictus,"Der Satinpothos hat samtig-glaenzende, silbrig gefleckte Blaetter auf langen, haengenden Ranken.",Helles indirektes Licht,18-28 °C,7,easy|patterned|hanging,,,,, -patterned,constants/lexiconBatch2.ts,45,Regenbogenmoos,Selaginella uncinata,"Das Regenbogenmoos hat schuppenfoermige Blaetter, die im Licht schillernd irisieren. Dekorativ fuer Terrarien.",Helles indirektes Licht,18-27 °C,5,patterned|high_humidity,,,,, -patterned,constants/lexiconBatch1.ts,52,Stromanthe,Stromanthe sanguinea,Die Stromanthe hat dekorative Blaetter mit weissem Muster und leuchtend roter Unterseite. Familie der Marantaceen.,Helles indirektes Licht,18-25 °C,5,patterned|high_humidity,,,,, -patterned,constants/lexiconBatch1.ts,17,Zebrakraut,Tradescantia zebrina,Das Zebrakraut faellt durch seine silbrig-lila gestreiften Blaetter auf. Schnellwachsende Haengepflanze.,Helles indirektes Licht,15-25 °C,5,easy|patterned|hanging,,,,, -patterned,constants/lexiconBatch2.ts,35,Flammen-Bromelie,Vriesea splendens,"Die Flammen-Bromelie hat gebänderte, dunkelgruene Blaetter und einen spektakulaeren, roten Bluetenstand.",Helles indirektes Licht,18-25 °C,7,flowering|patterned|high_humidity,,,,, -pet_friendly,constants/lexiconBatch1.ts,43,Bergpalme,Chamaedorea elegans,Die Bergpalme ist eine kompakte Zimmerpalme fuer schattigere Standorte. Ideal fuer dunkle Innenraeume.,Wenig bis helles Licht,15-25 °C,7,easy|pet_friendly|tree|air_purifier|low_light,air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence,,,, -pet_friendly,constants/lexiconBatch1.ts,42,Goldfruchtpalme,Dypsis lutescens,Die Goldfruchtpalme ist eine elegante Zimmerpalme mit gelblich-gruenen Stielen und gefiederten Wedeln.,Helles indirektes Licht,18-27 °C,5,pet_friendly|tree|air_purifier,air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence,,,, -pet_friendly,constants/lexiconBatch2.ts,100,Erdbeere,Fragaria ananassa,"Die Erdbeere ist ein beliebtes Obst fuer Balkon und Terrasse mit aromatischen, roten Fruechten.",Helles bis volles Licht,15-25 °C,3,easy|pet_friendly|sun,pet_friendly_requires_external_evidence,,,, -pet_friendly,constants/lexiconBatch2.ts,240,Calathea lancifolia,Goeppertia insignis,Calathea lancifolia ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5,pet_friendly|patterned|high_humidity,pet_friendly_requires_external_evidence,,,, -pet_friendly,constants/lexiconBatch2.ts,241,Calathea ornata,Goeppertia ornata,Calathea ornata ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5,pet_friendly|patterned|high_humidity,pet_friendly_requires_external_evidence,,,, -pet_friendly,constants/lexiconBatch2.ts,3,Kentia-Palme,Howea forsteriana,"Die Kentia-Palme ist eine der elegantesten Zimmerpalmen mit langen, herabhängenden Fiederblaettern.",Helles indirektes Licht,18-25 °C,7,pet_friendly|tree|low_light,pet_friendly_requires_external_evidence,,,, -pet_friendly,constants/lexiconBatch1.ts,51,Gebet-Pflanze,Maranta leuconeura,Die Gebet-Pflanze faltet ihre gemusterten Blaetter nachts wie Haende zusammen. Faszinierende rote und gruene Muster.,Indirektes Licht,18-27 °C,5,pet_friendly|patterned|high_humidity,pet_friendly_requires_external_evidence,,,, -pet_friendly,constants/lexiconBatch2.ts,229,Wassermelonen-Peperomie,Peperomia argyreia,Wassermelonen-Peperomie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,pet_friendly|patterned,pet_friendly_requires_external_evidence,,,, -pet_friendly,constants/lexiconBatch1.ts,102,Rippenpeperomie,Peperomia caperata,"Die Rippenpeperomie hat tief gerippte, dunkelgruene bis violette Blaetter mit einer samtigen Textur.",Helles indirektes Licht,18-26 °C,10,easy|pet_friendly,pet_friendly_requires_external_evidence,,,, -pet_friendly,constants/lexiconBatch1.ts,103,Spiegelpeperomie,Peperomia obtusifolia,"Die Spiegelpeperomie hat glaenzende, lederartige, oval-runde Blaetter in tiefem Gruen. Sehr robust.",Helles indirektes Licht,16-26 °C,10,easy|pet_friendly|low_light,pet_friendly_requires_external_evidence,,,, -pet_friendly,constants/lexiconBatch2.ts,230,Raindrop-Peperomie,Peperomia polybotrya,Raindrop-Peperomie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,easy|pet_friendly,pet_friendly_requires_external_evidence,,,, -pet_friendly,constants/lexiconBatch1.ts,34,Petunie,Petunia hybrida,Die Petunie ist eine der beliebtesten Balkonpflanzen mit trichterfoermigen Blueten in unzaehligen Farben.,Volles Sonnenlicht,15-25 °C,2,easy|pet_friendly|flowering|sun,pet_friendly_requires_external_evidence,,,, -pet_friendly,constants/lexiconBatch2.ts,228,Aluminium-Pflanze,Pilea cadierei,Aluminium-Pflanze ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,easy|pet_friendly|patterned,pet_friendly_requires_external_evidence,,,, -pet_friendly,constants/lexiconBatch1.ts,2,Ufopflanze,Pilea peperomioides,"Die Ufopflanze hat unverwechselbare, runde Blaetter auf langen Stielen. Bildet leicht Ableger zum Verschenken.",Helles indirektes Licht,13-30 °C,7,easy|pet_friendly,pet_friendly_requires_external_evidence,,,, -pet_friendly,constants/lexiconBatch2.ts,238,Bubikopf,Soleirolia soleirolii,Bubikopf ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,15-24 C,4,pet_friendly|high_humidity,pet_friendly_requires_external_evidence,,,, -succulent,constants/lexiconBatch1.ts,86,Wuestenrose,Adenium obesum,Die Wuestenrose ist eine sukkulente Zimmerpflanze mit dickem Stamm und leuchtend pinken Blueten.,Volles Sonnenlicht,20-35 °C,10,flowering|succulent|sun,,,,, -succulent,constants/lexiconBatch2.ts,117,Socotra-Wuestenrose,Adenium socotranum,"Die Socotra-Wuestenrose ist eine seltene, endemische Art mit einem sehr dicken, knolligen Stamm und rosa Blueten.",Volles Sonnenlicht,20-35 °C,14,flowering|succulent|sun,,,,, -succulent,constants/lexiconBatch2.ts,31,Adromischus,Adromischus cristatus,Adromischus ist eine kompakte Sukkulente mit ungewoehnlich wellenrandigen Blaettern auf kurzen Staengeln.,Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, -succulent,constants/lexiconBatch1.ts,10,Schwarze Rose (Aeonium),Aeonium arboreum,"Das Aeonium bildet dekorative, rosettenfoermige Sukkulenten an verzweigten Stielen.",Volles Sonnenlicht,10-25 °C,10,succulent|sun,,,,, -succulent,constants/lexiconBatch1.ts,11,Agave,Agave americana,"Die Agave ist eine imposante Sukkulente mit steifen, blaugruenen Blaettern mit Stacheln. Sie bluet nur einmal.",Volles Sonnenlicht,10-35 °C,21,succulent|large|sun,,,,, -succulent,constants/lexiconBatch1.ts,89,Kap-Aloe,Aloe arborescens,"Die Kap-Aloe ist eine strauchige Aloe mit schmalen, gezaehnten Blaettern und leuchtend roten Bluetenaehren im Winter.",Volles Sonnenlicht,10-30 °C,14,easy|succulent|medicinal|sun,medicinal_requires_external_evidence,,,, -succulent,constants/lexiconBatch2.ts,18,Kap-Aloe (ferox),Aloe ferox,"Aloe ferox ist eine grosse, imposante Aloe mit stachligen, blaugruenen Blaettern und leuchtend roten Bluetenaehren.",Volles Sonnenlicht,10-30 °C,14,succulent|large|medicinal|sun,medicinal_requires_external_evidence,,,, -succulent,constants/lexiconBatch1.ts,41,Pferdeschwanzpalme,Beaucarnea recurvata,"Die Pferdeschwanzpalme hat einen verdickten Stammbasis als Wasserspeicher und lange, schmale Blaetter.",Volles Sonnenlicht,15-30 °C,21,easy|succulent|tree|sun,,,,, -succulent,constants/lexiconBatch1.ts,81,Peruanischer Fackelkaktus,Cereus peruvianus,"Der Peruanische Fackelkaktus ist ein saeulenfoermiger Kaktus, der im Innenraum bis zu 2 m hoch werden kann.",Volles Sonnenlicht,15-35 °C,21,easy|succulent|large|sun,,,,, -succulent,constants/lexiconBatch1.ts,99,Herzkette,Ceropegia woodii,"Die Herzkette hat duenne, haengende Ranken mit herzfoermigen, silbergrau gemusterten Blaettchen.",Helles indirektes Licht,15-27 °C,14,easy|succulent|patterned|hanging,,,,, -succulent,constants/lexiconBatch2.ts,24,Konophytum,Conophytum calculus,"Das Konophytum ist eine sehr kompakte Sukkulente, die zwei Blaetter zu einer kugelfoermigen Form verschmilzt.",Volles Sonnenlicht,10-25 °C,21,succulent|sun,,,,, -succulent,constants/lexiconBatch2.ts,29,Kotyledon,Cotyledon orbiculata,"Kotyledon hat dickfleischige, runde Blaetter mit einem mehligen, weisslichen Belag. Sehr trockenheitsresistent.",Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, -succulent,constants/lexiconBatch2.ts,26,Moos-Crassula,Crassula muscosa,"Die Moos-Crassula hat dicht aneinandergereihte, winzige gruene Blaetter auf unverzweigten Trieben. Sieht aus wie Moos.",Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, -succulent,constants/lexiconBatch1.ts,5,Jadepflanze,Crassula ovata,"Die Jadepflanze ist eine langlebige Sukkulente mit dicken, ovalen Blaettern. In Japan gilt sie als Gluecksbringer.",Helles bis volles Licht,15-24 °C,14,easy|succulent|sun,,,,, -succulent,constants/lexiconBatch2.ts,236,String of Bananas,Curio radicans,String of Bananas ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles bis volles Licht,18-30 C,10,succulent|hanging|sun,,,,, -succulent,constants/lexiconBatch2.ts,237,String of Dolphins,Curio x peregrinus,String of Dolphins ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles bis volles Licht,18-30 C,10,succulent|hanging|sun,,,,, -succulent,constants/lexiconBatch1.ts,101,Dischidia,Dischidia ruscifolia,"Die Dischidia ist eine epiphytische Haengepflanze mit kleinen, runden Blaettern entlang duenner Ranken.",Helles indirektes Licht,18-27 °C,7,succulent|hanging,,,,, -succulent,constants/lexiconBatch2.ts,30,Dudleya,Dudleya brittonii,"Dudleya ist eine rosetten­bildende Sukkulente mit silbrig-weissen, mehligen Blaettern. Sehr elegant.",Volles Sonnenlicht,10-25 °C,14,easy|succulent|sun,,,,, -succulent,constants/lexiconBatch1.ts,4,Echeverie,Echeveria elegans,"Die Echeverie bildet symmetrische, rosettenfoermige Sukkulenten mit blaugruenen Blaettern. Pflegeleicht.",Volles Sonnenlicht,15-25 °C,14,easy|succulent|sun,,,,, -succulent,constants/lexiconBatch1.ts,77,Goldene Tonne,Echinocactus grusonii,Die Goldene Tonne ist ein ikonischer kugelfoermiger Kaktus mit goldgelben Stacheln. Waechst langsam aber imposant.,Volles Sonnenlicht,15-35 °C,21,easy|succulent|sun,,,,, -succulent,constants/lexiconBatch1.ts,83,San-Pedro-Kaktus,Echinopsis pachanoi,"Der San-Pedro-Kaktus ist ein schnell wachsender, saeulenfoermiger Kaktus aus den Anden.",Volles Sonnenlicht,10-35 °C,14,easy|succulent|sun,,,,, -succulent,constants/lexiconBatch1.ts,84,Koenigin der Nacht,Epiphyllum oxypetalum,"Die Koenigin der Nacht bluet nur eine einzige Nacht lang mit riesigen, intensiv duftenden weissen Blueten.",Indirektes Licht,18-27 °C,7,flowering|succulent,,,,, -succulent,constants/lexiconBatch2.ts,19,Christusdorn,Euphorbia milii,Der Christusdorn ist eine sukkulente Wolfsmilch mit stacheligen Zweigen und kleinen roten oder gelben Hochblaettern.,Helles bis volles Licht,15-28 °C,10,easy|flowering|succulent|sun,,,,, -succulent,constants/lexiconBatch1.ts,12,Bleistiftkaktus,Euphorbia tirucalli,"Der Bleistiftkaktus ist eine sukkulente Wolfsmilch mit duennen, zylindrischen Zweigen ohne Blaetter.",Volles Sonnenlicht,18-30 °C,14,easy|succulent|sun,,,,, -succulent,constants/lexiconBatch1.ts,78,Fass-Kaktus,Ferocactus cylindraceus,"Der Fass-Kaktus ist ein zylindrischer Wuestenkaktus mit langen, roten Stacheln. Sehr langlebig.",Volles Sonnenlicht,15-35 °C,21,easy|succulent|sun,,,,, -succulent,constants/lexiconBatch1.ts,90,Gasteria,Gasteria carinata,"Die Gasteria ist eine kleine Sukkulente mit zweireihig angeordneten, zungenfoermigen, gefleckten Blaettern.",Helles indirektes Licht,15-25 °C,14,easy|succulent|low_light,,,,, -succulent,constants/lexiconBatch1.ts,87,Geisterpflanze,Graptopetalum paraguayense,"Die Geisterpflanze hat zartgraue bis perlmutt-rosafarbene, rosettenfoermige Blaetter. Sehr robuste Sukkulente.",Volles Sonnenlicht,15-25 °C,14,easy|succulent|sun,,,,, -succulent,constants/lexiconBatch1.ts,80,Mond-Kaktus,Gymnocalycium mihanovichii,Der Mond-Kaktus ist eine farbenfrohe Veredelung eines chlorophylllosen Kaktus auf einem gruenen Unterlagekaktus.,Indirektes Licht,15-30 °C,14,easy|succulent,,,,, -succulent,constants/lexiconBatch1.ts,6,Zebra-Haworthie,Haworthia fasciata,Die Zebra-Haworthie ist eine kompakte Sukkulente mit weissen Querstreifen auf dunkelgruenen Blaettern.,Helles indirektes Licht,15-25 °C,14,easy|succulent|low_light,,,,, -succulent,constants/lexiconBatch1.ts,58,Kleine Wachsblume,Hoya bella,"Die Kleine Wachsblume traegt zierliche, sternfoermige weisse Blueten mit rosa Mitte. Haengende Sukkulente.",Helles indirektes Licht,18-27 °C,10,flowering|succulent|hanging,,,,, -succulent,constants/lexiconBatch1.ts,57,Wachsblume,Hoya carnosa,"Die Wachsblume ist eine Kletterpflanze mit dicken, wachsartigen Blaettern und sternfoermigen, duftenden Blueten.",Helles indirektes Licht,16-27 °C,10,easy|flowering|succulent|hanging,,,,, -succulent,constants/lexiconBatch1.ts,9,Kalanchoe,Kalanchoe blossfeldiana,"Die Kalanchoe ist eine beliebte Bluehpflanze mit leuchtenden Blueten in Rot, Orange, Gelb oder Rosa.",Helles bis volles Licht,15-25 °C,10,easy|flowering|succulent|sun,,,,, -succulent,constants/lexiconBatch2.ts,22,Brutblatt,Kalanchoe daigremontiana,Das Brutblatt bildet entlang des Blattrandes zahlreiche kleine Jungpflanzen. Eine faszinierende Sukkulente.,Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, -succulent,constants/lexiconBatch2.ts,21,Kaninchen-Ohren,Kalanchoe tomentosa,"Kaninchen-Ohren haben weisslich-filzige Blaetter mit braunen Raendern, die Kaninchen­ohren aehneln. Sehr dekorativ.",Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, -succulent,constants/lexiconBatch2.ts,23,Lebende Steine,Lithops julii,"Lebende Steine sind faszinierende Mimikry-Sukkulenten, die Kieselsteinen taeuschen aehnlich sehen. Sehr trockenheitsresistent.",Volles Sonnenlicht,10-30 °C,21,succulent|sun,,,,, -succulent,constants/lexiconBatch1.ts,79,Mammillaria,Mammillaria zeilmanniana,"Die Mammillaria ist ein kompakter, kugelfoermiger Kaktus, der im Fruehling einen Kranz aus rosa Blueten traegt.",Volles Sonnenlicht,15-35 °C,14,easy|flowering|succulent|sun,,,,, -succulent,constants/lexiconBatch1.ts,82,Hasenohren-Kaktus,Opuntia microdasys,"Der Hasenohren-Kaktus hat flache, ovale Triebe mit dichten weissen Glochiden. Klassischer Zimmerkaktus.",Volles Sonnenlicht,10-35 °C,21,easy|succulent|sun,,,,, -succulent,constants/lexiconBatch1.ts,88,Mondstein-Pflanze,Pachyphytum oviferum,"Die Mondstein-Pflanze hat dicke, ovale Blaetter mit einem pastellrosafarbenen, mehligen Ueberzug.",Volles Sonnenlicht,15-25 °C,14,easy|succulent|sun,,,,, -succulent,constants/lexiconBatch2.ts,27,Speckbaum,Portulacaria afra,"Der Speckbaum ist eine sukkulente Pflanze mit roten Stielen und kleinen, runden, glaenzenden Blaettern.",Helles bis volles Licht,15-30 °C,14,easy|succulent|sun,,,,, -succulent,constants/lexiconBatch1.ts,85,Korallenkaktus,Rhipsalis baccifera,"Der Korallenkaktus ist ein epiphytischer Kaktus mit duennen, haengenden Trieben und kleinen weissen Beeren.",Indirektes Licht,18-27 °C,7,succulent|hanging,,,,, -succulent,constants/lexiconBatch2.ts,17,Zylindrischer Bogenhanf,Sansevieria cylindrica,"Der Zylindrische Bogenhanf hat zylindrische, aufrechte Blaetter, die sich nach oben verjuengen. Sehr pflegeleicht.",Helles bis volles Licht,15-27 °C,14,easy|succulent|sun,,,,, -succulent,constants/lexiconBatch1.ts,8,Weihnachtskaktus,Schlumbergera truncata,"Der Weihnachtskaktus erfreut zur Weihnachtszeit mit leuchtenden Blueten in Rosa, Rot oder Weiss.",Helles indirektes Licht,15-21 °C,7,easy|flowering|succulent,,,,, -succulent,constants/lexiconBatch1.ts,7,Eselschwanz,Sedum morganianum,"Der Eselschwanz ist eine haengende Sukkulente mit langen Trieben aus dichten, blaugruenen Blaettchen.",Volles Sonnenlicht,15-25 °C,14,easy|succulent|hanging|sun,,,,, -succulent,constants/lexiconBatch1.ts,100,Perlenschnur-Pflanze,Senecio rowleyanus,"Die Perlenschnur-Pflanze hat haengende Ranken mit kugelfoermigen, perlenaehnlichen Blaettern. Einzigartige Sukkulente.",Helles bis volles Licht,15-27 °C,14,easy|succulent|hanging,,,,, -succulent,constants/lexiconBatch2.ts,28,Blauer Kreuzkraut,Senecio serpens,"Der Blaue Kreuzkraut hat zylindrische, blaublaugruene Blaetter und einen kriechenden Wuchs. Sehr dekorativ.",Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, -succulent,constants/lexiconBatch2.ts,25,Aasblume,Stapelia grandiflora,"Die Aasblume hat fleischige, gruene Staengel und riesige, sternfoermige Blueten mit aasartigem Duft.",Helles bis volles Licht,18-30 °C,14,flowering|succulent|sun,,,,, -sun,constants/lexiconBatch2.ts,212,Spitzahorn,Acer platanoides,Spitzahorn ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, -sun,constants/lexiconBatch2.ts,108,Schafgarbe,Achillea millefolium,Die Schafgarbe hat weisse oder rosafarbene Bluetenschirme und fein gefiederte Blaetter. Wichtige Heilpflanze.,Volles Sonnenlicht,10-25 °C,7,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, -sun,constants/lexiconBatch1.ts,86,Wuestenrose,Adenium obesum,Die Wuestenrose ist eine sukkulente Zimmerpflanze mit dickem Stamm und leuchtend pinken Blueten.,Volles Sonnenlicht,20-35 °C,10,flowering|succulent|sun,,,,, -sun,constants/lexiconBatch2.ts,117,Socotra-Wuestenrose,Adenium socotranum,"Die Socotra-Wuestenrose ist eine seltene, endemische Art mit einem sehr dicken, knolligen Stamm und rosa Blueten.",Volles Sonnenlicht,20-35 °C,14,flowering|succulent|sun,,,,, -sun,constants/lexiconBatch2.ts,31,Adromischus,Adromischus cristatus,Adromischus ist eine kompakte Sukkulente mit ungewoehnlich wellenrandigen Blaettern auf kurzen Staengeln.,Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, -sun,constants/lexiconBatch1.ts,10,Schwarze Rose (Aeonium),Aeonium arboreum,"Das Aeonium bildet dekorative, rosettenfoermige Sukkulenten an verzweigten Stielen.",Volles Sonnenlicht,10-25 °C,10,succulent|sun,,,,, -sun,constants/lexiconBatch1.ts,11,Agave,Agave americana,"Die Agave ist eine imposante Sukkulente mit steifen, blaugruenen Blaettern mit Stacheln. Sie bluet nur einmal.",Volles Sonnenlicht,10-35 °C,21,succulent|large|sun,,,,, -sun,constants/lexiconBatch2.ts,155,Stockrose,Alcea rosea,"Stockrose ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,135,Schnittknoblauch,Allium tuberosum,Schnittknoblauch ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -sun,constants/lexiconBatch1.ts,89,Kap-Aloe,Aloe arborescens,"Die Kap-Aloe ist eine strauchige Aloe mit schmalen, gezaehnten Blaettern und leuchtend roten Bluetenaehren im Winter.",Volles Sonnenlicht,10-30 °C,14,easy|succulent|medicinal|sun,medicinal_requires_external_evidence,,,, -sun,constants/lexiconBatch2.ts,18,Kap-Aloe (ferox),Aloe ferox,"Aloe ferox ist eine grosse, imposante Aloe mit stachligen, blaugruenen Blaettern und leuchtend roten Bluetenaehren.",Volles Sonnenlicht,10-30 °C,14,succulent|large|medicinal|sun,medicinal_requires_external_evidence,,,, -sun,constants/lexiconBatch2.ts,128,Zitronenverbene,Aloysia citrodora,Zitronenverbene ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -sun,constants/lexiconBatch2.ts,194,Fuchsschwanz,Amaranthus caudatus,"Fuchsschwanz ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,163,Anemone,Anemone coronaria,"Anemone ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,140,Dill,Anethum graveolens,Dill ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -sun,constants/lexiconBatch2.ts,125,Kerbel,Anthriscus cerefolium,Kerbel ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -sun,constants/lexiconBatch2.ts,147,Loewenmaeulchen,Antirrhinum majus,"Loewenmaeulchen ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,107,Arnika,Arnica montana,Arnika ist eine bekannte Heilpflanze aus den Alpen mit goldgelben Korbbluten. Sie wird fuer Muskeln und Gelenke verwendet.,Volles Sonnenlicht,10-20 °C,7,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, -sun,constants/lexiconBatch2.ts,110,Wermut,Artemisia absinthium,"Wermut ist ein stark aromatisches Heilkraut mit silbrig-gruenen, tief eingeschnittenen Blaettern. Fuer Kraeuterlikoere.",Volles Sonnenlicht,10-25 °C,14,medicinal|sun,medicinal_requires_external_evidence,,,, -sun,constants/lexiconBatch2.ts,122,Estragon,Artemisia dracunculus,Estragon ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -sun,constants/lexiconBatch2.ts,178,Seidenpflanze,Asclepias tuberosa,"Seidenpflanze ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch1.ts,41,Pferdeschwanzpalme,Beaucarnea recurvata,"Die Pferdeschwanzpalme hat einen verdickten Stammbasis als Wasserspeicher und lange, schmale Blaetter.",Volles Sonnenlicht,15-30 °C,21,easy|succulent|tree|sun,,,,, -sun,constants/lexiconBatch2.ts,145,Gaensebluemchen,Bellis perennis,"Gaensebluemchen ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,129,Borretsch,Borago officinalis,Borretsch ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -sun,constants/lexiconBatch1.ts,62,Bougainvillea,Bougainvillea spectabilis,"Die Bougainvillea ist eine rankenreiche Kletterpflanze mit leuchtend farbigen Hochblaettern in Rot, Orange oder Pink.",Volles Sonnenlicht,18-30 °C,5,flowering|bright_light|sun,,,,, -sun,constants/lexiconBatch2.ts,223,Schmetterlingsflieder,Buddleja davidii,Schmetterlingsflieder ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|sun,,,,, -sun,constants/lexiconBatch2.ts,202,Buchsbaum,Buxus sempervirens,Buchsbaum ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|sun,,,,, -sun,constants/lexiconBatch2.ts,187,Ringelblume,Calendula officinalis,"Ringelblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, -sun,constants/lexiconBatch2.ts,63,Calibrachoa,Calibrachoa hybrida,"Calibrachoa ist eine petunienaehnliche Haengepflanze mit unzaehligen, kleinen Trichterbluten in allen Farben.",Volles Sonnenlicht,15-25 °C,2,easy|flowering|hanging|sun,,,,, -sun,constants/lexiconBatch2.ts,67,Blumenschilfrohr,Canna indica,"Das Blumenschilfrohr hat grosse, tropisch wirkende Blaetter und auffaellige Blueten in Rot, Orange oder Gelb.",Volles Sonnenlicht,18-28 °C,5,flowering|large|sun,,,,, -sun,constants/lexiconBatch2.ts,92,Chili,Capsicum annuum,"Chili ist eine beliebte Gemuese- und Zierpflanze mit leuchtenden, roten oder orangen Fruechten. Im Topf kultivierbar.",Volles Sonnenlicht,20-30 °C,4,easy|medicinal|sun,medicinal_requires_external_evidence,,,, -sun,constants/lexiconBatch2.ts,90,Papaya,Carica papaya,"Die Papaya ist eine tropische Fruchtpflanze mit grossen, gelappten Blaettern und orangen Fruechten.",Volles Sonnenlicht,20-35 °C,5,large|sun,,,,, -sun,constants/lexiconBatch2.ts,217,Trompetenbaum,Catalpa bignonioides,Trompetenbaum ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, -sun,constants/lexiconBatch2.ts,208,Zeder,Cedrus libani,Zeder ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, -sun,constants/lexiconBatch2.ts,188,Kornblume,Centaurea cyanus,"Kornblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch1.ts,81,Peruanischer Fackelkaktus,Cereus peruvianus,"Der Peruanische Fackelkaktus ist ein saeulenfoermiger Kaktus, der im Innenraum bis zu 2 m hoch werden kann.",Volles Sonnenlicht,15-35 °C,21,easy|succulent|large|sun,,,,, -sun,constants/lexiconBatch2.ts,138,Roemische Kamille,Chamaemelum nobile,Roemische Kamille ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|medicinal|sun,medicinal_requires_external_evidence,,,, -sun,constants/lexiconBatch2.ts,101,Kamille,Chamomilla recutita,"Die Kamille ist ein beliebtes Heilkraut mit kleinen, weiss-gelben Blueten. Das aetherische Oel wirkt beruhigend.",Volles Sonnenlicht,15-25 °C,5,easy|medicinal|sun,medicinal_requires_external_evidence,,,, -sun,constants/lexiconBatch2.ts,86,Zitronenbaum,Citrus limon,"Der Zitronenbaum ist ein kleiner, immergruener Baum mit weissen, duftenden Blueten und gelben Fruechten.",Volles Sonnenlicht,18-28 °C,5,tree|sun,,,,, -sun,constants/lexiconBatch2.ts,87,Orangenbaum,Citrus sinensis,"Der Orangenbaum ist ein kleiner, immergruener Baum mit weissen Blueten und orangen Fruechten.",Volles Sonnenlicht,18-28 °C,5,tree|sun,,,,, -sun,constants/lexiconBatch2.ts,24,Konophytum,Conophytum calculus,"Das Konophytum ist eine sehr kompakte Sukkulente, die zwei Blaetter zu einer kugelfoermigen Form verschmilzt.",Volles Sonnenlicht,10-25 °C,21,succulent|sun,,,,, -sun,constants/lexiconBatch2.ts,14,Keulenlilie,Cordyline australis,"Die Keulenlilie hat lange, schmale, gruene oder rotbraune Blaetter in einem dekorativen Schopf.",Helles bis volles Licht,10-25 °C,7,easy|tree|sun,,,,, -sun,constants/lexiconBatch2.ts,181,Maedchenauge,Coreopsis tinctoria,"Maedchenauge ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,139,Koriander,Coriandrum sativum,Koriander ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -sun,constants/lexiconBatch2.ts,150,Kosmee,Cosmos bipinnatus,"Kosmee ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,29,Kotyledon,Cotyledon orbiculata,"Kotyledon hat dickfleischige, runde Blaetter mit einem mehligen, weisslichen Belag. Sehr trockenheitsresistent.",Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, -sun,constants/lexiconBatch2.ts,26,Moos-Crassula,Crassula muscosa,"Die Moos-Crassula hat dicht aneinandergereihte, winzige gruene Blaetter auf unverzweigten Trieben. Sieht aus wie Moos.",Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, -sun,constants/lexiconBatch1.ts,5,Jadepflanze,Crassula ovata,"Die Jadepflanze ist eine langlebige Sukkulente mit dicken, ovalen Blaettern. In Japan gilt sie als Gluecksbringer.",Helles bis volles Licht,15-24 °C,14,easy|succulent|sun,,,,, -sun,constants/lexiconBatch2.ts,94,Gurke,Cucumis sativus,"Die Gurke ist eine rankende Gemuese­pflanze mit gruenen, erfrischenden Fruechten. Im Balkonkasten kultivierbar.",Volles Sonnenlicht,18-28 °C,3,easy|sun,,,,, -sun,constants/lexiconBatch2.ts,209,Zypresse,Cupressus sempervirens,Zypresse ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, -sun,constants/lexiconBatch2.ts,236,String of Bananas,Curio radicans,String of Bananas ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles bis volles Licht,18-30 C,10,succulent|hanging|sun,,,,, -sun,constants/lexiconBatch2.ts,237,String of Dolphins,Curio x peregrinus,String of Dolphins ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles bis volles Licht,18-30 C,10,succulent|hanging|sun,,,,, -sun,constants/lexiconBatch2.ts,239,Palmfarn,Cycas revoluta,Palmfarn ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles bis volles Licht,18-30 C,10,tree|large|sun,,,,, -sun,constants/lexiconBatch2.ts,127,Zitronengras,Cymbopogon citratus,Zitronengras ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -sun,constants/lexiconBatch2.ts,68,Dahlie,Dahlia pinnata,Die Dahlie ist eine prachtvolle Sommerblume mit Blueten in allen Groessen und Formen. Sie wird aus Knollen gezogen.,Volles Sonnenlicht,15-25 °C,5,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,153,Rittersporn,Delphinium elatum,"Rittersporn ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,189,Bartnelke,Dianthus barbatus,"Bartnelke ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,146,Nelke,Dianthus caryophyllus,"Nelke ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,77,Venusfliegenfalle,Dionaea muscipula,Die Venusfliegenfalle ist eine fleischfressende Pflanze mit klappfallartigen Blaettern. Faengt Insekten.,Volles Sonnenlicht,15-30 °C,5,sun,,,,, -sun,constants/lexiconBatch2.ts,80,Sonnentau,Drosera capensis,Der Sonnentau faengt Insekten mit klebrigen Tropfen auf seinen Blaettern. Eine faszinierende fleischfressende Pflanze.,Volles Sonnenlicht,15-25 °C,5,high_humidity|sun,,,,, -sun,constants/lexiconBatch2.ts,30,Dudleya,Dudleya brittonii,"Dudleya ist eine rosetten­bildende Sukkulente mit silbrig-weissen, mehligen Blaettern. Sehr elegant.",Volles Sonnenlicht,10-25 °C,14,easy|succulent|sun,,,,, -sun,constants/lexiconBatch1.ts,4,Echeverie,Echeveria elegans,"Die Echeverie bildet symmetrische, rosettenfoermige Sukkulenten mit blaugruenen Blaettern. Pflegeleicht.",Volles Sonnenlicht,15-25 °C,14,easy|succulent|sun,,,,, -sun,constants/lexiconBatch2.ts,106,Sonnenhut,Echinacea purpurea,"Der Sonnenhut ist eine beliebte Heilpflanze mit grossen, pinkfarbenen Blueten. Er staerkt das Immunsystem.",Helles bis volles Licht,15-25 °C,7,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, -sun,constants/lexiconBatch1.ts,77,Goldene Tonne,Echinocactus grusonii,Die Goldene Tonne ist ein ikonischer kugelfoermiger Kaktus mit goldgelben Stacheln. Waechst langsam aber imposant.,Volles Sonnenlicht,15-35 °C,21,easy|succulent|sun,,,,, -sun,constants/lexiconBatch1.ts,83,San-Pedro-Kaktus,Echinopsis pachanoi,"Der San-Pedro-Kaktus ist ein schnell wachsender, saeulenfoermiger Kaktus aus den Anden.",Volles Sonnenlicht,10-35 °C,14,easy|succulent|sun,,,,, -sun,constants/lexiconBatch2.ts,186,Kalifornischer Mohn,Eschscholzia californica,"Kalifornischer Mohn ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,210,Eukalyptus,Eucalyptus globulus,Eukalyptus ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|medicinal|sun,medicinal_requires_external_evidence,,,, -sun,constants/lexiconBatch2.ts,19,Christusdorn,Euphorbia milii,Der Christusdorn ist eine sukkulente Wolfsmilch mit stacheligen Zweigen und kleinen roten oder gelben Hochblaettern.,Helles bis volles Licht,15-28 °C,10,easy|flowering|succulent|sun,,,,, -sun,constants/lexiconBatch1.ts,12,Bleistiftkaktus,Euphorbia tirucalli,"Der Bleistiftkaktus ist eine sukkulente Wolfsmilch mit duennen, zylindrischen Zweigen ohne Blaetter.",Volles Sonnenlicht,18-30 °C,14,easy|succulent|sun,,,,, -sun,constants/lexiconBatch1.ts,78,Fass-Kaktus,Ferocactus cylindraceus,"Der Fass-Kaktus ist ein zylindrischer Wuestenkaktus mit langen, roten Stacheln. Sehr langlebig.",Volles Sonnenlicht,15-35 °C,21,easy|succulent|sun,,,,, -sun,constants/lexiconBatch2.ts,219,Forsythie,Forsythia x intermedia,Forsythie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|sun,,,,, -sun,constants/lexiconBatch2.ts,100,Erdbeere,Fragaria ananassa,"Die Erdbeere ist ein beliebtes Obst fuer Balkon und Terrasse mit aromatischen, roten Fruechten.",Helles bis volles Licht,15-25 °C,3,easy|pet_friendly|sun,pet_friendly_requires_external_evidence,,,, -sun,constants/lexiconBatch2.ts,169,Freesie,Freesia refracta,"Freesie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,196,Kokardenblume,Gaillardia aristata,"Kokardenblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,190,Mittagsgold,Gazania rigens,"Mittagsgold ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,216,Ginkgo,Ginkgo biloba,Ginkgo ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|medicinal|sun,medicinal_requires_external_evidence,,,, -sun,constants/lexiconBatch2.ts,161,Gladiole,Gladiolus hortulanus,"Gladiole ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch1.ts,87,Geisterpflanze,Graptopetalum paraguayense,"Die Geisterpflanze hat zartgraue bis perlmutt-rosafarbene, rosettenfoermige Blaetter. Sehr robuste Sukkulente.",Volles Sonnenlicht,15-25 °C,14,easy|succulent|sun,,,,, -sun,constants/lexiconBatch2.ts,141,Sonnenblume,Helianthus annuus,"Sonnenblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,133,Currykraut,Helichrysum italicum,Currykraut ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -sun,constants/lexiconBatch2.ts,191,Heliotrop,Heliotropium arborescens,"Heliotrop ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,182,Taglilie,Hemerocallis fulva,"Taglilie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch1.ts,21,Hibiskus,Hibiscus rosa-sinensis,"Der Hibiskus begeistert mit grossen, trompetenfoermigen Blueten in Rot, Orange und Rosa.",Volles Sonnenlicht,18-28 °C,3,flowering|bright_light|sun,,,,, -sun,constants/lexiconBatch2.ts,220,Gartenhibiskus,Hibiscus syriacus,Gartenhibiskus ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|sun,,,,, -sun,constants/lexiconBatch2.ts,159,Hasengloeckchen,Hyacinthoides non-scripta,"Hasengloeckchen ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,105,Johanniskraut,Hypericum perforatum,Das Johanniskraut hat leuchtend gelbe Blueten und ist ein wichtiges Heilkraut gegen Depressionen und Stimmungstiefs.,Volles Sonnenlicht,10-25 °C,7,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, -sun,constants/lexiconBatch2.ts,136,Ysop,Hyssopus officinalis,Ysop ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -sun,constants/lexiconBatch2.ts,203,Stechpalme,Ilex aquifolium,Stechpalme ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|sun,,,,, -sun,constants/lexiconBatch1.ts,64,Suesskartoffel,Ipomoea batatas,"Die Suesskartoffel-Zierpflanze hat dekorative, herzfoermige Blaetter in gruen oder dunkelviolett. Ideal als Haengepflanze.",Volles Sonnenlicht,20-30 °C,5,easy|hanging|sun,,,,, -sun,constants/lexiconBatch2.ts,156,Prunkwinde,Ipomoea purpurea,"Prunkwinde ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,144,Bart-Iris,Iris germanica,"Bart-Iris ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch1.ts,9,Kalanchoe,Kalanchoe blossfeldiana,"Die Kalanchoe ist eine beliebte Bluehpflanze mit leuchtenden Blueten in Rot, Orange, Gelb oder Rosa.",Helles bis volles Licht,15-25 °C,10,easy|flowering|succulent|sun,,,,, -sun,constants/lexiconBatch2.ts,22,Brutblatt,Kalanchoe daigremontiana,Das Brutblatt bildet entlang des Blattrandes zahlreiche kleine Jungpflanzen. Eine faszinierende Sukkulente.,Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, -sun,constants/lexiconBatch2.ts,21,Kaninchen-Ohren,Kalanchoe tomentosa,"Kaninchen-Ohren haben weisslich-filzige Blaetter mit braunen Raendern, die Kaninchen­ohren aehneln. Sehr dekorativ.",Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, -sun,constants/lexiconBatch2.ts,64,Wandelroeschen,Lantana camara,"Das Wandelroeschen hat kugelige Bluetenkoepfe, die die Farbe von Gelb ueber Orange zu Rot wechseln. Sehr attraktiv.",Volles Sonnenlicht,18-28 °C,5,flowering|bright_light|sun,,,,, -sun,constants/lexiconBatch2.ts,158,Duftwicke,Lathyrus odoratus,"Duftwicke ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,121,Lorbeer,Laurus nobilis,Lorbeer ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -sun,constants/lexiconBatch1.ts,23,Echter Lavendel,Lavandula angustifolia,Der Echte Lavendel ist ein aromatischer Halbstrauch mit lilafarbenen Bluetenaehren. Herrlicher Duft.,Volles Sonnenlicht,10-25 °C,10,medicinal|bright_light|sun,medicinal_requires_external_evidence,,,, -sun,constants/lexiconBatch2.ts,180,Bechermalve,Lavatera trimestris,"Bechermalve ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,173,Margerite,Leucanthemum vulgare,"Margerite ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,201,Shasta-Margerite,Leucanthemum x superbum,"Shasta-Margerite ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,126,Liebstoeckel,Levisticum officinale,Liebstoeckel ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -sun,constants/lexiconBatch2.ts,23,Lebende Steine,Lithops julii,"Lebende Steine sind faszinierende Mimikry-Sukkulenten, die Kieselsteinen taeuschen aehnlich sehen. Sehr trockenheitsresistent.",Volles Sonnenlicht,10-30 °C,21,succulent|sun,,,,, -sun,constants/lexiconBatch2.ts,154,Lupine,Lupinus polyphyllus,"Lupine ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch1.ts,79,Mammillaria,Mammillaria zeilmanniana,"Die Mammillaria ist ein kompakter, kugelfoermiger Kaktus, der im Fruehling einen Kranz aus rosa Blueten traegt.",Volles Sonnenlicht,15-35 °C,14,easy|flowering|succulent|sun,,,,, -sun,constants/lexiconBatch2.ts,179,Indianernessel,Monarda didyma,"Indianernessel ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,177,Vergissmeinnicht,Myosotis sylvatica,"Vergissmeinnicht ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,199,Nemesie,Nemesia strumosa,"Nemesie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,132,Katzenminze,Nepeta cataria,Katzenminze ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -sun,constants/lexiconBatch2.ts,120,Oleander,Nerium oleander,"Der Oleander ist ein mediteraner Strauch mit leuchtend roten, rosa oder weissen Blueten. Sehr hitzetolerant.",Volles Sonnenlicht,15-28 °C,7,flowering|bright_light|sun,,,,, -sun,constants/lexiconBatch2.ts,193,Ziertabak,Nicotiana alata,"Ziertabak ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch1.ts,25,Basilikum,Ocimum basilicum,"Basilikum ist das beliebteste Kuechenkraut mit intensiv aromatischen, gruenen Blaettern. Fuer Pesto verwendet.",Volles Sonnenlicht,18-30 °C,2,easy|medicinal|sun,medicinal_requires_external_evidence,,,, -sun,constants/lexiconBatch1.ts,82,Hasenohren-Kaktus,Opuntia microdasys,"Der Hasenohren-Kaktus hat flache, ovale Triebe mit dichten weissen Glochiden. Klassischer Zimmerkaktus.",Volles Sonnenlicht,10-35 °C,21,easy|succulent|sun,,,,, -sun,constants/lexiconBatch2.ts,124,Majoran,Origanum majorana,Majoran ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -sun,constants/lexiconBatch1.ts,28,Oregano,Origanum vulgare,"Oregano ist ein aromatisches Kuechenkraut mit runden, behaarten Blaettern. In mediterraner Kueche beliebt.",Volles Sonnenlicht,15-25 °C,7,easy|medicinal|sun,medicinal_requires_external_evidence,,,, -sun,constants/lexiconBatch2.ts,200,Kapmargerite,Osteospermum ecklonis,"Kapmargerite ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch1.ts,88,Mondstein-Pflanze,Pachyphytum oviferum,"Die Mondstein-Pflanze hat dicke, ovale Blaetter mit einem pastellrosafarbenen, mehligen Ueberzug.",Volles Sonnenlicht,15-25 °C,14,easy|succulent|sun,,,,, -sun,constants/lexiconBatch2.ts,143,Pfingstrose,Paeonia lactiflora,"Pfingstrose ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,185,Mohn,Papaver rhoeas,"Mohn ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch1.ts,31,Rosengeranie,Pelargonium graveolens,Die Rosengeranie ist eine Duftpflanze mit tief eingeschnittenen Blaettern und rosaenlichem Aroma.,Volles Sonnenlicht,15-25 °C,7,easy|medicinal|sun,medicinal_requires_external_evidence,,,, -sun,constants/lexiconBatch2.ts,61,Efeu-Geranie,Pelargonium peltatum,"Die Efeu-Geranie hat efeufoermige, glaenzende Blaetter und bluet den ganzen Sommer in leuchtenden Farben.",Helles bis volles Licht,15-25 °C,5,easy|flowering|hanging|sun,,,,, -sun,constants/lexiconBatch2.ts,174,Stehende Geranie,Pelargonium zonale,"Stehende Geranie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,134,Shiso,Perilla frutescens,Shiso ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -sun,constants/lexiconBatch1.ts,34,Petunie,Petunia hybrida,Die Petunie ist eine der beliebtesten Balkonpflanzen mit trichterfoermigen Blueten in unzaehligen Farben.,Volles Sonnenlicht,15-25 °C,2,easy|pet_friendly|flowering|sun,pet_friendly_requires_external_evidence,,,, -sun,constants/lexiconBatch2.ts,165,Flammenblume,Phlox paniculata,"Flammenblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,207,Fichte,Picea abies,Fichte ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, -sun,constants/lexiconBatch2.ts,206,Kiefer,Pinus sylvestris,Kiefer ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, -sun,constants/lexiconBatch1.ts,61,Bleiwurz,Plumbago auriculata,"Die Bleiwurz ist ein halbimmergruener Strauch mit himmelblauen Blueten, der fast das ganze Jahr bluet.",Volles Sonnenlicht,15-27 °C,5,flowering|bright_light|sun,,,,, -sun,constants/lexiconBatch2.ts,118,Tempel-Baum,Plumeria rubra,"Der Tempel-Baum hat intensiv duftende, sternfoermige Blueten in Weiss, Gelb oder Rosa. Klassische Tropenblume.",Volles Sonnenlicht,20-30 °C,7,flowering|tree|sun,,,,, -sun,constants/lexiconBatch2.ts,27,Speckbaum,Portulacaria afra,"Der Speckbaum ist eine sukkulente Pflanze mit roten Stielen und kleinen, runden, glaenzenden Blaettern.",Helles bis volles Licht,15-30 °C,14,easy|succulent|sun,,,,, -sun,constants/lexiconBatch2.ts,71,Koenigs-Protea,Protea cynaroides,"Die Koenigs-Protea ist die Nationalblume Suedafrikas mit riesigen, imposanten Bluetenkoepfen. Eine echte Besonderheit.",Volles Sonnenlicht,10-25 °C,7,flowering|large|sun,,,,, -sun,constants/lexiconBatch2.ts,218,Kirschlorbeer,Prunus laurocerasus,Kirschlorbeer ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|sun,,,,, -sun,constants/lexiconBatch2.ts,89,Guave,Psidium guajava,Die Guave ist ein tropischer Obstbaum mit gelblich-weissen Fruechten. Sie ist reich an Vitamin C.,Volles Sonnenlicht,18-30 °C,7,tree|sun,,,,, -sun,constants/lexiconBatch2.ts,88,Granatapfelbaum,Punica granatum,"Der Granatapfelbaum hat leuchtend rote Blueten und rote, essbare Fruechte mit rubinroten Kernen.",Volles Sonnenlicht,15-28 °C,7,flowering|tree|sun,,,,, -sun,constants/lexiconBatch2.ts,205,Eiche,Quercus robur,Eiche ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, -sun,constants/lexiconBatch2.ts,162,Ranunkel,Ranunculus asiaticus,"Ranunkel ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,214,Robinie,Robinia pseudoacacia,Robinie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, -sun,constants/lexiconBatch1.ts,66,Chinesische Rose,Rosa chinensis,Die Chinesische Rose ist eine der Stammarten vieler Gartenrosen und bluet fast ununterbrochen.,Volles Sonnenlicht,15-25 °C,5,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,142,Rose,Rosa x hybrida,"Rose ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light|sun,,,,, -sun,constants/lexiconBatch1.ts,24,Rosmarin,Rosmarinus officinalis,Rosmarin ist ein aromatisches Kraut mit nadelartigen Blaettern und blauen Blueten. In der Kueche unverzichtbar.,Volles Sonnenlicht,10-25 °C,7,easy|medicinal|sun,medicinal_requires_external_evidence,,,, -sun,constants/lexiconBatch2.ts,167,Rudbeckie,Rudbeckia hirta,"Rudbeckie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,130,Sauerampfer,Rumex acetosa,Sauerampfer ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -sun,constants/lexiconBatch2.ts,195,Mehlsalbei,Salvia farinacea,"Mehlsalbei ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,103,Salbei,Salvia officinalis,Salbei ist ein aromatisches Heilkraut mit silbrig-gruenen Blaettern. Er hat antibakterielle und entzuendungshem­mende Wirkung.,Volles Sonnenlicht,10-25 °C,7,easy|medicinal|sun,medicinal_requires_external_evidence,,,, -sun,constants/lexiconBatch2.ts,168,Feuersalbei,Salvia splendens,"Feuersalbei ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,17,Zylindrischer Bogenhanf,Sansevieria cylindrica,"Der Zylindrische Bogenhanf hat zylindrische, aufrechte Blaetter, die sich nach oben verjuengen. Sehr pflegeleicht.",Helles bis volles Licht,15-27 °C,14,easy|succulent|sun,,,,, -sun,constants/lexiconBatch2.ts,78,Purpursonnentau,Sarracenia purpurea,Der Purpursonnentau ist eine fleischfressende Kannenpflanze mit purpurroten Kannen. Faengt Insekten.,Volles Sonnenlicht,5-25 °C,3,high_humidity|sun,,,,, -sun,constants/lexiconBatch2.ts,123,Bohnenkraut,Satureja hortensis,Bohnenkraut ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -sun,constants/lexiconBatch1.ts,7,Eselschwanz,Sedum morganianum,"Der Eselschwanz ist eine haengende Sukkulente mit langen Trieben aus dichten, blaugruenen Blaettchen.",Volles Sonnenlicht,15-25 °C,14,easy|succulent|hanging|sun,,,,, -sun,constants/lexiconBatch2.ts,28,Blauer Kreuzkraut,Senecio serpens,"Der Blaue Kreuzkraut hat zylindrische, blaublaugruene Blaetter und einen kriechenden Wuchs. Sehr dekorativ.",Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, -sun,constants/lexiconBatch2.ts,93,Aubergine,Solanum melongena,"Die Aubergine ist eine Gemuese­pflanze mit grossen, violetten Fruechten. Sie benoetigt viel Waerme und Sonne.",Volles Sonnenlicht,20-30 °C,5,bright_light|sun,,,,, -sun,constants/lexiconBatch2.ts,213,Eberesche,Sorbus aucuparia,Eberesche ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, -sun,constants/lexiconBatch2.ts,222,Spierstrauch,Spiraea japonica,Spierstrauch ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|sun,,,,, -sun,constants/lexiconBatch2.ts,25,Aasblume,Stapelia grandiflora,"Die Aasblume hat fleischige, gruene Staengel und riesige, sternfoermige Blueten mit aasartigem Duft.",Helles bis volles Licht,18-30 °C,14,flowering|succulent|sun,,,,, -sun,constants/lexiconBatch2.ts,131,Stevia,Stevia rebaudiana,Stevia ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, -sun,constants/lexiconBatch1.ts,3,Paradiesvogelblume,Strelitzia reginae,"Die Paradiesvogelblume beeindruckt mit leuchtend orangefarbenen und blauen Blueten, die einem Vogel aehneln.",Volles Sonnenlicht,18-26 °C,7,flowering|large|sun,,,,, -sun,constants/lexiconBatch2.ts,166,Herbstaster,Symphyotrichum novi-belgii,"Herbstaster ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,149,Flieder,Syringa vulgaris,"Flieder ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|tree|sun,,,,, -sun,constants/lexiconBatch2.ts,66,Studentenblume,Tagetes patula,Die Studentenblume ist eine robuste Sommerblume mit orangen oder gelben Blueten. Sie haelt Schadlinge fern.,Volles Sonnenlicht,15-28 °C,3,easy|flowering|sun,,,,, -sun,constants/lexiconBatch1.ts,27,Thymian,Thymus vulgaris,"Thymian ist ein kleiner, aromatischer Strauch mit winzigen Blaettern und rosa Blueten. Wichtiges Kuechenkraut.",Volles Sonnenlicht,10-25 °C,7,easy|medicinal|sun,medicinal_requires_external_evidence,,,, -sun,constants/lexiconBatch2.ts,54,Lila Tradescantia,Tradescantia pallida,Die Lila Tradescantia hat leuchtend purpurrote Blaetter und ist sehr auffaellig. Sie liebt viel Licht.,Helles bis volles Licht,15-25 °C,5,easy|hanging|sun,,,,, -sun,constants/lexiconBatch2.ts,151,Kapuzinerkresse,Tropaeolum majus,"Kapuzinerkresse ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,82,Wasserschlauch,Utricularia gibba,Der Wasserschlauch ist eine wasserbewohnende fleischfressende Pflanze mit Schlaeuchen als Insekten­fallen.,Helles bis volles Licht,15-25 °C,2,high_humidity|sun,,,,, -sun,constants/lexiconBatch2.ts,192,Koenigskerze,Verbascum thapsus,"Koenigskerze ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, -sun,constants/lexiconBatch2.ts,164,Eisenkraut,Verbena bonariensis,"Eisenkraut ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,198,Hornveilchen,Viola cornuta,"Hornveilchen ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, -sun,constants/lexiconBatch2.ts,5,Mexikanische Fächerpalme,Washingtonia robusta,"Die Mexikanische Fächerpalme ist eine schlanke, hohe Palme mit faecher­foermigen Blaettern. Sehr hitzetolerant.",Volles Sonnenlicht,15-35 °C,10,tree|large|sun,,,,, -sun,constants/lexiconBatch2.ts,221,Weigelie,Weigela florida,Weigelie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|sun,,,,, -sun,constants/lexiconBatch1.ts,65,Chinesischer Blauregen,Wisteria sinensis,"Der Chinesische Blauregen ist ein ueppiger Kletterkuenstler mit langen, duftenden Bluetentrauben in Lila.",Volles Sonnenlicht,10-25 °C,7,flowering|large|sun,,,,, -sun,constants/lexiconBatch2.ts,246,Yucca aloifolia,Yucca aloifolia,Yucca aloifolia ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Volles Sonnenlicht,18-30 C,10,easy|tree|sun,,,,, -sun,constants/lexiconBatch1.ts,40,Yucca-Palme,Yucca elephantipes,"Die Yucca-Palme ist eine robuste Zimmerpflanze mit starrem, immergruenem Blaetterschopf auf einem dicken Stamm.",Helles bis volles Licht,15-28 °C,14,easy|tree|sun,,,,, -sun,constants/lexiconBatch2.ts,65,Zinnie,Zinnia elegans,"Die Zinnie ist eine leuchtende Sommerblume mit grossen, dahlienaehnlichen Blueten. Sehr robust und hitzetolerant.",Volles Sonnenlicht,18-30 °C,3,easy|flowering|sun,,,,, -tree,constants/lexiconBatch2.ts,115,Faecherahorn,Acer palmatum,"Der Faecherahorn ist ein japanischer Zierahorn mit feingeschnittenen, faecherfoermigen Blaettern in Gruen oder Rot.",Helles bis volles Licht,10-22 °C,5,tree,,,,, -tree,constants/lexiconBatch2.ts,212,Spitzahorn,Acer platanoides,Spitzahorn ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, -tree,constants/lexiconBatch2.ts,232,Norfolk-Tanne,Araucaria heterophylla,Norfolk-Tanne ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,tree|bright_light,,,,, -tree,constants/lexiconBatch1.ts,41,Pferdeschwanzpalme,Beaucarnea recurvata,"Die Pferdeschwanzpalme hat einen verdickten Stammbasis als Wasserspeicher und lange, schmale Blaetter.",Volles Sonnenlicht,15-30 °C,21,easy|succulent|tree|sun,,,,, -tree,constants/lexiconBatch2.ts,114,Hange-Birke,Betula pendula,Die Haenge-Birke hat charakteristisch weisse Rinde und haengende Zweige. Die Blaetter werden in der Heilkunde genutzt.,Volles Sonnenlicht,10-25 °C,7,tree|large|medicinal,medicinal_requires_external_evidence,,,, -tree,constants/lexiconBatch2.ts,223,Schmetterlingsflieder,Buddleja davidii,Schmetterlingsflieder ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|sun,,,,, -tree,constants/lexiconBatch2.ts,202,Buchsbaum,Buxus sempervirens,Buchsbaum ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|sun,,,,, -tree,constants/lexiconBatch2.ts,217,Trompetenbaum,Catalpa bignonioides,Trompetenbaum ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, -tree,constants/lexiconBatch2.ts,208,Zeder,Cedrus libani,Zeder ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, -tree,constants/lexiconBatch1.ts,43,Bergpalme,Chamaedorea elegans,Die Bergpalme ist eine kompakte Zimmerpalme fuer schattigere Standorte. Ideal fuer dunkle Innenraeume.,Wenig bis helles Licht,15-25 °C,7,easy|pet_friendly|tree|air_purifier|low_light,air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence,,,, -tree,constants/lexiconBatch2.ts,86,Zitronenbaum,Citrus limon,"Der Zitronenbaum ist ein kleiner, immergruener Baum mit weissen, duftenden Blueten und gelben Fruechten.",Volles Sonnenlicht,18-28 °C,5,tree|sun,,,,, -tree,constants/lexiconBatch2.ts,87,Orangenbaum,Citrus sinensis,"Der Orangenbaum ist ein kleiner, immergruener Baum mit weissen Blueten und orangen Fruechten.",Volles Sonnenlicht,18-28 °C,5,tree|sun,,,,, -tree,constants/lexiconBatch2.ts,14,Keulenlilie,Cordyline australis,"Die Keulenlilie hat lange, schmale, gruene oder rotbraune Blaetter in einem dekorativen Schopf.",Helles bis volles Licht,10-25 °C,7,easy|tree|sun,,,,, -tree,constants/lexiconBatch2.ts,209,Zypresse,Cupressus sempervirens,Zypresse ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, -tree,constants/lexiconBatch2.ts,239,Palmfarn,Cycas revoluta,Palmfarn ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles bis volles Licht,18-30 C,10,tree|large|sun,,,,, -tree,constants/lexiconBatch2.ts,215,Flammenbaum,Delonix regia,Flammenbaum ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|large,,,,, -tree,constants/lexiconBatch1.ts,14,Maisstrauch,Dracaena fragrans,"Der Maisstrauch ist eine robuste Zimmerpflanze mit breiten, gestreiften Blaettern. Gedeiht auch bei wenig Licht.",Helles indirektes Licht,15-25 °C,10,easy|tree|air_purifier|low_light,air_purifier_requires_external_evidence,,,, -tree,constants/lexiconBatch1.ts,13,Drachenbaum,Dracaena marginata,"Der Drachenbaum ist eine schlanke Zimmerpflanze mit roten, schmalen Blaettern auf langen Staemmen.",Helles indirektes Licht,15-25 °C,10,easy|tree|air_purifier,air_purifier_requires_external_evidence,,,, -tree,constants/lexiconBatch1.ts,42,Goldfruchtpalme,Dypsis lutescens,Die Goldfruchtpalme ist eine elegante Zimmerpalme mit gelblich-gruenen Stielen und gefiederten Wedeln.,Helles indirektes Licht,18-27 °C,5,pet_friendly|tree|air_purifier,air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence,,,, -tree,constants/lexiconBatch2.ts,210,Eukalyptus,Eucalyptus globulus,Eukalyptus ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|medicinal|sun,medicinal_requires_external_evidence,,,, -tree,constants/lexiconBatch2.ts,248,Ficus altissima,Ficus altissima,Ficus altissima ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,tree|bright_light,,,,, -tree,constants/lexiconBatch1.ts,1,Birkenfeige,Ficus benjamina,"Die Birkenfeige ist ein eleganter Zimmerstrauch mit haengenden Aesten und kleinen, glaenzenden Blaettern.",Helles indirektes Licht,16-24 °C,7,tree|air_purifier,air_purifier_requires_external_evidence,,,, -tree,constants/lexiconBatch1.ts,38,Gummibaum,Ficus elastica,"Der Gummibaum ist eine imposante Zimmerpflanze mit grossen, glaenzenden, lederartigen Blaettern. Reinigt die Luft.",Helles indirektes Licht,16-24 °C,10,easy|tree|air_purifier,air_purifier_requires_external_evidence,,,, -tree,constants/lexiconBatch1.ts,39,Geigenfeige,Ficus lyrata,"Die Geigenfeige ist ein Trendbaum mit grossen, geigenfoermigen Blaettern. Benoetigt viel Licht.",Helles indirektes Licht,18-27 °C,7,tree|large|bright_light,,,,, -tree,constants/lexiconBatch2.ts,247,Ficus microcarpa,Ficus microcarpa,Ficus microcarpa ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,easy|tree|bright_light,,,,, -tree,constants/lexiconBatch2.ts,116,Bonsai-Feige,Ficus retusa,"Die Bonsai-Feige ist eine klassische Bonsai-Art mit kleinen, elliptischen Blaettern. Sehr formbar.",Helles indirektes Licht,16-24 °C,7,tree,,,,, -tree,constants/lexiconBatch2.ts,219,Forsythie,Forsythia x intermedia,Forsythie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|sun,,,,, -tree,constants/lexiconBatch2.ts,216,Ginkgo,Ginkgo biloba,Ginkgo ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|medicinal|sun,medicinal_requires_external_evidence,,,, -tree,constants/lexiconBatch2.ts,220,Gartenhibiskus,Hibiscus syriacus,Gartenhibiskus ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|sun,,,,, -tree,constants/lexiconBatch2.ts,3,Kentia-Palme,Howea forsteriana,"Die Kentia-Palme ist eine der elegantesten Zimmerpalmen mit langen, herabhängenden Fiederblaettern.",Helles indirektes Licht,18-25 °C,7,pet_friendly|tree|low_light,pet_friendly_requires_external_evidence,,,, -tree,constants/lexiconBatch2.ts,203,Stechpalme,Ilex aquifolium,Stechpalme ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|sun,,,,, -tree,constants/lexiconBatch2.ts,211,Jacaranda,Jacaranda mimosifolia,Jacaranda ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|large,,,,, -tree,constants/lexiconBatch2.ts,4,Chinesische Fächerpalme,Livistona chinensis,"Die Chinesische Fächerpalme hat grosse, faecher­foermige Blaetter auf einem einzelnen Stamm. Sehr dekorativ.",Helles bis volles Licht,15-25 °C,7,tree|bright_light,,,,, -tree,constants/lexiconBatch2.ts,204,Magnolie,Magnolia grandiflora,Magnolie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|large,,,,, -tree,constants/lexiconBatch2.ts,231,Glueckskastanie,Pachira aquatica,Glueckskastanie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,easy|tree|bright_light,,,,, -tree,constants/lexiconBatch1.ts,44,Zwergdattelpalme,Phoenix roebelenii,"Die Zwergdattelpalme ist eine zierliche Palme mit eleganten, gebogenen Fiederblaettern. Tropisches Flair.",Helles bis volles Licht,18-27 °C,7,tree|bright_light,,,,, -tree,constants/lexiconBatch2.ts,207,Fichte,Picea abies,Fichte ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, -tree,constants/lexiconBatch2.ts,206,Kiefer,Pinus sylvestris,Kiefer ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, -tree,constants/lexiconBatch2.ts,118,Tempel-Baum,Plumeria rubra,"Der Tempel-Baum hat intensiv duftende, sternfoermige Blueten in Weiss, Gelb oder Rosa. Klassische Tropenblume.",Volles Sonnenlicht,20-30 °C,7,flowering|tree|sun,,,,, -tree,constants/lexiconBatch2.ts,218,Kirschlorbeer,Prunus laurocerasus,Kirschlorbeer ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|sun,,,,, -tree,constants/lexiconBatch2.ts,89,Guave,Psidium guajava,Die Guave ist ein tropischer Obstbaum mit gelblich-weissen Fruechten. Sie ist reich an Vitamin C.,Volles Sonnenlicht,18-30 °C,7,tree|sun,,,,, -tree,constants/lexiconBatch2.ts,88,Granatapfelbaum,Punica granatum,"Der Granatapfelbaum hat leuchtend rote Blueten und rote, essbare Fruechte mit rubinroten Kernen.",Volles Sonnenlicht,15-28 °C,7,flowering|tree|sun,,,,, -tree,constants/lexiconBatch2.ts,205,Eiche,Quercus robur,Eiche ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, -tree,constants/lexiconBatch1.ts,45,Stab-Palme,Rhapis excelsa,"Die Stab-Palme ist eine elegante Zimmerpalme mit faecher­foermigen Blaettern auf duennen, bambusartigen Staemmen.",Helles indirektes Licht,15-25 °C,7,tree|low_light,,,,, -tree,constants/lexiconBatch2.ts,170,Rhododendron,Rhododendron catawbiense,"Rhododendron ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|tree|bright_light,,,,, -tree,constants/lexiconBatch2.ts,214,Robinie,Robinia pseudoacacia,Robinie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, -tree,constants/lexiconBatch2.ts,113,Silber-Weide,Salix alba,"Die Silber-Weide hat silbrig-glaenzende Blaetter. Weidenrinde enthält Salicylsaeure, die Grundlage von Aspirin.",Helles bis volles Licht,10-25 °C,7,tree|large|medicinal,medicinal_requires_external_evidence,,,, -tree,constants/lexiconBatch2.ts,112,Schwarzer Holunder,Sambucus nigra,Der Schwarze Holunder hat weisse Doldenbluten und schwarze Beeren. Die Fruechte werden fuer Sirup und Saft verwendet.,Helles bis volles Licht,10-25 °C,7,flowering|tree|medicinal,medicinal_requires_external_evidence,,,, -tree,constants/lexiconBatch2.ts,11,Grosse Strahlenaralie,Schefflera actinophylla,"Die Grosse Strahlenaralie kann grosse, handfoermige Blaetter entwickeln. Sie ist ideal als Zimmerstrauch.",Helles indirektes Licht,18-27 °C,7,easy|tree|large,,,,, -tree,constants/lexiconBatch2.ts,10,Strahlenaralie,Schefflera arboricola,"Die Strahlenaralie hat fingerfoermig angeordnete, glaenzende Blaetter auf langen Stielen. Sehr robuste Zimmerpflanze.",Helles indirektes Licht,15-25 °C,7,easy|tree|air_purifier,air_purifier_requires_external_evidence,,,, -tree,constants/lexiconBatch2.ts,235,Falsche Aralie,Schefflera elegantissima,Falsche Aralie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,tree|bright_light,,,,, -tree,constants/lexiconBatch2.ts,213,Eberesche,Sorbus aucuparia,Eberesche ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, -tree,constants/lexiconBatch2.ts,222,Spierstrauch,Spiraea japonica,Spierstrauch ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|sun,,,,, -tree,constants/lexiconBatch2.ts,1,Weisse Strelitzie,Strelitzia nicolai,"Die Weisse Strelitzie ist ein beeindruckender Zimmerstrauch mit grossen, blaugruenen Blaettern und weiss-blauen Blueten.",Helles bis volles Licht,18-27 °C,7,tree|large|bright_light,,,,, -tree,constants/lexiconBatch2.ts,149,Flieder,Syringa vulgaris,"Flieder ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|tree|sun,,,,, -tree,constants/lexiconBatch2.ts,5,Mexikanische Fächerpalme,Washingtonia robusta,"Die Mexikanische Fächerpalme ist eine schlanke, hohe Palme mit faecher­foermigen Blaettern. Sehr hitzetolerant.",Volles Sonnenlicht,15-35 °C,10,tree|large|sun,,,,, -tree,constants/lexiconBatch2.ts,221,Weigelie,Weigela florida,Weigelie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|sun,,,,, -tree,constants/lexiconBatch2.ts,246,Yucca aloifolia,Yucca aloifolia,Yucca aloifolia ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Volles Sonnenlicht,18-30 C,10,easy|tree|sun,,,,, -tree,constants/lexiconBatch1.ts,40,Yucca-Palme,Yucca elephantipes,"Die Yucca-Palme ist eine robuste Zimmerpflanze mit starrem, immergruenem Blaetterschopf auf einem dicken Stamm.",Helles bis volles Licht,15-28 °C,14,easy|tree|sun,,,,, +category,source_file,source_index,name,botanical_name,description,light,temp,water_interval_days,all_categories,risk_flags,audit_status,evidence_source,evidence_url,notes +air_purifier,constants/lexiconBatch1.ts,43,Bergpalme,Chamaedorea elegans,Die Bergpalme ist eine kompakte Zimmerpalme fuer schattigere Standorte. Ideal fuer dunkle Innenraeume.,Wenig bis helles Licht,15-25 °C,7,easy|pet_friendly|tree|air_purifier|low_light,air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence,,,, +air_purifier,constants/lexiconBatch1.ts,48,Dieffenbachie,Dieffenbachia seguine,"Die Dieffenbachie ist eine tropische Blattschmuckpflanze mit grossen, gruen-weiss gefleckten Blaettern.",Helles indirektes Licht,18-26 °C,7,easy|air_purifier|low_light,air_purifier_requires_external_evidence,,,, +air_purifier,constants/lexiconBatch1.ts,14,Maisstrauch,Dracaena fragrans,"Der Maisstrauch ist eine robuste Zimmerpflanze mit breiten, gestreiften Blaettern. Gedeiht auch bei wenig Licht.",Helles indirektes Licht,15-25 °C,10,easy|tree|air_purifier|low_light,air_purifier_requires_external_evidence,,,, +air_purifier,constants/lexiconBatch1.ts,13,Drachenbaum,Dracaena marginata,"Der Drachenbaum ist eine schlanke Zimmerpflanze mit roten, schmalen Blaettern auf langen Staemmen.",Helles indirektes Licht,15-25 °C,10,easy|tree|air_purifier,air_purifier_requires_external_evidence,,,, +air_purifier,constants/lexiconBatch1.ts,42,Goldfruchtpalme,Dypsis lutescens,Die Goldfruchtpalme ist eine elegante Zimmerpalme mit gelblich-gruenen Stielen und gefiederten Wedeln.,Helles indirektes Licht,18-27 °C,5,pet_friendly|tree|air_purifier,air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence,,,, +air_purifier,constants/lexiconBatch1.ts,16,Marmor-Efeutute,Epipremnum aureum Marble Queen,Die Marmor-Efeutute hat cremeweiss-gruen marmorierte Blaetter. Eine dekorative Variante der klassischen Efeutute.,Helles indirektes Licht,15-30 °C,7,easy|hanging|air_purifier,air_purifier_requires_external_evidence,,,, +air_purifier,constants/lexiconBatch2.ts,53,Neon-Efeutute,Epipremnum pinnatum Neon,Die Neon-Efeutute hat leuchtend limonengruene Blaetter. Sehr auffaellig und pflegeleicht.,Helles indirektes Licht,15-30 °C,7,easy|hanging|air_purifier,air_purifier_requires_external_evidence,,,, +air_purifier,constants/lexiconBatch1.ts,1,Birkenfeige,Ficus benjamina,"Die Birkenfeige ist ein eleganter Zimmerstrauch mit haengenden Aesten und kleinen, glaenzenden Blaettern.",Helles indirektes Licht,16-24 °C,7,tree|air_purifier,air_purifier_requires_external_evidence,,,, +air_purifier,constants/lexiconBatch1.ts,38,Gummibaum,Ficus elastica,"Der Gummibaum ist eine imposante Zimmerpflanze mit grossen, glaenzenden, lederartigen Blaettern. Reinigt die Luft.",Helles indirektes Licht,16-24 °C,10,easy|tree|air_purifier,air_purifier_requires_external_evidence,,,, +air_purifier,constants/lexiconBatch1.ts,68,Gerbera,Gerbera jamesonii,"Die Gerbera ist eine farbenfrohe Schnittblume mit grossen, sonnenblumenaehnlichen Blueten. Sehr beliebt.",Helles bis volles Licht,15-25 °C,5,flowering|air_purifier|bright_light,air_purifier_requires_external_evidence,,,, +air_purifier,constants/lexiconBatch1.ts,37,Efeu,Hedera helix,"Efeu ist eine robuste Kletter- und Haengepflanze mit charakteristischen, dreilappigen Blaettern. Sehr langlebig.",Wenig bis helles Licht,10-20 °C,7,easy|hanging|air_purifier|low_light,air_purifier_requires_external_evidence,,,, +air_purifier,constants/lexiconBatch2.ts,10,Strahlenaralie,Schefflera arboricola,"Die Strahlenaralie hat fingerfoermig angeordnete, glaenzende Blaetter auf langen Stielen. Sehr robuste Zimmerpflanze.",Helles indirektes Licht,15-25 °C,7,easy|tree|air_purifier,air_purifier_requires_external_evidence,,,, +bright_light,constants/lexiconBatch2.ts,225,Alocasia zebrina,Alocasia zebrina,Alocasia zebrina ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5,bright_light|high_humidity,,,,, +bright_light,constants/lexiconBatch2.ts,232,Norfolk-Tanne,Araucaria heterophylla,Norfolk-Tanne ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,tree|bright_light,,,,, +bright_light,constants/lexiconBatch2.ts,175,Eisbegonie,Begonia semperflorens-cultorum,"Eisbegonie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light,,,,, +bright_light,constants/lexiconBatch1.ts,62,Bougainvillea,Bougainvillea spectabilis,"Die Bougainvillea ist eine rankenreiche Kletterpflanze mit leuchtend farbigen Hochblaettern in Rot, Orange oder Pink.",Volles Sonnenlicht,18-30 °C,5,flowering|bright_light|sun,,,,, +bright_light,constants/lexiconBatch2.ts,184,Trompetenwinde,Campsis radicans,"Trompetenwinde ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light,,,,, +bright_light,constants/lexiconBatch2.ts,157,Clematis,Clematis viticella,"Clematis ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light,,,,, +bright_light,constants/lexiconBatch2.ts,224,Kroton,Codiaeum variegatum,Kroton ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,patterned|bright_light,,,,, +bright_light,constants/lexiconBatch2.ts,245,Kaffeepflanze arabica nana,Coffea arabica Nana,Kaffeepflanze arabica nana ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,bright_light,,,,, +bright_light,constants/lexiconBatch2.ts,137,Wasabi,Eutrema japonicum,"Wasabi ist ein seltenes Wuerzkraut, das gleichmaessige Feuchte und eher kuehle Bedingungen bevorzugt.",Helles indirektes Licht,8-20 C,4,bright_light|high_humidity,,,,, +bright_light,constants/lexiconBatch2.ts,248,Ficus altissima,Ficus altissima,Ficus altissima ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,tree|bright_light,,,,, +bright_light,constants/lexiconBatch1.ts,39,Geigenfeige,Ficus lyrata,"Die Geigenfeige ist ein Trendbaum mit grossen, geigenfoermigen Blaettern. Benoetigt viel Licht.",Helles indirektes Licht,18-27 °C,7,tree|large|bright_light,,,,, +bright_light,constants/lexiconBatch2.ts,247,Ficus microcarpa,Ficus microcarpa,Ficus microcarpa ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,easy|tree|bright_light,,,,, +bright_light,constants/lexiconBatch1.ts,68,Gerbera,Gerbera jamesonii,"Die Gerbera ist eine farbenfrohe Schnittblume mit grossen, sonnenblumenaehnlichen Blueten. Sehr beliebt.",Helles bis volles Licht,15-25 °C,5,flowering|air_purifier|bright_light,air_purifier_requires_external_evidence,,,, +bright_light,constants/lexiconBatch2.ts,72,Heliconia,Heliconia psittacorum,"Die Heliconia hat leuchtend orangefarbe oder rote, bootsfoermige Hochblaetter. Eine exotische Tropenpflanze.",Helles bis volles Licht,20-30 °C,5,flowering|bright_light|high_humidity,,,,, +bright_light,constants/lexiconBatch1.ts,21,Hibiskus,Hibiscus rosa-sinensis,"Der Hibiskus begeistert mit grossen, trompetenfoermigen Blueten in Rot, Orange und Rosa.",Volles Sonnenlicht,18-28 °C,3,flowering|bright_light|sun,,,,, +bright_light,constants/lexiconBatch1.ts,105,Ritterstern,Hippeastrum hybrid,"Der Ritterstern beeindruckt im Winter mit riesigen, trompetenfoermigen Blueten in Rot, Pink oder Weiss.",Helles bis volles Licht,18-25 °C,7,flowering|bright_light,,,,, +bright_light,constants/lexiconBatch2.ts,148,Hortensie,Hydrangea macrophylla,"Hortensie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Helles bis halbschattiges Licht,8-24 C,4,flowering|bright_light,,,,, +bright_light,constants/lexiconBatch2.ts,227,Punktblatt,Hypoestes phyllostachya,Punktblatt ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,patterned|bright_light,,,,, +bright_light,constants/lexiconBatch2.ts,176,Gartenbalsamine,Impatiens balsamina,"Gartenbalsamine ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light,,,,, +bright_light,constants/lexiconBatch2.ts,172,Arabischer Jasmin,Jasminum sambac,"Arabischer Jasmin ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light,,,,, +bright_light,constants/lexiconBatch2.ts,197,Traenendes Herz,Lamprocapnos spectabilis,"Traenendes Herz ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light,,,,, +bright_light,constants/lexiconBatch2.ts,64,Wandelroeschen,Lantana camara,"Das Wandelroeschen hat kugelige Bluetenkoepfe, die die Farbe von Gelb ueber Orange zu Rot wechseln. Sehr attraktiv.",Volles Sonnenlicht,18-28 °C,5,flowering|bright_light|sun,,,,, +bright_light,constants/lexiconBatch1.ts,23,Echter Lavendel,Lavandula angustifolia,Der Echte Lavendel ist ein aromatischer Halbstrauch mit lilafarbenen Bluetenaehren. Herrlicher Duft.,Volles Sonnenlicht,10-25 °C,10,medicinal|bright_light|sun,medicinal_requires_external_evidence,,,, +bright_light,constants/lexiconBatch2.ts,69,Ostertrompete,Lilium longiflorum,"Die Ostertrompete hat grosse, weisse, trichterfoermige Blueten mit intensivem Duft. Klassische Osterblume.",Helles bis volles Licht,15-25 °C,5,flowering|bright_light,,,,, +bright_light,constants/lexiconBatch2.ts,4,Chinesische Fächerpalme,Livistona chinensis,"Die Chinesische Fächerpalme hat grosse, faecher­foermige Blaetter auf einem einzelnen Stamm. Sehr dekorativ.",Helles bis volles Licht,15-25 °C,7,tree|bright_light,,,,, +bright_light,constants/lexiconBatch2.ts,171,Geissblatt,Lonicera japonica,"Geissblatt ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light,,,,, +bright_light,constants/lexiconBatch2.ts,76,Schamkraut,Mimosa pudica,"Das Schamkraut faltet seine Blaettchen blitzschnell zusammen, wenn man sie beruehrt. Ein faszinierendes Erlebnis.",Helles bis volles Licht,20-28 °C,5,flowering|bright_light,,,,, +bright_light,constants/lexiconBatch2.ts,37,Neoregelia,Neoregelia carolinae,"Die Neoregelia ist eine Bromelie, bei der das Herzblatt zur Bluetzeit leuchtend rot wird. Sehr dekorativ.",Helles bis volles Licht,18-27 °C,7,flowering|patterned|bright_light,,,,, +bright_light,constants/lexiconBatch2.ts,120,Oleander,Nerium oleander,"Der Oleander ist ein mediteraner Strauch mit leuchtend roten, rosa oder weissen Blueten. Sehr hitzetolerant.",Volles Sonnenlicht,15-28 °C,7,flowering|bright_light|sun,,,,, +bright_light,constants/lexiconBatch2.ts,231,Glueckskastanie,Pachira aquatica,Glueckskastanie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,easy|tree|bright_light,,,,, +bright_light,constants/lexiconBatch2.ts,6,Schraubenbaum,Pandanus veitchii,"Der Schraubenbaum hat spiralfoermig angeordnete, gruenweiss gestreifte Blaetter. Sehr dekorativ und exotisch.",Helles bis volles Licht,18-27 °C,7,patterned|bright_light,,,,, +bright_light,constants/lexiconBatch2.ts,243,Philodendron Pink Princess,Philodendron erubescens Pink Princess,Philodendron Pink Princess ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,patterned|bright_light,,,,, +bright_light,constants/lexiconBatch1.ts,44,Zwergdattelpalme,Phoenix roebelenii,"Die Zwergdattelpalme ist eine zierliche Palme mit eleganten, gebogenen Fiederblaettern. Tropisches Flair.",Helles bis volles Licht,18-27 °C,7,tree|bright_light,,,,, +bright_light,constants/lexiconBatch2.ts,152,Buntnessel,Plectranthus scutellarioides,"Buntnessel ist eine farbstarke Zierpflanze, die vor allem fuer ihr dekoratives Laub beliebt ist.",Volles bis helles Licht,10-24 C,4,patterned|bright_light,,,,, +bright_light,constants/lexiconBatch1.ts,61,Bleiwurz,Plumbago auriculata,"Die Bleiwurz ist ein halbimmergruener Strauch mit himmelblauen Blueten, der fast das ganze Jahr bluet.",Volles Sonnenlicht,15-27 °C,5,flowering|bright_light|sun,,,,, +bright_light,constants/lexiconBatch2.ts,170,Rhododendron,Rhododendron catawbiense,"Rhododendron ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|tree|bright_light,,,,, +bright_light,constants/lexiconBatch2.ts,142,Rose,Rosa x hybrida,"Rose ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light|sun,,,,, +bright_light,constants/lexiconBatch2.ts,235,Falsche Aralie,Schefflera elegantissima,Falsche Aralie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,tree|bright_light,,,,, +bright_light,constants/lexiconBatch2.ts,93,Aubergine,Solanum melongena,"Die Aubergine ist eine Gemuese­pflanze mit grossen, violetten Fruechten. Sie benoetigt viel Waerme und Sonne.",Volles Sonnenlicht,20-30 °C,5,bright_light|sun,,,,, +bright_light,constants/lexiconBatch2.ts,1,Weisse Strelitzie,Strelitzia nicolai,"Die Weisse Strelitzie ist ein beeindruckender Zimmerstrauch mit grossen, blaugruenen Blaettern und weiss-blauen Blueten.",Helles bis volles Licht,18-27 °C,7,tree|large|bright_light,,,,, +bright_light,constants/lexiconBatch2.ts,244,Philodendron Xanadu,Thaumatophyllum xanadu,Philodendron Xanadu ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,bright_light,,,,, +bright_light,constants/lexiconBatch1.ts,72,Vanda-Orchidee,Vanda coerulea,Die Vanda-Orchidee ist bekannt fuer ihre seltene blaue Bluetenfarbe. Epiphytische Orchidee mit grossen Blueten.,Helles bis volles Licht,20-30 °C,3,flowering|bright_light|high_humidity,,,,, +easy,constants/lexiconBatch2.ts,31,Adromischus,Adromischus cristatus,Adromischus ist eine kompakte Sukkulente mit ungewoehnlich wellenrandigen Blaettern auf kurzen Staengeln.,Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, +easy,constants/lexiconBatch1.ts,50,Aglaoneme,Aglaonema commutatum,Die Aglaoneme ist eine dekorative Zimmerpflanze mit silbrig-gruen gemusterten Blaettern. Tolerant gegenueber wenig Licht.,Wenig bis helles Licht,15-26 °C,7,easy|patterned|low_light,,,,, +easy,constants/lexiconBatch1.ts,30,Schnittlauch,Allium schoenoprasum,Schnittlauch ist ein beliebtes Kuechenkraut mit roehrenfoermigen Blaettern und lila Blueten.,Helles bis volles Licht,10-25 °C,3,easy,,,,, +easy,constants/lexiconBatch2.ts,135,Schnittknoblauch,Allium tuberosum,Schnittknoblauch ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +easy,constants/lexiconBatch1.ts,89,Kap-Aloe,Aloe arborescens,"Die Kap-Aloe ist eine strauchige Aloe mit schmalen, gezaehnten Blaettern und leuchtend roten Bluetenaehren im Winter.",Volles Sonnenlicht,10-30 °C,14,easy|succulent|medicinal|sun,medicinal_requires_external_evidence,,,, +easy,constants/lexiconBatch2.ts,128,Zitronenverbene,Aloysia citrodora,Zitronenverbene ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +easy,constants/lexiconBatch2.ts,140,Dill,Anethum graveolens,Dill ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +easy,constants/lexiconBatch2.ts,125,Kerbel,Anthriscus cerefolium,Kerbel ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +easy,constants/lexiconBatch2.ts,122,Estragon,Artemisia dracunculus,Estragon ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +easy,constants/lexiconBatch2.ts,16,Schusterpflanze,Aspidistra elatior,"Die Schusterpflanze ist eine extrem robuste Zimmerpflanze mit langen, dunkelgruenen Blaettern. Vertraegt tiefe Temperaturen.",Wenig bis helles Licht,10-20 °C,14,easy|low_light,,,,, +easy,constants/lexiconBatch2.ts,43,Vogelnest-Farn,Asplenium nidus,"Der Vogelnest-Farn hat ganzrandige, glaenzende Wedel, die eine Nestform bilden. Sehr dekorativ und robust.",Helles indirektes Licht,18-27 °C,5,easy|low_light|high_humidity,,,,, +easy,constants/lexiconBatch2.ts,13,Japanische Aucube,Aucuba japonica,"Die Japanische Aucube hat glaenzende, gruene oder gelbgefleckte Blaetter. Sehr schattenvertraeglich.",Wenig bis helles Licht,10-20 °C,7,easy|low_light,,,,, +easy,constants/lexiconBatch2.ts,7,Bambusrohr,Bambusa vulgaris,Das Bambusrohr ist eine schnell wachsende Bambusart mit gelbgruenen Halmen. Sehr dekorativ und vielseitig nutzbar.,Helles bis volles Licht,15-30 °C,5,easy|large,,,,, +easy,constants/lexiconBatch1.ts,41,Pferdeschwanzpalme,Beaucarnea recurvata,"Die Pferdeschwanzpalme hat einen verdickten Stammbasis als Wasserspeicher und lange, schmale Blaetter.",Volles Sonnenlicht,15-30 °C,21,easy|succulent|tree|sun,,,,, +easy,constants/lexiconBatch2.ts,97,Mangold,Beta vulgaris,"Mangold ist ein farbenfrohes Blattgemuese mit bunten Stielen in Rot, Gelb, Orange und Weiss.",Helles bis volles Licht,10-25 °C,3,easy,,,,, +easy,constants/lexiconBatch2.ts,38,Billbergia,Billbergia nutans,"Die Billbergia ist eine robuste Bromelie mit schmalen, gruenen Blaettern und hängenden, blauen und gruenen Blueten.",Helles indirektes Licht,15-25 °C,7,easy|flowering,,,,, +easy,constants/lexiconBatch2.ts,129,Borretsch,Borago officinalis,Borretsch ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +easy,constants/lexiconBatch2.ts,63,Calibrachoa,Calibrachoa hybrida,"Calibrachoa ist eine petunienaehnliche Haengepflanze mit unzaehligen, kleinen Trichterbluten in allen Farben.",Volles Sonnenlicht,15-25 °C,2,easy|flowering|hanging|sun,,,,, +easy,constants/lexiconBatch2.ts,56,Callisia,Callisia repens,"Callisia repens ist ein kleines, kriechendes Kraut mit winzigen, gruenen Blaettern. Ideal fuer haengende Behaelter.",Helles indirektes Licht,15-25 °C,5,easy|hanging,,,,, +easy,constants/lexiconBatch2.ts,92,Chili,Capsicum annuum,"Chili ist eine beliebte Gemuese- und Zierpflanze mit leuchtenden, roten oder orangen Fruechten. Im Topf kultivierbar.",Volles Sonnenlicht,20-30 °C,4,easy|medicinal|sun,medicinal_requires_external_evidence,,,, +easy,constants/lexiconBatch1.ts,81,Peruanischer Fackelkaktus,Cereus peruvianus,"Der Peruanische Fackelkaktus ist ein saeulenfoermiger Kaktus, der im Innenraum bis zu 2 m hoch werden kann.",Volles Sonnenlicht,15-35 °C,21,easy|succulent|large|sun,,,,, +easy,constants/lexiconBatch1.ts,99,Herzkette,Ceropegia woodii,"Die Herzkette hat duenne, haengende Ranken mit herzfoermigen, silbergrau gemusterten Blaettchen.",Helles indirektes Licht,15-27 °C,14,easy|succulent|patterned|hanging,,,,, +easy,constants/lexiconBatch1.ts,43,Bergpalme,Chamaedorea elegans,Die Bergpalme ist eine kompakte Zimmerpalme fuer schattigere Standorte. Ideal fuer dunkle Innenraeume.,Wenig bis helles Licht,15-25 °C,7,easy|pet_friendly|tree|air_purifier|low_light,air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence,,,, +easy,constants/lexiconBatch2.ts,138,Roemische Kamille,Chamaemelum nobile,Roemische Kamille ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|medicinal|sun,medicinal_requires_external_evidence,,,, +easy,constants/lexiconBatch2.ts,101,Kamille,Chamomilla recutita,"Die Kamille ist ein beliebtes Heilkraut mit kleinen, weiss-gelben Blueten. Das aetherische Oel wirkt beruhigend.",Volles Sonnenlicht,15-25 °C,5,easy|medicinal|sun,medicinal_requires_external_evidence,,,, +easy,constants/lexiconBatch2.ts,84,Kaffeestrauch,Coffea arabica,"Der Kaffeestrauch hat glaenzende, dunkelgruene Blaetter und entwickelt rote Kaffe­ekirschen. Kann im Topf gehalten werden.",Helles indirektes Licht,18-25 °C,7,easy,,,,, +easy,constants/lexiconBatch2.ts,14,Keulenlilie,Cordyline australis,"Die Keulenlilie hat lange, schmale, gruene oder rotbraune Blaetter in einem dekorativen Schopf.",Helles bis volles Licht,10-25 °C,7,easy|tree|sun,,,,, +easy,constants/lexiconBatch2.ts,15,Tiroler Keulenlilie,Cordyline fruticosa,"Die Tiroler Keulenlilie hat leuchtend rote, gruene oder buntlaubige Blaetter. Eine exotische Zimmerpflanze.",Helles indirektes Licht,18-27 °C,7,easy,,,,, +easy,constants/lexiconBatch2.ts,139,Koriander,Coriandrum sativum,Koriander ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +easy,constants/lexiconBatch2.ts,29,Kotyledon,Cotyledon orbiculata,"Kotyledon hat dickfleischige, runde Blaetter mit einem mehligen, weisslichen Belag. Sehr trockenheitsresistent.",Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, +easy,constants/lexiconBatch2.ts,26,Moos-Crassula,Crassula muscosa,"Die Moos-Crassula hat dicht aneinandergereihte, winzige gruene Blaetter auf unverzweigten Trieben. Sieht aus wie Moos.",Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, +easy,constants/lexiconBatch1.ts,5,Jadepflanze,Crassula ovata,"Die Jadepflanze ist eine langlebige Sukkulente mit dicken, ovalen Blaettern. In Japan gilt sie als Gluecksbringer.",Helles bis volles Licht,15-24 °C,14,easy|succulent|sun,,,,, +easy,constants/lexiconBatch1.ts,110,Krokus,Crocus vernus,"Der Krokus ist einer der ersten Fruehjahrs­boten mit kelchfoermigen Blueten in Lila, Weiss und Gelb.",Helles bis volles Licht,5-15 °C,7,easy|flowering,,,,, +easy,constants/lexiconBatch2.ts,94,Gurke,Cucumis sativus,"Die Gurke ist eine rankende Gemuese­pflanze mit gruenen, erfrischenden Fruechten. Im Balkonkasten kultivierbar.",Volles Sonnenlicht,18-28 °C,3,easy|sun,,,,, +easy,constants/lexiconBatch2.ts,127,Zitronengras,Cymbopogon citratus,Zitronengras ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +easy,constants/lexiconBatch2.ts,99,Karotte,Daucus carota,Die Karotte ist eine beliebte Gemuese­pflanze mit orangefarbenen Wurzeln. Im tiefen Topf kultivierbar.,Helles bis volles Licht,15-22 °C,5,easy,,,,, +easy,constants/lexiconBatch1.ts,48,Dieffenbachie,Dieffenbachia seguine,"Die Dieffenbachie ist eine tropische Blattschmuckpflanze mit grossen, gruen-weiss gefleckten Blaettern.",Helles indirektes Licht,18-26 °C,7,easy|air_purifier|low_light,air_purifier_requires_external_evidence,,,, +easy,constants/lexiconBatch1.ts,14,Maisstrauch,Dracaena fragrans,"Der Maisstrauch ist eine robuste Zimmerpflanze mit breiten, gestreiften Blaettern. Gedeiht auch bei wenig Licht.",Helles indirektes Licht,15-25 °C,10,easy|tree|air_purifier|low_light,air_purifier_requires_external_evidence,,,, +easy,constants/lexiconBatch1.ts,13,Drachenbaum,Dracaena marginata,"Der Drachenbaum ist eine schlanke Zimmerpflanze mit roten, schmalen Blaettern auf langen Staemmen.",Helles indirektes Licht,15-25 °C,10,easy|tree|air_purifier,air_purifier_requires_external_evidence,,,, +easy,constants/lexiconBatch2.ts,30,Dudleya,Dudleya brittonii,"Dudleya ist eine rosetten­bildende Sukkulente mit silbrig-weissen, mehligen Blaettern. Sehr elegant.",Volles Sonnenlicht,10-25 °C,14,easy|succulent|sun,,,,, +easy,constants/lexiconBatch1.ts,4,Echeverie,Echeveria elegans,"Die Echeverie bildet symmetrische, rosettenfoermige Sukkulenten mit blaugruenen Blaettern. Pflegeleicht.",Volles Sonnenlicht,15-25 °C,14,easy|succulent|sun,,,,, +easy,constants/lexiconBatch1.ts,77,Goldene Tonne,Echinocactus grusonii,Die Goldene Tonne ist ein ikonischer kugelfoermiger Kaktus mit goldgelben Stacheln. Waechst langsam aber imposant.,Volles Sonnenlicht,15-35 °C,21,easy|succulent|sun,,,,, +easy,constants/lexiconBatch1.ts,83,San-Pedro-Kaktus,Echinopsis pachanoi,"Der San-Pedro-Kaktus ist ein schnell wachsender, saeulenfoermiger Kaktus aus den Anden.",Volles Sonnenlicht,10-35 °C,14,easy|succulent|sun,,,,, +easy,constants/lexiconBatch1.ts,16,Marmor-Efeutute,Epipremnum aureum Marble Queen,Die Marmor-Efeutute hat cremeweiss-gruen marmorierte Blaetter. Eine dekorative Variante der klassischen Efeutute.,Helles indirektes Licht,15-30 °C,7,easy|hanging|air_purifier,air_purifier_requires_external_evidence,,,, +easy,constants/lexiconBatch2.ts,53,Neon-Efeutute,Epipremnum pinnatum Neon,Die Neon-Efeutute hat leuchtend limonengruene Blaetter. Sehr auffaellig und pflegeleicht.,Helles indirektes Licht,15-30 °C,7,easy|hanging|air_purifier,air_purifier_requires_external_evidence,,,, +easy,constants/lexiconBatch2.ts,19,Christusdorn,Euphorbia milii,Der Christusdorn ist eine sukkulente Wolfsmilch mit stacheligen Zweigen und kleinen roten oder gelben Hochblaettern.,Helles bis volles Licht,15-28 °C,10,easy|flowering|succulent|sun,,,,, +easy,constants/lexiconBatch1.ts,12,Bleistiftkaktus,Euphorbia tirucalli,"Der Bleistiftkaktus ist eine sukkulente Wolfsmilch mit duennen, zylindrischen Zweigen ohne Blaetter.",Volles Sonnenlicht,18-30 °C,14,easy|succulent|sun,,,,, +easy,constants/lexiconBatch2.ts,12,Fatsia,Fatsia japonica,"Die Fatsia ist ein dekorativer Zimmerstrauch mit grossen, handfoermigen, glaenzenden Blaettern. Sehr robust.",Helles indirektes Licht,10-20 °C,7,easy|low_light,,,,, +easy,constants/lexiconBatch1.ts,78,Fass-Kaktus,Ferocactus cylindraceus,"Der Fass-Kaktus ist ein zylindrischer Wuestenkaktus mit langen, roten Stacheln. Sehr langlebig.",Volles Sonnenlicht,15-35 °C,21,easy|succulent|sun,,,,, +easy,constants/lexiconBatch1.ts,38,Gummibaum,Ficus elastica,"Der Gummibaum ist eine imposante Zimmerpflanze mit grossen, glaenzenden, lederartigen Blaettern. Reinigt die Luft.",Helles indirektes Licht,16-24 °C,10,easy|tree|air_purifier,air_purifier_requires_external_evidence,,,, +easy,constants/lexiconBatch2.ts,247,Ficus microcarpa,Ficus microcarpa,Ficus microcarpa ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,easy|tree|bright_light,,,,, +easy,constants/lexiconBatch2.ts,100,Erdbeere,Fragaria ananassa,"Die Erdbeere ist ein beliebtes Obst fuer Balkon und Terrasse mit aromatischen, roten Fruechten.",Helles bis volles Licht,15-25 °C,3,easy|pet_friendly|sun,pet_friendly_requires_external_evidence,,,, +easy,constants/lexiconBatch1.ts,90,Gasteria,Gasteria carinata,"Die Gasteria ist eine kleine Sukkulente mit zweireihig angeordneten, zungenfoermigen, gefleckten Blaettern.",Helles indirektes Licht,15-25 °C,14,easy|succulent|low_light,,,,, +easy,constants/lexiconBatch1.ts,32,Blutroter Storchschnabel,Geranium sanguineum,Der Blutrote Storchschnabel ist ein zierlicher Storchschnabel mit intensiv magentafarbenen Blueten.,Helles bis volles Licht,10-25 °C,7,easy|flowering,,,,, +easy,constants/lexiconBatch1.ts,87,Geisterpflanze,Graptopetalum paraguayense,"Die Geisterpflanze hat zartgraue bis perlmutt-rosafarbene, rosettenfoermige Blaetter. Sehr robuste Sukkulente.",Volles Sonnenlicht,15-25 °C,14,easy|succulent|sun,,,,, +easy,constants/lexiconBatch1.ts,80,Mond-Kaktus,Gymnocalycium mihanovichii,Der Mond-Kaktus ist eine farbenfrohe Veredelung eines chlorophylllosen Kaktus auf einem gruenen Unterlagekaktus.,Indirektes Licht,15-30 °C,14,easy|succulent,,,,, +easy,constants/lexiconBatch1.ts,6,Zebra-Haworthie,Haworthia fasciata,Die Zebra-Haworthie ist eine kompakte Sukkulente mit weissen Querstreifen auf dunkelgruenen Blaettern.,Helles indirektes Licht,15-25 °C,14,easy|succulent|low_light,,,,, +easy,constants/lexiconBatch1.ts,37,Efeu,Hedera helix,"Efeu ist eine robuste Kletter- und Haengepflanze mit charakteristischen, dreilappigen Blaettern. Sehr langlebig.",Wenig bis helles Licht,10-20 °C,7,easy|hanging|air_purifier|low_light,air_purifier_requires_external_evidence,,,, +easy,constants/lexiconBatch2.ts,133,Currykraut,Helichrysum italicum,Currykraut ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +easy,constants/lexiconBatch1.ts,57,Wachsblume,Hoya carnosa,"Die Wachsblume ist eine Kletterpflanze mit dicken, wachsartigen Blaettern und sternfoermigen, duftenden Blueten.",Helles indirektes Licht,16-27 °C,10,easy|flowering|succulent|hanging,,,,, +easy,constants/lexiconBatch1.ts,108,Hyazinthe,Hyacinthus orientalis,"Die Hyazinthe bezaubert mit dichten Bluetenrispen und intensivem Duft in Blau, Rosa, Weiss oder Gelb.",Helles bis volles Licht,10-18 °C,5,easy|flowering,,,,, +easy,constants/lexiconBatch2.ts,136,Ysop,Hyssopus officinalis,Ysop ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +easy,constants/lexiconBatch2.ts,59,Neuguinea-Balsamine,Impatiens hawkeri,"Die Neuguinea-Balsamine hat grosse, leuchtende Blueten und ist sehr bluehfreudig. Ideal fuer Terrassen.",Helles indirektes Licht,18-27 °C,3,easy|flowering,,,,, +easy,constants/lexiconBatch1.ts,20,Fleissiges Lieschen,Impatiens walleriana,Das Fleissige Lieschen bluet von Fruehling bis Herbst unermudlich in vielen Farben.,Helles indirektes Licht,16-24 °C,2,easy|flowering,,,,, +easy,constants/lexiconBatch1.ts,64,Suesskartoffel,Ipomoea batatas,"Die Suesskartoffel-Zierpflanze hat dekorative, herzfoermige Blaetter in gruen oder dunkelviolett. Ideal als Haengepflanze.",Volles Sonnenlicht,20-30 °C,5,easy|hanging|sun,,,,, +easy,constants/lexiconBatch1.ts,9,Kalanchoe,Kalanchoe blossfeldiana,"Die Kalanchoe ist eine beliebte Bluehpflanze mit leuchtenden Blueten in Rot, Orange, Gelb oder Rosa.",Helles bis volles Licht,15-25 °C,10,easy|flowering|succulent|sun,,,,, +easy,constants/lexiconBatch2.ts,22,Brutblatt,Kalanchoe daigremontiana,Das Brutblatt bildet entlang des Blattrandes zahlreiche kleine Jungpflanzen. Eine faszinierende Sukkulente.,Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, +easy,constants/lexiconBatch2.ts,21,Kaninchen-Ohren,Kalanchoe tomentosa,"Kaninchen-Ohren haben weisslich-filzige Blaetter mit braunen Raendern, die Kaninchen­ohren aehneln. Sehr dekorativ.",Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, +easy,constants/lexiconBatch2.ts,95,Salat,Lactuca sativa,Salat ist eine schnell wachsende Blattgemuese­pflanze. Im Topf und Balkonkasten sehr gut zu kultivieren.,Helles bis volles Licht,10-22 °C,3,easy,,,,, +easy,constants/lexiconBatch2.ts,121,Lorbeer,Laurus nobilis,Lorbeer ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +easy,constants/lexiconBatch2.ts,126,Liebstoeckel,Levisticum officinale,Liebstoeckel ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +easy,constants/lexiconBatch2.ts,62,Duftsteinrich,Lobularia maritima,"Der Duftsteinrich ist ein niedrig wachsendes Pflanzchen mit winzigen, weissen oder lilafarbenen Blueten und suessem Duft.",Helles bis volles Licht,10-22 °C,3,easy|flowering,,,,, +easy,constants/lexiconBatch1.ts,79,Mammillaria,Mammillaria zeilmanniana,"Die Mammillaria ist ein kompakter, kugelfoermiger Kaktus, der im Fruehling einen Kranz aus rosa Blueten traegt.",Volles Sonnenlicht,15-35 °C,14,easy|flowering|succulent|sun,,,,, +easy,constants/lexiconBatch2.ts,102,Zitronenmelisse,Melissa officinalis,Die Zitronenmelisse ist ein zitronig duftendes Heilkraut. Sie beruhigt die Nerven und foerdert den Schlaf.,Helles bis volles Licht,15-25 °C,5,easy|medicinal,medicinal_requires_external_evidence,,,, +easy,constants/lexiconBatch1.ts,26,Gruene Minze,Mentha spicata,"Die Gruene Minze ist ein wuchsfreudiges Kuechenkraut mit frischem, minzigem Duft. Fuer Tee und Cocktails.",Helles bis volles Licht,15-25 °C,3,easy,,,,, +easy,constants/lexiconBatch2.ts,47,Monstera adansonii,Monstera adansonii,Monstera adansonii hat herzfoermige Blaetter mit zahlreichen runden Lochern. Eine rankende Zimmerpflanze.,Helles indirektes Licht,18-27 °C,7,easy|hanging,,,,, +easy,constants/lexiconBatch1.ts,109,Traubenhyazinthe,Muscari armeniacum,"Die Traubenhyazinthe bildet dichte Trauben aus kleinen, blauen bis violetten Gloeckchen. Zuverlaessige Fruejahrszwiebel.",Helles bis volles Licht,8-18 °C,7,easy|flowering,,,,, +easy,constants/lexiconBatch2.ts,132,Katzenminze,Nepeta cataria,Katzenminze ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +easy,constants/lexiconBatch1.ts,25,Basilikum,Ocimum basilicum,"Basilikum ist das beliebteste Kuechenkraut mit intensiv aromatischen, gruenen Blaettern. Fuer Pesto verwendet.",Volles Sonnenlicht,18-30 °C,2,easy|medicinal|sun,medicinal_requires_external_evidence,,,, +easy,constants/lexiconBatch1.ts,82,Hasenohren-Kaktus,Opuntia microdasys,"Der Hasenohren-Kaktus hat flache, ovale Triebe mit dichten weissen Glochiden. Klassischer Zimmerkaktus.",Volles Sonnenlicht,10-35 °C,21,easy|succulent|sun,,,,, +easy,constants/lexiconBatch2.ts,124,Majoran,Origanum majorana,Majoran ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +easy,constants/lexiconBatch1.ts,28,Oregano,Origanum vulgare,"Oregano ist ein aromatisches Kuechenkraut mit runden, behaarten Blaettern. In mediterraner Kueche beliebt.",Volles Sonnenlicht,15-25 °C,7,easy|medicinal|sun,medicinal_requires_external_evidence,,,, +easy,constants/lexiconBatch2.ts,231,Glueckskastanie,Pachira aquatica,Glueckskastanie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,easy|tree|bright_light,,,,, +easy,constants/lexiconBatch1.ts,88,Mondstein-Pflanze,Pachyphytum oviferum,"Die Mondstein-Pflanze hat dicke, ovale Blaetter mit einem pastellrosafarbenen, mehligen Ueberzug.",Volles Sonnenlicht,15-25 °C,14,easy|succulent|sun,,,,, +easy,constants/lexiconBatch1.ts,31,Rosengeranie,Pelargonium graveolens,Die Rosengeranie ist eine Duftpflanze mit tief eingeschnittenen Blaettern und rosaenlichem Aroma.,Volles Sonnenlicht,15-25 °C,7,easy|medicinal|sun,medicinal_requires_external_evidence,,,, +easy,constants/lexiconBatch2.ts,61,Efeu-Geranie,Pelargonium peltatum,"Die Efeu-Geranie hat efeufoermige, glaenzende Blaetter und bluet den ganzen Sommer in leuchtenden Farben.",Helles bis volles Licht,15-25 °C,5,easy|flowering|hanging|sun,,,,, +easy,constants/lexiconBatch1.ts,102,Rippenpeperomie,Peperomia caperata,"Die Rippenpeperomie hat tief gerippte, dunkelgruene bis violette Blaetter mit einer samtigen Textur.",Helles indirektes Licht,18-26 °C,10,easy|pet_friendly,pet_friendly_requires_external_evidence,,,, +easy,constants/lexiconBatch1.ts,103,Spiegelpeperomie,Peperomia obtusifolia,"Die Spiegelpeperomie hat glaenzende, lederartige, oval-runde Blaetter in tiefem Gruen. Sehr robust.",Helles indirektes Licht,16-26 °C,10,easy|pet_friendly|low_light,pet_friendly_requires_external_evidence,,,, +easy,constants/lexiconBatch2.ts,230,Raindrop-Peperomie,Peperomia polybotrya,Raindrop-Peperomie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,easy|pet_friendly,pet_friendly_requires_external_evidence,,,, +easy,constants/lexiconBatch2.ts,134,Shiso,Perilla frutescens,Shiso ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +easy,constants/lexiconBatch1.ts,29,Petersilie,Petroselinum crispum,Petersilie ist eines der meistgenutzten Kuechenkraeuter mit frisch-aromatischem Geschmack. Reich an Vitaminen.,Helles Licht,10-25 °C,3,easy,,,,, +easy,constants/lexiconBatch1.ts,34,Petunie,Petunia hybrida,Die Petunie ist eine der beliebtesten Balkonpflanzen mit trichterfoermigen Blueten in unzaehligen Farben.,Volles Sonnenlicht,15-25 °C,2,easy|pet_friendly|flowering|sun,pet_friendly_requires_external_evidence,,,, +easy,constants/lexiconBatch2.ts,50,Philodendron bipinnatifidum,Philodendron bipinnatifidum,"Philodendron bipinnatifidum hat grosse, tief gelappte Blaetter. Er entwickelt einen beeindruckenden, baumfoermigen Wuchs.",Helles indirektes Licht,18-27 °C,7,easy|large,,,,, +easy,constants/lexiconBatch2.ts,51,Roter Philodendron,Philodendron erubescens,"Der Rote Philodendron hat glaenzende, herzfoermige Blaetter, die jung roetrlich erscheinen. Sehr dekorativ.",Helles indirektes Licht,18-27 °C,7,easy|hanging,,,,, +easy,constants/lexiconBatch1.ts,15,Herzblatt-Philodendron,Philodendron hederaceum,Der Herzblatt-Philodendron ist eine pflegeleichte Kletter- oder Haengepflanze mit herzfoermigen Blaettern.,Indirektes Licht,18-28 °C,7,easy|hanging|low_light,,,,, +easy,constants/lexiconBatch2.ts,242,Philodendron Brasil,Philodendron hederaceum Brasil,Philodendron Brasil ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,easy|hanging|low_light,,,,, +easy,constants/lexiconBatch2.ts,8,Goldener Bambus,Phyllostachys aurea,"Der Goldene Bambus hat elegante, goldgelbe Halme mit engstehenden Knoten. Sehr dekorativ als Sichtschutz.",Helles bis volles Licht,10-30 °C,5,easy|large,,,,, +easy,constants/lexiconBatch2.ts,228,Aluminium-Pflanze,Pilea cadierei,Aluminium-Pflanze ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,easy|pet_friendly|patterned,pet_friendly_requires_external_evidence,,,, +easy,constants/lexiconBatch1.ts,2,Ufopflanze,Pilea peperomioides,"Die Ufopflanze hat unverwechselbare, runde Blaetter auf langen Stielen. Bildet leicht Ableger zum Verschenken.",Helles indirektes Licht,13-30 °C,7,easy|pet_friendly,pet_friendly_requires_external_evidence,,,, +easy,constants/lexiconBatch2.ts,44,Tueipelfarn,Polypodium vulgare,Der Tueipelfarn ist ein heimischer Farn mit gelappten Wedeln und runden Sporenhaeufchen auf der Unterseite.,Helles indirektes Licht,10-20 °C,7,easy,,,,, +easy,constants/lexiconBatch2.ts,27,Speckbaum,Portulacaria afra,"Der Speckbaum ist eine sukkulente Pflanze mit roten Stielen und kleinen, runden, glaenzenden Blaettern.",Helles bis volles Licht,15-30 °C,14,easy|succulent|sun,,,,, +easy,constants/lexiconBatch2.ts,98,Radieschen,Raphanus sativus,"Das Radieschen ist ein schnellwachsendes Gemuese mit runden, roten Knollen. Es reift in nur 3-4 Wochen.",Helles bis volles Licht,10-22 °C,2,easy,,,,, +easy,constants/lexiconBatch2.ts,52,Mini-Monstera,Rhaphidophora tetrasperma,"Die Mini-Monstera hat monstera­aehnliche, gelochte Blaetter auf einer kompakten, klettternden Pflanze. Sehr trendig.",Helles indirektes Licht,18-27 °C,7,easy|hanging,,,,, +easy,constants/lexiconBatch1.ts,24,Rosmarin,Rosmarinus officinalis,Rosmarin ist ein aromatisches Kraut mit nadelartigen Blaettern und blauen Blueten. In der Kueche unverzichtbar.,Volles Sonnenlicht,10-25 °C,7,easy|medicinal|sun,medicinal_requires_external_evidence,,,, +easy,constants/lexiconBatch2.ts,130,Sauerampfer,Rumex acetosa,Sauerampfer ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +easy,constants/lexiconBatch1.ts,94,Afrikanisches Veilchen,Saintpaulia ionantha,"Das Afrikanische Veilchen ist eine kleine, kompakte Bluehpflanze mit samtigen Blaettern und violetten Blueten.",Helles indirektes Licht,18-25 °C,7,easy|flowering,,,,, +easy,constants/lexiconBatch2.ts,103,Salbei,Salvia officinalis,Salbei ist ein aromatisches Heilkraut mit silbrig-gruenen Blaettern. Er hat antibakterielle und entzuendungshem­mende Wirkung.,Volles Sonnenlicht,10-25 °C,7,easy|medicinal|sun,medicinal_requires_external_evidence,,,, +easy,constants/lexiconBatch2.ts,17,Zylindrischer Bogenhanf,Sansevieria cylindrica,"Der Zylindrische Bogenhanf hat zylindrische, aufrechte Blaetter, die sich nach oben verjuengen. Sehr pflegeleicht.",Helles bis volles Licht,15-27 °C,14,easy|succulent|sun,,,,, +easy,constants/lexiconBatch2.ts,123,Bohnenkraut,Satureja hortensis,Bohnenkraut ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +easy,constants/lexiconBatch2.ts,11,Grosse Strahlenaralie,Schefflera actinophylla,"Die Grosse Strahlenaralie kann grosse, handfoermige Blaetter entwickeln. Sie ist ideal als Zimmerstrauch.",Helles indirektes Licht,18-27 °C,7,easy|tree|large,,,,, +easy,constants/lexiconBatch2.ts,10,Strahlenaralie,Schefflera arboricola,"Die Strahlenaralie hat fingerfoermig angeordnete, glaenzende Blaetter auf langen Stielen. Sehr robuste Zimmerpflanze.",Helles indirektes Licht,15-25 °C,7,easy|tree|air_purifier,air_purifier_requires_external_evidence,,,, +easy,constants/lexiconBatch1.ts,8,Weihnachtskaktus,Schlumbergera truncata,"Der Weihnachtskaktus erfreut zur Weihnachtszeit mit leuchtenden Blueten in Rosa, Rot oder Weiss.",Helles indirektes Licht,15-21 °C,7,easy|flowering|succulent,,,,, +easy,constants/lexiconBatch1.ts,55,Satinpothos,Scindapsus pictus,"Der Satinpothos hat samtig-glaenzende, silbrig gefleckte Blaetter auf langen, haengenden Ranken.",Helles indirektes Licht,18-28 °C,7,easy|patterned|hanging,,,,, +easy,constants/lexiconBatch1.ts,7,Eselschwanz,Sedum morganianum,"Der Eselschwanz ist eine haengende Sukkulente mit langen Trieben aus dichten, blaugruenen Blaettchen.",Volles Sonnenlicht,15-25 °C,14,easy|succulent|hanging|sun,,,,, +easy,constants/lexiconBatch1.ts,100,Perlenschnur-Pflanze,Senecio rowleyanus,"Die Perlenschnur-Pflanze hat haengende Ranken mit kugelfoermigen, perlenaehnlichen Blaettern. Einzigartige Sukkulente.",Helles bis volles Licht,15-27 °C,14,easy|succulent|hanging,,,,, +easy,constants/lexiconBatch2.ts,28,Blauer Kreuzkraut,Senecio serpens,"Der Blaue Kreuzkraut hat zylindrische, blaublaugruene Blaetter und einen kriechenden Wuchs. Sehr dekorativ.",Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, +easy,constants/lexiconBatch2.ts,91,Tomate,Solanum lycopersicum,"Die Tomate ist eine beliebte Gemuese- und Balkonpflanze mit roten, saftigen Fruechten. Im Topf kultivierbar.",Volles Sonnenlicht,18-28 °C,3,easy,,,,, +easy,constants/lexiconBatch2.ts,96,Spinat,Spinacia oleracea,Spinat ist ein naehrstoffreiches Blattgemuese mit dunkelgruenen Blaettern. Reich an Eisen und Vitaminen.,Helles bis volles Licht,10-20 °C,3,easy,,,,, +easy,constants/lexiconBatch2.ts,131,Stevia,Stevia rebaudiana,Stevia ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +easy,constants/lexiconBatch1.ts,56,Pfeilblatt,Syngonium podophyllum,"Das Pfeilblatt hat charakteristisch pfeilfoermige Blaetter, die sich mit dem Alter weiterentwickeln.",Helles indirektes Licht,16-27 °C,7,easy|hanging,,,,, +easy,constants/lexiconBatch2.ts,66,Studentenblume,Tagetes patula,Die Studentenblume ist eine robuste Sommerblume mit orangen oder gelben Blueten. Sie haelt Schadlinge fern.,Volles Sonnenlicht,15-28 °C,3,easy|flowering|sun,,,,, +easy,constants/lexiconBatch1.ts,27,Thymian,Thymus vulgaris,"Thymian ist ein kleiner, aromatischer Strauch mit winzigen Blaettern und rosa Blueten. Wichtiges Kuechenkraut.",Volles Sonnenlicht,10-25 °C,7,easy|medicinal|sun,medicinal_requires_external_evidence,,,, +easy,constants/lexiconBatch2.ts,33,Luftpflanze,Tillandsia ionantha,Die Luftpflanze ist eine kompakte Bromelie ohne Topferde. Sie nimmt Wasser und Naehrstoffe ueber die Blattschuppen auf.,Helles bis volles Licht,15-30 °C,3,easy,,,,, +easy,constants/lexiconBatch2.ts,32,Spanisches Moos,Tillandsia usneoides,"Das Spanische Moos ist eine epiphytische Bromelie ohne Wurzeln, die in der Luft haengt. Es benoetigt nur Feuchtigkeitsbespruehing.",Helles bis volles Licht,15-30 °C,3,easy|hanging,,,,, +easy,constants/lexiconBatch2.ts,55,Weisse Tradescantia,Tradescantia fluminensis,Die Weisse Tradescantia hat gruene Blaetter mit weisslichen Unterseiten. Sehr robust und schnellwachsend.,Helles indirektes Licht,15-25 °C,5,easy|hanging,,,,, +easy,constants/lexiconBatch2.ts,54,Lila Tradescantia,Tradescantia pallida,Die Lila Tradescantia hat leuchtend purpurrote Blaetter und ist sehr auffaellig. Sie liebt viel Licht.,Helles bis volles Licht,15-25 °C,5,easy|hanging|sun,,,,, +easy,constants/lexiconBatch1.ts,17,Zebrakraut,Tradescantia zebrina,Das Zebrakraut faellt durch seine silbrig-lila gestreiften Blaetter auf. Schnellwachsende Haengepflanze.,Helles indirektes Licht,15-25 °C,5,easy|patterned|hanging,,,,, +easy,constants/lexiconBatch1.ts,107,Tulpe,Tulipa gesneriana,Die Tulpe ist eine der beliebtesten Fruehjahrsblueher mit kelchfoermigen Blueten in unzaehligen Farben.,Helles bis volles Licht,8-18 °C,5,easy|flowering,,,,, +easy,constants/lexiconBatch1.ts,35,Stiefmuetterchen,Viola wittrockiana,Das Stiefmuetterchen ist ein bekannter Fruehjahrsblueher mit charakteristisch gezeichneten Blueten.,Helles bis volles Licht,5-18 °C,3,easy|flowering,,,,, +easy,constants/lexiconBatch2.ts,246,Yucca aloifolia,Yucca aloifolia,Yucca aloifolia ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Volles Sonnenlicht,18-30 C,10,easy|tree|sun,,,,, +easy,constants/lexiconBatch1.ts,40,Yucca-Palme,Yucca elephantipes,"Die Yucca-Palme ist eine robuste Zimmerpflanze mit starrem, immergruenem Blaetterschopf auf einem dicken Stamm.",Helles bis volles Licht,15-28 °C,14,easy|tree|sun,,,,, +easy,constants/lexiconBatch2.ts,65,Zinnie,Zinnia elegans,"Die Zinnie ist eine leuchtende Sommerblume mit grossen, dahlienaehnlichen Blueten. Sehr robust und hitzetolerant.",Volles Sonnenlicht,18-30 °C,3,easy|flowering|sun,,,,, +flowering,constants/lexiconBatch2.ts,108,Schafgarbe,Achillea millefolium,Die Schafgarbe hat weisse oder rosafarbene Bluetenschirme und fein gefiederte Blaetter. Wichtige Heilpflanze.,Volles Sonnenlicht,10-25 °C,7,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, +flowering,constants/lexiconBatch1.ts,86,Wuestenrose,Adenium obesum,Die Wuestenrose ist eine sukkulente Zimmerpflanze mit dickem Stamm und leuchtend pinken Blueten.,Volles Sonnenlicht,20-35 °C,10,flowering|succulent|sun,,,,, +flowering,constants/lexiconBatch2.ts,117,Socotra-Wuestenrose,Adenium socotranum,"Die Socotra-Wuestenrose ist eine seltene, endemische Art mit einem sehr dicken, knolligen Stamm und rosa Blueten.",Volles Sonnenlicht,20-35 °C,14,flowering|succulent|sun,,,,, +flowering,constants/lexiconBatch2.ts,34,Silbervase,Aechmea fasciata,Die Silbervase ist eine Bromelie mit silbrig gebänderten Blaettern und einem rosafarbenen Bluetenstand.,Helles indirektes Licht,18-25 °C,10,flowering|patterned,,,,, +flowering,constants/lexiconBatch1.ts,98,Lippenstiftpflanze,Aeschynanthus radicans,Die Lippenstiftpflanze hat haengende Triebe mit glaenzenden Blaettern und leuchtend roten Roehrenbluten.,Helles indirektes Licht,18-27 °C,7,flowering|hanging|high_humidity,,,,, +flowering,constants/lexiconBatch2.ts,155,Stockrose,Alcea rosea,"Stockrose ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch2.ts,73,Muschelingwer,Alpinia zerumbet,"Der Muschelingwer hat lange, elegante Blaetter und haengende Bluetenrispen mit weiss-rosa Bluetchen.",Helles bis volles Licht,20-30 °C,5,flowering|large|high_humidity,,,,, +flowering,constants/lexiconBatch2.ts,194,Fuchsschwanz,Amaranthus caudatus,"Fuchsschwanz ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch2.ts,163,Anemone,Anemone coronaria,"Anemone ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch2.ts,147,Loewenmaeulchen,Antirrhinum majus,"Loewenmaeulchen ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch2.ts,107,Arnika,Arnica montana,Arnika ist eine bekannte Heilpflanze aus den Alpen mit goldgelben Korbbluten. Sie wird fuer Muskeln und Gelenke verwendet.,Volles Sonnenlicht,10-20 °C,7,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, +flowering,constants/lexiconBatch2.ts,178,Seidenpflanze,Asclepias tuberosa,"Seidenpflanze ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch1.ts,92,Indische Azalee,Azalea indica,"Die Indische Azalee ist ein beliebter Zierstrauch mit grossen, auffaelligen Blueten in Rosa- und Rottönen.",Helles indirektes Licht,10-20 °C,4,flowering,,,,, +flowering,constants/lexiconBatch2.ts,175,Eisbegonie,Begonia semperflorens-cultorum,"Eisbegonie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light,,,,, +flowering,constants/lexiconBatch2.ts,58,Knollen-Begonie,Begonia tuberhybrida,"Die Knollen-Begonie hat riesige, rosenaehnliche Blueten in leuchtendem Rot, Orange, Gelb oder Weiss.",Helles indirektes Licht,15-22 °C,5,flowering|high_humidity,,,,, +flowering,constants/lexiconBatch2.ts,145,Gaensebluemchen,Bellis perennis,"Gaensebluemchen ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch2.ts,38,Billbergia,Billbergia nutans,"Die Billbergia ist eine robuste Bromelie mit schmalen, gruenen Blaettern und hängenden, blauen und gruenen Blueten.",Helles indirektes Licht,15-25 °C,7,easy|flowering,,,,, +flowering,constants/lexiconBatch1.ts,62,Bougainvillea,Bougainvillea spectabilis,"Die Bougainvillea ist eine rankenreiche Kletterpflanze mit leuchtend farbigen Hochblaettern in Rot, Orange oder Pink.",Volles Sonnenlicht,18-30 °C,5,flowering|bright_light|sun,,,,, +flowering,constants/lexiconBatch2.ts,223,Schmetterlingsflieder,Buddleja davidii,Schmetterlingsflieder ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|sun,,,,, +flowering,constants/lexiconBatch2.ts,187,Ringelblume,Calendula officinalis,"Ringelblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, +flowering,constants/lexiconBatch2.ts,63,Calibrachoa,Calibrachoa hybrida,"Calibrachoa ist eine petunienaehnliche Haengepflanze mit unzaehligen, kleinen Trichterbluten in allen Farben.",Volles Sonnenlicht,15-25 °C,2,easy|flowering|hanging|sun,,,,, +flowering,constants/lexiconBatch1.ts,93,Kamelie,Camellia japonica,Die Kamelie ist ein eleganter Zierstrauch mit glaenzenden Blaettern und rosenaehnlichen Blueten von Januar bis April.,Helles indirektes Licht,7-18 °C,5,flowering,,,,, +flowering,constants/lexiconBatch2.ts,85,Teestrauch,Camellia sinensis,"Der Teestrauch ist die Pflanze, aus deren Blaettern Tee gewonnen wird. Er hat weisse Blueten und glaenzende Blaetter.",Helles indirektes Licht,15-22 °C,7,flowering,,,,, +flowering,constants/lexiconBatch2.ts,184,Trompetenwinde,Campsis radicans,"Trompetenwinde ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light,,,,, +flowering,constants/lexiconBatch2.ts,67,Blumenschilfrohr,Canna indica,"Das Blumenschilfrohr hat grosse, tropisch wirkende Blaetter und auffaellige Blueten in Rot, Orange oder Gelb.",Volles Sonnenlicht,18-28 °C,5,flowering|large|sun,,,,, +flowering,constants/lexiconBatch1.ts,73,Cattleya-Orchidee,Cattleya labiata,"Die Cattleya ist die Koenigin der Orchideen mit ueppigen, duftenden Blueten in Lila, Rosa und Weiss.",Helles indirektes Licht,18-28 °C,7,flowering|high_humidity,,,,, +flowering,constants/lexiconBatch2.ts,188,Kornblume,Centaurea cyanus,"Kornblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch1.ts,67,Chrysantheme,Chrysanthemum indicum,"Die Chrysantheme ist die klassische Herbstblume mit ueppigen, dichten Blueten in vielen Farben.",Helles bis volles Licht,12-22 °C,4,flowering,,,,, +flowering,constants/lexiconBatch2.ts,157,Clematis,Clematis viticella,"Clematis ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light,,,,, +flowering,constants/lexiconBatch1.ts,104,Riemenblatt,Clivia miniata,Das Riemenblatt ist eine dekorative Zimmerpflanze mit leuchtend orangefarbenen Blueten im Fruehling.,Helles indirektes Licht,15-24 °C,10,flowering,,,,, +flowering,constants/lexiconBatch1.ts,97,Columnea,Columnea gloriosa,"Die Columnea ist eine haengende Zimmerpflanze mit kleinen, behaarten Blaettern und leuchtend roten, roehrenfoermigen Blueten.",Helles indirektes Licht,18-25 °C,7,flowering|hanging|high_humidity,,,,, +flowering,constants/lexiconBatch2.ts,160,Maigloeckchen,Convallaria majalis,"Maigloeckchen ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|medicinal,medicinal_requires_external_evidence,,,, +flowering,constants/lexiconBatch2.ts,181,Maedchenauge,Coreopsis tinctoria,"Maedchenauge ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch2.ts,150,Kosmee,Cosmos bipinnatus,"Kosmee ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch1.ts,110,Krokus,Crocus vernus,"Der Krokus ist einer der ersten Fruehjahrs­boten mit kelchfoermigen Blueten in Lila, Weiss und Gelb.",Helles bis volles Licht,5-15 °C,7,easy|flowering,,,,, +flowering,constants/lexiconBatch1.ts,19,Alpenveilchen,Cyclamen persicum,"Das Alpenveilchen bluet im Herbst und Winter mit eleganten Blueten in Rosa, Rot oder Weiss.",Helles indirektes Licht,12-18 °C,5,flowering,,,,, +flowering,constants/lexiconBatch1.ts,71,Zymbidium,Cymbidium lowianum,"Das Zymbidium ist eine robuste Orchidee mit langen, grassartigen Blaettern und eleganten Bluetenrispen.",Helles Licht,12-24 °C,7,flowering,,,,, +flowering,constants/lexiconBatch2.ts,68,Dahlie,Dahlia pinnata,Die Dahlie ist eine prachtvolle Sommerblume mit Blueten in allen Groessen und Formen. Sie wird aus Knollen gezogen.,Volles Sonnenlicht,15-25 °C,5,flowering|sun,,,,, +flowering,constants/lexiconBatch2.ts,215,Flammenbaum,Delonix regia,Flammenbaum ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|large,,,,, +flowering,constants/lexiconBatch2.ts,153,Rittersporn,Delphinium elatum,"Rittersporn ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch1.ts,70,Dendrobium,Dendrobium nobile,"Das Dendrobium ist eine beliebte Zimmerorchidee mit langen Pseudobulben, die im Winter mit Blueten besetzt werden.",Helles indirektes Licht,15-28 °C,10,flowering|high_humidity,,,,, +flowering,constants/lexiconBatch2.ts,189,Bartnelke,Dianthus barbatus,"Bartnelke ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch2.ts,146,Nelke,Dianthus caryophyllus,"Nelke ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch2.ts,109,Roter Fingerhut,Digitalis purpurea,"Der Rote Fingerhut hat hohe Bluetenstaende mit roehrenfoermigen, gepunkteten Blueten in Rosa. Wichtige Arzneipflanze.",Helles bis volles Licht,10-20 °C,7,flowering|medicinal,medicinal_requires_external_evidence,,,, +flowering,constants/lexiconBatch2.ts,106,Sonnenhut,Echinacea purpurea,"Der Sonnenhut ist eine beliebte Heilpflanze mit grossen, pinkfarbenen Blueten. Er staerkt das Immunsystem.",Helles bis volles Licht,15-25 °C,7,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, +flowering,constants/lexiconBatch1.ts,84,Koenigin der Nacht,Epiphyllum oxypetalum,"Die Koenigin der Nacht bluet nur eine einzige Nacht lang mit riesigen, intensiv duftenden weissen Blueten.",Indirektes Licht,18-27 °C,7,flowering|succulent,,,,, +flowering,constants/lexiconBatch2.ts,186,Kalifornischer Mohn,Eschscholzia californica,"Kalifornischer Mohn ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch2.ts,19,Christusdorn,Euphorbia milii,Der Christusdorn ist eine sukkulente Wolfsmilch mit stacheligen Zweigen und kleinen roten oder gelben Hochblaettern.,Helles bis volles Licht,15-28 °C,10,easy|flowering|succulent|sun,,,,, +flowering,constants/lexiconBatch2.ts,20,Weihnachtsstern,Euphorbia pulcherrima,Der Weihnachtsstern ist die klassische Winterpflanze mit leuchtend roten Hochblaettern. Er steht symbolisch fuer Weihnachten.,Helles indirektes Licht,15-22 °C,7,flowering,,,,, +flowering,constants/lexiconBatch2.ts,219,Forsythie,Forsythia x intermedia,Forsythie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|sun,,,,, +flowering,constants/lexiconBatch2.ts,169,Freesie,Freesia refracta,"Freesie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch1.ts,33,Fuchsie,Fuchsia hybrida,"Die Fuchsie haengt mit eleganten, zweifarbigen Blueten wie kleine Ohrringe herab. Ideal fuer Ampeln.",Helles indirektes Licht,14-22 °C,3,flowering|hanging,,,,, +flowering,constants/lexiconBatch2.ts,60,Triphylla-Fuchsie,Fuchsia triphylla,"Die Triphylla-Fuchsie hat lange, roehrenfoermige, orangefarbe Blueten in haengenden Trauben. Sehr exotisch.",Helles indirektes Licht,15-22 °C,3,flowering|hanging,,,,, +flowering,constants/lexiconBatch2.ts,196,Kokardenblume,Gaillardia aristata,"Kokardenblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch1.ts,22,Gardenie,Gardenia jasminoides,"Die Gardenie fasziniert mit cremefarbenen, intensiv duftenden Blueten. Anspruchsvoll in der Pflege.",Helles indirektes Licht,18-23 °C,5,flowering|high_humidity,,,,, +flowering,constants/lexiconBatch2.ts,190,Mittagsgold,Gazania rigens,"Mittagsgold ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch1.ts,32,Blutroter Storchschnabel,Geranium sanguineum,Der Blutrote Storchschnabel ist ein zierlicher Storchschnabel mit intensiv magentafarbenen Blueten.,Helles bis volles Licht,10-25 °C,7,easy|flowering,,,,, +flowering,constants/lexiconBatch1.ts,68,Gerbera,Gerbera jamesonii,"Die Gerbera ist eine farbenfrohe Schnittblume mit grossen, sonnenblumenaehnlichen Blueten. Sehr beliebt.",Helles bis volles Licht,15-25 °C,5,flowering|air_purifier|bright_light,air_purifier_requires_external_evidence,,,, +flowering,constants/lexiconBatch2.ts,161,Gladiole,Gladiolus hortulanus,"Gladiole ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch1.ts,96,Gloxinie,Gloxinia speciosa,"Die Gloxinie hat grosse, samtartige Blueten in Violett, Rosa oder Weiss mit farbigen Raendern.",Helles indirektes Licht,18-25 °C,5,flowering|high_humidity,,,,, +flowering,constants/lexiconBatch2.ts,36,Guzmania,Guzmania lingulata,"Die Guzmania ist eine Bromelie mit glänzenden, gruenen Blaettern und einem leuchtend roten, sternfoermigen Bluetenstand.",Helles indirektes Licht,18-27 °C,7,flowering|high_humidity,,,,, +flowering,constants/lexiconBatch2.ts,119,Zaubernuss,Hamamelis mollis,"Die Zaubernuss bluet im Winter mit fadendunnen, gelben Bluetenkranzeln, die bis -10 Grad standhalten.",Helles bis volles Licht,10-20 °C,10,flowering|medicinal,medicinal_requires_external_evidence,,,, +flowering,constants/lexiconBatch2.ts,141,Sonnenblume,Helianthus annuus,"Sonnenblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch2.ts,72,Heliconia,Heliconia psittacorum,"Die Heliconia hat leuchtend orangefarbe oder rote, bootsfoermige Hochblaetter. Eine exotische Tropenpflanze.",Helles bis volles Licht,20-30 °C,5,flowering|bright_light|high_humidity,,,,, +flowering,constants/lexiconBatch2.ts,191,Heliotrop,Heliotropium arborescens,"Heliotrop ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch2.ts,183,Lenzrose,Helleborus orientalis,"Lenzrose ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering,,,,, +flowering,constants/lexiconBatch2.ts,182,Taglilie,Hemerocallis fulva,"Taglilie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch1.ts,21,Hibiskus,Hibiscus rosa-sinensis,"Der Hibiskus begeistert mit grossen, trompetenfoermigen Blueten in Rot, Orange und Rosa.",Volles Sonnenlicht,18-28 °C,3,flowering|bright_light|sun,,,,, +flowering,constants/lexiconBatch2.ts,220,Gartenhibiskus,Hibiscus syriacus,Gartenhibiskus ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|sun,,,,, +flowering,constants/lexiconBatch1.ts,105,Ritterstern,Hippeastrum hybrid,"Der Ritterstern beeindruckt im Winter mit riesigen, trompetenfoermigen Blueten in Rot, Pink oder Weiss.",Helles bis volles Licht,18-25 °C,7,flowering|bright_light,,,,, +flowering,constants/lexiconBatch1.ts,58,Kleine Wachsblume,Hoya bella,"Die Kleine Wachsblume traegt zierliche, sternfoermige weisse Blueten mit rosa Mitte. Haengende Sukkulente.",Helles indirektes Licht,18-27 °C,10,flowering|succulent|hanging,,,,, +flowering,constants/lexiconBatch1.ts,57,Wachsblume,Hoya carnosa,"Die Wachsblume ist eine Kletterpflanze mit dicken, wachsartigen Blaettern und sternfoermigen, duftenden Blueten.",Helles indirektes Licht,16-27 °C,10,easy|flowering|succulent|hanging,,,,, +flowering,constants/lexiconBatch2.ts,159,Hasengloeckchen,Hyacinthoides non-scripta,"Hasengloeckchen ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch1.ts,108,Hyazinthe,Hyacinthus orientalis,"Die Hyazinthe bezaubert mit dichten Bluetenrispen und intensivem Duft in Blau, Rosa, Weiss oder Gelb.",Helles bis volles Licht,10-18 °C,5,easy|flowering,,,,, +flowering,constants/lexiconBatch2.ts,148,Hortensie,Hydrangea macrophylla,"Hortensie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Helles bis halbschattiges Licht,8-24 C,4,flowering|bright_light,,,,, +flowering,constants/lexiconBatch2.ts,105,Johanniskraut,Hypericum perforatum,Das Johanniskraut hat leuchtend gelbe Blueten und ist ein wichtiges Heilkraut gegen Depressionen und Stimmungstiefs.,Volles Sonnenlicht,10-25 °C,7,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, +flowering,constants/lexiconBatch2.ts,176,Gartenbalsamine,Impatiens balsamina,"Gartenbalsamine ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light,,,,, +flowering,constants/lexiconBatch2.ts,59,Neuguinea-Balsamine,Impatiens hawkeri,"Die Neuguinea-Balsamine hat grosse, leuchtende Blueten und ist sehr bluehfreudig. Ideal fuer Terrassen.",Helles indirektes Licht,18-27 °C,3,easy|flowering,,,,, +flowering,constants/lexiconBatch1.ts,20,Fleissiges Lieschen,Impatiens walleriana,Das Fleissige Lieschen bluet von Fruehling bis Herbst unermudlich in vielen Farben.,Helles indirektes Licht,16-24 °C,2,easy|flowering,,,,, +flowering,constants/lexiconBatch2.ts,156,Prunkwinde,Ipomoea purpurea,"Prunkwinde ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch2.ts,144,Bart-Iris,Iris germanica,"Bart-Iris ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch2.ts,211,Jacaranda,Jacaranda mimosifolia,Jacaranda ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|large,,,,, +flowering,constants/lexiconBatch1.ts,59,Jasmin,Jasminum polyanthum,"Der Jasmin ist eine Kletterpflanze mit intensiv duftenden, weissen Blueten. Er bluet im Winter und Fruehling.",Helles bis volles Licht,10-22 °C,5,flowering,,,,, +flowering,constants/lexiconBatch2.ts,172,Arabischer Jasmin,Jasminum sambac,"Arabischer Jasmin ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light,,,,, +flowering,constants/lexiconBatch1.ts,9,Kalanchoe,Kalanchoe blossfeldiana,"Die Kalanchoe ist eine beliebte Bluehpflanze mit leuchtenden Blueten in Rot, Orange, Gelb oder Rosa.",Helles bis volles Licht,15-25 °C,10,easy|flowering|succulent|sun,,,,, +flowering,constants/lexiconBatch2.ts,197,Traenendes Herz,Lamprocapnos spectabilis,"Traenendes Herz ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light,,,,, +flowering,constants/lexiconBatch2.ts,64,Wandelroeschen,Lantana camara,"Das Wandelroeschen hat kugelige Bluetenkoepfe, die die Farbe von Gelb ueber Orange zu Rot wechseln. Sehr attraktiv.",Volles Sonnenlicht,18-28 °C,5,flowering|bright_light|sun,,,,, +flowering,constants/lexiconBatch2.ts,158,Duftwicke,Lathyrus odoratus,"Duftwicke ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch2.ts,180,Bechermalve,Lavatera trimestris,"Bechermalve ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch2.ts,173,Margerite,Leucanthemum vulgare,"Margerite ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch2.ts,201,Shasta-Margerite,Leucanthemum x superbum,"Shasta-Margerite ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch2.ts,69,Ostertrompete,Lilium longiflorum,"Die Ostertrompete hat grosse, weisse, trichterfoermige Blueten mit intensivem Duft. Klassische Osterblume.",Helles bis volles Licht,15-25 °C,5,flowering|bright_light,,,,, +flowering,constants/lexiconBatch2.ts,62,Duftsteinrich,Lobularia maritima,"Der Duftsteinrich ist ein niedrig wachsendes Pflanzchen mit winzigen, weissen oder lilafarbenen Blueten und suessem Duft.",Helles bis volles Licht,10-22 °C,3,easy|flowering,,,,, +flowering,constants/lexiconBatch2.ts,171,Geissblatt,Lonicera japonica,"Geissblatt ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light,,,,, +flowering,constants/lexiconBatch2.ts,154,Lupine,Lupinus polyphyllus,"Lupine ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch2.ts,204,Magnolie,Magnolia grandiflora,Magnolie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|large,,,,, +flowering,constants/lexiconBatch1.ts,79,Mammillaria,Mammillaria zeilmanniana,"Die Mammillaria ist ein kompakter, kugelfoermiger Kaktus, der im Fruehling einen Kranz aus rosa Blueten traegt.",Volles Sonnenlicht,15-35 °C,14,easy|flowering|succulent|sun,,,,, +flowering,constants/lexiconBatch1.ts,75,Stiefmuetterchen-Orchidee,Miltoniopsis roezlii,"Die Stiefmuetterchen-Orchidee hat grosse, flache Blueten. Bevorzugt kuehle Temperaturen und hohe Luftfeuchtigkeit.",Indirektes Licht,15-22 °C,5,flowering|high_humidity,,,,, +flowering,constants/lexiconBatch2.ts,76,Schamkraut,Mimosa pudica,"Das Schamkraut faltet seine Blaettchen blitzschnell zusammen, wenn man sie beruehrt. Ein faszinierendes Erlebnis.",Helles bis volles Licht,20-28 °C,5,flowering|bright_light,,,,, +flowering,constants/lexiconBatch2.ts,179,Indianernessel,Monarda didyma,"Indianernessel ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch1.ts,109,Traubenhyazinthe,Muscari armeniacum,"Die Traubenhyazinthe bildet dichte Trauben aus kleinen, blauen bis violetten Gloeckchen. Zuverlaessige Fruejahrszwiebel.",Helles bis volles Licht,8-18 °C,7,easy|flowering,,,,, +flowering,constants/lexiconBatch2.ts,177,Vergissmeinnicht,Myosotis sylvatica,"Vergissmeinnicht ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch1.ts,106,Osterglocke,Narcissus pseudonarcissus,"Die Osterglocke ist der klassische Fruehjahrsblueher mit leuchtend gelben, trompetenfoermigen Blueten.",Helles bis volles Licht,10-18 °C,5,flowering,,,,, +flowering,constants/lexiconBatch2.ts,199,Nemesie,Nemesia strumosa,"Nemesie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch2.ts,37,Neoregelia,Neoregelia carolinae,"Die Neoregelia ist eine Bromelie, bei der das Herzblatt zur Bluetzeit leuchtend rot wird. Sehr dekorativ.",Helles bis volles Licht,18-27 °C,7,flowering|patterned|bright_light,,,,, +flowering,constants/lexiconBatch2.ts,120,Oleander,Nerium oleander,"Der Oleander ist ein mediteraner Strauch mit leuchtend roten, rosa oder weissen Blueten. Sehr hitzetolerant.",Volles Sonnenlicht,15-28 °C,7,flowering|bright_light|sun,,,,, +flowering,constants/lexiconBatch2.ts,193,Ziertabak,Nicotiana alata,"Ziertabak ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch1.ts,74,Tanzerinnen-Orchidee,Oncidium sphacelatum,"Die Tanzerinnen-Orchidee traegt lange Rispen mit Hunderten kleiner, gelb-brauner Blueten. Sehr reichliche Bluetracht.",Helles indirektes Licht,18-27 °C,7,flowering|high_humidity,,,,, +flowering,constants/lexiconBatch2.ts,200,Kapmargerite,Osteospermum ecklonis,"Kapmargerite ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch1.ts,54,Kleeblume,Oxalis triangularis,"Die Kleeblume hat tiefviolette, dreieckige Blaetter und zarte rosa Blueten. Sie faltet die Blaetter bei Dunkelheit.",Helles indirektes Licht,15-24 °C,7,flowering|patterned,,,,, +flowering,constants/lexiconBatch2.ts,143,Pfingstrose,Paeonia lactiflora,"Pfingstrose ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch2.ts,185,Mohn,Papaver rhoeas,"Mohn ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch1.ts,63,Passionsblume,Passiflora caerulea,"Die Passionsblume ist eine faszinierende Kletterpflanze mit komplex strukturierten, blau-weissen Blueten.",Helles bis volles Licht,15-27 °C,5,flowering,,,,, +flowering,constants/lexiconBatch2.ts,61,Efeu-Geranie,Pelargonium peltatum,"Die Efeu-Geranie hat efeufoermige, glaenzende Blaetter und bluet den ganzen Sommer in leuchtenden Farben.",Helles bis volles Licht,15-25 °C,5,easy|flowering|hanging|sun,,,,, +flowering,constants/lexiconBatch2.ts,174,Stehende Geranie,Pelargonium zonale,"Stehende Geranie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch1.ts,34,Petunie,Petunia hybrida,Die Petunie ist eine der beliebtesten Balkonpflanzen mit trichterfoermigen Blueten in unzaehligen Farben.,Volles Sonnenlicht,15-25 °C,2,easy|pet_friendly|flowering|sun,pet_friendly_requires_external_evidence,,,, +flowering,constants/lexiconBatch1.ts,69,Schmetterlingsorchidee,Phalaenopsis amabilis,Die Schmetterlingsorchidee ist die bekannteste Zimmerorchidee. Sie bluet bei guter Pflege monatelang.,Helles indirektes Licht,18-28 °C,10,flowering|high_humidity,,,,, +flowering,constants/lexiconBatch2.ts,165,Flammenblume,Phlox paniculata,"Flammenblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch2.ts,81,Fettkraut,Pinguicula grandiflora,"Das Fettkraut faengt Insekten mit klebrigen Blaettern. Es bluet mit violetten, sporenartigen Blueten.",Helles indirektes Licht,10-20 °C,5,flowering|high_humidity,,,,, +flowering,constants/lexiconBatch1.ts,61,Bleiwurz,Plumbago auriculata,"Die Bleiwurz ist ein halbimmergruener Strauch mit himmelblauen Blueten, der fast das ganze Jahr bluet.",Volles Sonnenlicht,15-27 °C,5,flowering|bright_light|sun,,,,, +flowering,constants/lexiconBatch2.ts,118,Tempel-Baum,Plumeria rubra,"Der Tempel-Baum hat intensiv duftende, sternfoermige Blueten in Weiss, Gelb oder Rosa. Klassische Tropenblume.",Volles Sonnenlicht,20-30 °C,7,flowering|tree|sun,,,,, +flowering,constants/lexiconBatch1.ts,36,Primel,Primula vulgaris,"Die Primel ist einer der ersten Fruehjahrs­boten mit lebhaften Blueten in Gelb, Pink, Rot und Lila.",Helles indirektes Licht,10-18 °C,4,flowering,,,,, +flowering,constants/lexiconBatch2.ts,71,Koenigs-Protea,Protea cynaroides,"Die Koenigs-Protea ist die Nationalblume Suedafrikas mit riesigen, imposanten Bluetenkoepfen. Eine echte Besonderheit.",Volles Sonnenlicht,10-25 °C,7,flowering|large|sun,,,,, +flowering,constants/lexiconBatch2.ts,88,Granatapfelbaum,Punica granatum,"Der Granatapfelbaum hat leuchtend rote Blueten und rote, essbare Fruechte mit rubinroten Kernen.",Volles Sonnenlicht,15-28 °C,7,flowering|tree|sun,,,,, +flowering,constants/lexiconBatch2.ts,162,Ranunkel,Ranunculus asiaticus,"Ranunkel ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch2.ts,170,Rhododendron,Rhododendron catawbiense,"Rhododendron ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|tree|bright_light,,,,, +flowering,constants/lexiconBatch1.ts,91,Japanische Azalee,Rhododendron simsii,"Die Japanische Azalee bluet im Winter und Fruehling ueppig mit leuchtend roten, rosa oder weissen Blueten.",Helles indirektes Licht,10-18 °C,4,flowering,,,,, +flowering,constants/lexiconBatch1.ts,66,Chinesische Rose,Rosa chinensis,Die Chinesische Rose ist eine der Stammarten vieler Gartenrosen und bluet fast ununterbrochen.,Volles Sonnenlicht,15-25 °C,5,flowering|sun,,,,, +flowering,constants/lexiconBatch2.ts,142,Rose,Rosa x hybrida,"Rose ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light|sun,,,,, +flowering,constants/lexiconBatch2.ts,167,Rudbeckie,Rudbeckia hirta,"Rudbeckie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch1.ts,94,Afrikanisches Veilchen,Saintpaulia ionantha,"Das Afrikanische Veilchen ist eine kleine, kompakte Bluehpflanze mit samtigen Blaettern und violetten Blueten.",Helles indirektes Licht,18-25 °C,7,easy|flowering,,,,, +flowering,constants/lexiconBatch2.ts,195,Mehlsalbei,Salvia farinacea,"Mehlsalbei ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch2.ts,168,Feuersalbei,Salvia splendens,"Feuersalbei ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch2.ts,112,Schwarzer Holunder,Sambucus nigra,Der Schwarze Holunder hat weisse Doldenbluten und schwarze Beeren. Die Fruechte werden fuer Sirup und Saft verwendet.,Helles bis volles Licht,10-25 °C,7,flowering|tree|medicinal,medicinal_requires_external_evidence,,,, +flowering,constants/lexiconBatch1.ts,8,Weihnachtskaktus,Schlumbergera truncata,"Der Weihnachtskaktus erfreut zur Weihnachtszeit mit leuchtenden Blueten in Rosa, Rot oder Weiss.",Helles indirektes Licht,15-21 °C,7,easy|flowering|succulent,,,,, +flowering,constants/lexiconBatch2.ts,222,Spierstrauch,Spiraea japonica,Spierstrauch ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|sun,,,,, +flowering,constants/lexiconBatch2.ts,25,Aasblume,Stapelia grandiflora,"Die Aasblume hat fleischige, gruene Staengel und riesige, sternfoermige Blueten mit aasartigem Duft.",Helles bis volles Licht,18-30 °C,14,flowering|succulent|sun,,,,, +flowering,constants/lexiconBatch1.ts,60,Madagaskar-Jasmin,Stephanotis floribunda,"Der Madagaskar-Jasmin hat dicke, glaenzende Blaetter und wachsweisse, intensiv duftende Blueten. Klassische Hochzeitsblume.",Helles indirektes Licht,18-25 °C,7,flowering,,,,, +flowering,constants/lexiconBatch1.ts,3,Paradiesvogelblume,Strelitzia reginae,"Die Paradiesvogelblume beeindruckt mit leuchtend orangefarbenen und blauen Blueten, die einem Vogel aehneln.",Volles Sonnenlicht,18-26 °C,7,flowering|large|sun,,,,, +flowering,constants/lexiconBatch1.ts,95,Drehfrucht,Streptocarpus hybridus,"Die Drehfrucht ist ein Gesneriengewaechs mit langen, gerippten Blaettern und trichterfoermigen Blueten in Lila oder Rosa.",Helles indirektes Licht,15-22 °C,7,flowering,,,,, +flowering,constants/lexiconBatch2.ts,166,Herbstaster,Symphyotrichum novi-belgii,"Herbstaster ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch2.ts,149,Flieder,Syringa vulgaris,"Flieder ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|tree|sun,,,,, +flowering,constants/lexiconBatch2.ts,66,Studentenblume,Tagetes patula,Die Studentenblume ist eine robuste Sommerblume mit orangen oder gelben Blueten. Sie haelt Schadlinge fern.,Volles Sonnenlicht,15-28 °C,3,easy|flowering|sun,,,,, +flowering,constants/lexiconBatch2.ts,151,Kapuzinerkresse,Tropaeolum majus,"Kapuzinerkresse ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch1.ts,107,Tulpe,Tulipa gesneriana,Die Tulpe ist eine der beliebtesten Fruehjahrsblueher mit kelchfoermigen Blueten in unzaehligen Farben.,Helles bis volles Licht,8-18 °C,5,easy|flowering,,,,, +flowering,constants/lexiconBatch2.ts,104,Baldrian,Valeriana officinalis,Baldrian ist ein bekanntes Heilkraut mit weissen bis roeslichen Blueten. Die Wurzeln werden zur Schlaffoerderung verwendet.,Helles bis volles Licht,15-25 °C,7,flowering|medicinal,medicinal_requires_external_evidence,,,, +flowering,constants/lexiconBatch1.ts,72,Vanda-Orchidee,Vanda coerulea,Die Vanda-Orchidee ist bekannt fuer ihre seltene blaue Bluetenfarbe. Epiphytische Orchidee mit grossen Blueten.,Helles bis volles Licht,20-30 °C,3,flowering|bright_light|high_humidity,,,,, +flowering,constants/lexiconBatch1.ts,76,Vanille,Vanilla planifolia,"Die Vanille ist eine kletternde Orchidee, aus deren Fruechten das beliebte Gewuerz gewonnen wird.",Helles indirektes Licht,20-30 °C,5,flowering|high_humidity,,,,, +flowering,constants/lexiconBatch2.ts,192,Koenigskerze,Verbascum thapsus,"Koenigskerze ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, +flowering,constants/lexiconBatch2.ts,164,Eisenkraut,Verbena bonariensis,"Eisenkraut ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch2.ts,198,Hornveilchen,Viola cornuta,"Hornveilchen ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +flowering,constants/lexiconBatch1.ts,35,Stiefmuetterchen,Viola wittrockiana,Das Stiefmuetterchen ist ein bekannter Fruehjahrsblueher mit charakteristisch gezeichneten Blueten.,Helles bis volles Licht,5-18 °C,3,easy|flowering,,,,, +flowering,constants/lexiconBatch2.ts,35,Flammen-Bromelie,Vriesea splendens,"Die Flammen-Bromelie hat gebänderte, dunkelgruene Blaetter und einen spektakulaeren, roten Bluetenstand.",Helles indirektes Licht,18-25 °C,7,flowering|patterned|high_humidity,,,,, +flowering,constants/lexiconBatch2.ts,221,Weigelie,Weigela florida,Weigelie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|sun,,,,, +flowering,constants/lexiconBatch1.ts,65,Chinesischer Blauregen,Wisteria sinensis,"Der Chinesische Blauregen ist ein ueppiger Kletterkuenstler mit langen, duftenden Bluetentrauben in Lila.",Volles Sonnenlicht,10-25 °C,7,flowering|large|sun,,,,, +flowering,constants/lexiconBatch2.ts,70,Calla,Zantedeschia aethiopica,"Die Calla hat elegante, trichterfoermige weisse Hochblaetter und glaenzende, herzfoermige Blaetter. Sehr edel.",Helles indirektes Licht,15-24 °C,7,flowering|high_humidity,,,,, +flowering,constants/lexiconBatch2.ts,65,Zinnie,Zinnia elegans,"Die Zinnie ist eine leuchtende Sommerblume mit grossen, dahlienaehnlichen Blueten. Sehr robust und hitzetolerant.",Volles Sonnenlicht,18-30 °C,3,easy|flowering|sun,,,,, +hanging,constants/lexiconBatch1.ts,98,Lippenstiftpflanze,Aeschynanthus radicans,Die Lippenstiftpflanze hat haengende Triebe mit glaenzenden Blaettern und leuchtend roten Roehrenbluten.,Helles indirektes Licht,18-27 °C,7,flowering|hanging|high_humidity,,,,, +hanging,constants/lexiconBatch2.ts,63,Calibrachoa,Calibrachoa hybrida,"Calibrachoa ist eine petunienaehnliche Haengepflanze mit unzaehligen, kleinen Trichterbluten in allen Farben.",Volles Sonnenlicht,15-25 °C,2,easy|flowering|hanging|sun,,,,, +hanging,constants/lexiconBatch2.ts,56,Callisia,Callisia repens,"Callisia repens ist ein kleines, kriechendes Kraut mit winzigen, gruenen Blaettern. Ideal fuer haengende Behaelter.",Helles indirektes Licht,15-25 °C,5,easy|hanging,,,,, +hanging,constants/lexiconBatch1.ts,99,Herzkette,Ceropegia woodii,"Die Herzkette hat duenne, haengende Ranken mit herzfoermigen, silbergrau gemusterten Blaettchen.",Helles indirektes Licht,15-27 °C,14,easy|succulent|patterned|hanging,,,,, +hanging,constants/lexiconBatch1.ts,97,Columnea,Columnea gloriosa,"Die Columnea ist eine haengende Zimmerpflanze mit kleinen, behaarten Blaettern und leuchtend roten, roehrenfoermigen Blueten.",Helles indirektes Licht,18-25 °C,7,flowering|hanging|high_humidity,,,,, +hanging,constants/lexiconBatch2.ts,236,String of Bananas,Curio radicans,String of Bananas ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles bis volles Licht,18-30 C,10,succulent|hanging|sun,,,,, +hanging,constants/lexiconBatch2.ts,237,String of Dolphins,Curio x peregrinus,String of Dolphins ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles bis volles Licht,18-30 C,10,succulent|hanging|sun,,,,, +hanging,constants/lexiconBatch1.ts,101,Dischidia,Dischidia ruscifolia,"Die Dischidia ist eine epiphytische Haengepflanze mit kleinen, runden Blaettern entlang duenner Ranken.",Helles indirektes Licht,18-27 °C,7,succulent|hanging,,,,, +hanging,constants/lexiconBatch1.ts,16,Marmor-Efeutute,Epipremnum aureum Marble Queen,Die Marmor-Efeutute hat cremeweiss-gruen marmorierte Blaetter. Eine dekorative Variante der klassischen Efeutute.,Helles indirektes Licht,15-30 °C,7,easy|hanging|air_purifier,air_purifier_requires_external_evidence,,,, +hanging,constants/lexiconBatch2.ts,53,Neon-Efeutute,Epipremnum pinnatum Neon,Die Neon-Efeutute hat leuchtend limonengruene Blaetter. Sehr auffaellig und pflegeleicht.,Helles indirektes Licht,15-30 °C,7,easy|hanging|air_purifier,air_purifier_requires_external_evidence,,,, +hanging,constants/lexiconBatch1.ts,33,Fuchsie,Fuchsia hybrida,"Die Fuchsie haengt mit eleganten, zweifarbigen Blueten wie kleine Ohrringe herab. Ideal fuer Ampeln.",Helles indirektes Licht,14-22 °C,3,flowering|hanging,,,,, +hanging,constants/lexiconBatch2.ts,60,Triphylla-Fuchsie,Fuchsia triphylla,"Die Triphylla-Fuchsie hat lange, roehrenfoermige, orangefarbe Blueten in haengenden Trauben. Sehr exotisch.",Helles indirektes Licht,15-22 °C,3,flowering|hanging,,,,, +hanging,constants/lexiconBatch1.ts,37,Efeu,Hedera helix,"Efeu ist eine robuste Kletter- und Haengepflanze mit charakteristischen, dreilappigen Blaettern. Sehr langlebig.",Wenig bis helles Licht,10-20 °C,7,easy|hanging|air_purifier|low_light,air_purifier_requires_external_evidence,,,, +hanging,constants/lexiconBatch1.ts,58,Kleine Wachsblume,Hoya bella,"Die Kleine Wachsblume traegt zierliche, sternfoermige weisse Blueten mit rosa Mitte. Haengende Sukkulente.",Helles indirektes Licht,18-27 °C,10,flowering|succulent|hanging,,,,, +hanging,constants/lexiconBatch1.ts,57,Wachsblume,Hoya carnosa,"Die Wachsblume ist eine Kletterpflanze mit dicken, wachsartigen Blaettern und sternfoermigen, duftenden Blueten.",Helles indirektes Licht,16-27 °C,10,easy|flowering|succulent|hanging,,,,, +hanging,constants/lexiconBatch1.ts,64,Suesskartoffel,Ipomoea batatas,"Die Suesskartoffel-Zierpflanze hat dekorative, herzfoermige Blaetter in gruen oder dunkelviolett. Ideal als Haengepflanze.",Volles Sonnenlicht,20-30 °C,5,easy|hanging|sun,,,,, +hanging,constants/lexiconBatch2.ts,47,Monstera adansonii,Monstera adansonii,Monstera adansonii hat herzfoermige Blaetter mit zahlreichen runden Lochern. Eine rankende Zimmerpflanze.,Helles indirektes Licht,18-27 °C,7,easy|hanging,,,,, +hanging,constants/lexiconBatch2.ts,48,Monstera obliqua,Monstera obliqua,"Monstera obliqua ist eine seltene Monstera-Art mit filigranen Blaettern, die hauptsaechlich aus Lochern bestehen.",Helles indirektes Licht,18-27 °C,7,patterned|hanging,,,,, +hanging,constants/lexiconBatch2.ts,79,Kannenpflanze,Nepenthes alata,"Die Kannenpflanze bildet grosse, gefuellte Kannen als Insekten­fallen. Eine faszinierende, tropische Pflanze.",Helles indirektes Licht,20-30 °C,5,hanging|high_humidity,,,,, +hanging,constants/lexiconBatch2.ts,61,Efeu-Geranie,Pelargonium peltatum,"Die Efeu-Geranie hat efeufoermige, glaenzende Blaetter und bluet den ganzen Sommer in leuchtenden Farben.",Helles bis volles Licht,15-25 °C,5,easy|flowering|hanging|sun,,,,, +hanging,constants/lexiconBatch2.ts,51,Roter Philodendron,Philodendron erubescens,"Der Rote Philodendron hat glaenzende, herzfoermige Blaetter, die jung roetrlich erscheinen. Sehr dekorativ.",Helles indirektes Licht,18-27 °C,7,easy|hanging,,,,, +hanging,constants/lexiconBatch1.ts,15,Herzblatt-Philodendron,Philodendron hederaceum,Der Herzblatt-Philodendron ist eine pflegeleichte Kletter- oder Haengepflanze mit herzfoermigen Blaettern.,Indirektes Licht,18-28 °C,7,easy|hanging|low_light,,,,, +hanging,constants/lexiconBatch2.ts,242,Philodendron Brasil,Philodendron hederaceum Brasil,Philodendron Brasil ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,easy|hanging|low_light,,,,, +hanging,constants/lexiconBatch2.ts,41,Geweihfarn,Platycerium bifurcatum,"Der Geweihfarn hat gespaltene Wedel, die einem Hirschgeweih aehneln. Er ist ein epiphytischer Farn fuer Holz.",Helles indirektes Licht,15-25 °C,7,hanging|high_humidity,,,,, +hanging,constants/lexiconBatch2.ts,52,Mini-Monstera,Rhaphidophora tetrasperma,"Die Mini-Monstera hat monstera­aehnliche, gelochte Blaetter auf einer kompakten, klettternden Pflanze. Sehr trendig.",Helles indirektes Licht,18-27 °C,7,easy|hanging,,,,, +hanging,constants/lexiconBatch1.ts,85,Korallenkaktus,Rhipsalis baccifera,"Der Korallenkaktus ist ein epiphytischer Kaktus mit duennen, haengenden Trieben und kleinen weissen Beeren.",Indirektes Licht,18-27 °C,7,succulent|hanging,,,,, +hanging,constants/lexiconBatch1.ts,55,Satinpothos,Scindapsus pictus,"Der Satinpothos hat samtig-glaenzende, silbrig gefleckte Blaetter auf langen, haengenden Ranken.",Helles indirektes Licht,18-28 °C,7,easy|patterned|hanging,,,,, +hanging,constants/lexiconBatch1.ts,7,Eselschwanz,Sedum morganianum,"Der Eselschwanz ist eine haengende Sukkulente mit langen Trieben aus dichten, blaugruenen Blaettchen.",Volles Sonnenlicht,15-25 °C,14,easy|succulent|hanging|sun,,,,, +hanging,constants/lexiconBatch1.ts,100,Perlenschnur-Pflanze,Senecio rowleyanus,"Die Perlenschnur-Pflanze hat haengende Ranken mit kugelfoermigen, perlenaehnlichen Blaettern. Einzigartige Sukkulente.",Helles bis volles Licht,15-27 °C,14,easy|succulent|hanging,,,,, +hanging,constants/lexiconBatch1.ts,56,Pfeilblatt,Syngonium podophyllum,"Das Pfeilblatt hat charakteristisch pfeilfoermige Blaetter, die sich mit dem Alter weiterentwickeln.",Helles indirektes Licht,16-27 °C,7,easy|hanging,,,,, +hanging,constants/lexiconBatch2.ts,32,Spanisches Moos,Tillandsia usneoides,"Das Spanische Moos ist eine epiphytische Bromelie ohne Wurzeln, die in der Luft haengt. Es benoetigt nur Feuchtigkeitsbespruehing.",Helles bis volles Licht,15-30 °C,3,easy|hanging,,,,, +hanging,constants/lexiconBatch2.ts,55,Weisse Tradescantia,Tradescantia fluminensis,Die Weisse Tradescantia hat gruene Blaetter mit weisslichen Unterseiten. Sehr robust und schnellwachsend.,Helles indirektes Licht,15-25 °C,5,easy|hanging,,,,, +hanging,constants/lexiconBatch2.ts,54,Lila Tradescantia,Tradescantia pallida,Die Lila Tradescantia hat leuchtend purpurrote Blaetter und ist sehr auffaellig. Sie liebt viel Licht.,Helles bis volles Licht,15-25 °C,5,easy|hanging|sun,,,,, +hanging,constants/lexiconBatch1.ts,17,Zebrakraut,Tradescantia zebrina,Das Zebrakraut faellt durch seine silbrig-lila gestreiften Blaetter auf. Schnellwachsende Haengepflanze.,Helles indirektes Licht,15-25 °C,5,easy|patterned|hanging,,,,, +high_humidity,constants/lexiconBatch2.ts,42,Frauenhaarfarn,Adiantum raddianum,"Der Frauenhaarfarn hat zarte, feingliedrige Wedel auf schwarzen, draht­aehnlichen Stielen. Liebt Feuchtigkeit.",Helles indirektes Licht,18-27 °C,3,high_humidity,,,,, +high_humidity,constants/lexiconBatch1.ts,98,Lippenstiftpflanze,Aeschynanthus radicans,Die Lippenstiftpflanze hat haengende Triebe mit glaenzenden Blaettern und leuchtend roten Roehrenbluten.,Helles indirektes Licht,18-27 °C,7,flowering|hanging|high_humidity,,,,, +high_humidity,constants/lexiconBatch1.ts,46,Amazona-Taro,Alocasia amazonica,"Der Amazona-Taro besticht mit dunkelgruenen, pfeilfoermigen Blaettern mit markant weissen Rippen.",Indirektes Licht,18-27 °C,5,patterned|large|high_humidity,,,,, +high_humidity,constants/lexiconBatch2.ts,225,Alocasia zebrina,Alocasia zebrina,Alocasia zebrina ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5,bright_light|high_humidity,,,,, +high_humidity,constants/lexiconBatch2.ts,73,Muschelingwer,Alpinia zerumbet,"Der Muschelingwer hat lange, elegante Blaetter und haengende Bluetenrispen mit weiss-rosa Bluetchen.",Helles bis volles Licht,20-30 °C,5,flowering|large|high_humidity,,,,, +high_humidity,constants/lexiconBatch2.ts,233,Samt-Anthurie,Anthurium clarinervium,Samt-Anthurie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5,patterned|high_humidity,,,,, +high_humidity,constants/lexiconBatch2.ts,234,Kristall-Anthurie,Anthurium crystallinum,Kristall-Anthurie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5,patterned|high_humidity,,,,, +high_humidity,constants/lexiconBatch2.ts,43,Vogelnest-Farn,Asplenium nidus,"Der Vogelnest-Farn hat ganzrandige, glaenzende Wedel, die eine Nestform bilden. Sehr dekorativ und robust.",Helles indirektes Licht,18-27 °C,5,easy|low_light|high_humidity,,,,, +high_humidity,constants/lexiconBatch2.ts,57,Forellen-Begonie,Begonia maculata,Die Forellen-Begonie hat olivgruene Blaetter mit silbernen Punkten und einer roten Unterseite. Atemberaubend.,Helles indirektes Licht,18-27 °C,7,patterned|high_humidity,,,,, +high_humidity,constants/lexiconBatch1.ts,18,Koenigsbegonie,Begonia rex,"Die Koenigsbegonie beeindruckt mit prachtvoll gemusterten Blaettern in Silber, Rot und Gruen.",Indirektes Licht,18-25 °C,5,patterned|high_humidity,,,,, +high_humidity,constants/lexiconBatch2.ts,58,Knollen-Begonie,Begonia tuberhybrida,"Die Knollen-Begonie hat riesige, rosenaehnliche Blueten in leuchtendem Rot, Orange, Gelb oder Weiss.",Helles indirektes Licht,15-22 °C,5,flowering|high_humidity,,,,, +high_humidity,constants/lexiconBatch1.ts,49,Buntblatt,Caladium bicolor,"Das Buntblatt beeindruckt mit transparenten, bunt gemusterten Blaettern in Pink, Rot, Weiss und Gruen.",Indirektes Licht,20-30 °C,5,patterned|high_humidity,,,,, +high_humidity,constants/lexiconBatch1.ts,73,Cattleya-Orchidee,Cattleya labiata,"Die Cattleya ist die Koenigin der Orchideen mit ueppigen, duftenden Blueten in Lila, Rosa und Weiss.",Helles indirektes Licht,18-28 °C,7,flowering|high_humidity,,,,, +high_humidity,constants/lexiconBatch1.ts,47,Taro,Colocasia esculenta,"Der Taro ist eine tropische Pflanze mit grossen, herzfoermigen Blaettern. Die Knollen sind Nahrungsquelle.",Helles indirektes Licht,18-30 °C,3,large|high_humidity,,,,, +high_humidity,constants/lexiconBatch1.ts,97,Columnea,Columnea gloriosa,"Die Columnea ist eine haengende Zimmerpflanze mit kleinen, behaarten Blaettern und leuchtend roten, roehrenfoermigen Blueten.",Helles indirektes Licht,18-25 °C,7,flowering|hanging|high_humidity,,,,, +high_humidity,constants/lexiconBatch2.ts,39,Cryptanthus,Cryptanthus bivittatus,Cryptanthus ist eine niedrig wachsende Bromelie mit sternfoermigen Rosetten und gemusterten Blaettern. Fuer Terrarien.,Helles indirektes Licht,18-27 °C,7,patterned|high_humidity,,,,, +high_humidity,constants/lexiconBatch1.ts,53,Ctenanthe,Ctenanthe burle-marxii,Die Ctenanthe hat faszinierend gemusterte Blaetter mit dunkelgruunem Fischgraetenmuster auf hellgruunem Hintergrund.,Indirektes Licht,18-25 °C,5,patterned|high_humidity,,,,, +high_humidity,constants/lexiconBatch2.ts,74,Kurkuma,Curcuma longa,Kurkuma ist eine tropische Gewuerzpflanze mit breiten Blaettern und leuchtend gelber Wurzel. Wichtiges Heilgewuerz.,Helles bis volles Licht,20-30 °C,7,medicinal|high_humidity,medicinal_requires_external_evidence,,,, +high_humidity,constants/lexiconBatch2.ts,9,Paragraphenpflanze,Cyperus alternifolius,"Die Paragraphenpflanze hat lange, grasartige Blaetter, die sternfoermig vom Stiel abstehen. Sie liebt viel Wasser.",Helles bis volles Licht,18-27 °C,3,high_humidity,,,,, +high_humidity,constants/lexiconBatch1.ts,70,Dendrobium,Dendrobium nobile,"Das Dendrobium ist eine beliebte Zimmerorchidee mit langen Pseudobulben, die im Winter mit Blueten besetzt werden.",Helles indirektes Licht,15-28 °C,10,flowering|high_humidity,,,,, +high_humidity,constants/lexiconBatch2.ts,80,Sonnentau,Drosera capensis,Der Sonnentau faengt Insekten mit klebrigen Tropfen auf seinen Blaettern. Eine faszinierende fleischfressende Pflanze.,Volles Sonnenlicht,15-25 °C,5,high_humidity|sun,,,,, +high_humidity,constants/lexiconBatch2.ts,137,Wasabi,Eutrema japonicum,"Wasabi ist ein seltenes Wuerzkraut, das gleichmaessige Feuchte und eher kuehle Bedingungen bevorzugt.",Helles indirektes Licht,8-20 C,4,bright_light|high_humidity,,,,, +high_humidity,constants/lexiconBatch2.ts,226,Nervenpflanze,Fittonia albivenis,Nervenpflanze ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5,patterned|high_humidity,,,,, +high_humidity,constants/lexiconBatch1.ts,22,Gardenie,Gardenia jasminoides,"Die Gardenie fasziniert mit cremefarbenen, intensiv duftenden Blueten. Anspruchsvoll in der Pflege.",Helles indirektes Licht,18-23 °C,5,flowering|high_humidity,,,,, +high_humidity,constants/lexiconBatch1.ts,96,Gloxinie,Gloxinia speciosa,"Die Gloxinie hat grosse, samtartige Blueten in Violett, Rosa oder Weiss mit farbigen Raendern.",Helles indirektes Licht,18-25 °C,5,flowering|high_humidity,,,,, +high_humidity,constants/lexiconBatch2.ts,240,Calathea lancifolia,Goeppertia insignis,Calathea lancifolia ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5,pet_friendly|patterned|high_humidity,pet_friendly_requires_external_evidence,,,, +high_humidity,constants/lexiconBatch2.ts,241,Calathea ornata,Goeppertia ornata,Calathea ornata ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5,pet_friendly|patterned|high_humidity,pet_friendly_requires_external_evidence,,,, +high_humidity,constants/lexiconBatch2.ts,36,Guzmania,Guzmania lingulata,"Die Guzmania ist eine Bromelie mit glänzenden, gruenen Blaettern und einem leuchtend roten, sternfoermigen Bluetenstand.",Helles indirektes Licht,18-27 °C,7,flowering|high_humidity,,,,, +high_humidity,constants/lexiconBatch2.ts,83,Heliamphora,Heliamphora nutans,Heliamphora ist eine urtuemliche Kannenpflanze aus den Tafelbergen Venezuelas. Sehr dekorativ und selten.,Helles indirektes Licht,15-25 °C,5,high_humidity,,,,, +high_humidity,constants/lexiconBatch2.ts,72,Heliconia,Heliconia psittacorum,"Die Heliconia hat leuchtend orangefarbe oder rote, bootsfoermige Hochblaetter. Eine exotische Tropenpflanze.",Helles bis volles Licht,20-30 °C,5,flowering|bright_light|high_humidity,,,,, +high_humidity,constants/lexiconBatch1.ts,51,Gebet-Pflanze,Maranta leuconeura,Die Gebet-Pflanze faltet ihre gemusterten Blaetter nachts wie Haende zusammen. Faszinierende rote und gruene Muster.,Indirektes Licht,18-27 °C,5,pet_friendly|patterned|high_humidity,pet_friendly_requires_external_evidence,,,, +high_humidity,constants/lexiconBatch2.ts,46,Tueipelfarn (Microsorum),Microsorum punctatum,"Microsorum punctatum ist ein tropischer Farn mit langen, ungeteilten, glaenzenden Wedeln. Fuer feuchte Standorte.",Helles indirektes Licht,18-27 °C,7,high_humidity,,,,, +high_humidity,constants/lexiconBatch1.ts,75,Stiefmuetterchen-Orchidee,Miltoniopsis roezlii,"Die Stiefmuetterchen-Orchidee hat grosse, flache Blueten. Bevorzugt kuehle Temperaturen und hohe Luftfeuchtigkeit.",Indirektes Licht,15-22 °C,5,flowering|high_humidity,,,,, +high_humidity,constants/lexiconBatch2.ts,2,Bananenpflanze,Musa acuminata,"Die Bananenpflanze ist eine tropische Staude mit riesigen, glaenzenden Blaettern. Im Zimmer selten fruechttragend.",Helles bis volles Licht,20-30 °C,5,large|high_humidity,,,,, +high_humidity,constants/lexiconBatch2.ts,79,Kannenpflanze,Nepenthes alata,"Die Kannenpflanze bildet grosse, gefuellte Kannen als Insekten­fallen. Eine faszinierende, tropische Pflanze.",Helles indirektes Licht,20-30 °C,5,hanging|high_humidity,,,,, +high_humidity,constants/lexiconBatch1.ts,74,Tanzerinnen-Orchidee,Oncidium sphacelatum,"Die Tanzerinnen-Orchidee traegt lange Rispen mit Hunderten kleiner, gelb-brauner Blueten. Sehr reichliche Bluetracht.",Helles indirektes Licht,18-27 °C,7,flowering|high_humidity,,,,, +high_humidity,constants/lexiconBatch1.ts,69,Schmetterlingsorchidee,Phalaenopsis amabilis,Die Schmetterlingsorchidee ist die bekannteste Zimmerorchidee. Sie bluet bei guter Pflege monatelang.,Helles indirektes Licht,18-28 °C,10,flowering|high_humidity,,,,, +high_humidity,constants/lexiconBatch2.ts,49,Philodendron gloriosum,Philodendron gloriosum,"Philodendron gloriosum hat grosse, samtige, herzfoermige Blaetter mit weissen Rippen. Eine atemberaubende Pflanze.",Helles indirektes Licht,18-27 °C,7,patterned|large|high_humidity,,,,, +high_humidity,constants/lexiconBatch2.ts,40,Blaues Kanaelfarn,Phlebodium aureum,"Der Blaue Kanaelfarn hat wachsartige, blaugruene Wedel und glaenzende Wurzelstaemme. Sehr dekorativ.",Helles indirektes Licht,18-27 °C,7,high_humidity,,,,, +high_humidity,constants/lexiconBatch2.ts,81,Fettkraut,Pinguicula grandiflora,"Das Fettkraut faengt Insekten mit klebrigen Blaettern. Es bluet mit violetten, sporenartigen Blueten.",Helles indirektes Licht,10-20 °C,5,flowering|high_humidity,,,,, +high_humidity,constants/lexiconBatch2.ts,41,Geweihfarn,Platycerium bifurcatum,"Der Geweihfarn hat gespaltene Wedel, die einem Hirschgeweih aehneln. Er ist ein epiphytischer Farn fuer Holz.",Helles indirektes Licht,15-25 °C,7,hanging|high_humidity,,,,, +high_humidity,constants/lexiconBatch2.ts,78,Purpursonnentau,Sarracenia purpurea,Der Purpursonnentau ist eine fleischfressende Kannenpflanze mit purpurroten Kannen. Faengt Insekten.,Volles Sonnenlicht,5-25 °C,3,high_humidity|sun,,,,, +high_humidity,constants/lexiconBatch2.ts,45,Regenbogenmoos,Selaginella uncinata,"Das Regenbogenmoos hat schuppenfoermige Blaetter, die im Licht schillernd irisieren. Dekorativ fuer Terrarien.",Helles indirektes Licht,18-27 °C,5,patterned|high_humidity,,,,, +high_humidity,constants/lexiconBatch2.ts,238,Bubikopf,Soleirolia soleirolii,Bubikopf ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,15-24 C,4,pet_friendly|high_humidity,pet_friendly_requires_external_evidence,,,, +high_humidity,constants/lexiconBatch1.ts,52,Stromanthe,Stromanthe sanguinea,Die Stromanthe hat dekorative Blaetter mit weissem Muster und leuchtend roter Unterseite. Familie der Marantaceen.,Helles indirektes Licht,18-25 °C,5,patterned|high_humidity,,,,, +high_humidity,constants/lexiconBatch2.ts,82,Wasserschlauch,Utricularia gibba,Der Wasserschlauch ist eine wasserbewohnende fleischfressende Pflanze mit Schlaeuchen als Insekten­fallen.,Helles bis volles Licht,15-25 °C,2,high_humidity|sun,,,,, +high_humidity,constants/lexiconBatch1.ts,72,Vanda-Orchidee,Vanda coerulea,Die Vanda-Orchidee ist bekannt fuer ihre seltene blaue Bluetenfarbe. Epiphytische Orchidee mit grossen Blueten.,Helles bis volles Licht,20-30 °C,3,flowering|bright_light|high_humidity,,,,, +high_humidity,constants/lexiconBatch1.ts,76,Vanille,Vanilla planifolia,"Die Vanille ist eine kletternde Orchidee, aus deren Fruechten das beliebte Gewuerz gewonnen wird.",Helles indirektes Licht,20-30 °C,5,flowering|high_humidity,,,,, +high_humidity,constants/lexiconBatch2.ts,35,Flammen-Bromelie,Vriesea splendens,"Die Flammen-Bromelie hat gebänderte, dunkelgruene Blaetter und einen spektakulaeren, roten Bluetenstand.",Helles indirektes Licht,18-25 °C,7,flowering|patterned|high_humidity,,,,, +high_humidity,constants/lexiconBatch2.ts,70,Calla,Zantedeschia aethiopica,"Die Calla hat elegante, trichterfoermige weisse Hochblaetter und glaenzende, herzfoermige Blaetter. Sehr edel.",Helles indirektes Licht,15-24 °C,7,flowering|high_humidity,,,,, +high_humidity,constants/lexiconBatch2.ts,75,Ingwer,Zingiber officinale,Ingwer ist eine tropische Gewuerzpflanze mit aromatischen Knollen. Die Blaetter sind schilfartig.,Helles indirektes Licht,20-30 °C,5,medicinal|high_humidity,medicinal_requires_external_evidence,,,, +large,constants/lexiconBatch2.ts,212,Spitzahorn,Acer platanoides,Spitzahorn ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, +large,constants/lexiconBatch1.ts,11,Agave,Agave americana,"Die Agave ist eine imposante Sukkulente mit steifen, blaugruenen Blaettern mit Stacheln. Sie bluet nur einmal.",Volles Sonnenlicht,10-35 °C,21,succulent|large|sun,,,,, +large,constants/lexiconBatch1.ts,46,Amazona-Taro,Alocasia amazonica,"Der Amazona-Taro besticht mit dunkelgruenen, pfeilfoermigen Blaettern mit markant weissen Rippen.",Indirektes Licht,18-27 °C,5,patterned|large|high_humidity,,,,, +large,constants/lexiconBatch2.ts,18,Kap-Aloe (ferox),Aloe ferox,"Aloe ferox ist eine grosse, imposante Aloe mit stachligen, blaugruenen Blaettern und leuchtend roten Bluetenaehren.",Volles Sonnenlicht,10-30 °C,14,succulent|large|medicinal|sun,medicinal_requires_external_evidence,,,, +large,constants/lexiconBatch2.ts,73,Muschelingwer,Alpinia zerumbet,"Der Muschelingwer hat lange, elegante Blaetter und haengende Bluetenrispen mit weiss-rosa Bluetchen.",Helles bis volles Licht,20-30 °C,5,flowering|large|high_humidity,,,,, +large,constants/lexiconBatch2.ts,7,Bambusrohr,Bambusa vulgaris,Das Bambusrohr ist eine schnell wachsende Bambusart mit gelbgruenen Halmen. Sehr dekorativ und vielseitig nutzbar.,Helles bis volles Licht,15-30 °C,5,easy|large,,,,, +large,constants/lexiconBatch2.ts,114,Hange-Birke,Betula pendula,Die Haenge-Birke hat charakteristisch weisse Rinde und haengende Zweige. Die Blaetter werden in der Heilkunde genutzt.,Volles Sonnenlicht,10-25 °C,7,tree|large|medicinal,medicinal_requires_external_evidence,,,, +large,constants/lexiconBatch2.ts,67,Blumenschilfrohr,Canna indica,"Das Blumenschilfrohr hat grosse, tropisch wirkende Blaetter und auffaellige Blueten in Rot, Orange oder Gelb.",Volles Sonnenlicht,18-28 °C,5,flowering|large|sun,,,,, +large,constants/lexiconBatch2.ts,90,Papaya,Carica papaya,"Die Papaya ist eine tropische Fruchtpflanze mit grossen, gelappten Blaettern und orangen Fruechten.",Volles Sonnenlicht,20-35 °C,5,large|sun,,,,, +large,constants/lexiconBatch2.ts,217,Trompetenbaum,Catalpa bignonioides,Trompetenbaum ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, +large,constants/lexiconBatch2.ts,208,Zeder,Cedrus libani,Zeder ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, +large,constants/lexiconBatch1.ts,81,Peruanischer Fackelkaktus,Cereus peruvianus,"Der Peruanische Fackelkaktus ist ein saeulenfoermiger Kaktus, der im Innenraum bis zu 2 m hoch werden kann.",Volles Sonnenlicht,15-35 °C,21,easy|succulent|large|sun,,,,, +large,constants/lexiconBatch1.ts,47,Taro,Colocasia esculenta,"Der Taro ist eine tropische Pflanze mit grossen, herzfoermigen Blaettern. Die Knollen sind Nahrungsquelle.",Helles indirektes Licht,18-30 °C,3,large|high_humidity,,,,, +large,constants/lexiconBatch2.ts,209,Zypresse,Cupressus sempervirens,Zypresse ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, +large,constants/lexiconBatch2.ts,239,Palmfarn,Cycas revoluta,Palmfarn ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles bis volles Licht,18-30 C,10,tree|large|sun,,,,, +large,constants/lexiconBatch2.ts,215,Flammenbaum,Delonix regia,Flammenbaum ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|large,,,,, +large,constants/lexiconBatch1.ts,39,Geigenfeige,Ficus lyrata,"Die Geigenfeige ist ein Trendbaum mit grossen, geigenfoermigen Blaettern. Benoetigt viel Licht.",Helles indirektes Licht,18-27 °C,7,tree|large|bright_light,,,,, +large,constants/lexiconBatch2.ts,211,Jacaranda,Jacaranda mimosifolia,Jacaranda ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|large,,,,, +large,constants/lexiconBatch2.ts,204,Magnolie,Magnolia grandiflora,Magnolie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|large,,,,, +large,constants/lexiconBatch2.ts,2,Bananenpflanze,Musa acuminata,"Die Bananenpflanze ist eine tropische Staude mit riesigen, glaenzenden Blaettern. Im Zimmer selten fruechttragend.",Helles bis volles Licht,20-30 °C,5,large|high_humidity,,,,, +large,constants/lexiconBatch2.ts,50,Philodendron bipinnatifidum,Philodendron bipinnatifidum,"Philodendron bipinnatifidum hat grosse, tief gelappte Blaetter. Er entwickelt einen beeindruckenden, baumfoermigen Wuchs.",Helles indirektes Licht,18-27 °C,7,easy|large,,,,, +large,constants/lexiconBatch2.ts,49,Philodendron gloriosum,Philodendron gloriosum,"Philodendron gloriosum hat grosse, samtige, herzfoermige Blaetter mit weissen Rippen. Eine atemberaubende Pflanze.",Helles indirektes Licht,18-27 °C,7,patterned|large|high_humidity,,,,, +large,constants/lexiconBatch2.ts,8,Goldener Bambus,Phyllostachys aurea,"Der Goldene Bambus hat elegante, goldgelbe Halme mit engstehenden Knoten. Sehr dekorativ als Sichtschutz.",Helles bis volles Licht,10-30 °C,5,easy|large,,,,, +large,constants/lexiconBatch2.ts,207,Fichte,Picea abies,Fichte ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, +large,constants/lexiconBatch2.ts,206,Kiefer,Pinus sylvestris,Kiefer ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, +large,constants/lexiconBatch2.ts,71,Koenigs-Protea,Protea cynaroides,"Die Koenigs-Protea ist die Nationalblume Suedafrikas mit riesigen, imposanten Bluetenkoepfen. Eine echte Besonderheit.",Volles Sonnenlicht,10-25 °C,7,flowering|large|sun,,,,, +large,constants/lexiconBatch2.ts,205,Eiche,Quercus robur,Eiche ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, +large,constants/lexiconBatch2.ts,214,Robinie,Robinia pseudoacacia,Robinie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, +large,constants/lexiconBatch2.ts,113,Silber-Weide,Salix alba,"Die Silber-Weide hat silbrig-glaenzende Blaetter. Weidenrinde enthält Salicylsaeure, die Grundlage von Aspirin.",Helles bis volles Licht,10-25 °C,7,tree|large|medicinal,medicinal_requires_external_evidence,,,, +large,constants/lexiconBatch2.ts,11,Grosse Strahlenaralie,Schefflera actinophylla,"Die Grosse Strahlenaralie kann grosse, handfoermige Blaetter entwickeln. Sie ist ideal als Zimmerstrauch.",Helles indirektes Licht,18-27 °C,7,easy|tree|large,,,,, +large,constants/lexiconBatch2.ts,213,Eberesche,Sorbus aucuparia,Eberesche ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, +large,constants/lexiconBatch2.ts,1,Weisse Strelitzie,Strelitzia nicolai,"Die Weisse Strelitzie ist ein beeindruckender Zimmerstrauch mit grossen, blaugruenen Blaettern und weiss-blauen Blueten.",Helles bis volles Licht,18-27 °C,7,tree|large|bright_light,,,,, +large,constants/lexiconBatch1.ts,3,Paradiesvogelblume,Strelitzia reginae,"Die Paradiesvogelblume beeindruckt mit leuchtend orangefarbenen und blauen Blueten, die einem Vogel aehneln.",Volles Sonnenlicht,18-26 °C,7,flowering|large|sun,,,,, +large,constants/lexiconBatch2.ts,5,Mexikanische Fächerpalme,Washingtonia robusta,"Die Mexikanische Fächerpalme ist eine schlanke, hohe Palme mit faecher­foermigen Blaettern. Sehr hitzetolerant.",Volles Sonnenlicht,15-35 °C,10,tree|large|sun,,,,, +large,constants/lexiconBatch1.ts,65,Chinesischer Blauregen,Wisteria sinensis,"Der Chinesische Blauregen ist ein ueppiger Kletterkuenstler mit langen, duftenden Bluetentrauben in Lila.",Volles Sonnenlicht,10-25 °C,7,flowering|large|sun,,,,, +low_light,constants/lexiconBatch1.ts,50,Aglaoneme,Aglaonema commutatum,Die Aglaoneme ist eine dekorative Zimmerpflanze mit silbrig-gruen gemusterten Blaettern. Tolerant gegenueber wenig Licht.,Wenig bis helles Licht,15-26 °C,7,easy|patterned|low_light,,,,, +low_light,constants/lexiconBatch2.ts,16,Schusterpflanze,Aspidistra elatior,"Die Schusterpflanze ist eine extrem robuste Zimmerpflanze mit langen, dunkelgruenen Blaettern. Vertraegt tiefe Temperaturen.",Wenig bis helles Licht,10-20 °C,14,easy|low_light,,,,, +low_light,constants/lexiconBatch2.ts,43,Vogelnest-Farn,Asplenium nidus,"Der Vogelnest-Farn hat ganzrandige, glaenzende Wedel, die eine Nestform bilden. Sehr dekorativ und robust.",Helles indirektes Licht,18-27 °C,5,easy|low_light|high_humidity,,,,, +low_light,constants/lexiconBatch2.ts,13,Japanische Aucube,Aucuba japonica,"Die Japanische Aucube hat glaenzende, gruene oder gelbgefleckte Blaetter. Sehr schattenvertraeglich.",Wenig bis helles Licht,10-20 °C,7,easy|low_light,,,,, +low_light,constants/lexiconBatch1.ts,43,Bergpalme,Chamaedorea elegans,Die Bergpalme ist eine kompakte Zimmerpalme fuer schattigere Standorte. Ideal fuer dunkle Innenraeume.,Wenig bis helles Licht,15-25 °C,7,easy|pet_friendly|tree|air_purifier|low_light,air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence,,,, +low_light,constants/lexiconBatch1.ts,48,Dieffenbachie,Dieffenbachia seguine,"Die Dieffenbachie ist eine tropische Blattschmuckpflanze mit grossen, gruen-weiss gefleckten Blaettern.",Helles indirektes Licht,18-26 °C,7,easy|air_purifier|low_light,air_purifier_requires_external_evidence,,,, +low_light,constants/lexiconBatch1.ts,14,Maisstrauch,Dracaena fragrans,"Der Maisstrauch ist eine robuste Zimmerpflanze mit breiten, gestreiften Blaettern. Gedeiht auch bei wenig Licht.",Helles indirektes Licht,15-25 °C,10,easy|tree|air_purifier|low_light,air_purifier_requires_external_evidence,,,, +low_light,constants/lexiconBatch2.ts,12,Fatsia,Fatsia japonica,"Die Fatsia ist ein dekorativer Zimmerstrauch mit grossen, handfoermigen, glaenzenden Blaettern. Sehr robust.",Helles indirektes Licht,10-20 °C,7,easy|low_light,,,,, +low_light,constants/lexiconBatch1.ts,90,Gasteria,Gasteria carinata,"Die Gasteria ist eine kleine Sukkulente mit zweireihig angeordneten, zungenfoermigen, gefleckten Blaettern.",Helles indirektes Licht,15-25 °C,14,easy|succulent|low_light,,,,, +low_light,constants/lexiconBatch1.ts,6,Zebra-Haworthie,Haworthia fasciata,Die Zebra-Haworthie ist eine kompakte Sukkulente mit weissen Querstreifen auf dunkelgruenen Blaettern.,Helles indirektes Licht,15-25 °C,14,easy|succulent|low_light,,,,, +low_light,constants/lexiconBatch1.ts,37,Efeu,Hedera helix,"Efeu ist eine robuste Kletter- und Haengepflanze mit charakteristischen, dreilappigen Blaettern. Sehr langlebig.",Wenig bis helles Licht,10-20 °C,7,easy|hanging|air_purifier|low_light,air_purifier_requires_external_evidence,,,, +low_light,constants/lexiconBatch2.ts,3,Kentia-Palme,Howea forsteriana,"Die Kentia-Palme ist eine der elegantesten Zimmerpalmen mit langen, herabhängenden Fiederblaettern.",Helles indirektes Licht,18-25 °C,7,pet_friendly|tree|low_light,pet_friendly_requires_external_evidence,,,, +low_light,constants/lexiconBatch1.ts,103,Spiegelpeperomie,Peperomia obtusifolia,"Die Spiegelpeperomie hat glaenzende, lederartige, oval-runde Blaetter in tiefem Gruen. Sehr robust.",Helles indirektes Licht,16-26 °C,10,easy|pet_friendly|low_light,pet_friendly_requires_external_evidence,,,, +low_light,constants/lexiconBatch1.ts,15,Herzblatt-Philodendron,Philodendron hederaceum,Der Herzblatt-Philodendron ist eine pflegeleichte Kletter- oder Haengepflanze mit herzfoermigen Blaettern.,Indirektes Licht,18-28 °C,7,easy|hanging|low_light,,,,, +low_light,constants/lexiconBatch2.ts,242,Philodendron Brasil,Philodendron hederaceum Brasil,Philodendron Brasil ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,easy|hanging|low_light,,,,, +low_light,constants/lexiconBatch1.ts,45,Stab-Palme,Rhapis excelsa,"Die Stab-Palme ist eine elegante Zimmerpalme mit faecher­foermigen Blaettern auf duennen, bambusartigen Staemmen.",Helles indirektes Licht,15-25 °C,7,tree|low_light,,,,, +medicinal,constants/lexiconBatch2.ts,108,Schafgarbe,Achillea millefolium,Die Schafgarbe hat weisse oder rosafarbene Bluetenschirme und fein gefiederte Blaetter. Wichtige Heilpflanze.,Volles Sonnenlicht,10-25 °C,7,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, +medicinal,constants/lexiconBatch1.ts,89,Kap-Aloe,Aloe arborescens,"Die Kap-Aloe ist eine strauchige Aloe mit schmalen, gezaehnten Blaettern und leuchtend roten Bluetenaehren im Winter.",Volles Sonnenlicht,10-30 °C,14,easy|succulent|medicinal|sun,medicinal_requires_external_evidence,,,, +medicinal,constants/lexiconBatch2.ts,18,Kap-Aloe (ferox),Aloe ferox,"Aloe ferox ist eine grosse, imposante Aloe mit stachligen, blaugruenen Blaettern und leuchtend roten Bluetenaehren.",Volles Sonnenlicht,10-30 °C,14,succulent|large|medicinal|sun,medicinal_requires_external_evidence,,,, +medicinal,constants/lexiconBatch2.ts,107,Arnika,Arnica montana,Arnika ist eine bekannte Heilpflanze aus den Alpen mit goldgelben Korbbluten. Sie wird fuer Muskeln und Gelenke verwendet.,Volles Sonnenlicht,10-20 °C,7,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, +medicinal,constants/lexiconBatch2.ts,110,Wermut,Artemisia absinthium,"Wermut ist ein stark aromatisches Heilkraut mit silbrig-gruenen, tief eingeschnittenen Blaettern. Fuer Kraeuterlikoere.",Volles Sonnenlicht,10-25 °C,14,medicinal|sun,medicinal_requires_external_evidence,,,, +medicinal,constants/lexiconBatch2.ts,114,Hange-Birke,Betula pendula,Die Haenge-Birke hat charakteristisch weisse Rinde und haengende Zweige. Die Blaetter werden in der Heilkunde genutzt.,Volles Sonnenlicht,10-25 °C,7,tree|large|medicinal,medicinal_requires_external_evidence,,,, +medicinal,constants/lexiconBatch2.ts,187,Ringelblume,Calendula officinalis,"Ringelblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, +medicinal,constants/lexiconBatch2.ts,92,Chili,Capsicum annuum,"Chili ist eine beliebte Gemuese- und Zierpflanze mit leuchtenden, roten oder orangen Fruechten. Im Topf kultivierbar.",Volles Sonnenlicht,20-30 °C,4,easy|medicinal|sun,medicinal_requires_external_evidence,,,, +medicinal,constants/lexiconBatch2.ts,138,Roemische Kamille,Chamaemelum nobile,Roemische Kamille ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|medicinal|sun,medicinal_requires_external_evidence,,,, +medicinal,constants/lexiconBatch2.ts,101,Kamille,Chamomilla recutita,"Die Kamille ist ein beliebtes Heilkraut mit kleinen, weiss-gelben Blueten. Das aetherische Oel wirkt beruhigend.",Volles Sonnenlicht,15-25 °C,5,easy|medicinal|sun,medicinal_requires_external_evidence,,,, +medicinal,constants/lexiconBatch2.ts,160,Maigloeckchen,Convallaria majalis,"Maigloeckchen ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|medicinal,medicinal_requires_external_evidence,,,, +medicinal,constants/lexiconBatch2.ts,74,Kurkuma,Curcuma longa,Kurkuma ist eine tropische Gewuerzpflanze mit breiten Blaettern und leuchtend gelber Wurzel. Wichtiges Heilgewuerz.,Helles bis volles Licht,20-30 °C,7,medicinal|high_humidity,medicinal_requires_external_evidence,,,, +medicinal,constants/lexiconBatch2.ts,109,Roter Fingerhut,Digitalis purpurea,"Der Rote Fingerhut hat hohe Bluetenstaende mit roehrenfoermigen, gepunkteten Blueten in Rosa. Wichtige Arzneipflanze.",Helles bis volles Licht,10-20 °C,7,flowering|medicinal,medicinal_requires_external_evidence,,,, +medicinal,constants/lexiconBatch2.ts,106,Sonnenhut,Echinacea purpurea,"Der Sonnenhut ist eine beliebte Heilpflanze mit grossen, pinkfarbenen Blueten. Er staerkt das Immunsystem.",Helles bis volles Licht,15-25 °C,7,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, +medicinal,constants/lexiconBatch2.ts,210,Eukalyptus,Eucalyptus globulus,Eukalyptus ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|medicinal|sun,medicinal_requires_external_evidence,,,, +medicinal,constants/lexiconBatch2.ts,216,Ginkgo,Ginkgo biloba,Ginkgo ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|medicinal|sun,medicinal_requires_external_evidence,,,, +medicinal,constants/lexiconBatch2.ts,119,Zaubernuss,Hamamelis mollis,"Die Zaubernuss bluet im Winter mit fadendunnen, gelben Bluetenkranzeln, die bis -10 Grad standhalten.",Helles bis volles Licht,10-20 °C,10,flowering|medicinal,medicinal_requires_external_evidence,,,, +medicinal,constants/lexiconBatch2.ts,105,Johanniskraut,Hypericum perforatum,Das Johanniskraut hat leuchtend gelbe Blueten und ist ein wichtiges Heilkraut gegen Depressionen und Stimmungstiefs.,Volles Sonnenlicht,10-25 °C,7,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, +medicinal,constants/lexiconBatch1.ts,23,Echter Lavendel,Lavandula angustifolia,Der Echte Lavendel ist ein aromatischer Halbstrauch mit lilafarbenen Bluetenaehren. Herrlicher Duft.,Volles Sonnenlicht,10-25 °C,10,medicinal|bright_light|sun,medicinal_requires_external_evidence,,,, +medicinal,constants/lexiconBatch2.ts,102,Zitronenmelisse,Melissa officinalis,Die Zitronenmelisse ist ein zitronig duftendes Heilkraut. Sie beruhigt die Nerven und foerdert den Schlaf.,Helles bis volles Licht,15-25 °C,5,easy|medicinal,medicinal_requires_external_evidence,,,, +medicinal,constants/lexiconBatch1.ts,25,Basilikum,Ocimum basilicum,"Basilikum ist das beliebteste Kuechenkraut mit intensiv aromatischen, gruenen Blaettern. Fuer Pesto verwendet.",Volles Sonnenlicht,18-30 °C,2,easy|medicinal|sun,medicinal_requires_external_evidence,,,, +medicinal,constants/lexiconBatch1.ts,28,Oregano,Origanum vulgare,"Oregano ist ein aromatisches Kuechenkraut mit runden, behaarten Blaettern. In mediterraner Kueche beliebt.",Volles Sonnenlicht,15-25 °C,7,easy|medicinal|sun,medicinal_requires_external_evidence,,,, +medicinal,constants/lexiconBatch1.ts,31,Rosengeranie,Pelargonium graveolens,Die Rosengeranie ist eine Duftpflanze mit tief eingeschnittenen Blaettern und rosaenlichem Aroma.,Volles Sonnenlicht,15-25 °C,7,easy|medicinal|sun,medicinal_requires_external_evidence,,,, +medicinal,constants/lexiconBatch1.ts,24,Rosmarin,Rosmarinus officinalis,Rosmarin ist ein aromatisches Kraut mit nadelartigen Blaettern und blauen Blueten. In der Kueche unverzichtbar.,Volles Sonnenlicht,10-25 °C,7,easy|medicinal|sun,medicinal_requires_external_evidence,,,, +medicinal,constants/lexiconBatch2.ts,113,Silber-Weide,Salix alba,"Die Silber-Weide hat silbrig-glaenzende Blaetter. Weidenrinde enthält Salicylsaeure, die Grundlage von Aspirin.",Helles bis volles Licht,10-25 °C,7,tree|large|medicinal,medicinal_requires_external_evidence,,,, +medicinal,constants/lexiconBatch2.ts,103,Salbei,Salvia officinalis,Salbei ist ein aromatisches Heilkraut mit silbrig-gruenen Blaettern. Er hat antibakterielle und entzuendungshem­mende Wirkung.,Volles Sonnenlicht,10-25 °C,7,easy|medicinal|sun,medicinal_requires_external_evidence,,,, +medicinal,constants/lexiconBatch2.ts,112,Schwarzer Holunder,Sambucus nigra,Der Schwarze Holunder hat weisse Doldenbluten und schwarze Beeren. Die Fruechte werden fuer Sirup und Saft verwendet.,Helles bis volles Licht,10-25 °C,7,flowering|tree|medicinal,medicinal_requires_external_evidence,,,, +medicinal,constants/lexiconBatch1.ts,27,Thymian,Thymus vulgaris,"Thymian ist ein kleiner, aromatischer Strauch mit winzigen Blaettern und rosa Blueten. Wichtiges Kuechenkraut.",Volles Sonnenlicht,10-25 °C,7,easy|medicinal|sun,medicinal_requires_external_evidence,,,, +medicinal,constants/lexiconBatch2.ts,111,Grosse Brennessel,Urtica dioica,Die Grosse Brennessel ist eine Heilpflanze mit brennenden Haaren. Die Blaetter sind reich an Vitaminen und Mineralien.,Helles bis volles Licht,10-25 °C,7,medicinal,medicinal_requires_external_evidence,,,, +medicinal,constants/lexiconBatch2.ts,104,Baldrian,Valeriana officinalis,Baldrian ist ein bekanntes Heilkraut mit weissen bis roeslichen Blueten. Die Wurzeln werden zur Schlaffoerderung verwendet.,Helles bis volles Licht,15-25 °C,7,flowering|medicinal,medicinal_requires_external_evidence,,,, +medicinal,constants/lexiconBatch2.ts,192,Koenigskerze,Verbascum thapsus,"Koenigskerze ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, +medicinal,constants/lexiconBatch2.ts,75,Ingwer,Zingiber officinale,Ingwer ist eine tropische Gewuerzpflanze mit aromatischen Knollen. Die Blaetter sind schilfartig.,Helles indirektes Licht,20-30 °C,5,medicinal|high_humidity,medicinal_requires_external_evidence,,,, +patterned,constants/lexiconBatch2.ts,34,Silbervase,Aechmea fasciata,Die Silbervase ist eine Bromelie mit silbrig gebänderten Blaettern und einem rosafarbenen Bluetenstand.,Helles indirektes Licht,18-25 °C,10,flowering|patterned,,,,, +patterned,constants/lexiconBatch1.ts,50,Aglaoneme,Aglaonema commutatum,Die Aglaoneme ist eine dekorative Zimmerpflanze mit silbrig-gruen gemusterten Blaettern. Tolerant gegenueber wenig Licht.,Wenig bis helles Licht,15-26 °C,7,easy|patterned|low_light,,,,, +patterned,constants/lexiconBatch1.ts,46,Amazona-Taro,Alocasia amazonica,"Der Amazona-Taro besticht mit dunkelgruenen, pfeilfoermigen Blaettern mit markant weissen Rippen.",Indirektes Licht,18-27 °C,5,patterned|large|high_humidity,,,,, +patterned,constants/lexiconBatch2.ts,233,Samt-Anthurie,Anthurium clarinervium,Samt-Anthurie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5,patterned|high_humidity,,,,, +patterned,constants/lexiconBatch2.ts,234,Kristall-Anthurie,Anthurium crystallinum,Kristall-Anthurie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5,patterned|high_humidity,,,,, +patterned,constants/lexiconBatch2.ts,57,Forellen-Begonie,Begonia maculata,Die Forellen-Begonie hat olivgruene Blaetter mit silbernen Punkten und einer roten Unterseite. Atemberaubend.,Helles indirektes Licht,18-27 °C,7,patterned|high_humidity,,,,, +patterned,constants/lexiconBatch1.ts,18,Koenigsbegonie,Begonia rex,"Die Koenigsbegonie beeindruckt mit prachtvoll gemusterten Blaettern in Silber, Rot und Gruen.",Indirektes Licht,18-25 °C,5,patterned|high_humidity,,,,, +patterned,constants/lexiconBatch1.ts,49,Buntblatt,Caladium bicolor,"Das Buntblatt beeindruckt mit transparenten, bunt gemusterten Blaettern in Pink, Rot, Weiss und Gruen.",Indirektes Licht,20-30 °C,5,patterned|high_humidity,,,,, +patterned,constants/lexiconBatch1.ts,99,Herzkette,Ceropegia woodii,"Die Herzkette hat duenne, haengende Ranken mit herzfoermigen, silbergrau gemusterten Blaettchen.",Helles indirektes Licht,15-27 °C,14,easy|succulent|patterned|hanging,,,,, +patterned,constants/lexiconBatch2.ts,224,Kroton,Codiaeum variegatum,Kroton ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,patterned|bright_light,,,,, +patterned,constants/lexiconBatch2.ts,39,Cryptanthus,Cryptanthus bivittatus,Cryptanthus ist eine niedrig wachsende Bromelie mit sternfoermigen Rosetten und gemusterten Blaettern. Fuer Terrarien.,Helles indirektes Licht,18-27 °C,7,patterned|high_humidity,,,,, +patterned,constants/lexiconBatch1.ts,53,Ctenanthe,Ctenanthe burle-marxii,Die Ctenanthe hat faszinierend gemusterte Blaetter mit dunkelgruunem Fischgraetenmuster auf hellgruunem Hintergrund.,Indirektes Licht,18-25 °C,5,patterned|high_humidity,,,,, +patterned,constants/lexiconBatch2.ts,226,Nervenpflanze,Fittonia albivenis,Nervenpflanze ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5,patterned|high_humidity,,,,, +patterned,constants/lexiconBatch2.ts,240,Calathea lancifolia,Goeppertia insignis,Calathea lancifolia ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5,pet_friendly|patterned|high_humidity,pet_friendly_requires_external_evidence,,,, +patterned,constants/lexiconBatch2.ts,241,Calathea ornata,Goeppertia ornata,Calathea ornata ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5,pet_friendly|patterned|high_humidity,pet_friendly_requires_external_evidence,,,, +patterned,constants/lexiconBatch2.ts,227,Punktblatt,Hypoestes phyllostachya,Punktblatt ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,patterned|bright_light,,,,, +patterned,constants/lexiconBatch1.ts,51,Gebet-Pflanze,Maranta leuconeura,Die Gebet-Pflanze faltet ihre gemusterten Blaetter nachts wie Haende zusammen. Faszinierende rote und gruene Muster.,Indirektes Licht,18-27 °C,5,pet_friendly|patterned|high_humidity,pet_friendly_requires_external_evidence,,,, +patterned,constants/lexiconBatch2.ts,48,Monstera obliqua,Monstera obliqua,"Monstera obliqua ist eine seltene Monstera-Art mit filigranen Blaettern, die hauptsaechlich aus Lochern bestehen.",Helles indirektes Licht,18-27 °C,7,patterned|hanging,,,,, +patterned,constants/lexiconBatch2.ts,37,Neoregelia,Neoregelia carolinae,"Die Neoregelia ist eine Bromelie, bei der das Herzblatt zur Bluetzeit leuchtend rot wird. Sehr dekorativ.",Helles bis volles Licht,18-27 °C,7,flowering|patterned|bright_light,,,,, +patterned,constants/lexiconBatch1.ts,54,Kleeblume,Oxalis triangularis,"Die Kleeblume hat tiefviolette, dreieckige Blaetter und zarte rosa Blueten. Sie faltet die Blaetter bei Dunkelheit.",Helles indirektes Licht,15-24 °C,7,flowering|patterned,,,,, +patterned,constants/lexiconBatch2.ts,6,Schraubenbaum,Pandanus veitchii,"Der Schraubenbaum hat spiralfoermig angeordnete, gruenweiss gestreifte Blaetter. Sehr dekorativ und exotisch.",Helles bis volles Licht,18-27 °C,7,patterned|bright_light,,,,, +patterned,constants/lexiconBatch2.ts,229,Wassermelonen-Peperomie,Peperomia argyreia,Wassermelonen-Peperomie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,pet_friendly|patterned,pet_friendly_requires_external_evidence,,,, +patterned,constants/lexiconBatch2.ts,243,Philodendron Pink Princess,Philodendron erubescens Pink Princess,Philodendron Pink Princess ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,patterned|bright_light,,,,, +patterned,constants/lexiconBatch2.ts,49,Philodendron gloriosum,Philodendron gloriosum,"Philodendron gloriosum hat grosse, samtige, herzfoermige Blaetter mit weissen Rippen. Eine atemberaubende Pflanze.",Helles indirektes Licht,18-27 °C,7,patterned|large|high_humidity,,,,, +patterned,constants/lexiconBatch2.ts,228,Aluminium-Pflanze,Pilea cadierei,Aluminium-Pflanze ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,easy|pet_friendly|patterned,pet_friendly_requires_external_evidence,,,, +patterned,constants/lexiconBatch2.ts,152,Buntnessel,Plectranthus scutellarioides,"Buntnessel ist eine farbstarke Zierpflanze, die vor allem fuer ihr dekoratives Laub beliebt ist.",Volles bis helles Licht,10-24 C,4,patterned|bright_light,,,,, +patterned,constants/lexiconBatch1.ts,55,Satinpothos,Scindapsus pictus,"Der Satinpothos hat samtig-glaenzende, silbrig gefleckte Blaetter auf langen, haengenden Ranken.",Helles indirektes Licht,18-28 °C,7,easy|patterned|hanging,,,,, +patterned,constants/lexiconBatch2.ts,45,Regenbogenmoos,Selaginella uncinata,"Das Regenbogenmoos hat schuppenfoermige Blaetter, die im Licht schillernd irisieren. Dekorativ fuer Terrarien.",Helles indirektes Licht,18-27 °C,5,patterned|high_humidity,,,,, +patterned,constants/lexiconBatch1.ts,52,Stromanthe,Stromanthe sanguinea,Die Stromanthe hat dekorative Blaetter mit weissem Muster und leuchtend roter Unterseite. Familie der Marantaceen.,Helles indirektes Licht,18-25 °C,5,patterned|high_humidity,,,,, +patterned,constants/lexiconBatch1.ts,17,Zebrakraut,Tradescantia zebrina,Das Zebrakraut faellt durch seine silbrig-lila gestreiften Blaetter auf. Schnellwachsende Haengepflanze.,Helles indirektes Licht,15-25 °C,5,easy|patterned|hanging,,,,, +patterned,constants/lexiconBatch2.ts,35,Flammen-Bromelie,Vriesea splendens,"Die Flammen-Bromelie hat gebänderte, dunkelgruene Blaetter und einen spektakulaeren, roten Bluetenstand.",Helles indirektes Licht,18-25 °C,7,flowering|patterned|high_humidity,,,,, +pet_friendly,constants/lexiconBatch1.ts,43,Bergpalme,Chamaedorea elegans,Die Bergpalme ist eine kompakte Zimmerpalme fuer schattigere Standorte. Ideal fuer dunkle Innenraeume.,Wenig bis helles Licht,15-25 °C,7,easy|pet_friendly|tree|air_purifier|low_light,air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence,,,, +pet_friendly,constants/lexiconBatch1.ts,42,Goldfruchtpalme,Dypsis lutescens,Die Goldfruchtpalme ist eine elegante Zimmerpalme mit gelblich-gruenen Stielen und gefiederten Wedeln.,Helles indirektes Licht,18-27 °C,5,pet_friendly|tree|air_purifier,air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence,,,, +pet_friendly,constants/lexiconBatch2.ts,100,Erdbeere,Fragaria ananassa,"Die Erdbeere ist ein beliebtes Obst fuer Balkon und Terrasse mit aromatischen, roten Fruechten.",Helles bis volles Licht,15-25 °C,3,easy|pet_friendly|sun,pet_friendly_requires_external_evidence,,,, +pet_friendly,constants/lexiconBatch2.ts,240,Calathea lancifolia,Goeppertia insignis,Calathea lancifolia ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5,pet_friendly|patterned|high_humidity,pet_friendly_requires_external_evidence,,,, +pet_friendly,constants/lexiconBatch2.ts,241,Calathea ornata,Goeppertia ornata,Calathea ornata ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-28 C,5,pet_friendly|patterned|high_humidity,pet_friendly_requires_external_evidence,,,, +pet_friendly,constants/lexiconBatch2.ts,3,Kentia-Palme,Howea forsteriana,"Die Kentia-Palme ist eine der elegantesten Zimmerpalmen mit langen, herabhängenden Fiederblaettern.",Helles indirektes Licht,18-25 °C,7,pet_friendly|tree|low_light,pet_friendly_requires_external_evidence,,,, +pet_friendly,constants/lexiconBatch1.ts,51,Gebet-Pflanze,Maranta leuconeura,Die Gebet-Pflanze faltet ihre gemusterten Blaetter nachts wie Haende zusammen. Faszinierende rote und gruene Muster.,Indirektes Licht,18-27 °C,5,pet_friendly|patterned|high_humidity,pet_friendly_requires_external_evidence,,,, +pet_friendly,constants/lexiconBatch2.ts,229,Wassermelonen-Peperomie,Peperomia argyreia,Wassermelonen-Peperomie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,pet_friendly|patterned,pet_friendly_requires_external_evidence,,,, +pet_friendly,constants/lexiconBatch1.ts,102,Rippenpeperomie,Peperomia caperata,"Die Rippenpeperomie hat tief gerippte, dunkelgruene bis violette Blaetter mit einer samtigen Textur.",Helles indirektes Licht,18-26 °C,10,easy|pet_friendly,pet_friendly_requires_external_evidence,,,, +pet_friendly,constants/lexiconBatch1.ts,103,Spiegelpeperomie,Peperomia obtusifolia,"Die Spiegelpeperomie hat glaenzende, lederartige, oval-runde Blaetter in tiefem Gruen. Sehr robust.",Helles indirektes Licht,16-26 °C,10,easy|pet_friendly|low_light,pet_friendly_requires_external_evidence,,,, +pet_friendly,constants/lexiconBatch2.ts,230,Raindrop-Peperomie,Peperomia polybotrya,Raindrop-Peperomie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,easy|pet_friendly,pet_friendly_requires_external_evidence,,,, +pet_friendly,constants/lexiconBatch1.ts,34,Petunie,Petunia hybrida,Die Petunie ist eine der beliebtesten Balkonpflanzen mit trichterfoermigen Blueten in unzaehligen Farben.,Volles Sonnenlicht,15-25 °C,2,easy|pet_friendly|flowering|sun,pet_friendly_requires_external_evidence,,,, +pet_friendly,constants/lexiconBatch2.ts,228,Aluminium-Pflanze,Pilea cadierei,Aluminium-Pflanze ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,easy|pet_friendly|patterned,pet_friendly_requires_external_evidence,,,, +pet_friendly,constants/lexiconBatch1.ts,2,Ufopflanze,Pilea peperomioides,"Die Ufopflanze hat unverwechselbare, runde Blaetter auf langen Stielen. Bildet leicht Ableger zum Verschenken.",Helles indirektes Licht,13-30 °C,7,easy|pet_friendly,pet_friendly_requires_external_evidence,,,, +pet_friendly,constants/lexiconBatch2.ts,238,Bubikopf,Soleirolia soleirolii,Bubikopf ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,15-24 C,4,pet_friendly|high_humidity,pet_friendly_requires_external_evidence,,,, +succulent,constants/lexiconBatch1.ts,86,Wuestenrose,Adenium obesum,Die Wuestenrose ist eine sukkulente Zimmerpflanze mit dickem Stamm und leuchtend pinken Blueten.,Volles Sonnenlicht,20-35 °C,10,flowering|succulent|sun,,,,, +succulent,constants/lexiconBatch2.ts,117,Socotra-Wuestenrose,Adenium socotranum,"Die Socotra-Wuestenrose ist eine seltene, endemische Art mit einem sehr dicken, knolligen Stamm und rosa Blueten.",Volles Sonnenlicht,20-35 °C,14,flowering|succulent|sun,,,,, +succulent,constants/lexiconBatch2.ts,31,Adromischus,Adromischus cristatus,Adromischus ist eine kompakte Sukkulente mit ungewoehnlich wellenrandigen Blaettern auf kurzen Staengeln.,Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, +succulent,constants/lexiconBatch1.ts,10,Schwarze Rose (Aeonium),Aeonium arboreum,"Das Aeonium bildet dekorative, rosettenfoermige Sukkulenten an verzweigten Stielen.",Volles Sonnenlicht,10-25 °C,10,succulent|sun,,,,, +succulent,constants/lexiconBatch1.ts,11,Agave,Agave americana,"Die Agave ist eine imposante Sukkulente mit steifen, blaugruenen Blaettern mit Stacheln. Sie bluet nur einmal.",Volles Sonnenlicht,10-35 °C,21,succulent|large|sun,,,,, +succulent,constants/lexiconBatch1.ts,89,Kap-Aloe,Aloe arborescens,"Die Kap-Aloe ist eine strauchige Aloe mit schmalen, gezaehnten Blaettern und leuchtend roten Bluetenaehren im Winter.",Volles Sonnenlicht,10-30 °C,14,easy|succulent|medicinal|sun,medicinal_requires_external_evidence,,,, +succulent,constants/lexiconBatch2.ts,18,Kap-Aloe (ferox),Aloe ferox,"Aloe ferox ist eine grosse, imposante Aloe mit stachligen, blaugruenen Blaettern und leuchtend roten Bluetenaehren.",Volles Sonnenlicht,10-30 °C,14,succulent|large|medicinal|sun,medicinal_requires_external_evidence,,,, +succulent,constants/lexiconBatch1.ts,41,Pferdeschwanzpalme,Beaucarnea recurvata,"Die Pferdeschwanzpalme hat einen verdickten Stammbasis als Wasserspeicher und lange, schmale Blaetter.",Volles Sonnenlicht,15-30 °C,21,easy|succulent|tree|sun,,,,, +succulent,constants/lexiconBatch1.ts,81,Peruanischer Fackelkaktus,Cereus peruvianus,"Der Peruanische Fackelkaktus ist ein saeulenfoermiger Kaktus, der im Innenraum bis zu 2 m hoch werden kann.",Volles Sonnenlicht,15-35 °C,21,easy|succulent|large|sun,,,,, +succulent,constants/lexiconBatch1.ts,99,Herzkette,Ceropegia woodii,"Die Herzkette hat duenne, haengende Ranken mit herzfoermigen, silbergrau gemusterten Blaettchen.",Helles indirektes Licht,15-27 °C,14,easy|succulent|patterned|hanging,,,,, +succulent,constants/lexiconBatch2.ts,24,Konophytum,Conophytum calculus,"Das Konophytum ist eine sehr kompakte Sukkulente, die zwei Blaetter zu einer kugelfoermigen Form verschmilzt.",Volles Sonnenlicht,10-25 °C,21,succulent|sun,,,,, +succulent,constants/lexiconBatch2.ts,29,Kotyledon,Cotyledon orbiculata,"Kotyledon hat dickfleischige, runde Blaetter mit einem mehligen, weisslichen Belag. Sehr trockenheitsresistent.",Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, +succulent,constants/lexiconBatch2.ts,26,Moos-Crassula,Crassula muscosa,"Die Moos-Crassula hat dicht aneinandergereihte, winzige gruene Blaetter auf unverzweigten Trieben. Sieht aus wie Moos.",Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, +succulent,constants/lexiconBatch1.ts,5,Jadepflanze,Crassula ovata,"Die Jadepflanze ist eine langlebige Sukkulente mit dicken, ovalen Blaettern. In Japan gilt sie als Gluecksbringer.",Helles bis volles Licht,15-24 °C,14,easy|succulent|sun,,,,, +succulent,constants/lexiconBatch2.ts,236,String of Bananas,Curio radicans,String of Bananas ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles bis volles Licht,18-30 C,10,succulent|hanging|sun,,,,, +succulent,constants/lexiconBatch2.ts,237,String of Dolphins,Curio x peregrinus,String of Dolphins ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles bis volles Licht,18-30 C,10,succulent|hanging|sun,,,,, +succulent,constants/lexiconBatch1.ts,101,Dischidia,Dischidia ruscifolia,"Die Dischidia ist eine epiphytische Haengepflanze mit kleinen, runden Blaettern entlang duenner Ranken.",Helles indirektes Licht,18-27 °C,7,succulent|hanging,,,,, +succulent,constants/lexiconBatch2.ts,30,Dudleya,Dudleya brittonii,"Dudleya ist eine rosetten­bildende Sukkulente mit silbrig-weissen, mehligen Blaettern. Sehr elegant.",Volles Sonnenlicht,10-25 °C,14,easy|succulent|sun,,,,, +succulent,constants/lexiconBatch1.ts,4,Echeverie,Echeveria elegans,"Die Echeverie bildet symmetrische, rosettenfoermige Sukkulenten mit blaugruenen Blaettern. Pflegeleicht.",Volles Sonnenlicht,15-25 °C,14,easy|succulent|sun,,,,, +succulent,constants/lexiconBatch1.ts,77,Goldene Tonne,Echinocactus grusonii,Die Goldene Tonne ist ein ikonischer kugelfoermiger Kaktus mit goldgelben Stacheln. Waechst langsam aber imposant.,Volles Sonnenlicht,15-35 °C,21,easy|succulent|sun,,,,, +succulent,constants/lexiconBatch1.ts,83,San-Pedro-Kaktus,Echinopsis pachanoi,"Der San-Pedro-Kaktus ist ein schnell wachsender, saeulenfoermiger Kaktus aus den Anden.",Volles Sonnenlicht,10-35 °C,14,easy|succulent|sun,,,,, +succulent,constants/lexiconBatch1.ts,84,Koenigin der Nacht,Epiphyllum oxypetalum,"Die Koenigin der Nacht bluet nur eine einzige Nacht lang mit riesigen, intensiv duftenden weissen Blueten.",Indirektes Licht,18-27 °C,7,flowering|succulent,,,,, +succulent,constants/lexiconBatch2.ts,19,Christusdorn,Euphorbia milii,Der Christusdorn ist eine sukkulente Wolfsmilch mit stacheligen Zweigen und kleinen roten oder gelben Hochblaettern.,Helles bis volles Licht,15-28 °C,10,easy|flowering|succulent|sun,,,,, +succulent,constants/lexiconBatch1.ts,12,Bleistiftkaktus,Euphorbia tirucalli,"Der Bleistiftkaktus ist eine sukkulente Wolfsmilch mit duennen, zylindrischen Zweigen ohne Blaetter.",Volles Sonnenlicht,18-30 °C,14,easy|succulent|sun,,,,, +succulent,constants/lexiconBatch1.ts,78,Fass-Kaktus,Ferocactus cylindraceus,"Der Fass-Kaktus ist ein zylindrischer Wuestenkaktus mit langen, roten Stacheln. Sehr langlebig.",Volles Sonnenlicht,15-35 °C,21,easy|succulent|sun,,,,, +succulent,constants/lexiconBatch1.ts,90,Gasteria,Gasteria carinata,"Die Gasteria ist eine kleine Sukkulente mit zweireihig angeordneten, zungenfoermigen, gefleckten Blaettern.",Helles indirektes Licht,15-25 °C,14,easy|succulent|low_light,,,,, +succulent,constants/lexiconBatch1.ts,87,Geisterpflanze,Graptopetalum paraguayense,"Die Geisterpflanze hat zartgraue bis perlmutt-rosafarbene, rosettenfoermige Blaetter. Sehr robuste Sukkulente.",Volles Sonnenlicht,15-25 °C,14,easy|succulent|sun,,,,, +succulent,constants/lexiconBatch1.ts,80,Mond-Kaktus,Gymnocalycium mihanovichii,Der Mond-Kaktus ist eine farbenfrohe Veredelung eines chlorophylllosen Kaktus auf einem gruenen Unterlagekaktus.,Indirektes Licht,15-30 °C,14,easy|succulent,,,,, +succulent,constants/lexiconBatch1.ts,6,Zebra-Haworthie,Haworthia fasciata,Die Zebra-Haworthie ist eine kompakte Sukkulente mit weissen Querstreifen auf dunkelgruenen Blaettern.,Helles indirektes Licht,15-25 °C,14,easy|succulent|low_light,,,,, +succulent,constants/lexiconBatch1.ts,58,Kleine Wachsblume,Hoya bella,"Die Kleine Wachsblume traegt zierliche, sternfoermige weisse Blueten mit rosa Mitte. Haengende Sukkulente.",Helles indirektes Licht,18-27 °C,10,flowering|succulent|hanging,,,,, +succulent,constants/lexiconBatch1.ts,57,Wachsblume,Hoya carnosa,"Die Wachsblume ist eine Kletterpflanze mit dicken, wachsartigen Blaettern und sternfoermigen, duftenden Blueten.",Helles indirektes Licht,16-27 °C,10,easy|flowering|succulent|hanging,,,,, +succulent,constants/lexiconBatch1.ts,9,Kalanchoe,Kalanchoe blossfeldiana,"Die Kalanchoe ist eine beliebte Bluehpflanze mit leuchtenden Blueten in Rot, Orange, Gelb oder Rosa.",Helles bis volles Licht,15-25 °C,10,easy|flowering|succulent|sun,,,,, +succulent,constants/lexiconBatch2.ts,22,Brutblatt,Kalanchoe daigremontiana,Das Brutblatt bildet entlang des Blattrandes zahlreiche kleine Jungpflanzen. Eine faszinierende Sukkulente.,Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, +succulent,constants/lexiconBatch2.ts,21,Kaninchen-Ohren,Kalanchoe tomentosa,"Kaninchen-Ohren haben weisslich-filzige Blaetter mit braunen Raendern, die Kaninchen­ohren aehneln. Sehr dekorativ.",Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, +succulent,constants/lexiconBatch2.ts,23,Lebende Steine,Lithops julii,"Lebende Steine sind faszinierende Mimikry-Sukkulenten, die Kieselsteinen taeuschen aehnlich sehen. Sehr trockenheitsresistent.",Volles Sonnenlicht,10-30 °C,21,succulent|sun,,,,, +succulent,constants/lexiconBatch1.ts,79,Mammillaria,Mammillaria zeilmanniana,"Die Mammillaria ist ein kompakter, kugelfoermiger Kaktus, der im Fruehling einen Kranz aus rosa Blueten traegt.",Volles Sonnenlicht,15-35 °C,14,easy|flowering|succulent|sun,,,,, +succulent,constants/lexiconBatch1.ts,82,Hasenohren-Kaktus,Opuntia microdasys,"Der Hasenohren-Kaktus hat flache, ovale Triebe mit dichten weissen Glochiden. Klassischer Zimmerkaktus.",Volles Sonnenlicht,10-35 °C,21,easy|succulent|sun,,,,, +succulent,constants/lexiconBatch1.ts,88,Mondstein-Pflanze,Pachyphytum oviferum,"Die Mondstein-Pflanze hat dicke, ovale Blaetter mit einem pastellrosafarbenen, mehligen Ueberzug.",Volles Sonnenlicht,15-25 °C,14,easy|succulent|sun,,,,, +succulent,constants/lexiconBatch2.ts,27,Speckbaum,Portulacaria afra,"Der Speckbaum ist eine sukkulente Pflanze mit roten Stielen und kleinen, runden, glaenzenden Blaettern.",Helles bis volles Licht,15-30 °C,14,easy|succulent|sun,,,,, +succulent,constants/lexiconBatch1.ts,85,Korallenkaktus,Rhipsalis baccifera,"Der Korallenkaktus ist ein epiphytischer Kaktus mit duennen, haengenden Trieben und kleinen weissen Beeren.",Indirektes Licht,18-27 °C,7,succulent|hanging,,,,, +succulent,constants/lexiconBatch2.ts,17,Zylindrischer Bogenhanf,Sansevieria cylindrica,"Der Zylindrische Bogenhanf hat zylindrische, aufrechte Blaetter, die sich nach oben verjuengen. Sehr pflegeleicht.",Helles bis volles Licht,15-27 °C,14,easy|succulent|sun,,,,, +succulent,constants/lexiconBatch1.ts,8,Weihnachtskaktus,Schlumbergera truncata,"Der Weihnachtskaktus erfreut zur Weihnachtszeit mit leuchtenden Blueten in Rosa, Rot oder Weiss.",Helles indirektes Licht,15-21 °C,7,easy|flowering|succulent,,,,, +succulent,constants/lexiconBatch1.ts,7,Eselschwanz,Sedum morganianum,"Der Eselschwanz ist eine haengende Sukkulente mit langen Trieben aus dichten, blaugruenen Blaettchen.",Volles Sonnenlicht,15-25 °C,14,easy|succulent|hanging|sun,,,,, +succulent,constants/lexiconBatch1.ts,100,Perlenschnur-Pflanze,Senecio rowleyanus,"Die Perlenschnur-Pflanze hat haengende Ranken mit kugelfoermigen, perlenaehnlichen Blaettern. Einzigartige Sukkulente.",Helles bis volles Licht,15-27 °C,14,easy|succulent|hanging,,,,, +succulent,constants/lexiconBatch2.ts,28,Blauer Kreuzkraut,Senecio serpens,"Der Blaue Kreuzkraut hat zylindrische, blaublaugruene Blaetter und einen kriechenden Wuchs. Sehr dekorativ.",Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, +succulent,constants/lexiconBatch2.ts,25,Aasblume,Stapelia grandiflora,"Die Aasblume hat fleischige, gruene Staengel und riesige, sternfoermige Blueten mit aasartigem Duft.",Helles bis volles Licht,18-30 °C,14,flowering|succulent|sun,,,,, +sun,constants/lexiconBatch2.ts,212,Spitzahorn,Acer platanoides,Spitzahorn ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, +sun,constants/lexiconBatch2.ts,108,Schafgarbe,Achillea millefolium,Die Schafgarbe hat weisse oder rosafarbene Bluetenschirme und fein gefiederte Blaetter. Wichtige Heilpflanze.,Volles Sonnenlicht,10-25 °C,7,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, +sun,constants/lexiconBatch1.ts,86,Wuestenrose,Adenium obesum,Die Wuestenrose ist eine sukkulente Zimmerpflanze mit dickem Stamm und leuchtend pinken Blueten.,Volles Sonnenlicht,20-35 °C,10,flowering|succulent|sun,,,,, +sun,constants/lexiconBatch2.ts,117,Socotra-Wuestenrose,Adenium socotranum,"Die Socotra-Wuestenrose ist eine seltene, endemische Art mit einem sehr dicken, knolligen Stamm und rosa Blueten.",Volles Sonnenlicht,20-35 °C,14,flowering|succulent|sun,,,,, +sun,constants/lexiconBatch2.ts,31,Adromischus,Adromischus cristatus,Adromischus ist eine kompakte Sukkulente mit ungewoehnlich wellenrandigen Blaettern auf kurzen Staengeln.,Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, +sun,constants/lexiconBatch1.ts,10,Schwarze Rose (Aeonium),Aeonium arboreum,"Das Aeonium bildet dekorative, rosettenfoermige Sukkulenten an verzweigten Stielen.",Volles Sonnenlicht,10-25 °C,10,succulent|sun,,,,, +sun,constants/lexiconBatch1.ts,11,Agave,Agave americana,"Die Agave ist eine imposante Sukkulente mit steifen, blaugruenen Blaettern mit Stacheln. Sie bluet nur einmal.",Volles Sonnenlicht,10-35 °C,21,succulent|large|sun,,,,, +sun,constants/lexiconBatch2.ts,155,Stockrose,Alcea rosea,"Stockrose ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,135,Schnittknoblauch,Allium tuberosum,Schnittknoblauch ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +sun,constants/lexiconBatch1.ts,89,Kap-Aloe,Aloe arborescens,"Die Kap-Aloe ist eine strauchige Aloe mit schmalen, gezaehnten Blaettern und leuchtend roten Bluetenaehren im Winter.",Volles Sonnenlicht,10-30 °C,14,easy|succulent|medicinal|sun,medicinal_requires_external_evidence,,,, +sun,constants/lexiconBatch2.ts,18,Kap-Aloe (ferox),Aloe ferox,"Aloe ferox ist eine grosse, imposante Aloe mit stachligen, blaugruenen Blaettern und leuchtend roten Bluetenaehren.",Volles Sonnenlicht,10-30 °C,14,succulent|large|medicinal|sun,medicinal_requires_external_evidence,,,, +sun,constants/lexiconBatch2.ts,128,Zitronenverbene,Aloysia citrodora,Zitronenverbene ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +sun,constants/lexiconBatch2.ts,194,Fuchsschwanz,Amaranthus caudatus,"Fuchsschwanz ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,163,Anemone,Anemone coronaria,"Anemone ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,140,Dill,Anethum graveolens,Dill ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +sun,constants/lexiconBatch2.ts,125,Kerbel,Anthriscus cerefolium,Kerbel ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +sun,constants/lexiconBatch2.ts,147,Loewenmaeulchen,Antirrhinum majus,"Loewenmaeulchen ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,107,Arnika,Arnica montana,Arnika ist eine bekannte Heilpflanze aus den Alpen mit goldgelben Korbbluten. Sie wird fuer Muskeln und Gelenke verwendet.,Volles Sonnenlicht,10-20 °C,7,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, +sun,constants/lexiconBatch2.ts,110,Wermut,Artemisia absinthium,"Wermut ist ein stark aromatisches Heilkraut mit silbrig-gruenen, tief eingeschnittenen Blaettern. Fuer Kraeuterlikoere.",Volles Sonnenlicht,10-25 °C,14,medicinal|sun,medicinal_requires_external_evidence,,,, +sun,constants/lexiconBatch2.ts,122,Estragon,Artemisia dracunculus,Estragon ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +sun,constants/lexiconBatch2.ts,178,Seidenpflanze,Asclepias tuberosa,"Seidenpflanze ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch1.ts,41,Pferdeschwanzpalme,Beaucarnea recurvata,"Die Pferdeschwanzpalme hat einen verdickten Stammbasis als Wasserspeicher und lange, schmale Blaetter.",Volles Sonnenlicht,15-30 °C,21,easy|succulent|tree|sun,,,,, +sun,constants/lexiconBatch2.ts,145,Gaensebluemchen,Bellis perennis,"Gaensebluemchen ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,129,Borretsch,Borago officinalis,Borretsch ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +sun,constants/lexiconBatch1.ts,62,Bougainvillea,Bougainvillea spectabilis,"Die Bougainvillea ist eine rankenreiche Kletterpflanze mit leuchtend farbigen Hochblaettern in Rot, Orange oder Pink.",Volles Sonnenlicht,18-30 °C,5,flowering|bright_light|sun,,,,, +sun,constants/lexiconBatch2.ts,223,Schmetterlingsflieder,Buddleja davidii,Schmetterlingsflieder ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|sun,,,,, +sun,constants/lexiconBatch2.ts,202,Buchsbaum,Buxus sempervirens,Buchsbaum ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|sun,,,,, +sun,constants/lexiconBatch2.ts,187,Ringelblume,Calendula officinalis,"Ringelblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, +sun,constants/lexiconBatch2.ts,63,Calibrachoa,Calibrachoa hybrida,"Calibrachoa ist eine petunienaehnliche Haengepflanze mit unzaehligen, kleinen Trichterbluten in allen Farben.",Volles Sonnenlicht,15-25 °C,2,easy|flowering|hanging|sun,,,,, +sun,constants/lexiconBatch2.ts,67,Blumenschilfrohr,Canna indica,"Das Blumenschilfrohr hat grosse, tropisch wirkende Blaetter und auffaellige Blueten in Rot, Orange oder Gelb.",Volles Sonnenlicht,18-28 °C,5,flowering|large|sun,,,,, +sun,constants/lexiconBatch2.ts,92,Chili,Capsicum annuum,"Chili ist eine beliebte Gemuese- und Zierpflanze mit leuchtenden, roten oder orangen Fruechten. Im Topf kultivierbar.",Volles Sonnenlicht,20-30 °C,4,easy|medicinal|sun,medicinal_requires_external_evidence,,,, +sun,constants/lexiconBatch2.ts,90,Papaya,Carica papaya,"Die Papaya ist eine tropische Fruchtpflanze mit grossen, gelappten Blaettern und orangen Fruechten.",Volles Sonnenlicht,20-35 °C,5,large|sun,,,,, +sun,constants/lexiconBatch2.ts,217,Trompetenbaum,Catalpa bignonioides,Trompetenbaum ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, +sun,constants/lexiconBatch2.ts,208,Zeder,Cedrus libani,Zeder ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, +sun,constants/lexiconBatch2.ts,188,Kornblume,Centaurea cyanus,"Kornblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch1.ts,81,Peruanischer Fackelkaktus,Cereus peruvianus,"Der Peruanische Fackelkaktus ist ein saeulenfoermiger Kaktus, der im Innenraum bis zu 2 m hoch werden kann.",Volles Sonnenlicht,15-35 °C,21,easy|succulent|large|sun,,,,, +sun,constants/lexiconBatch2.ts,138,Roemische Kamille,Chamaemelum nobile,Roemische Kamille ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|medicinal|sun,medicinal_requires_external_evidence,,,, +sun,constants/lexiconBatch2.ts,101,Kamille,Chamomilla recutita,"Die Kamille ist ein beliebtes Heilkraut mit kleinen, weiss-gelben Blueten. Das aetherische Oel wirkt beruhigend.",Volles Sonnenlicht,15-25 °C,5,easy|medicinal|sun,medicinal_requires_external_evidence,,,, +sun,constants/lexiconBatch2.ts,86,Zitronenbaum,Citrus limon,"Der Zitronenbaum ist ein kleiner, immergruener Baum mit weissen, duftenden Blueten und gelben Fruechten.",Volles Sonnenlicht,18-28 °C,5,tree|sun,,,,, +sun,constants/lexiconBatch2.ts,87,Orangenbaum,Citrus sinensis,"Der Orangenbaum ist ein kleiner, immergruener Baum mit weissen Blueten und orangen Fruechten.",Volles Sonnenlicht,18-28 °C,5,tree|sun,,,,, +sun,constants/lexiconBatch2.ts,24,Konophytum,Conophytum calculus,"Das Konophytum ist eine sehr kompakte Sukkulente, die zwei Blaetter zu einer kugelfoermigen Form verschmilzt.",Volles Sonnenlicht,10-25 °C,21,succulent|sun,,,,, +sun,constants/lexiconBatch2.ts,14,Keulenlilie,Cordyline australis,"Die Keulenlilie hat lange, schmale, gruene oder rotbraune Blaetter in einem dekorativen Schopf.",Helles bis volles Licht,10-25 °C,7,easy|tree|sun,,,,, +sun,constants/lexiconBatch2.ts,181,Maedchenauge,Coreopsis tinctoria,"Maedchenauge ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,139,Koriander,Coriandrum sativum,Koriander ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +sun,constants/lexiconBatch2.ts,150,Kosmee,Cosmos bipinnatus,"Kosmee ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,29,Kotyledon,Cotyledon orbiculata,"Kotyledon hat dickfleischige, runde Blaetter mit einem mehligen, weisslichen Belag. Sehr trockenheitsresistent.",Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, +sun,constants/lexiconBatch2.ts,26,Moos-Crassula,Crassula muscosa,"Die Moos-Crassula hat dicht aneinandergereihte, winzige gruene Blaetter auf unverzweigten Trieben. Sieht aus wie Moos.",Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, +sun,constants/lexiconBatch1.ts,5,Jadepflanze,Crassula ovata,"Die Jadepflanze ist eine langlebige Sukkulente mit dicken, ovalen Blaettern. In Japan gilt sie als Gluecksbringer.",Helles bis volles Licht,15-24 °C,14,easy|succulent|sun,,,,, +sun,constants/lexiconBatch2.ts,94,Gurke,Cucumis sativus,"Die Gurke ist eine rankende Gemuese­pflanze mit gruenen, erfrischenden Fruechten. Im Balkonkasten kultivierbar.",Volles Sonnenlicht,18-28 °C,3,easy|sun,,,,, +sun,constants/lexiconBatch2.ts,209,Zypresse,Cupressus sempervirens,Zypresse ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, +sun,constants/lexiconBatch2.ts,236,String of Bananas,Curio radicans,String of Bananas ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles bis volles Licht,18-30 C,10,succulent|hanging|sun,,,,, +sun,constants/lexiconBatch2.ts,237,String of Dolphins,Curio x peregrinus,String of Dolphins ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles bis volles Licht,18-30 C,10,succulent|hanging|sun,,,,, +sun,constants/lexiconBatch2.ts,239,Palmfarn,Cycas revoluta,Palmfarn ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles bis volles Licht,18-30 C,10,tree|large|sun,,,,, +sun,constants/lexiconBatch2.ts,127,Zitronengras,Cymbopogon citratus,Zitronengras ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +sun,constants/lexiconBatch2.ts,68,Dahlie,Dahlia pinnata,Die Dahlie ist eine prachtvolle Sommerblume mit Blueten in allen Groessen und Formen. Sie wird aus Knollen gezogen.,Volles Sonnenlicht,15-25 °C,5,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,153,Rittersporn,Delphinium elatum,"Rittersporn ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,189,Bartnelke,Dianthus barbatus,"Bartnelke ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,146,Nelke,Dianthus caryophyllus,"Nelke ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,77,Venusfliegenfalle,Dionaea muscipula,Die Venusfliegenfalle ist eine fleischfressende Pflanze mit klappfallartigen Blaettern. Faengt Insekten.,Volles Sonnenlicht,15-30 °C,5,sun,,,,, +sun,constants/lexiconBatch2.ts,80,Sonnentau,Drosera capensis,Der Sonnentau faengt Insekten mit klebrigen Tropfen auf seinen Blaettern. Eine faszinierende fleischfressende Pflanze.,Volles Sonnenlicht,15-25 °C,5,high_humidity|sun,,,,, +sun,constants/lexiconBatch2.ts,30,Dudleya,Dudleya brittonii,"Dudleya ist eine rosetten­bildende Sukkulente mit silbrig-weissen, mehligen Blaettern. Sehr elegant.",Volles Sonnenlicht,10-25 °C,14,easy|succulent|sun,,,,, +sun,constants/lexiconBatch1.ts,4,Echeverie,Echeveria elegans,"Die Echeverie bildet symmetrische, rosettenfoermige Sukkulenten mit blaugruenen Blaettern. Pflegeleicht.",Volles Sonnenlicht,15-25 °C,14,easy|succulent|sun,,,,, +sun,constants/lexiconBatch2.ts,106,Sonnenhut,Echinacea purpurea,"Der Sonnenhut ist eine beliebte Heilpflanze mit grossen, pinkfarbenen Blueten. Er staerkt das Immunsystem.",Helles bis volles Licht,15-25 °C,7,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, +sun,constants/lexiconBatch1.ts,77,Goldene Tonne,Echinocactus grusonii,Die Goldene Tonne ist ein ikonischer kugelfoermiger Kaktus mit goldgelben Stacheln. Waechst langsam aber imposant.,Volles Sonnenlicht,15-35 °C,21,easy|succulent|sun,,,,, +sun,constants/lexiconBatch1.ts,83,San-Pedro-Kaktus,Echinopsis pachanoi,"Der San-Pedro-Kaktus ist ein schnell wachsender, saeulenfoermiger Kaktus aus den Anden.",Volles Sonnenlicht,10-35 °C,14,easy|succulent|sun,,,,, +sun,constants/lexiconBatch2.ts,186,Kalifornischer Mohn,Eschscholzia californica,"Kalifornischer Mohn ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,210,Eukalyptus,Eucalyptus globulus,Eukalyptus ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|medicinal|sun,medicinal_requires_external_evidence,,,, +sun,constants/lexiconBatch2.ts,19,Christusdorn,Euphorbia milii,Der Christusdorn ist eine sukkulente Wolfsmilch mit stacheligen Zweigen und kleinen roten oder gelben Hochblaettern.,Helles bis volles Licht,15-28 °C,10,easy|flowering|succulent|sun,,,,, +sun,constants/lexiconBatch1.ts,12,Bleistiftkaktus,Euphorbia tirucalli,"Der Bleistiftkaktus ist eine sukkulente Wolfsmilch mit duennen, zylindrischen Zweigen ohne Blaetter.",Volles Sonnenlicht,18-30 °C,14,easy|succulent|sun,,,,, +sun,constants/lexiconBatch1.ts,78,Fass-Kaktus,Ferocactus cylindraceus,"Der Fass-Kaktus ist ein zylindrischer Wuestenkaktus mit langen, roten Stacheln. Sehr langlebig.",Volles Sonnenlicht,15-35 °C,21,easy|succulent|sun,,,,, +sun,constants/lexiconBatch2.ts,219,Forsythie,Forsythia x intermedia,Forsythie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|sun,,,,, +sun,constants/lexiconBatch2.ts,100,Erdbeere,Fragaria ananassa,"Die Erdbeere ist ein beliebtes Obst fuer Balkon und Terrasse mit aromatischen, roten Fruechten.",Helles bis volles Licht,15-25 °C,3,easy|pet_friendly|sun,pet_friendly_requires_external_evidence,,,, +sun,constants/lexiconBatch2.ts,169,Freesie,Freesia refracta,"Freesie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,196,Kokardenblume,Gaillardia aristata,"Kokardenblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,190,Mittagsgold,Gazania rigens,"Mittagsgold ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,216,Ginkgo,Ginkgo biloba,Ginkgo ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|medicinal|sun,medicinal_requires_external_evidence,,,, +sun,constants/lexiconBatch2.ts,161,Gladiole,Gladiolus hortulanus,"Gladiole ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch1.ts,87,Geisterpflanze,Graptopetalum paraguayense,"Die Geisterpflanze hat zartgraue bis perlmutt-rosafarbene, rosettenfoermige Blaetter. Sehr robuste Sukkulente.",Volles Sonnenlicht,15-25 °C,14,easy|succulent|sun,,,,, +sun,constants/lexiconBatch2.ts,141,Sonnenblume,Helianthus annuus,"Sonnenblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,133,Currykraut,Helichrysum italicum,Currykraut ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +sun,constants/lexiconBatch2.ts,191,Heliotrop,Heliotropium arborescens,"Heliotrop ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,182,Taglilie,Hemerocallis fulva,"Taglilie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch1.ts,21,Hibiskus,Hibiscus rosa-sinensis,"Der Hibiskus begeistert mit grossen, trompetenfoermigen Blueten in Rot, Orange und Rosa.",Volles Sonnenlicht,18-28 °C,3,flowering|bright_light|sun,,,,, +sun,constants/lexiconBatch2.ts,220,Gartenhibiskus,Hibiscus syriacus,Gartenhibiskus ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|sun,,,,, +sun,constants/lexiconBatch2.ts,159,Hasengloeckchen,Hyacinthoides non-scripta,"Hasengloeckchen ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,105,Johanniskraut,Hypericum perforatum,Das Johanniskraut hat leuchtend gelbe Blueten und ist ein wichtiges Heilkraut gegen Depressionen und Stimmungstiefs.,Volles Sonnenlicht,10-25 °C,7,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, +sun,constants/lexiconBatch2.ts,136,Ysop,Hyssopus officinalis,Ysop ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +sun,constants/lexiconBatch2.ts,203,Stechpalme,Ilex aquifolium,Stechpalme ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|sun,,,,, +sun,constants/lexiconBatch1.ts,64,Suesskartoffel,Ipomoea batatas,"Die Suesskartoffel-Zierpflanze hat dekorative, herzfoermige Blaetter in gruen oder dunkelviolett. Ideal als Haengepflanze.",Volles Sonnenlicht,20-30 °C,5,easy|hanging|sun,,,,, +sun,constants/lexiconBatch2.ts,156,Prunkwinde,Ipomoea purpurea,"Prunkwinde ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,144,Bart-Iris,Iris germanica,"Bart-Iris ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch1.ts,9,Kalanchoe,Kalanchoe blossfeldiana,"Die Kalanchoe ist eine beliebte Bluehpflanze mit leuchtenden Blueten in Rot, Orange, Gelb oder Rosa.",Helles bis volles Licht,15-25 °C,10,easy|flowering|succulent|sun,,,,, +sun,constants/lexiconBatch2.ts,22,Brutblatt,Kalanchoe daigremontiana,Das Brutblatt bildet entlang des Blattrandes zahlreiche kleine Jungpflanzen. Eine faszinierende Sukkulente.,Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, +sun,constants/lexiconBatch2.ts,21,Kaninchen-Ohren,Kalanchoe tomentosa,"Kaninchen-Ohren haben weisslich-filzige Blaetter mit braunen Raendern, die Kaninchen­ohren aehneln. Sehr dekorativ.",Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, +sun,constants/lexiconBatch2.ts,64,Wandelroeschen,Lantana camara,"Das Wandelroeschen hat kugelige Bluetenkoepfe, die die Farbe von Gelb ueber Orange zu Rot wechseln. Sehr attraktiv.",Volles Sonnenlicht,18-28 °C,5,flowering|bright_light|sun,,,,, +sun,constants/lexiconBatch2.ts,158,Duftwicke,Lathyrus odoratus,"Duftwicke ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,121,Lorbeer,Laurus nobilis,Lorbeer ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +sun,constants/lexiconBatch1.ts,23,Echter Lavendel,Lavandula angustifolia,Der Echte Lavendel ist ein aromatischer Halbstrauch mit lilafarbenen Bluetenaehren. Herrlicher Duft.,Volles Sonnenlicht,10-25 °C,10,medicinal|bright_light|sun,medicinal_requires_external_evidence,,,, +sun,constants/lexiconBatch2.ts,180,Bechermalve,Lavatera trimestris,"Bechermalve ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,173,Margerite,Leucanthemum vulgare,"Margerite ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,201,Shasta-Margerite,Leucanthemum x superbum,"Shasta-Margerite ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,126,Liebstoeckel,Levisticum officinale,Liebstoeckel ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +sun,constants/lexiconBatch2.ts,23,Lebende Steine,Lithops julii,"Lebende Steine sind faszinierende Mimikry-Sukkulenten, die Kieselsteinen taeuschen aehnlich sehen. Sehr trockenheitsresistent.",Volles Sonnenlicht,10-30 °C,21,succulent|sun,,,,, +sun,constants/lexiconBatch2.ts,154,Lupine,Lupinus polyphyllus,"Lupine ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch1.ts,79,Mammillaria,Mammillaria zeilmanniana,"Die Mammillaria ist ein kompakter, kugelfoermiger Kaktus, der im Fruehling einen Kranz aus rosa Blueten traegt.",Volles Sonnenlicht,15-35 °C,14,easy|flowering|succulent|sun,,,,, +sun,constants/lexiconBatch2.ts,179,Indianernessel,Monarda didyma,"Indianernessel ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,177,Vergissmeinnicht,Myosotis sylvatica,"Vergissmeinnicht ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,199,Nemesie,Nemesia strumosa,"Nemesie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,132,Katzenminze,Nepeta cataria,Katzenminze ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +sun,constants/lexiconBatch2.ts,120,Oleander,Nerium oleander,"Der Oleander ist ein mediteraner Strauch mit leuchtend roten, rosa oder weissen Blueten. Sehr hitzetolerant.",Volles Sonnenlicht,15-28 °C,7,flowering|bright_light|sun,,,,, +sun,constants/lexiconBatch2.ts,193,Ziertabak,Nicotiana alata,"Ziertabak ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch1.ts,25,Basilikum,Ocimum basilicum,"Basilikum ist das beliebteste Kuechenkraut mit intensiv aromatischen, gruenen Blaettern. Fuer Pesto verwendet.",Volles Sonnenlicht,18-30 °C,2,easy|medicinal|sun,medicinal_requires_external_evidence,,,, +sun,constants/lexiconBatch1.ts,82,Hasenohren-Kaktus,Opuntia microdasys,"Der Hasenohren-Kaktus hat flache, ovale Triebe mit dichten weissen Glochiden. Klassischer Zimmerkaktus.",Volles Sonnenlicht,10-35 °C,21,easy|succulent|sun,,,,, +sun,constants/lexiconBatch2.ts,124,Majoran,Origanum majorana,Majoran ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +sun,constants/lexiconBatch1.ts,28,Oregano,Origanum vulgare,"Oregano ist ein aromatisches Kuechenkraut mit runden, behaarten Blaettern. In mediterraner Kueche beliebt.",Volles Sonnenlicht,15-25 °C,7,easy|medicinal|sun,medicinal_requires_external_evidence,,,, +sun,constants/lexiconBatch2.ts,200,Kapmargerite,Osteospermum ecklonis,"Kapmargerite ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch1.ts,88,Mondstein-Pflanze,Pachyphytum oviferum,"Die Mondstein-Pflanze hat dicke, ovale Blaetter mit einem pastellrosafarbenen, mehligen Ueberzug.",Volles Sonnenlicht,15-25 °C,14,easy|succulent|sun,,,,, +sun,constants/lexiconBatch2.ts,143,Pfingstrose,Paeonia lactiflora,"Pfingstrose ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,185,Mohn,Papaver rhoeas,"Mohn ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch1.ts,31,Rosengeranie,Pelargonium graveolens,Die Rosengeranie ist eine Duftpflanze mit tief eingeschnittenen Blaettern und rosaenlichem Aroma.,Volles Sonnenlicht,15-25 °C,7,easy|medicinal|sun,medicinal_requires_external_evidence,,,, +sun,constants/lexiconBatch2.ts,61,Efeu-Geranie,Pelargonium peltatum,"Die Efeu-Geranie hat efeufoermige, glaenzende Blaetter und bluet den ganzen Sommer in leuchtenden Farben.",Helles bis volles Licht,15-25 °C,5,easy|flowering|hanging|sun,,,,, +sun,constants/lexiconBatch2.ts,174,Stehende Geranie,Pelargonium zonale,"Stehende Geranie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,134,Shiso,Perilla frutescens,Shiso ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +sun,constants/lexiconBatch1.ts,34,Petunie,Petunia hybrida,Die Petunie ist eine der beliebtesten Balkonpflanzen mit trichterfoermigen Blueten in unzaehligen Farben.,Volles Sonnenlicht,15-25 °C,2,easy|pet_friendly|flowering|sun,pet_friendly_requires_external_evidence,,,, +sun,constants/lexiconBatch2.ts,165,Flammenblume,Phlox paniculata,"Flammenblume ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,207,Fichte,Picea abies,Fichte ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, +sun,constants/lexiconBatch2.ts,206,Kiefer,Pinus sylvestris,Kiefer ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, +sun,constants/lexiconBatch1.ts,61,Bleiwurz,Plumbago auriculata,"Die Bleiwurz ist ein halbimmergruener Strauch mit himmelblauen Blueten, der fast das ganze Jahr bluet.",Volles Sonnenlicht,15-27 °C,5,flowering|bright_light|sun,,,,, +sun,constants/lexiconBatch2.ts,118,Tempel-Baum,Plumeria rubra,"Der Tempel-Baum hat intensiv duftende, sternfoermige Blueten in Weiss, Gelb oder Rosa. Klassische Tropenblume.",Volles Sonnenlicht,20-30 °C,7,flowering|tree|sun,,,,, +sun,constants/lexiconBatch2.ts,27,Speckbaum,Portulacaria afra,"Der Speckbaum ist eine sukkulente Pflanze mit roten Stielen und kleinen, runden, glaenzenden Blaettern.",Helles bis volles Licht,15-30 °C,14,easy|succulent|sun,,,,, +sun,constants/lexiconBatch2.ts,71,Koenigs-Protea,Protea cynaroides,"Die Koenigs-Protea ist die Nationalblume Suedafrikas mit riesigen, imposanten Bluetenkoepfen. Eine echte Besonderheit.",Volles Sonnenlicht,10-25 °C,7,flowering|large|sun,,,,, +sun,constants/lexiconBatch2.ts,218,Kirschlorbeer,Prunus laurocerasus,Kirschlorbeer ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|sun,,,,, +sun,constants/lexiconBatch2.ts,89,Guave,Psidium guajava,Die Guave ist ein tropischer Obstbaum mit gelblich-weissen Fruechten. Sie ist reich an Vitamin C.,Volles Sonnenlicht,18-30 °C,7,tree|sun,,,,, +sun,constants/lexiconBatch2.ts,88,Granatapfelbaum,Punica granatum,"Der Granatapfelbaum hat leuchtend rote Blueten und rote, essbare Fruechte mit rubinroten Kernen.",Volles Sonnenlicht,15-28 °C,7,flowering|tree|sun,,,,, +sun,constants/lexiconBatch2.ts,205,Eiche,Quercus robur,Eiche ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, +sun,constants/lexiconBatch2.ts,162,Ranunkel,Ranunculus asiaticus,"Ranunkel ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,214,Robinie,Robinia pseudoacacia,Robinie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, +sun,constants/lexiconBatch1.ts,66,Chinesische Rose,Rosa chinensis,Die Chinesische Rose ist eine der Stammarten vieler Gartenrosen und bluet fast ununterbrochen.,Volles Sonnenlicht,15-25 °C,5,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,142,Rose,Rosa x hybrida,"Rose ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|bright_light|sun,,,,, +sun,constants/lexiconBatch1.ts,24,Rosmarin,Rosmarinus officinalis,Rosmarin ist ein aromatisches Kraut mit nadelartigen Blaettern und blauen Blueten. In der Kueche unverzichtbar.,Volles Sonnenlicht,10-25 °C,7,easy|medicinal|sun,medicinal_requires_external_evidence,,,, +sun,constants/lexiconBatch2.ts,167,Rudbeckie,Rudbeckia hirta,"Rudbeckie ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,130,Sauerampfer,Rumex acetosa,Sauerampfer ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +sun,constants/lexiconBatch2.ts,195,Mehlsalbei,Salvia farinacea,"Mehlsalbei ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,103,Salbei,Salvia officinalis,Salbei ist ein aromatisches Heilkraut mit silbrig-gruenen Blaettern. Er hat antibakterielle und entzuendungshem­mende Wirkung.,Volles Sonnenlicht,10-25 °C,7,easy|medicinal|sun,medicinal_requires_external_evidence,,,, +sun,constants/lexiconBatch2.ts,168,Feuersalbei,Salvia splendens,"Feuersalbei ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,17,Zylindrischer Bogenhanf,Sansevieria cylindrica,"Der Zylindrische Bogenhanf hat zylindrische, aufrechte Blaetter, die sich nach oben verjuengen. Sehr pflegeleicht.",Helles bis volles Licht,15-27 °C,14,easy|succulent|sun,,,,, +sun,constants/lexiconBatch2.ts,78,Purpursonnentau,Sarracenia purpurea,Der Purpursonnentau ist eine fleischfressende Kannenpflanze mit purpurroten Kannen. Faengt Insekten.,Volles Sonnenlicht,5-25 °C,3,high_humidity|sun,,,,, +sun,constants/lexiconBatch2.ts,123,Bohnenkraut,Satureja hortensis,Bohnenkraut ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +sun,constants/lexiconBatch1.ts,7,Eselschwanz,Sedum morganianum,"Der Eselschwanz ist eine haengende Sukkulente mit langen Trieben aus dichten, blaugruenen Blaettchen.",Volles Sonnenlicht,15-25 °C,14,easy|succulent|hanging|sun,,,,, +sun,constants/lexiconBatch2.ts,28,Blauer Kreuzkraut,Senecio serpens,"Der Blaue Kreuzkraut hat zylindrische, blaublaugruene Blaetter und einen kriechenden Wuchs. Sehr dekorativ.",Helles bis volles Licht,15-25 °C,14,easy|succulent|sun,,,,, +sun,constants/lexiconBatch2.ts,93,Aubergine,Solanum melongena,"Die Aubergine ist eine Gemuese­pflanze mit grossen, violetten Fruechten. Sie benoetigt viel Waerme und Sonne.",Volles Sonnenlicht,20-30 °C,5,bright_light|sun,,,,, +sun,constants/lexiconBatch2.ts,213,Eberesche,Sorbus aucuparia,Eberesche ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, +sun,constants/lexiconBatch2.ts,222,Spierstrauch,Spiraea japonica,Spierstrauch ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|sun,,,,, +sun,constants/lexiconBatch2.ts,25,Aasblume,Stapelia grandiflora,"Die Aasblume hat fleischige, gruene Staengel und riesige, sternfoermige Blueten mit aasartigem Duft.",Helles bis volles Licht,18-30 °C,14,flowering|succulent|sun,,,,, +sun,constants/lexiconBatch2.ts,131,Stevia,Stevia rebaudiana,Stevia ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.,Helles bis volles Licht,12-24 C,5,easy|sun,,,,, +sun,constants/lexiconBatch1.ts,3,Paradiesvogelblume,Strelitzia reginae,"Die Paradiesvogelblume beeindruckt mit leuchtend orangefarbenen und blauen Blueten, die einem Vogel aehneln.",Volles Sonnenlicht,18-26 °C,7,flowering|large|sun,,,,, +sun,constants/lexiconBatch2.ts,166,Herbstaster,Symphyotrichum novi-belgii,"Herbstaster ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,149,Flieder,Syringa vulgaris,"Flieder ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|tree|sun,,,,, +sun,constants/lexiconBatch2.ts,66,Studentenblume,Tagetes patula,Die Studentenblume ist eine robuste Sommerblume mit orangen oder gelben Blueten. Sie haelt Schadlinge fern.,Volles Sonnenlicht,15-28 °C,3,easy|flowering|sun,,,,, +sun,constants/lexiconBatch1.ts,27,Thymian,Thymus vulgaris,"Thymian ist ein kleiner, aromatischer Strauch mit winzigen Blaettern und rosa Blueten. Wichtiges Kuechenkraut.",Volles Sonnenlicht,10-25 °C,7,easy|medicinal|sun,medicinal_requires_external_evidence,,,, +sun,constants/lexiconBatch2.ts,54,Lila Tradescantia,Tradescantia pallida,Die Lila Tradescantia hat leuchtend purpurrote Blaetter und ist sehr auffaellig. Sie liebt viel Licht.,Helles bis volles Licht,15-25 °C,5,easy|hanging|sun,,,,, +sun,constants/lexiconBatch2.ts,151,Kapuzinerkresse,Tropaeolum majus,"Kapuzinerkresse ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,82,Wasserschlauch,Utricularia gibba,Der Wasserschlauch ist eine wasserbewohnende fleischfressende Pflanze mit Schlaeuchen als Insekten­fallen.,Helles bis volles Licht,15-25 °C,2,high_humidity|sun,,,,, +sun,constants/lexiconBatch2.ts,192,Koenigskerze,Verbascum thapsus,"Koenigskerze ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|medicinal|sun,medicinal_requires_external_evidence,,,, +sun,constants/lexiconBatch2.ts,164,Eisenkraut,Verbena bonariensis,"Eisenkraut ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,198,Hornveilchen,Viola cornuta,"Hornveilchen ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|sun,,,,, +sun,constants/lexiconBatch2.ts,5,Mexikanische Fächerpalme,Washingtonia robusta,"Die Mexikanische Fächerpalme ist eine schlanke, hohe Palme mit faecher­foermigen Blaettern. Sehr hitzetolerant.",Volles Sonnenlicht,15-35 °C,10,tree|large|sun,,,,, +sun,constants/lexiconBatch2.ts,221,Weigelie,Weigela florida,Weigelie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|sun,,,,, +sun,constants/lexiconBatch1.ts,65,Chinesischer Blauregen,Wisteria sinensis,"Der Chinesische Blauregen ist ein ueppiger Kletterkuenstler mit langen, duftenden Bluetentrauben in Lila.",Volles Sonnenlicht,10-25 °C,7,flowering|large|sun,,,,, +sun,constants/lexiconBatch2.ts,246,Yucca aloifolia,Yucca aloifolia,Yucca aloifolia ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Volles Sonnenlicht,18-30 C,10,easy|tree|sun,,,,, +sun,constants/lexiconBatch1.ts,40,Yucca-Palme,Yucca elephantipes,"Die Yucca-Palme ist eine robuste Zimmerpflanze mit starrem, immergruenem Blaetterschopf auf einem dicken Stamm.",Helles bis volles Licht,15-28 °C,14,easy|tree|sun,,,,, +sun,constants/lexiconBatch2.ts,65,Zinnie,Zinnia elegans,"Die Zinnie ist eine leuchtende Sommerblume mit grossen, dahlienaehnlichen Blueten. Sehr robust und hitzetolerant.",Volles Sonnenlicht,18-30 °C,3,easy|flowering|sun,,,,, +tree,constants/lexiconBatch2.ts,115,Faecherahorn,Acer palmatum,"Der Faecherahorn ist ein japanischer Zierahorn mit feingeschnittenen, faecherfoermigen Blaettern in Gruen oder Rot.",Helles bis volles Licht,10-22 °C,5,tree,,,,, +tree,constants/lexiconBatch2.ts,212,Spitzahorn,Acer platanoides,Spitzahorn ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, +tree,constants/lexiconBatch2.ts,232,Norfolk-Tanne,Araucaria heterophylla,Norfolk-Tanne ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,tree|bright_light,,,,, +tree,constants/lexiconBatch1.ts,41,Pferdeschwanzpalme,Beaucarnea recurvata,"Die Pferdeschwanzpalme hat einen verdickten Stammbasis als Wasserspeicher und lange, schmale Blaetter.",Volles Sonnenlicht,15-30 °C,21,easy|succulent|tree|sun,,,,, +tree,constants/lexiconBatch2.ts,114,Hange-Birke,Betula pendula,Die Haenge-Birke hat charakteristisch weisse Rinde und haengende Zweige. Die Blaetter werden in der Heilkunde genutzt.,Volles Sonnenlicht,10-25 °C,7,tree|large|medicinal,medicinal_requires_external_evidence,,,, +tree,constants/lexiconBatch2.ts,223,Schmetterlingsflieder,Buddleja davidii,Schmetterlingsflieder ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|sun,,,,, +tree,constants/lexiconBatch2.ts,202,Buchsbaum,Buxus sempervirens,Buchsbaum ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|sun,,,,, +tree,constants/lexiconBatch2.ts,217,Trompetenbaum,Catalpa bignonioides,Trompetenbaum ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, +tree,constants/lexiconBatch2.ts,208,Zeder,Cedrus libani,Zeder ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, +tree,constants/lexiconBatch1.ts,43,Bergpalme,Chamaedorea elegans,Die Bergpalme ist eine kompakte Zimmerpalme fuer schattigere Standorte. Ideal fuer dunkle Innenraeume.,Wenig bis helles Licht,15-25 °C,7,easy|pet_friendly|tree|air_purifier|low_light,air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence,,,, +tree,constants/lexiconBatch2.ts,86,Zitronenbaum,Citrus limon,"Der Zitronenbaum ist ein kleiner, immergruener Baum mit weissen, duftenden Blueten und gelben Fruechten.",Volles Sonnenlicht,18-28 °C,5,tree|sun,,,,, +tree,constants/lexiconBatch2.ts,87,Orangenbaum,Citrus sinensis,"Der Orangenbaum ist ein kleiner, immergruener Baum mit weissen Blueten und orangen Fruechten.",Volles Sonnenlicht,18-28 °C,5,tree|sun,,,,, +tree,constants/lexiconBatch2.ts,14,Keulenlilie,Cordyline australis,"Die Keulenlilie hat lange, schmale, gruene oder rotbraune Blaetter in einem dekorativen Schopf.",Helles bis volles Licht,10-25 °C,7,easy|tree|sun,,,,, +tree,constants/lexiconBatch2.ts,209,Zypresse,Cupressus sempervirens,Zypresse ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, +tree,constants/lexiconBatch2.ts,239,Palmfarn,Cycas revoluta,Palmfarn ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles bis volles Licht,18-30 C,10,tree|large|sun,,,,, +tree,constants/lexiconBatch2.ts,215,Flammenbaum,Delonix regia,Flammenbaum ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|large,,,,, +tree,constants/lexiconBatch1.ts,14,Maisstrauch,Dracaena fragrans,"Der Maisstrauch ist eine robuste Zimmerpflanze mit breiten, gestreiften Blaettern. Gedeiht auch bei wenig Licht.",Helles indirektes Licht,15-25 °C,10,easy|tree|air_purifier|low_light,air_purifier_requires_external_evidence,,,, +tree,constants/lexiconBatch1.ts,13,Drachenbaum,Dracaena marginata,"Der Drachenbaum ist eine schlanke Zimmerpflanze mit roten, schmalen Blaettern auf langen Staemmen.",Helles indirektes Licht,15-25 °C,10,easy|tree|air_purifier,air_purifier_requires_external_evidence,,,, +tree,constants/lexiconBatch1.ts,42,Goldfruchtpalme,Dypsis lutescens,Die Goldfruchtpalme ist eine elegante Zimmerpalme mit gelblich-gruenen Stielen und gefiederten Wedeln.,Helles indirektes Licht,18-27 °C,5,pet_friendly|tree|air_purifier,air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence,,,, +tree,constants/lexiconBatch2.ts,210,Eukalyptus,Eucalyptus globulus,Eukalyptus ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|medicinal|sun,medicinal_requires_external_evidence,,,, +tree,constants/lexiconBatch2.ts,248,Ficus altissima,Ficus altissima,Ficus altissima ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,tree|bright_light,,,,, +tree,constants/lexiconBatch1.ts,1,Birkenfeige,Ficus benjamina,"Die Birkenfeige ist ein eleganter Zimmerstrauch mit haengenden Aesten und kleinen, glaenzenden Blaettern.",Helles indirektes Licht,16-24 °C,7,tree|air_purifier,air_purifier_requires_external_evidence,,,, +tree,constants/lexiconBatch1.ts,38,Gummibaum,Ficus elastica,"Der Gummibaum ist eine imposante Zimmerpflanze mit grossen, glaenzenden, lederartigen Blaettern. Reinigt die Luft.",Helles indirektes Licht,16-24 °C,10,easy|tree|air_purifier,air_purifier_requires_external_evidence,,,, +tree,constants/lexiconBatch1.ts,39,Geigenfeige,Ficus lyrata,"Die Geigenfeige ist ein Trendbaum mit grossen, geigenfoermigen Blaettern. Benoetigt viel Licht.",Helles indirektes Licht,18-27 °C,7,tree|large|bright_light,,,,, +tree,constants/lexiconBatch2.ts,247,Ficus microcarpa,Ficus microcarpa,Ficus microcarpa ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,easy|tree|bright_light,,,,, +tree,constants/lexiconBatch2.ts,116,Bonsai-Feige,Ficus retusa,"Die Bonsai-Feige ist eine klassische Bonsai-Art mit kleinen, elliptischen Blaettern. Sehr formbar.",Helles indirektes Licht,16-24 °C,7,tree,,,,, +tree,constants/lexiconBatch2.ts,219,Forsythie,Forsythia x intermedia,Forsythie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|sun,,,,, +tree,constants/lexiconBatch2.ts,216,Ginkgo,Ginkgo biloba,Ginkgo ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|medicinal|sun,medicinal_requires_external_evidence,,,, +tree,constants/lexiconBatch2.ts,220,Gartenhibiskus,Hibiscus syriacus,Gartenhibiskus ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|sun,,,,, +tree,constants/lexiconBatch2.ts,3,Kentia-Palme,Howea forsteriana,"Die Kentia-Palme ist eine der elegantesten Zimmerpalmen mit langen, herabhängenden Fiederblaettern.",Helles indirektes Licht,18-25 °C,7,pet_friendly|tree|low_light,pet_friendly_requires_external_evidence,,,, +tree,constants/lexiconBatch2.ts,203,Stechpalme,Ilex aquifolium,Stechpalme ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|sun,,,,, +tree,constants/lexiconBatch2.ts,211,Jacaranda,Jacaranda mimosifolia,Jacaranda ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|large,,,,, +tree,constants/lexiconBatch2.ts,4,Chinesische Fächerpalme,Livistona chinensis,"Die Chinesische Fächerpalme hat grosse, faecher­foermige Blaetter auf einem einzelnen Stamm. Sehr dekorativ.",Helles bis volles Licht,15-25 °C,7,tree|bright_light,,,,, +tree,constants/lexiconBatch2.ts,204,Magnolie,Magnolia grandiflora,Magnolie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|large,,,,, +tree,constants/lexiconBatch2.ts,231,Glueckskastanie,Pachira aquatica,Glueckskastanie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,easy|tree|bright_light,,,,, +tree,constants/lexiconBatch1.ts,44,Zwergdattelpalme,Phoenix roebelenii,"Die Zwergdattelpalme ist eine zierliche Palme mit eleganten, gebogenen Fiederblaettern. Tropisches Flair.",Helles bis volles Licht,18-27 °C,7,tree|bright_light,,,,, +tree,constants/lexiconBatch2.ts,207,Fichte,Picea abies,Fichte ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, +tree,constants/lexiconBatch2.ts,206,Kiefer,Pinus sylvestris,Kiefer ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, +tree,constants/lexiconBatch2.ts,118,Tempel-Baum,Plumeria rubra,"Der Tempel-Baum hat intensiv duftende, sternfoermige Blueten in Weiss, Gelb oder Rosa. Klassische Tropenblume.",Volles Sonnenlicht,20-30 °C,7,flowering|tree|sun,,,,, +tree,constants/lexiconBatch2.ts,218,Kirschlorbeer,Prunus laurocerasus,Kirschlorbeer ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|sun,,,,, +tree,constants/lexiconBatch2.ts,89,Guave,Psidium guajava,Die Guave ist ein tropischer Obstbaum mit gelblich-weissen Fruechten. Sie ist reich an Vitamin C.,Volles Sonnenlicht,18-30 °C,7,tree|sun,,,,, +tree,constants/lexiconBatch2.ts,88,Granatapfelbaum,Punica granatum,"Der Granatapfelbaum hat leuchtend rote Blueten und rote, essbare Fruechte mit rubinroten Kernen.",Volles Sonnenlicht,15-28 °C,7,flowering|tree|sun,,,,, +tree,constants/lexiconBatch2.ts,205,Eiche,Quercus robur,Eiche ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, +tree,constants/lexiconBatch1.ts,45,Stab-Palme,Rhapis excelsa,"Die Stab-Palme ist eine elegante Zimmerpalme mit faecher­foermigen Blaettern auf duennen, bambusartigen Staemmen.",Helles indirektes Licht,15-25 °C,7,tree|low_light,,,,, +tree,constants/lexiconBatch2.ts,170,Rhododendron,Rhododendron catawbiense,"Rhododendron ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|tree|bright_light,,,,, +tree,constants/lexiconBatch2.ts,214,Robinie,Robinia pseudoacacia,Robinie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, +tree,constants/lexiconBatch2.ts,113,Silber-Weide,Salix alba,"Die Silber-Weide hat silbrig-glaenzende Blaetter. Weidenrinde enthält Salicylsaeure, die Grundlage von Aspirin.",Helles bis volles Licht,10-25 °C,7,tree|large|medicinal,medicinal_requires_external_evidence,,,, +tree,constants/lexiconBatch2.ts,112,Schwarzer Holunder,Sambucus nigra,Der Schwarze Holunder hat weisse Doldenbluten und schwarze Beeren. Die Fruechte werden fuer Sirup und Saft verwendet.,Helles bis volles Licht,10-25 °C,7,flowering|tree|medicinal,medicinal_requires_external_evidence,,,, +tree,constants/lexiconBatch2.ts,11,Grosse Strahlenaralie,Schefflera actinophylla,"Die Grosse Strahlenaralie kann grosse, handfoermige Blaetter entwickeln. Sie ist ideal als Zimmerstrauch.",Helles indirektes Licht,18-27 °C,7,easy|tree|large,,,,, +tree,constants/lexiconBatch2.ts,10,Strahlenaralie,Schefflera arboricola,"Die Strahlenaralie hat fingerfoermig angeordnete, glaenzende Blaetter auf langen Stielen. Sehr robuste Zimmerpflanze.",Helles indirektes Licht,15-25 °C,7,easy|tree|air_purifier,air_purifier_requires_external_evidence,,,, +tree,constants/lexiconBatch2.ts,235,Falsche Aralie,Schefflera elegantissima,Falsche Aralie ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Helles indirektes Licht,18-27 C,7,tree|bright_light,,,,, +tree,constants/lexiconBatch2.ts,213,Eberesche,Sorbus aucuparia,Eberesche ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,tree|large|sun,,,,, +tree,constants/lexiconBatch2.ts,222,Spierstrauch,Spiraea japonica,Spierstrauch ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|sun,,,,, +tree,constants/lexiconBatch2.ts,1,Weisse Strelitzie,Strelitzia nicolai,"Die Weisse Strelitzie ist ein beeindruckender Zimmerstrauch mit grossen, blaugruenen Blaettern und weiss-blauen Blueten.",Helles bis volles Licht,18-27 °C,7,tree|large|bright_light,,,,, +tree,constants/lexiconBatch2.ts,149,Flieder,Syringa vulgaris,"Flieder ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.",Volles bis helles Licht,10-24 C,4,flowering|tree|sun,,,,, +tree,constants/lexiconBatch2.ts,5,Mexikanische Fächerpalme,Washingtonia robusta,"Die Mexikanische Fächerpalme ist eine schlanke, hohe Palme mit faecher­foermigen Blaettern. Sehr hitzetolerant.",Volles Sonnenlicht,15-35 °C,10,tree|large|sun,,,,, +tree,constants/lexiconBatch2.ts,221,Weigelie,Weigela florida,Weigelie ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.,Volles bis helles Licht,5-25 C,7,flowering|tree|sun,,,,, +tree,constants/lexiconBatch2.ts,246,Yucca aloifolia,Yucca aloifolia,Yucca aloifolia ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.,Volles Sonnenlicht,18-30 C,10,easy|tree|sun,,,,, +tree,constants/lexiconBatch1.ts,40,Yucca-Palme,Yucca elephantipes,"Die Yucca-Palme ist eine robuste Zimmerpflanze mit starrem, immergruenem Blaetterschopf auf einem dicken Stamm.",Helles bis volles Licht,15-28 °C,14,easy|tree|sun,,,,, diff --git a/audits/semantic-search/review-change-candidates.md b/audits/semantic-search/review-change-candidates.md index 90d2129..6b128a1 100644 --- a/audits/semantic-search/review-change-candidates.md +++ b/audits/semantic-search/review-change-candidates.md @@ -1,98 +1,98 @@ -# Review Change Candidates - -Date: 2026-03-12 - -Purpose: -- collect the user-provided `AENDERN` review items in one place -- separate already-applied semantic fixes from deferred raw source array reordering - -Status summary: -- semantic fixes: applied -- export ordering: already normalized in `all-plants-categories.csv` -- source-array ordering in the batch files: deferred on purpose - -## Applied Semantic Fixes - -- `Anthurium clarinervium`: `patterned|high_humidity|pet_friendly` -> `patterned|high_humidity` -- `Anthurium crystallinum`: `patterned|high_humidity|pet_friendly` -> `patterned|high_humidity` -- `Camellia sinensis`: `[]` -> `flowering` -- `Mimosa pudica`: `[]` -> `flowering|bright_light` -- `Spinacia oleracea`: `[]` -> `easy` - -## Deferred Raw Source Array Reordering - -These were left out of the source files because the export generator now canonicalizes category order in `all-plants-categories.csv`. If you still want the raw `categories` arrays in the batch files normalized too, these are the deferred candidates from the review list. - -- `Acer platanoides`: `tree|sun|large` -> `tree|large|sun` -- `Achillea millefolium`: `medicinal|flowering|sun` -> `flowering|medicinal|sun` -- `Adenium obesum`: `succulent|flowering|sun` -> `flowering|succulent|sun` -- `Adenium socotranum`: `succulent|flowering|sun` -> `flowering|succulent|sun` -- `Agave americana`: `succulent|sun|large` -> `succulent|large|sun` -- `Aglaonema commutatum`: `easy|low_light|patterned` -> `easy|patterned|low_light` -- `Alocasia amazonica`: `patterned|high_humidity|large` -> `patterned|large|high_humidity` -- `Aloe ferox`: `succulent|medicinal|sun|large` -> `succulent|medicinal|large|sun` -- `Alpinia zerumbet`: `flowering|high_humidity|large` -> `flowering|large|high_humidity` -- `Solanum aviculare`: `medicinal|flowering|sun` -> `flowering|medicinal|sun` -- `Solanum laciniatum`: `medicinal|flowering|sun` -> `flowering|medicinal|sun` -- `Strelitzia reginae`: `flowering|sun|large` -> `flowering|large|sun` -- `Agapanthus africanus`: `flowering|sun|large` -> `flowering|large|sun` -- `Aquilegia vulgaris`: `flowering|sun|pet_friendly` -> `flowering|pet_friendly|sun` -- `Momordica balsamina`: `flowering|sun|medicinal` -> `flowering|medicinal|sun` -- `Thunbergia alata`: `flowering|sun|hanging` -> `flowering|hanging|sun` -- `Gerbera jamesonii`: `flowering|sun|pet_friendly` -> `flowering|pet_friendly|sun` -- `Hibiscus rosa-sinensis`: `flowering|sun|large` -> `flowering|large|sun` -- `Bergenia cordifolia`: `flowering|low_light|large` -> `flowering|large|low_light` -- `Photinia serratifolia`: `tree|sun|large` -> `tree|large|sun` -- `Chrysanthemum morifolium`: `flowering|sun|pet_friendly` -> `flowering|pet_friendly|sun` -- `Galanthus nivalis`: `flowering|low_light|pet_friendly` -> `flowering|pet_friendly|low_light` -- `Leucojum aestivum`: `flowering|low_light|pet_friendly` -> `flowering|pet_friendly|low_light` -- `Cyclamen persicum`: `flowering|low_light|pet_friendly` -> `flowering|pet_friendly|low_light` -- `Narcissus pseudonarcissus`: `flowering|sun|pet_friendly` -> `flowering|pet_friendly|sun` -- `Dahlia pinnata`: `flowering|sun|pet_friendly` -> `flowering|pet_friendly|sun` -- `Photinia fraseri`: `tree|sun|large` -> `tree|large|sun` -- `Rosa canina`: `flowering|sun|medicinal` -> `flowering|medicinal|sun` -- `Acer campestre`: `tree|sun|large` -> `tree|large|sun` -- `Amelanchier ovalis`: `flowering|sun|large` -> `flowering|large|sun` -- `Howea forsteriana`: `easy|pet_friendly|large|air_purifier|bright_light` -> `easy|pet_friendly|air_purifier|large|bright_light` -- `Dracaena trifasciata`: `easy|air_purifier|low_light|large` -> `easy|air_purifier|large|low_light` -- `Lobularia maritima`: `flowering|sun|hanging` -> `flowering|hanging|sun` -- `Buxus sempervirens`: `tree|sun|large` -> `tree|large|sun` -- `Cosmos bipinnatus`: `flowering|sun|pet_friendly` -> `flowering|pet_friendly|sun` -- `Lilium candidum`: `flowering|sun|pet_friendly` -> `flowering|pet_friendly|sun` -- `Origanum vulgare`: `medicinal|sun|pet_friendly` -> `medicinal|pet_friendly|sun` -- `Rudbeckia hirta`: `flowering|sun|pet_friendly` -> `flowering|pet_friendly|sun` -- `Hibiscus syriacus`: `flowering|sun|large` -> `flowering|large|sun` -- `Sedum acre`: `succulent|sun|pet_friendly` -> `succulent|pet_friendly|sun` -- `Fatsia japonica`: `tree|low_light|large` -> `tree|large|low_light` -- `Ocimum tenuiflorum`: `medicinal|sun|flowering` -> `flowering|medicinal|sun` -- `Ulmus minor`: `tree|sun|large` -> `tree|large|sun` -- `Ulmus americana`: `tree|sun|large` -> `tree|large|sun` -- `Ulmus glabra`: `tree|sun|large` -> `tree|large|sun` -- `Aloysia citrodora`: `medicinal|sun|flowering` -> `flowering|medicinal|sun` -- `Cucumis sativus`: `easy|sun|hanging` -> `easy|hanging|sun` -- `Citrullus lanatus`: `easy|sun|hanging` -> `easy|hanging|sun` -- `Hypoestes phyllostachya`: `patterned|bright_light|pet_friendly` -> `patterned|pet_friendly|bright_light` -- `Nephrolepis exaltata`: `air_purifier|high_humidity|pet_friendly` -> `air_purifier|pet_friendly|high_humidity` -- `Phalaenopsis amabilis`: `flowering|high_humidity|pet_friendly` -> `flowering|pet_friendly|high_humidity` -- `Plantago major`: `medicinal|sun|pet_friendly` -> `medicinal|pet_friendly|sun` -- `Chaenomeles japonica`: `flowering|sun|large` -> `flowering|large|sun` -- `Rhododendron ferrugineum`: `flowering|low_light|large` -> `flowering|large|low_light` -- `Brassica napus napobrassica`: `easy|sun|large` -> `easy|large|sun` -- `Salvia apiana`: `medicinal|sun|flowering` -> `flowering|medicinal|sun` -- `Salvia canariensis`: `medicinal|sun|flowering` -> `flowering|medicinal|sun` -- `Helianthus annuus`: `flowering|sun|large` -> `flowering|large|sun` -- `Syringa vulgaris`: `flowering|sun|large` -> `flowering|large|sun` -- `Calystegia sepium`: `flowering|sun|hanging` -> `flowering|hanging|sun` -- `Vanilla planifolia`: `flowering|high_humidity|hanging` -> `flowering|hanging|high_humidity` -- `Vanda coerulea`: `flowering|high_humidity|bright_light` -> `flowering|bright_light|high_humidity` -- `Verbascum thapsus`: `flowering|sun|medicinal` -> `flowering|medicinal|sun` -- `Washingtonia robusta`: `tree|sun|large` -> `tree|large|sun` -- `Wisteria sinensis`: `flowering|sun|large` -> `flowering|large|sun` -- `Yucca aloifolia`: `tree|sun|easy` -> `easy|tree|sun` - -## Notes - -- Some review items were omitted because they were explicit no-ops, duplicate rows, or already effectively normalized by the export layer. -- The obvious no-op reorder rows were removed from this file during cleanup. -- Some older order proposals may now be stale if a later semantic audit intentionally changed the underlying categories. -- The canonical order visible to QA should be taken from `all-plants-categories.csv`, not from the raw category array order inside the batch source files. +# Review Change Candidates + +Date: 2026-03-12 + +Purpose: +- collect the user-provided `AENDERN` review items in one place +- separate already-applied semantic fixes from deferred raw source array reordering + +Status summary: +- semantic fixes: applied +- export ordering: already normalized in `all-plants-categories.csv` +- source-array ordering in the batch files: deferred on purpose + +## Applied Semantic Fixes + +- `Anthurium clarinervium`: `patterned|high_humidity|pet_friendly` -> `patterned|high_humidity` +- `Anthurium crystallinum`: `patterned|high_humidity|pet_friendly` -> `patterned|high_humidity` +- `Camellia sinensis`: `[]` -> `flowering` +- `Mimosa pudica`: `[]` -> `flowering|bright_light` +- `Spinacia oleracea`: `[]` -> `easy` + +## Deferred Raw Source Array Reordering + +These were left out of the source files because the export generator now canonicalizes category order in `all-plants-categories.csv`. If you still want the raw `categories` arrays in the batch files normalized too, these are the deferred candidates from the review list. + +- `Acer platanoides`: `tree|sun|large` -> `tree|large|sun` +- `Achillea millefolium`: `medicinal|flowering|sun` -> `flowering|medicinal|sun` +- `Adenium obesum`: `succulent|flowering|sun` -> `flowering|succulent|sun` +- `Adenium socotranum`: `succulent|flowering|sun` -> `flowering|succulent|sun` +- `Agave americana`: `succulent|sun|large` -> `succulent|large|sun` +- `Aglaonema commutatum`: `easy|low_light|patterned` -> `easy|patterned|low_light` +- `Alocasia amazonica`: `patterned|high_humidity|large` -> `patterned|large|high_humidity` +- `Aloe ferox`: `succulent|medicinal|sun|large` -> `succulent|medicinal|large|sun` +- `Alpinia zerumbet`: `flowering|high_humidity|large` -> `flowering|large|high_humidity` +- `Solanum aviculare`: `medicinal|flowering|sun` -> `flowering|medicinal|sun` +- `Solanum laciniatum`: `medicinal|flowering|sun` -> `flowering|medicinal|sun` +- `Strelitzia reginae`: `flowering|sun|large` -> `flowering|large|sun` +- `Agapanthus africanus`: `flowering|sun|large` -> `flowering|large|sun` +- `Aquilegia vulgaris`: `flowering|sun|pet_friendly` -> `flowering|pet_friendly|sun` +- `Momordica balsamina`: `flowering|sun|medicinal` -> `flowering|medicinal|sun` +- `Thunbergia alata`: `flowering|sun|hanging` -> `flowering|hanging|sun` +- `Gerbera jamesonii`: `flowering|sun|pet_friendly` -> `flowering|pet_friendly|sun` +- `Hibiscus rosa-sinensis`: `flowering|sun|large` -> `flowering|large|sun` +- `Bergenia cordifolia`: `flowering|low_light|large` -> `flowering|large|low_light` +- `Photinia serratifolia`: `tree|sun|large` -> `tree|large|sun` +- `Chrysanthemum morifolium`: `flowering|sun|pet_friendly` -> `flowering|pet_friendly|sun` +- `Galanthus nivalis`: `flowering|low_light|pet_friendly` -> `flowering|pet_friendly|low_light` +- `Leucojum aestivum`: `flowering|low_light|pet_friendly` -> `flowering|pet_friendly|low_light` +- `Cyclamen persicum`: `flowering|low_light|pet_friendly` -> `flowering|pet_friendly|low_light` +- `Narcissus pseudonarcissus`: `flowering|sun|pet_friendly` -> `flowering|pet_friendly|sun` +- `Dahlia pinnata`: `flowering|sun|pet_friendly` -> `flowering|pet_friendly|sun` +- `Photinia fraseri`: `tree|sun|large` -> `tree|large|sun` +- `Rosa canina`: `flowering|sun|medicinal` -> `flowering|medicinal|sun` +- `Acer campestre`: `tree|sun|large` -> `tree|large|sun` +- `Amelanchier ovalis`: `flowering|sun|large` -> `flowering|large|sun` +- `Howea forsteriana`: `easy|pet_friendly|large|air_purifier|bright_light` -> `easy|pet_friendly|air_purifier|large|bright_light` +- `Dracaena trifasciata`: `easy|air_purifier|low_light|large` -> `easy|air_purifier|large|low_light` +- `Lobularia maritima`: `flowering|sun|hanging` -> `flowering|hanging|sun` +- `Buxus sempervirens`: `tree|sun|large` -> `tree|large|sun` +- `Cosmos bipinnatus`: `flowering|sun|pet_friendly` -> `flowering|pet_friendly|sun` +- `Lilium candidum`: `flowering|sun|pet_friendly` -> `flowering|pet_friendly|sun` +- `Origanum vulgare`: `medicinal|sun|pet_friendly` -> `medicinal|pet_friendly|sun` +- `Rudbeckia hirta`: `flowering|sun|pet_friendly` -> `flowering|pet_friendly|sun` +- `Hibiscus syriacus`: `flowering|sun|large` -> `flowering|large|sun` +- `Sedum acre`: `succulent|sun|pet_friendly` -> `succulent|pet_friendly|sun` +- `Fatsia japonica`: `tree|low_light|large` -> `tree|large|low_light` +- `Ocimum tenuiflorum`: `medicinal|sun|flowering` -> `flowering|medicinal|sun` +- `Ulmus minor`: `tree|sun|large` -> `tree|large|sun` +- `Ulmus americana`: `tree|sun|large` -> `tree|large|sun` +- `Ulmus glabra`: `tree|sun|large` -> `tree|large|sun` +- `Aloysia citrodora`: `medicinal|sun|flowering` -> `flowering|medicinal|sun` +- `Cucumis sativus`: `easy|sun|hanging` -> `easy|hanging|sun` +- `Citrullus lanatus`: `easy|sun|hanging` -> `easy|hanging|sun` +- `Hypoestes phyllostachya`: `patterned|bright_light|pet_friendly` -> `patterned|pet_friendly|bright_light` +- `Nephrolepis exaltata`: `air_purifier|high_humidity|pet_friendly` -> `air_purifier|pet_friendly|high_humidity` +- `Phalaenopsis amabilis`: `flowering|high_humidity|pet_friendly` -> `flowering|pet_friendly|high_humidity` +- `Plantago major`: `medicinal|sun|pet_friendly` -> `medicinal|pet_friendly|sun` +- `Chaenomeles japonica`: `flowering|sun|large` -> `flowering|large|sun` +- `Rhododendron ferrugineum`: `flowering|low_light|large` -> `flowering|large|low_light` +- `Brassica napus napobrassica`: `easy|sun|large` -> `easy|large|sun` +- `Salvia apiana`: `medicinal|sun|flowering` -> `flowering|medicinal|sun` +- `Salvia canariensis`: `medicinal|sun|flowering` -> `flowering|medicinal|sun` +- `Helianthus annuus`: `flowering|sun|large` -> `flowering|large|sun` +- `Syringa vulgaris`: `flowering|sun|large` -> `flowering|large|sun` +- `Calystegia sepium`: `flowering|sun|hanging` -> `flowering|hanging|sun` +- `Vanilla planifolia`: `flowering|high_humidity|hanging` -> `flowering|hanging|high_humidity` +- `Vanda coerulea`: `flowering|high_humidity|bright_light` -> `flowering|bright_light|high_humidity` +- `Verbascum thapsus`: `flowering|sun|medicinal` -> `flowering|medicinal|sun` +- `Washingtonia robusta`: `tree|sun|large` -> `tree|large|sun` +- `Wisteria sinensis`: `flowering|sun|large` -> `flowering|large|sun` +- `Yucca aloifolia`: `tree|sun|easy` -> `easy|tree|sun` + +## Notes + +- Some review items were omitted because they were explicit no-ops, duplicate rows, or already effectively normalized by the export layer. +- The obvious no-op reorder rows were removed from this file during cleanup. +- Some older order proposals may now be stale if a later semantic audit intentionally changed the underlying categories. +- The canonical order visible to QA should be taken from `all-plants-categories.csv`, not from the raw category array order inside the batch source files. diff --git a/audits/semantic-search/summary.json b/audits/semantic-search/summary.json index 22189fc..905b6c9 100644 --- a/audits/semantic-search/summary.json +++ b/audits/semantic-search/summary.json @@ -1,76 +1,76 @@ -{ - "generatedAt": "2026-03-12T14:15:29.567Z", - "totalEntries": 358, - "categories": [ - { - "category": "pet_friendly", - "count": 15, - "priority": 1 - }, - { - "category": "air_purifier", - "count": 12, - "priority": 2 - }, - { - "category": "medicinal", - "count": 32, - "priority": 3 - }, - { - "category": "low_light", - "count": 16, - "priority": 4 - }, - { - "category": "bright_light", - "count": 42, - "priority": 5 - }, - { - "category": "sun", - "count": 172, - "priority": 6 - }, - { - "category": "easy", - "count": 132, - "priority": 7 - }, - { - "category": "high_humidity", - "count": 51, - "priority": 8 - }, - { - "category": "hanging", - "count": 34, - "priority": 9 - }, - { - "category": "tree", - "count": 59, - "priority": 10 - }, - { - "category": "large", - "count": 35, - "priority": 11 - }, - { - "category": "patterned", - "count": 31, - "priority": 12 - }, - { - "category": "flowering", - "count": 157, - "priority": 13 - }, - { - "category": "succulent", - "count": 46, - "priority": 14 - } - ] -} +{ + "generatedAt": "2026-03-12T14:15:29.567Z", + "totalEntries": 358, + "categories": [ + { + "category": "pet_friendly", + "count": 15, + "priority": 1 + }, + { + "category": "air_purifier", + "count": 12, + "priority": 2 + }, + { + "category": "medicinal", + "count": 32, + "priority": 3 + }, + { + "category": "low_light", + "count": 16, + "priority": 4 + }, + { + "category": "bright_light", + "count": 42, + "priority": 5 + }, + { + "category": "sun", + "count": 172, + "priority": 6 + }, + { + "category": "easy", + "count": 132, + "priority": 7 + }, + { + "category": "high_humidity", + "count": 51, + "priority": 8 + }, + { + "category": "hanging", + "count": 34, + "priority": 9 + }, + { + "category": "tree", + "count": 59, + "priority": 10 + }, + { + "category": "large", + "count": 35, + "priority": 11 + }, + { + "category": "patterned", + "count": 31, + "priority": 12 + }, + { + "category": "flowering", + "count": 157, + "priority": 13 + }, + { + "category": "succulent", + "count": 46, + "priority": 14 + } + ] +} diff --git a/audits/semantic-search/suspicious.csv b/audits/semantic-search/suspicious.csv index 2846fe8..23245a5 100644 --- a/audits/semantic-search/suspicious.csv +++ b/audits/semantic-search/suspicious.csv @@ -1,163 +1,163 @@ -category,source_file,source_index,name,botanical_name,risk_flags -air_purifier,constants/lexiconBatch1.ts,43,Bergpalme,Chamaedorea elegans,air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence -air_purifier,constants/lexiconBatch1.ts,48,Dieffenbachie,Dieffenbachia seguine,air_purifier_requires_external_evidence -air_purifier,constants/lexiconBatch1.ts,14,Maisstrauch,Dracaena fragrans,air_purifier_requires_external_evidence -air_purifier,constants/lexiconBatch1.ts,13,Drachenbaum,Dracaena marginata,air_purifier_requires_external_evidence -air_purifier,constants/lexiconBatch1.ts,42,Goldfruchtpalme,Dypsis lutescens,air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence -air_purifier,constants/lexiconBatch1.ts,16,Marmor-Efeutute,Epipremnum aureum Marble Queen,air_purifier_requires_external_evidence -air_purifier,constants/lexiconBatch2.ts,53,Neon-Efeutute,Epipremnum pinnatum Neon,air_purifier_requires_external_evidence -air_purifier,constants/lexiconBatch1.ts,1,Birkenfeige,Ficus benjamina,air_purifier_requires_external_evidence -air_purifier,constants/lexiconBatch1.ts,38,Gummibaum,Ficus elastica,air_purifier_requires_external_evidence -air_purifier,constants/lexiconBatch1.ts,68,Gerbera,Gerbera jamesonii,air_purifier_requires_external_evidence -air_purifier,constants/lexiconBatch1.ts,37,Efeu,Hedera helix,air_purifier_requires_external_evidence -air_purifier,constants/lexiconBatch2.ts,10,Strahlenaralie,Schefflera arboricola,air_purifier_requires_external_evidence -bright_light,constants/lexiconBatch1.ts,68,Gerbera,Gerbera jamesonii,air_purifier_requires_external_evidence -bright_light,constants/lexiconBatch1.ts,23,Echter Lavendel,Lavandula angustifolia,medicinal_requires_external_evidence -easy,constants/lexiconBatch1.ts,89,Kap-Aloe,Aloe arborescens,medicinal_requires_external_evidence -easy,constants/lexiconBatch2.ts,92,Chili,Capsicum annuum,medicinal_requires_external_evidence -easy,constants/lexiconBatch1.ts,43,Bergpalme,Chamaedorea elegans,air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence -easy,constants/lexiconBatch2.ts,138,Roemische Kamille,Chamaemelum nobile,medicinal_requires_external_evidence -easy,constants/lexiconBatch2.ts,101,Kamille,Chamomilla recutita,medicinal_requires_external_evidence -easy,constants/lexiconBatch1.ts,48,Dieffenbachie,Dieffenbachia seguine,air_purifier_requires_external_evidence -easy,constants/lexiconBatch1.ts,14,Maisstrauch,Dracaena fragrans,air_purifier_requires_external_evidence -easy,constants/lexiconBatch1.ts,13,Drachenbaum,Dracaena marginata,air_purifier_requires_external_evidence -easy,constants/lexiconBatch1.ts,16,Marmor-Efeutute,Epipremnum aureum Marble Queen,air_purifier_requires_external_evidence -easy,constants/lexiconBatch2.ts,53,Neon-Efeutute,Epipremnum pinnatum Neon,air_purifier_requires_external_evidence -easy,constants/lexiconBatch1.ts,38,Gummibaum,Ficus elastica,air_purifier_requires_external_evidence -easy,constants/lexiconBatch2.ts,100,Erdbeere,Fragaria ananassa,pet_friendly_requires_external_evidence -easy,constants/lexiconBatch1.ts,37,Efeu,Hedera helix,air_purifier_requires_external_evidence -easy,constants/lexiconBatch2.ts,102,Zitronenmelisse,Melissa officinalis,medicinal_requires_external_evidence -easy,constants/lexiconBatch1.ts,25,Basilikum,Ocimum basilicum,medicinal_requires_external_evidence -easy,constants/lexiconBatch1.ts,28,Oregano,Origanum vulgare,medicinal_requires_external_evidence -easy,constants/lexiconBatch1.ts,31,Rosengeranie,Pelargonium graveolens,medicinal_requires_external_evidence -easy,constants/lexiconBatch1.ts,102,Rippenpeperomie,Peperomia caperata,pet_friendly_requires_external_evidence -easy,constants/lexiconBatch1.ts,103,Spiegelpeperomie,Peperomia obtusifolia,pet_friendly_requires_external_evidence -easy,constants/lexiconBatch2.ts,230,Raindrop-Peperomie,Peperomia polybotrya,pet_friendly_requires_external_evidence -easy,constants/lexiconBatch1.ts,34,Petunie,Petunia hybrida,pet_friendly_requires_external_evidence -easy,constants/lexiconBatch2.ts,228,Aluminium-Pflanze,Pilea cadierei,pet_friendly_requires_external_evidence -easy,constants/lexiconBatch1.ts,2,Ufopflanze,Pilea peperomioides,pet_friendly_requires_external_evidence -easy,constants/lexiconBatch1.ts,24,Rosmarin,Rosmarinus officinalis,medicinal_requires_external_evidence -easy,constants/lexiconBatch2.ts,103,Salbei,Salvia officinalis,medicinal_requires_external_evidence -easy,constants/lexiconBatch2.ts,10,Strahlenaralie,Schefflera arboricola,air_purifier_requires_external_evidence -easy,constants/lexiconBatch1.ts,27,Thymian,Thymus vulgaris,medicinal_requires_external_evidence -flowering,constants/lexiconBatch2.ts,108,Schafgarbe,Achillea millefolium,medicinal_requires_external_evidence -flowering,constants/lexiconBatch2.ts,107,Arnika,Arnica montana,medicinal_requires_external_evidence -flowering,constants/lexiconBatch2.ts,187,Ringelblume,Calendula officinalis,medicinal_requires_external_evidence -flowering,constants/lexiconBatch2.ts,160,Maigloeckchen,Convallaria majalis,medicinal_requires_external_evidence -flowering,constants/lexiconBatch2.ts,109,Roter Fingerhut,Digitalis purpurea,medicinal_requires_external_evidence -flowering,constants/lexiconBatch2.ts,106,Sonnenhut,Echinacea purpurea,medicinal_requires_external_evidence -flowering,constants/lexiconBatch1.ts,68,Gerbera,Gerbera jamesonii,air_purifier_requires_external_evidence -flowering,constants/lexiconBatch2.ts,119,Zaubernuss,Hamamelis mollis,medicinal_requires_external_evidence -flowering,constants/lexiconBatch2.ts,105,Johanniskraut,Hypericum perforatum,medicinal_requires_external_evidence -flowering,constants/lexiconBatch1.ts,34,Petunie,Petunia hybrida,pet_friendly_requires_external_evidence -flowering,constants/lexiconBatch2.ts,112,Schwarzer Holunder,Sambucus nigra,medicinal_requires_external_evidence -flowering,constants/lexiconBatch2.ts,104,Baldrian,Valeriana officinalis,medicinal_requires_external_evidence -flowering,constants/lexiconBatch2.ts,192,Koenigskerze,Verbascum thapsus,medicinal_requires_external_evidence -hanging,constants/lexiconBatch1.ts,16,Marmor-Efeutute,Epipremnum aureum Marble Queen,air_purifier_requires_external_evidence -hanging,constants/lexiconBatch2.ts,53,Neon-Efeutute,Epipremnum pinnatum Neon,air_purifier_requires_external_evidence -hanging,constants/lexiconBatch1.ts,37,Efeu,Hedera helix,air_purifier_requires_external_evidence -high_humidity,constants/lexiconBatch2.ts,74,Kurkuma,Curcuma longa,medicinal_requires_external_evidence -high_humidity,constants/lexiconBatch2.ts,240,Calathea lancifolia,Goeppertia insignis,pet_friendly_requires_external_evidence -high_humidity,constants/lexiconBatch2.ts,241,Calathea ornata,Goeppertia ornata,pet_friendly_requires_external_evidence -high_humidity,constants/lexiconBatch1.ts,51,Gebet-Pflanze,Maranta leuconeura,pet_friendly_requires_external_evidence -high_humidity,constants/lexiconBatch2.ts,238,Bubikopf,Soleirolia soleirolii,pet_friendly_requires_external_evidence -high_humidity,constants/lexiconBatch2.ts,75,Ingwer,Zingiber officinale,medicinal_requires_external_evidence -large,constants/lexiconBatch2.ts,18,Kap-Aloe (ferox),Aloe ferox,medicinal_requires_external_evidence -large,constants/lexiconBatch2.ts,114,Hange-Birke,Betula pendula,medicinal_requires_external_evidence -large,constants/lexiconBatch2.ts,113,Silber-Weide,Salix alba,medicinal_requires_external_evidence -low_light,constants/lexiconBatch1.ts,43,Bergpalme,Chamaedorea elegans,air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence -low_light,constants/lexiconBatch1.ts,48,Dieffenbachie,Dieffenbachia seguine,air_purifier_requires_external_evidence -low_light,constants/lexiconBatch1.ts,14,Maisstrauch,Dracaena fragrans,air_purifier_requires_external_evidence -low_light,constants/lexiconBatch1.ts,37,Efeu,Hedera helix,air_purifier_requires_external_evidence -low_light,constants/lexiconBatch2.ts,3,Kentia-Palme,Howea forsteriana,pet_friendly_requires_external_evidence -low_light,constants/lexiconBatch1.ts,103,Spiegelpeperomie,Peperomia obtusifolia,pet_friendly_requires_external_evidence -medicinal,constants/lexiconBatch2.ts,108,Schafgarbe,Achillea millefolium,medicinal_requires_external_evidence -medicinal,constants/lexiconBatch1.ts,89,Kap-Aloe,Aloe arborescens,medicinal_requires_external_evidence -medicinal,constants/lexiconBatch2.ts,18,Kap-Aloe (ferox),Aloe ferox,medicinal_requires_external_evidence -medicinal,constants/lexiconBatch2.ts,107,Arnika,Arnica montana,medicinal_requires_external_evidence -medicinal,constants/lexiconBatch2.ts,110,Wermut,Artemisia absinthium,medicinal_requires_external_evidence -medicinal,constants/lexiconBatch2.ts,114,Hange-Birke,Betula pendula,medicinal_requires_external_evidence -medicinal,constants/lexiconBatch2.ts,187,Ringelblume,Calendula officinalis,medicinal_requires_external_evidence -medicinal,constants/lexiconBatch2.ts,92,Chili,Capsicum annuum,medicinal_requires_external_evidence -medicinal,constants/lexiconBatch2.ts,138,Roemische Kamille,Chamaemelum nobile,medicinal_requires_external_evidence -medicinal,constants/lexiconBatch2.ts,101,Kamille,Chamomilla recutita,medicinal_requires_external_evidence -medicinal,constants/lexiconBatch2.ts,160,Maigloeckchen,Convallaria majalis,medicinal_requires_external_evidence -medicinal,constants/lexiconBatch2.ts,74,Kurkuma,Curcuma longa,medicinal_requires_external_evidence -medicinal,constants/lexiconBatch2.ts,109,Roter Fingerhut,Digitalis purpurea,medicinal_requires_external_evidence -medicinal,constants/lexiconBatch2.ts,106,Sonnenhut,Echinacea purpurea,medicinal_requires_external_evidence -medicinal,constants/lexiconBatch2.ts,210,Eukalyptus,Eucalyptus globulus,medicinal_requires_external_evidence -medicinal,constants/lexiconBatch2.ts,216,Ginkgo,Ginkgo biloba,medicinal_requires_external_evidence -medicinal,constants/lexiconBatch2.ts,119,Zaubernuss,Hamamelis mollis,medicinal_requires_external_evidence -medicinal,constants/lexiconBatch2.ts,105,Johanniskraut,Hypericum perforatum,medicinal_requires_external_evidence -medicinal,constants/lexiconBatch1.ts,23,Echter Lavendel,Lavandula angustifolia,medicinal_requires_external_evidence -medicinal,constants/lexiconBatch2.ts,102,Zitronenmelisse,Melissa officinalis,medicinal_requires_external_evidence -medicinal,constants/lexiconBatch1.ts,25,Basilikum,Ocimum basilicum,medicinal_requires_external_evidence -medicinal,constants/lexiconBatch1.ts,28,Oregano,Origanum vulgare,medicinal_requires_external_evidence -medicinal,constants/lexiconBatch1.ts,31,Rosengeranie,Pelargonium graveolens,medicinal_requires_external_evidence -medicinal,constants/lexiconBatch1.ts,24,Rosmarin,Rosmarinus officinalis,medicinal_requires_external_evidence -medicinal,constants/lexiconBatch2.ts,113,Silber-Weide,Salix alba,medicinal_requires_external_evidence -medicinal,constants/lexiconBatch2.ts,103,Salbei,Salvia officinalis,medicinal_requires_external_evidence -medicinal,constants/lexiconBatch2.ts,112,Schwarzer Holunder,Sambucus nigra,medicinal_requires_external_evidence -medicinal,constants/lexiconBatch1.ts,27,Thymian,Thymus vulgaris,medicinal_requires_external_evidence -medicinal,constants/lexiconBatch2.ts,111,Grosse Brennessel,Urtica dioica,medicinal_requires_external_evidence -medicinal,constants/lexiconBatch2.ts,104,Baldrian,Valeriana officinalis,medicinal_requires_external_evidence -medicinal,constants/lexiconBatch2.ts,192,Koenigskerze,Verbascum thapsus,medicinal_requires_external_evidence -medicinal,constants/lexiconBatch2.ts,75,Ingwer,Zingiber officinale,medicinal_requires_external_evidence -patterned,constants/lexiconBatch2.ts,240,Calathea lancifolia,Goeppertia insignis,pet_friendly_requires_external_evidence -patterned,constants/lexiconBatch2.ts,241,Calathea ornata,Goeppertia ornata,pet_friendly_requires_external_evidence -patterned,constants/lexiconBatch1.ts,51,Gebet-Pflanze,Maranta leuconeura,pet_friendly_requires_external_evidence -patterned,constants/lexiconBatch2.ts,229,Wassermelonen-Peperomie,Peperomia argyreia,pet_friendly_requires_external_evidence -patterned,constants/lexiconBatch2.ts,228,Aluminium-Pflanze,Pilea cadierei,pet_friendly_requires_external_evidence -pet_friendly,constants/lexiconBatch1.ts,43,Bergpalme,Chamaedorea elegans,air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence -pet_friendly,constants/lexiconBatch1.ts,42,Goldfruchtpalme,Dypsis lutescens,air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence -pet_friendly,constants/lexiconBatch2.ts,100,Erdbeere,Fragaria ananassa,pet_friendly_requires_external_evidence -pet_friendly,constants/lexiconBatch2.ts,240,Calathea lancifolia,Goeppertia insignis,pet_friendly_requires_external_evidence -pet_friendly,constants/lexiconBatch2.ts,241,Calathea ornata,Goeppertia ornata,pet_friendly_requires_external_evidence -pet_friendly,constants/lexiconBatch2.ts,3,Kentia-Palme,Howea forsteriana,pet_friendly_requires_external_evidence -pet_friendly,constants/lexiconBatch1.ts,51,Gebet-Pflanze,Maranta leuconeura,pet_friendly_requires_external_evidence -pet_friendly,constants/lexiconBatch2.ts,229,Wassermelonen-Peperomie,Peperomia argyreia,pet_friendly_requires_external_evidence -pet_friendly,constants/lexiconBatch1.ts,102,Rippenpeperomie,Peperomia caperata,pet_friendly_requires_external_evidence -pet_friendly,constants/lexiconBatch1.ts,103,Spiegelpeperomie,Peperomia obtusifolia,pet_friendly_requires_external_evidence -pet_friendly,constants/lexiconBatch2.ts,230,Raindrop-Peperomie,Peperomia polybotrya,pet_friendly_requires_external_evidence -pet_friendly,constants/lexiconBatch1.ts,34,Petunie,Petunia hybrida,pet_friendly_requires_external_evidence -pet_friendly,constants/lexiconBatch2.ts,228,Aluminium-Pflanze,Pilea cadierei,pet_friendly_requires_external_evidence -pet_friendly,constants/lexiconBatch1.ts,2,Ufopflanze,Pilea peperomioides,pet_friendly_requires_external_evidence -pet_friendly,constants/lexiconBatch2.ts,238,Bubikopf,Soleirolia soleirolii,pet_friendly_requires_external_evidence -succulent,constants/lexiconBatch1.ts,89,Kap-Aloe,Aloe arborescens,medicinal_requires_external_evidence -succulent,constants/lexiconBatch2.ts,18,Kap-Aloe (ferox),Aloe ferox,medicinal_requires_external_evidence -sun,constants/lexiconBatch2.ts,108,Schafgarbe,Achillea millefolium,medicinal_requires_external_evidence -sun,constants/lexiconBatch1.ts,89,Kap-Aloe,Aloe arborescens,medicinal_requires_external_evidence -sun,constants/lexiconBatch2.ts,18,Kap-Aloe (ferox),Aloe ferox,medicinal_requires_external_evidence -sun,constants/lexiconBatch2.ts,107,Arnika,Arnica montana,medicinal_requires_external_evidence -sun,constants/lexiconBatch2.ts,110,Wermut,Artemisia absinthium,medicinal_requires_external_evidence -sun,constants/lexiconBatch2.ts,187,Ringelblume,Calendula officinalis,medicinal_requires_external_evidence -sun,constants/lexiconBatch2.ts,92,Chili,Capsicum annuum,medicinal_requires_external_evidence -sun,constants/lexiconBatch2.ts,138,Roemische Kamille,Chamaemelum nobile,medicinal_requires_external_evidence -sun,constants/lexiconBatch2.ts,101,Kamille,Chamomilla recutita,medicinal_requires_external_evidence -sun,constants/lexiconBatch2.ts,106,Sonnenhut,Echinacea purpurea,medicinal_requires_external_evidence -sun,constants/lexiconBatch2.ts,210,Eukalyptus,Eucalyptus globulus,medicinal_requires_external_evidence -sun,constants/lexiconBatch2.ts,100,Erdbeere,Fragaria ananassa,pet_friendly_requires_external_evidence -sun,constants/lexiconBatch2.ts,216,Ginkgo,Ginkgo biloba,medicinal_requires_external_evidence -sun,constants/lexiconBatch2.ts,105,Johanniskraut,Hypericum perforatum,medicinal_requires_external_evidence -sun,constants/lexiconBatch1.ts,23,Echter Lavendel,Lavandula angustifolia,medicinal_requires_external_evidence -sun,constants/lexiconBatch1.ts,25,Basilikum,Ocimum basilicum,medicinal_requires_external_evidence -sun,constants/lexiconBatch1.ts,28,Oregano,Origanum vulgare,medicinal_requires_external_evidence -sun,constants/lexiconBatch1.ts,31,Rosengeranie,Pelargonium graveolens,medicinal_requires_external_evidence -sun,constants/lexiconBatch1.ts,34,Petunie,Petunia hybrida,pet_friendly_requires_external_evidence -sun,constants/lexiconBatch1.ts,24,Rosmarin,Rosmarinus officinalis,medicinal_requires_external_evidence -sun,constants/lexiconBatch2.ts,103,Salbei,Salvia officinalis,medicinal_requires_external_evidence -sun,constants/lexiconBatch1.ts,27,Thymian,Thymus vulgaris,medicinal_requires_external_evidence -sun,constants/lexiconBatch2.ts,192,Koenigskerze,Verbascum thapsus,medicinal_requires_external_evidence -tree,constants/lexiconBatch2.ts,114,Hange-Birke,Betula pendula,medicinal_requires_external_evidence -tree,constants/lexiconBatch1.ts,43,Bergpalme,Chamaedorea elegans,air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence -tree,constants/lexiconBatch1.ts,14,Maisstrauch,Dracaena fragrans,air_purifier_requires_external_evidence -tree,constants/lexiconBatch1.ts,13,Drachenbaum,Dracaena marginata,air_purifier_requires_external_evidence -tree,constants/lexiconBatch1.ts,42,Goldfruchtpalme,Dypsis lutescens,air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence -tree,constants/lexiconBatch2.ts,210,Eukalyptus,Eucalyptus globulus,medicinal_requires_external_evidence -tree,constants/lexiconBatch1.ts,1,Birkenfeige,Ficus benjamina,air_purifier_requires_external_evidence -tree,constants/lexiconBatch1.ts,38,Gummibaum,Ficus elastica,air_purifier_requires_external_evidence -tree,constants/lexiconBatch2.ts,216,Ginkgo,Ginkgo biloba,medicinal_requires_external_evidence -tree,constants/lexiconBatch2.ts,3,Kentia-Palme,Howea forsteriana,pet_friendly_requires_external_evidence -tree,constants/lexiconBatch2.ts,113,Silber-Weide,Salix alba,medicinal_requires_external_evidence -tree,constants/lexiconBatch2.ts,112,Schwarzer Holunder,Sambucus nigra,medicinal_requires_external_evidence -tree,constants/lexiconBatch2.ts,10,Strahlenaralie,Schefflera arboricola,air_purifier_requires_external_evidence +category,source_file,source_index,name,botanical_name,risk_flags +air_purifier,constants/lexiconBatch1.ts,43,Bergpalme,Chamaedorea elegans,air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence +air_purifier,constants/lexiconBatch1.ts,48,Dieffenbachie,Dieffenbachia seguine,air_purifier_requires_external_evidence +air_purifier,constants/lexiconBatch1.ts,14,Maisstrauch,Dracaena fragrans,air_purifier_requires_external_evidence +air_purifier,constants/lexiconBatch1.ts,13,Drachenbaum,Dracaena marginata,air_purifier_requires_external_evidence +air_purifier,constants/lexiconBatch1.ts,42,Goldfruchtpalme,Dypsis lutescens,air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence +air_purifier,constants/lexiconBatch1.ts,16,Marmor-Efeutute,Epipremnum aureum Marble Queen,air_purifier_requires_external_evidence +air_purifier,constants/lexiconBatch2.ts,53,Neon-Efeutute,Epipremnum pinnatum Neon,air_purifier_requires_external_evidence +air_purifier,constants/lexiconBatch1.ts,1,Birkenfeige,Ficus benjamina,air_purifier_requires_external_evidence +air_purifier,constants/lexiconBatch1.ts,38,Gummibaum,Ficus elastica,air_purifier_requires_external_evidence +air_purifier,constants/lexiconBatch1.ts,68,Gerbera,Gerbera jamesonii,air_purifier_requires_external_evidence +air_purifier,constants/lexiconBatch1.ts,37,Efeu,Hedera helix,air_purifier_requires_external_evidence +air_purifier,constants/lexiconBatch2.ts,10,Strahlenaralie,Schefflera arboricola,air_purifier_requires_external_evidence +bright_light,constants/lexiconBatch1.ts,68,Gerbera,Gerbera jamesonii,air_purifier_requires_external_evidence +bright_light,constants/lexiconBatch1.ts,23,Echter Lavendel,Lavandula angustifolia,medicinal_requires_external_evidence +easy,constants/lexiconBatch1.ts,89,Kap-Aloe,Aloe arborescens,medicinal_requires_external_evidence +easy,constants/lexiconBatch2.ts,92,Chili,Capsicum annuum,medicinal_requires_external_evidence +easy,constants/lexiconBatch1.ts,43,Bergpalme,Chamaedorea elegans,air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence +easy,constants/lexiconBatch2.ts,138,Roemische Kamille,Chamaemelum nobile,medicinal_requires_external_evidence +easy,constants/lexiconBatch2.ts,101,Kamille,Chamomilla recutita,medicinal_requires_external_evidence +easy,constants/lexiconBatch1.ts,48,Dieffenbachie,Dieffenbachia seguine,air_purifier_requires_external_evidence +easy,constants/lexiconBatch1.ts,14,Maisstrauch,Dracaena fragrans,air_purifier_requires_external_evidence +easy,constants/lexiconBatch1.ts,13,Drachenbaum,Dracaena marginata,air_purifier_requires_external_evidence +easy,constants/lexiconBatch1.ts,16,Marmor-Efeutute,Epipremnum aureum Marble Queen,air_purifier_requires_external_evidence +easy,constants/lexiconBatch2.ts,53,Neon-Efeutute,Epipremnum pinnatum Neon,air_purifier_requires_external_evidence +easy,constants/lexiconBatch1.ts,38,Gummibaum,Ficus elastica,air_purifier_requires_external_evidence +easy,constants/lexiconBatch2.ts,100,Erdbeere,Fragaria ananassa,pet_friendly_requires_external_evidence +easy,constants/lexiconBatch1.ts,37,Efeu,Hedera helix,air_purifier_requires_external_evidence +easy,constants/lexiconBatch2.ts,102,Zitronenmelisse,Melissa officinalis,medicinal_requires_external_evidence +easy,constants/lexiconBatch1.ts,25,Basilikum,Ocimum basilicum,medicinal_requires_external_evidence +easy,constants/lexiconBatch1.ts,28,Oregano,Origanum vulgare,medicinal_requires_external_evidence +easy,constants/lexiconBatch1.ts,31,Rosengeranie,Pelargonium graveolens,medicinal_requires_external_evidence +easy,constants/lexiconBatch1.ts,102,Rippenpeperomie,Peperomia caperata,pet_friendly_requires_external_evidence +easy,constants/lexiconBatch1.ts,103,Spiegelpeperomie,Peperomia obtusifolia,pet_friendly_requires_external_evidence +easy,constants/lexiconBatch2.ts,230,Raindrop-Peperomie,Peperomia polybotrya,pet_friendly_requires_external_evidence +easy,constants/lexiconBatch1.ts,34,Petunie,Petunia hybrida,pet_friendly_requires_external_evidence +easy,constants/lexiconBatch2.ts,228,Aluminium-Pflanze,Pilea cadierei,pet_friendly_requires_external_evidence +easy,constants/lexiconBatch1.ts,2,Ufopflanze,Pilea peperomioides,pet_friendly_requires_external_evidence +easy,constants/lexiconBatch1.ts,24,Rosmarin,Rosmarinus officinalis,medicinal_requires_external_evidence +easy,constants/lexiconBatch2.ts,103,Salbei,Salvia officinalis,medicinal_requires_external_evidence +easy,constants/lexiconBatch2.ts,10,Strahlenaralie,Schefflera arboricola,air_purifier_requires_external_evidence +easy,constants/lexiconBatch1.ts,27,Thymian,Thymus vulgaris,medicinal_requires_external_evidence +flowering,constants/lexiconBatch2.ts,108,Schafgarbe,Achillea millefolium,medicinal_requires_external_evidence +flowering,constants/lexiconBatch2.ts,107,Arnika,Arnica montana,medicinal_requires_external_evidence +flowering,constants/lexiconBatch2.ts,187,Ringelblume,Calendula officinalis,medicinal_requires_external_evidence +flowering,constants/lexiconBatch2.ts,160,Maigloeckchen,Convallaria majalis,medicinal_requires_external_evidence +flowering,constants/lexiconBatch2.ts,109,Roter Fingerhut,Digitalis purpurea,medicinal_requires_external_evidence +flowering,constants/lexiconBatch2.ts,106,Sonnenhut,Echinacea purpurea,medicinal_requires_external_evidence +flowering,constants/lexiconBatch1.ts,68,Gerbera,Gerbera jamesonii,air_purifier_requires_external_evidence +flowering,constants/lexiconBatch2.ts,119,Zaubernuss,Hamamelis mollis,medicinal_requires_external_evidence +flowering,constants/lexiconBatch2.ts,105,Johanniskraut,Hypericum perforatum,medicinal_requires_external_evidence +flowering,constants/lexiconBatch1.ts,34,Petunie,Petunia hybrida,pet_friendly_requires_external_evidence +flowering,constants/lexiconBatch2.ts,112,Schwarzer Holunder,Sambucus nigra,medicinal_requires_external_evidence +flowering,constants/lexiconBatch2.ts,104,Baldrian,Valeriana officinalis,medicinal_requires_external_evidence +flowering,constants/lexiconBatch2.ts,192,Koenigskerze,Verbascum thapsus,medicinal_requires_external_evidence +hanging,constants/lexiconBatch1.ts,16,Marmor-Efeutute,Epipremnum aureum Marble Queen,air_purifier_requires_external_evidence +hanging,constants/lexiconBatch2.ts,53,Neon-Efeutute,Epipremnum pinnatum Neon,air_purifier_requires_external_evidence +hanging,constants/lexiconBatch1.ts,37,Efeu,Hedera helix,air_purifier_requires_external_evidence +high_humidity,constants/lexiconBatch2.ts,74,Kurkuma,Curcuma longa,medicinal_requires_external_evidence +high_humidity,constants/lexiconBatch2.ts,240,Calathea lancifolia,Goeppertia insignis,pet_friendly_requires_external_evidence +high_humidity,constants/lexiconBatch2.ts,241,Calathea ornata,Goeppertia ornata,pet_friendly_requires_external_evidence +high_humidity,constants/lexiconBatch1.ts,51,Gebet-Pflanze,Maranta leuconeura,pet_friendly_requires_external_evidence +high_humidity,constants/lexiconBatch2.ts,238,Bubikopf,Soleirolia soleirolii,pet_friendly_requires_external_evidence +high_humidity,constants/lexiconBatch2.ts,75,Ingwer,Zingiber officinale,medicinal_requires_external_evidence +large,constants/lexiconBatch2.ts,18,Kap-Aloe (ferox),Aloe ferox,medicinal_requires_external_evidence +large,constants/lexiconBatch2.ts,114,Hange-Birke,Betula pendula,medicinal_requires_external_evidence +large,constants/lexiconBatch2.ts,113,Silber-Weide,Salix alba,medicinal_requires_external_evidence +low_light,constants/lexiconBatch1.ts,43,Bergpalme,Chamaedorea elegans,air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence +low_light,constants/lexiconBatch1.ts,48,Dieffenbachie,Dieffenbachia seguine,air_purifier_requires_external_evidence +low_light,constants/lexiconBatch1.ts,14,Maisstrauch,Dracaena fragrans,air_purifier_requires_external_evidence +low_light,constants/lexiconBatch1.ts,37,Efeu,Hedera helix,air_purifier_requires_external_evidence +low_light,constants/lexiconBatch2.ts,3,Kentia-Palme,Howea forsteriana,pet_friendly_requires_external_evidence +low_light,constants/lexiconBatch1.ts,103,Spiegelpeperomie,Peperomia obtusifolia,pet_friendly_requires_external_evidence +medicinal,constants/lexiconBatch2.ts,108,Schafgarbe,Achillea millefolium,medicinal_requires_external_evidence +medicinal,constants/lexiconBatch1.ts,89,Kap-Aloe,Aloe arborescens,medicinal_requires_external_evidence +medicinal,constants/lexiconBatch2.ts,18,Kap-Aloe (ferox),Aloe ferox,medicinal_requires_external_evidence +medicinal,constants/lexiconBatch2.ts,107,Arnika,Arnica montana,medicinal_requires_external_evidence +medicinal,constants/lexiconBatch2.ts,110,Wermut,Artemisia absinthium,medicinal_requires_external_evidence +medicinal,constants/lexiconBatch2.ts,114,Hange-Birke,Betula pendula,medicinal_requires_external_evidence +medicinal,constants/lexiconBatch2.ts,187,Ringelblume,Calendula officinalis,medicinal_requires_external_evidence +medicinal,constants/lexiconBatch2.ts,92,Chili,Capsicum annuum,medicinal_requires_external_evidence +medicinal,constants/lexiconBatch2.ts,138,Roemische Kamille,Chamaemelum nobile,medicinal_requires_external_evidence +medicinal,constants/lexiconBatch2.ts,101,Kamille,Chamomilla recutita,medicinal_requires_external_evidence +medicinal,constants/lexiconBatch2.ts,160,Maigloeckchen,Convallaria majalis,medicinal_requires_external_evidence +medicinal,constants/lexiconBatch2.ts,74,Kurkuma,Curcuma longa,medicinal_requires_external_evidence +medicinal,constants/lexiconBatch2.ts,109,Roter Fingerhut,Digitalis purpurea,medicinal_requires_external_evidence +medicinal,constants/lexiconBatch2.ts,106,Sonnenhut,Echinacea purpurea,medicinal_requires_external_evidence +medicinal,constants/lexiconBatch2.ts,210,Eukalyptus,Eucalyptus globulus,medicinal_requires_external_evidence +medicinal,constants/lexiconBatch2.ts,216,Ginkgo,Ginkgo biloba,medicinal_requires_external_evidence +medicinal,constants/lexiconBatch2.ts,119,Zaubernuss,Hamamelis mollis,medicinal_requires_external_evidence +medicinal,constants/lexiconBatch2.ts,105,Johanniskraut,Hypericum perforatum,medicinal_requires_external_evidence +medicinal,constants/lexiconBatch1.ts,23,Echter Lavendel,Lavandula angustifolia,medicinal_requires_external_evidence +medicinal,constants/lexiconBatch2.ts,102,Zitronenmelisse,Melissa officinalis,medicinal_requires_external_evidence +medicinal,constants/lexiconBatch1.ts,25,Basilikum,Ocimum basilicum,medicinal_requires_external_evidence +medicinal,constants/lexiconBatch1.ts,28,Oregano,Origanum vulgare,medicinal_requires_external_evidence +medicinal,constants/lexiconBatch1.ts,31,Rosengeranie,Pelargonium graveolens,medicinal_requires_external_evidence +medicinal,constants/lexiconBatch1.ts,24,Rosmarin,Rosmarinus officinalis,medicinal_requires_external_evidence +medicinal,constants/lexiconBatch2.ts,113,Silber-Weide,Salix alba,medicinal_requires_external_evidence +medicinal,constants/lexiconBatch2.ts,103,Salbei,Salvia officinalis,medicinal_requires_external_evidence +medicinal,constants/lexiconBatch2.ts,112,Schwarzer Holunder,Sambucus nigra,medicinal_requires_external_evidence +medicinal,constants/lexiconBatch1.ts,27,Thymian,Thymus vulgaris,medicinal_requires_external_evidence +medicinal,constants/lexiconBatch2.ts,111,Grosse Brennessel,Urtica dioica,medicinal_requires_external_evidence +medicinal,constants/lexiconBatch2.ts,104,Baldrian,Valeriana officinalis,medicinal_requires_external_evidence +medicinal,constants/lexiconBatch2.ts,192,Koenigskerze,Verbascum thapsus,medicinal_requires_external_evidence +medicinal,constants/lexiconBatch2.ts,75,Ingwer,Zingiber officinale,medicinal_requires_external_evidence +patterned,constants/lexiconBatch2.ts,240,Calathea lancifolia,Goeppertia insignis,pet_friendly_requires_external_evidence +patterned,constants/lexiconBatch2.ts,241,Calathea ornata,Goeppertia ornata,pet_friendly_requires_external_evidence +patterned,constants/lexiconBatch1.ts,51,Gebet-Pflanze,Maranta leuconeura,pet_friendly_requires_external_evidence +patterned,constants/lexiconBatch2.ts,229,Wassermelonen-Peperomie,Peperomia argyreia,pet_friendly_requires_external_evidence +patterned,constants/lexiconBatch2.ts,228,Aluminium-Pflanze,Pilea cadierei,pet_friendly_requires_external_evidence +pet_friendly,constants/lexiconBatch1.ts,43,Bergpalme,Chamaedorea elegans,air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence +pet_friendly,constants/lexiconBatch1.ts,42,Goldfruchtpalme,Dypsis lutescens,air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence +pet_friendly,constants/lexiconBatch2.ts,100,Erdbeere,Fragaria ananassa,pet_friendly_requires_external_evidence +pet_friendly,constants/lexiconBatch2.ts,240,Calathea lancifolia,Goeppertia insignis,pet_friendly_requires_external_evidence +pet_friendly,constants/lexiconBatch2.ts,241,Calathea ornata,Goeppertia ornata,pet_friendly_requires_external_evidence +pet_friendly,constants/lexiconBatch2.ts,3,Kentia-Palme,Howea forsteriana,pet_friendly_requires_external_evidence +pet_friendly,constants/lexiconBatch1.ts,51,Gebet-Pflanze,Maranta leuconeura,pet_friendly_requires_external_evidence +pet_friendly,constants/lexiconBatch2.ts,229,Wassermelonen-Peperomie,Peperomia argyreia,pet_friendly_requires_external_evidence +pet_friendly,constants/lexiconBatch1.ts,102,Rippenpeperomie,Peperomia caperata,pet_friendly_requires_external_evidence +pet_friendly,constants/lexiconBatch1.ts,103,Spiegelpeperomie,Peperomia obtusifolia,pet_friendly_requires_external_evidence +pet_friendly,constants/lexiconBatch2.ts,230,Raindrop-Peperomie,Peperomia polybotrya,pet_friendly_requires_external_evidence +pet_friendly,constants/lexiconBatch1.ts,34,Petunie,Petunia hybrida,pet_friendly_requires_external_evidence +pet_friendly,constants/lexiconBatch2.ts,228,Aluminium-Pflanze,Pilea cadierei,pet_friendly_requires_external_evidence +pet_friendly,constants/lexiconBatch1.ts,2,Ufopflanze,Pilea peperomioides,pet_friendly_requires_external_evidence +pet_friendly,constants/lexiconBatch2.ts,238,Bubikopf,Soleirolia soleirolii,pet_friendly_requires_external_evidence +succulent,constants/lexiconBatch1.ts,89,Kap-Aloe,Aloe arborescens,medicinal_requires_external_evidence +succulent,constants/lexiconBatch2.ts,18,Kap-Aloe (ferox),Aloe ferox,medicinal_requires_external_evidence +sun,constants/lexiconBatch2.ts,108,Schafgarbe,Achillea millefolium,medicinal_requires_external_evidence +sun,constants/lexiconBatch1.ts,89,Kap-Aloe,Aloe arborescens,medicinal_requires_external_evidence +sun,constants/lexiconBatch2.ts,18,Kap-Aloe (ferox),Aloe ferox,medicinal_requires_external_evidence +sun,constants/lexiconBatch2.ts,107,Arnika,Arnica montana,medicinal_requires_external_evidence +sun,constants/lexiconBatch2.ts,110,Wermut,Artemisia absinthium,medicinal_requires_external_evidence +sun,constants/lexiconBatch2.ts,187,Ringelblume,Calendula officinalis,medicinal_requires_external_evidence +sun,constants/lexiconBatch2.ts,92,Chili,Capsicum annuum,medicinal_requires_external_evidence +sun,constants/lexiconBatch2.ts,138,Roemische Kamille,Chamaemelum nobile,medicinal_requires_external_evidence +sun,constants/lexiconBatch2.ts,101,Kamille,Chamomilla recutita,medicinal_requires_external_evidence +sun,constants/lexiconBatch2.ts,106,Sonnenhut,Echinacea purpurea,medicinal_requires_external_evidence +sun,constants/lexiconBatch2.ts,210,Eukalyptus,Eucalyptus globulus,medicinal_requires_external_evidence +sun,constants/lexiconBatch2.ts,100,Erdbeere,Fragaria ananassa,pet_friendly_requires_external_evidence +sun,constants/lexiconBatch2.ts,216,Ginkgo,Ginkgo biloba,medicinal_requires_external_evidence +sun,constants/lexiconBatch2.ts,105,Johanniskraut,Hypericum perforatum,medicinal_requires_external_evidence +sun,constants/lexiconBatch1.ts,23,Echter Lavendel,Lavandula angustifolia,medicinal_requires_external_evidence +sun,constants/lexiconBatch1.ts,25,Basilikum,Ocimum basilicum,medicinal_requires_external_evidence +sun,constants/lexiconBatch1.ts,28,Oregano,Origanum vulgare,medicinal_requires_external_evidence +sun,constants/lexiconBatch1.ts,31,Rosengeranie,Pelargonium graveolens,medicinal_requires_external_evidence +sun,constants/lexiconBatch1.ts,34,Petunie,Petunia hybrida,pet_friendly_requires_external_evidence +sun,constants/lexiconBatch1.ts,24,Rosmarin,Rosmarinus officinalis,medicinal_requires_external_evidence +sun,constants/lexiconBatch2.ts,103,Salbei,Salvia officinalis,medicinal_requires_external_evidence +sun,constants/lexiconBatch1.ts,27,Thymian,Thymus vulgaris,medicinal_requires_external_evidence +sun,constants/lexiconBatch2.ts,192,Koenigskerze,Verbascum thapsus,medicinal_requires_external_evidence +tree,constants/lexiconBatch2.ts,114,Hange-Birke,Betula pendula,medicinal_requires_external_evidence +tree,constants/lexiconBatch1.ts,43,Bergpalme,Chamaedorea elegans,air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence +tree,constants/lexiconBatch1.ts,14,Maisstrauch,Dracaena fragrans,air_purifier_requires_external_evidence +tree,constants/lexiconBatch1.ts,13,Drachenbaum,Dracaena marginata,air_purifier_requires_external_evidence +tree,constants/lexiconBatch1.ts,42,Goldfruchtpalme,Dypsis lutescens,air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence +tree,constants/lexiconBatch2.ts,210,Eukalyptus,Eucalyptus globulus,medicinal_requires_external_evidence +tree,constants/lexiconBatch1.ts,1,Birkenfeige,Ficus benjamina,air_purifier_requires_external_evidence +tree,constants/lexiconBatch1.ts,38,Gummibaum,Ficus elastica,air_purifier_requires_external_evidence +tree,constants/lexiconBatch2.ts,216,Ginkgo,Ginkgo biloba,medicinal_requires_external_evidence +tree,constants/lexiconBatch2.ts,3,Kentia-Palme,Howea forsteriana,pet_friendly_requires_external_evidence +tree,constants/lexiconBatch2.ts,113,Silber-Weide,Salix alba,medicinal_requires_external_evidence +tree,constants/lexiconBatch2.ts,112,Schwarzer Holunder,Sambucus nigra,medicinal_requires_external_evidence +tree,constants/lexiconBatch2.ts,10,Strahlenaralie,Schefflera arboricola,air_purifier_requires_external_evidence diff --git a/audits/semantic-search/suspicious.json b/audits/semantic-search/suspicious.json index 7cc72ad..62e3544 100644 --- a/audits/semantic-search/suspicious.json +++ b/audits/semantic-search/suspicious.json @@ -1,1298 +1,1298 @@ -[ - { - "category": "air_purifier", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 43, - "name": "Bergpalme", - "botanical_name": "Chamaedorea elegans", - "risk_flags": "air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence" - }, - { - "category": "air_purifier", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 48, - "name": "Dieffenbachie", - "botanical_name": "Dieffenbachia seguine", - "risk_flags": "air_purifier_requires_external_evidence" - }, - { - "category": "air_purifier", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 14, - "name": "Maisstrauch", - "botanical_name": "Dracaena fragrans", - "risk_flags": "air_purifier_requires_external_evidence" - }, - { - "category": "air_purifier", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 13, - "name": "Drachenbaum", - "botanical_name": "Dracaena marginata", - "risk_flags": "air_purifier_requires_external_evidence" - }, - { - "category": "air_purifier", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 42, - "name": "Goldfruchtpalme", - "botanical_name": "Dypsis lutescens", - "risk_flags": "air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence" - }, - { - "category": "air_purifier", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 16, - "name": "Marmor-Efeutute", - "botanical_name": "Epipremnum aureum Marble Queen", - "risk_flags": "air_purifier_requires_external_evidence" - }, - { - "category": "air_purifier", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 53, - "name": "Neon-Efeutute", - "botanical_name": "Epipremnum pinnatum Neon", - "risk_flags": "air_purifier_requires_external_evidence" - }, - { - "category": "air_purifier", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 1, - "name": "Birkenfeige", - "botanical_name": "Ficus benjamina", - "risk_flags": "air_purifier_requires_external_evidence" - }, - { - "category": "air_purifier", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 38, - "name": "Gummibaum", - "botanical_name": "Ficus elastica", - "risk_flags": "air_purifier_requires_external_evidence" - }, - { - "category": "air_purifier", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 68, - "name": "Gerbera", - "botanical_name": "Gerbera jamesonii", - "risk_flags": "air_purifier_requires_external_evidence" - }, - { - "category": "air_purifier", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 37, - "name": "Efeu", - "botanical_name": "Hedera helix", - "risk_flags": "air_purifier_requires_external_evidence" - }, - { - "category": "air_purifier", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 10, - "name": "Strahlenaralie", - "botanical_name": "Schefflera arboricola", - "risk_flags": "air_purifier_requires_external_evidence" - }, - { - "category": "bright_light", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 68, - "name": "Gerbera", - "botanical_name": "Gerbera jamesonii", - "risk_flags": "air_purifier_requires_external_evidence" - }, - { - "category": "bright_light", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 23, - "name": "Echter Lavendel", - "botanical_name": "Lavandula angustifolia", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "easy", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 89, - "name": "Kap-Aloe", - "botanical_name": "Aloe arborescens", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "easy", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 92, - "name": "Chili", - "botanical_name": "Capsicum annuum", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "easy", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 43, - "name": "Bergpalme", - "botanical_name": "Chamaedorea elegans", - "risk_flags": "air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence" - }, - { - "category": "easy", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 138, - "name": "Roemische Kamille", - "botanical_name": "Chamaemelum nobile", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "easy", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 101, - "name": "Kamille", - "botanical_name": "Chamomilla recutita", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "easy", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 48, - "name": "Dieffenbachie", - "botanical_name": "Dieffenbachia seguine", - "risk_flags": "air_purifier_requires_external_evidence" - }, - { - "category": "easy", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 14, - "name": "Maisstrauch", - "botanical_name": "Dracaena fragrans", - "risk_flags": "air_purifier_requires_external_evidence" - }, - { - "category": "easy", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 13, - "name": "Drachenbaum", - "botanical_name": "Dracaena marginata", - "risk_flags": "air_purifier_requires_external_evidence" - }, - { - "category": "easy", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 16, - "name": "Marmor-Efeutute", - "botanical_name": "Epipremnum aureum Marble Queen", - "risk_flags": "air_purifier_requires_external_evidence" - }, - { - "category": "easy", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 53, - "name": "Neon-Efeutute", - "botanical_name": "Epipremnum pinnatum Neon", - "risk_flags": "air_purifier_requires_external_evidence" - }, - { - "category": "easy", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 38, - "name": "Gummibaum", - "botanical_name": "Ficus elastica", - "risk_flags": "air_purifier_requires_external_evidence" - }, - { - "category": "easy", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 100, - "name": "Erdbeere", - "botanical_name": "Fragaria ananassa", - "risk_flags": "pet_friendly_requires_external_evidence" - }, - { - "category": "easy", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 37, - "name": "Efeu", - "botanical_name": "Hedera helix", - "risk_flags": "air_purifier_requires_external_evidence" - }, - { - "category": "easy", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 102, - "name": "Zitronenmelisse", - "botanical_name": "Melissa officinalis", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "easy", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 25, - "name": "Basilikum", - "botanical_name": "Ocimum basilicum", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "easy", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 28, - "name": "Oregano", - "botanical_name": "Origanum vulgare", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "easy", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 31, - "name": "Rosengeranie", - "botanical_name": "Pelargonium graveolens", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "easy", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 102, - "name": "Rippenpeperomie", - "botanical_name": "Peperomia caperata", - "risk_flags": "pet_friendly_requires_external_evidence" - }, - { - "category": "easy", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 103, - "name": "Spiegelpeperomie", - "botanical_name": "Peperomia obtusifolia", - "risk_flags": "pet_friendly_requires_external_evidence" - }, - { - "category": "easy", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 230, - "name": "Raindrop-Peperomie", - "botanical_name": "Peperomia polybotrya", - "risk_flags": "pet_friendly_requires_external_evidence" - }, - { - "category": "easy", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 34, - "name": "Petunie", - "botanical_name": "Petunia hybrida", - "risk_flags": "pet_friendly_requires_external_evidence" - }, - { - "category": "easy", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 228, - "name": "Aluminium-Pflanze", - "botanical_name": "Pilea cadierei", - "risk_flags": "pet_friendly_requires_external_evidence" - }, - { - "category": "easy", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 2, - "name": "Ufopflanze", - "botanical_name": "Pilea peperomioides", - "risk_flags": "pet_friendly_requires_external_evidence" - }, - { - "category": "easy", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 24, - "name": "Rosmarin", - "botanical_name": "Rosmarinus officinalis", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "easy", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 103, - "name": "Salbei", - "botanical_name": "Salvia officinalis", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "easy", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 10, - "name": "Strahlenaralie", - "botanical_name": "Schefflera arboricola", - "risk_flags": "air_purifier_requires_external_evidence" - }, - { - "category": "easy", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 27, - "name": "Thymian", - "botanical_name": "Thymus vulgaris", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "flowering", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 108, - "name": "Schafgarbe", - "botanical_name": "Achillea millefolium", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "flowering", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 107, - "name": "Arnika", - "botanical_name": "Arnica montana", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "flowering", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 187, - "name": "Ringelblume", - "botanical_name": "Calendula officinalis", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "flowering", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 160, - "name": "Maigloeckchen", - "botanical_name": "Convallaria majalis", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "flowering", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 109, - "name": "Roter Fingerhut", - "botanical_name": "Digitalis purpurea", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "flowering", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 106, - "name": "Sonnenhut", - "botanical_name": "Echinacea purpurea", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "flowering", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 68, - "name": "Gerbera", - "botanical_name": "Gerbera jamesonii", - "risk_flags": "air_purifier_requires_external_evidence" - }, - { - "category": "flowering", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 119, - "name": "Zaubernuss", - "botanical_name": "Hamamelis mollis", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "flowering", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 105, - "name": "Johanniskraut", - "botanical_name": "Hypericum perforatum", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "flowering", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 34, - "name": "Petunie", - "botanical_name": "Petunia hybrida", - "risk_flags": "pet_friendly_requires_external_evidence" - }, - { - "category": "flowering", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 112, - "name": "Schwarzer Holunder", - "botanical_name": "Sambucus nigra", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "flowering", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 104, - "name": "Baldrian", - "botanical_name": "Valeriana officinalis", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "flowering", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 192, - "name": "Koenigskerze", - "botanical_name": "Verbascum thapsus", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "hanging", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 16, - "name": "Marmor-Efeutute", - "botanical_name": "Epipremnum aureum Marble Queen", - "risk_flags": "air_purifier_requires_external_evidence" - }, - { - "category": "hanging", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 53, - "name": "Neon-Efeutute", - "botanical_name": "Epipremnum pinnatum Neon", - "risk_flags": "air_purifier_requires_external_evidence" - }, - { - "category": "hanging", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 37, - "name": "Efeu", - "botanical_name": "Hedera helix", - "risk_flags": "air_purifier_requires_external_evidence" - }, - { - "category": "high_humidity", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 74, - "name": "Kurkuma", - "botanical_name": "Curcuma longa", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "high_humidity", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 240, - "name": "Calathea lancifolia", - "botanical_name": "Goeppertia insignis", - "risk_flags": "pet_friendly_requires_external_evidence" - }, - { - "category": "high_humidity", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 241, - "name": "Calathea ornata", - "botanical_name": "Goeppertia ornata", - "risk_flags": "pet_friendly_requires_external_evidence" - }, - { - "category": "high_humidity", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 51, - "name": "Gebet-Pflanze", - "botanical_name": "Maranta leuconeura", - "risk_flags": "pet_friendly_requires_external_evidence" - }, - { - "category": "high_humidity", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 238, - "name": "Bubikopf", - "botanical_name": "Soleirolia soleirolii", - "risk_flags": "pet_friendly_requires_external_evidence" - }, - { - "category": "high_humidity", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 75, - "name": "Ingwer", - "botanical_name": "Zingiber officinale", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "large", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 18, - "name": "Kap-Aloe (ferox)", - "botanical_name": "Aloe ferox", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "large", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 114, - "name": "Hange-Birke", - "botanical_name": "Betula pendula", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "large", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 113, - "name": "Silber-Weide", - "botanical_name": "Salix alba", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "low_light", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 43, - "name": "Bergpalme", - "botanical_name": "Chamaedorea elegans", - "risk_flags": "air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence" - }, - { - "category": "low_light", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 48, - "name": "Dieffenbachie", - "botanical_name": "Dieffenbachia seguine", - "risk_flags": "air_purifier_requires_external_evidence" - }, - { - "category": "low_light", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 14, - "name": "Maisstrauch", - "botanical_name": "Dracaena fragrans", - "risk_flags": "air_purifier_requires_external_evidence" - }, - { - "category": "low_light", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 37, - "name": "Efeu", - "botanical_name": "Hedera helix", - "risk_flags": "air_purifier_requires_external_evidence" - }, - { - "category": "low_light", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 3, - "name": "Kentia-Palme", - "botanical_name": "Howea forsteriana", - "risk_flags": "pet_friendly_requires_external_evidence" - }, - { - "category": "low_light", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 103, - "name": "Spiegelpeperomie", - "botanical_name": "Peperomia obtusifolia", - "risk_flags": "pet_friendly_requires_external_evidence" - }, - { - "category": "medicinal", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 108, - "name": "Schafgarbe", - "botanical_name": "Achillea millefolium", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "medicinal", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 89, - "name": "Kap-Aloe", - "botanical_name": "Aloe arborescens", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "medicinal", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 18, - "name": "Kap-Aloe (ferox)", - "botanical_name": "Aloe ferox", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "medicinal", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 107, - "name": "Arnika", - "botanical_name": "Arnica montana", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "medicinal", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 110, - "name": "Wermut", - "botanical_name": "Artemisia absinthium", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "medicinal", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 114, - "name": "Hange-Birke", - "botanical_name": "Betula pendula", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "medicinal", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 187, - "name": "Ringelblume", - "botanical_name": "Calendula officinalis", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "medicinal", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 92, - "name": "Chili", - "botanical_name": "Capsicum annuum", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "medicinal", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 138, - "name": "Roemische Kamille", - "botanical_name": "Chamaemelum nobile", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "medicinal", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 101, - "name": "Kamille", - "botanical_name": "Chamomilla recutita", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "medicinal", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 160, - "name": "Maigloeckchen", - "botanical_name": "Convallaria majalis", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "medicinal", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 74, - "name": "Kurkuma", - "botanical_name": "Curcuma longa", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "medicinal", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 109, - "name": "Roter Fingerhut", - "botanical_name": "Digitalis purpurea", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "medicinal", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 106, - "name": "Sonnenhut", - "botanical_name": "Echinacea purpurea", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "medicinal", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 210, - "name": "Eukalyptus", - "botanical_name": "Eucalyptus globulus", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "medicinal", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 216, - "name": "Ginkgo", - "botanical_name": "Ginkgo biloba", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "medicinal", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 119, - "name": "Zaubernuss", - "botanical_name": "Hamamelis mollis", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "medicinal", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 105, - "name": "Johanniskraut", - "botanical_name": "Hypericum perforatum", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "medicinal", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 23, - "name": "Echter Lavendel", - "botanical_name": "Lavandula angustifolia", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "medicinal", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 102, - "name": "Zitronenmelisse", - "botanical_name": "Melissa officinalis", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "medicinal", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 25, - "name": "Basilikum", - "botanical_name": "Ocimum basilicum", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "medicinal", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 28, - "name": "Oregano", - "botanical_name": "Origanum vulgare", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "medicinal", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 31, - "name": "Rosengeranie", - "botanical_name": "Pelargonium graveolens", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "medicinal", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 24, - "name": "Rosmarin", - "botanical_name": "Rosmarinus officinalis", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "medicinal", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 113, - "name": "Silber-Weide", - "botanical_name": "Salix alba", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "medicinal", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 103, - "name": "Salbei", - "botanical_name": "Salvia officinalis", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "medicinal", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 112, - "name": "Schwarzer Holunder", - "botanical_name": "Sambucus nigra", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "medicinal", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 27, - "name": "Thymian", - "botanical_name": "Thymus vulgaris", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "medicinal", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 111, - "name": "Grosse Brennessel", - "botanical_name": "Urtica dioica", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "medicinal", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 104, - "name": "Baldrian", - "botanical_name": "Valeriana officinalis", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "medicinal", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 192, - "name": "Koenigskerze", - "botanical_name": "Verbascum thapsus", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "medicinal", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 75, - "name": "Ingwer", - "botanical_name": "Zingiber officinale", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "patterned", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 240, - "name": "Calathea lancifolia", - "botanical_name": "Goeppertia insignis", - "risk_flags": "pet_friendly_requires_external_evidence" - }, - { - "category": "patterned", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 241, - "name": "Calathea ornata", - "botanical_name": "Goeppertia ornata", - "risk_flags": "pet_friendly_requires_external_evidence" - }, - { - "category": "patterned", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 51, - "name": "Gebet-Pflanze", - "botanical_name": "Maranta leuconeura", - "risk_flags": "pet_friendly_requires_external_evidence" - }, - { - "category": "patterned", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 229, - "name": "Wassermelonen-Peperomie", - "botanical_name": "Peperomia argyreia", - "risk_flags": "pet_friendly_requires_external_evidence" - }, - { - "category": "patterned", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 228, - "name": "Aluminium-Pflanze", - "botanical_name": "Pilea cadierei", - "risk_flags": "pet_friendly_requires_external_evidence" - }, - { - "category": "pet_friendly", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 43, - "name": "Bergpalme", - "botanical_name": "Chamaedorea elegans", - "risk_flags": "air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence" - }, - { - "category": "pet_friendly", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 42, - "name": "Goldfruchtpalme", - "botanical_name": "Dypsis lutescens", - "risk_flags": "air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence" - }, - { - "category": "pet_friendly", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 100, - "name": "Erdbeere", - "botanical_name": "Fragaria ananassa", - "risk_flags": "pet_friendly_requires_external_evidence" - }, - { - "category": "pet_friendly", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 240, - "name": "Calathea lancifolia", - "botanical_name": "Goeppertia insignis", - "risk_flags": "pet_friendly_requires_external_evidence" - }, - { - "category": "pet_friendly", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 241, - "name": "Calathea ornata", - "botanical_name": "Goeppertia ornata", - "risk_flags": "pet_friendly_requires_external_evidence" - }, - { - "category": "pet_friendly", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 3, - "name": "Kentia-Palme", - "botanical_name": "Howea forsteriana", - "risk_flags": "pet_friendly_requires_external_evidence" - }, - { - "category": "pet_friendly", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 51, - "name": "Gebet-Pflanze", - "botanical_name": "Maranta leuconeura", - "risk_flags": "pet_friendly_requires_external_evidence" - }, - { - "category": "pet_friendly", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 229, - "name": "Wassermelonen-Peperomie", - "botanical_name": "Peperomia argyreia", - "risk_flags": "pet_friendly_requires_external_evidence" - }, - { - "category": "pet_friendly", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 102, - "name": "Rippenpeperomie", - "botanical_name": "Peperomia caperata", - "risk_flags": "pet_friendly_requires_external_evidence" - }, - { - "category": "pet_friendly", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 103, - "name": "Spiegelpeperomie", - "botanical_name": "Peperomia obtusifolia", - "risk_flags": "pet_friendly_requires_external_evidence" - }, - { - "category": "pet_friendly", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 230, - "name": "Raindrop-Peperomie", - "botanical_name": "Peperomia polybotrya", - "risk_flags": "pet_friendly_requires_external_evidence" - }, - { - "category": "pet_friendly", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 34, - "name": "Petunie", - "botanical_name": "Petunia hybrida", - "risk_flags": "pet_friendly_requires_external_evidence" - }, - { - "category": "pet_friendly", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 228, - "name": "Aluminium-Pflanze", - "botanical_name": "Pilea cadierei", - "risk_flags": "pet_friendly_requires_external_evidence" - }, - { - "category": "pet_friendly", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 2, - "name": "Ufopflanze", - "botanical_name": "Pilea peperomioides", - "risk_flags": "pet_friendly_requires_external_evidence" - }, - { - "category": "pet_friendly", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 238, - "name": "Bubikopf", - "botanical_name": "Soleirolia soleirolii", - "risk_flags": "pet_friendly_requires_external_evidence" - }, - { - "category": "succulent", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 89, - "name": "Kap-Aloe", - "botanical_name": "Aloe arborescens", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "succulent", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 18, - "name": "Kap-Aloe (ferox)", - "botanical_name": "Aloe ferox", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "sun", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 108, - "name": "Schafgarbe", - "botanical_name": "Achillea millefolium", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "sun", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 89, - "name": "Kap-Aloe", - "botanical_name": "Aloe arborescens", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "sun", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 18, - "name": "Kap-Aloe (ferox)", - "botanical_name": "Aloe ferox", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "sun", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 107, - "name": "Arnika", - "botanical_name": "Arnica montana", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "sun", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 110, - "name": "Wermut", - "botanical_name": "Artemisia absinthium", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "sun", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 187, - "name": "Ringelblume", - "botanical_name": "Calendula officinalis", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "sun", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 92, - "name": "Chili", - "botanical_name": "Capsicum annuum", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "sun", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 138, - "name": "Roemische Kamille", - "botanical_name": "Chamaemelum nobile", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "sun", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 101, - "name": "Kamille", - "botanical_name": "Chamomilla recutita", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "sun", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 106, - "name": "Sonnenhut", - "botanical_name": "Echinacea purpurea", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "sun", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 210, - "name": "Eukalyptus", - "botanical_name": "Eucalyptus globulus", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "sun", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 100, - "name": "Erdbeere", - "botanical_name": "Fragaria ananassa", - "risk_flags": "pet_friendly_requires_external_evidence" - }, - { - "category": "sun", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 216, - "name": "Ginkgo", - "botanical_name": "Ginkgo biloba", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "sun", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 105, - "name": "Johanniskraut", - "botanical_name": "Hypericum perforatum", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "sun", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 23, - "name": "Echter Lavendel", - "botanical_name": "Lavandula angustifolia", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "sun", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 25, - "name": "Basilikum", - "botanical_name": "Ocimum basilicum", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "sun", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 28, - "name": "Oregano", - "botanical_name": "Origanum vulgare", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "sun", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 31, - "name": "Rosengeranie", - "botanical_name": "Pelargonium graveolens", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "sun", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 34, - "name": "Petunie", - "botanical_name": "Petunia hybrida", - "risk_flags": "pet_friendly_requires_external_evidence" - }, - { - "category": "sun", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 24, - "name": "Rosmarin", - "botanical_name": "Rosmarinus officinalis", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "sun", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 103, - "name": "Salbei", - "botanical_name": "Salvia officinalis", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "sun", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 27, - "name": "Thymian", - "botanical_name": "Thymus vulgaris", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "sun", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 192, - "name": "Koenigskerze", - "botanical_name": "Verbascum thapsus", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "tree", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 114, - "name": "Hange-Birke", - "botanical_name": "Betula pendula", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "tree", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 43, - "name": "Bergpalme", - "botanical_name": "Chamaedorea elegans", - "risk_flags": "air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence" - }, - { - "category": "tree", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 14, - "name": "Maisstrauch", - "botanical_name": "Dracaena fragrans", - "risk_flags": "air_purifier_requires_external_evidence" - }, - { - "category": "tree", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 13, - "name": "Drachenbaum", - "botanical_name": "Dracaena marginata", - "risk_flags": "air_purifier_requires_external_evidence" - }, - { - "category": "tree", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 42, - "name": "Goldfruchtpalme", - "botanical_name": "Dypsis lutescens", - "risk_flags": "air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence" - }, - { - "category": "tree", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 210, - "name": "Eukalyptus", - "botanical_name": "Eucalyptus globulus", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "tree", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 1, - "name": "Birkenfeige", - "botanical_name": "Ficus benjamina", - "risk_flags": "air_purifier_requires_external_evidence" - }, - { - "category": "tree", - "source_file": "constants/lexiconBatch1.ts", - "source_index": 38, - "name": "Gummibaum", - "botanical_name": "Ficus elastica", - "risk_flags": "air_purifier_requires_external_evidence" - }, - { - "category": "tree", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 216, - "name": "Ginkgo", - "botanical_name": "Ginkgo biloba", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "tree", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 3, - "name": "Kentia-Palme", - "botanical_name": "Howea forsteriana", - "risk_flags": "pet_friendly_requires_external_evidence" - }, - { - "category": "tree", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 113, - "name": "Silber-Weide", - "botanical_name": "Salix alba", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "tree", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 112, - "name": "Schwarzer Holunder", - "botanical_name": "Sambucus nigra", - "risk_flags": "medicinal_requires_external_evidence" - }, - { - "category": "tree", - "source_file": "constants/lexiconBatch2.ts", - "source_index": 10, - "name": "Strahlenaralie", - "botanical_name": "Schefflera arboricola", - "risk_flags": "air_purifier_requires_external_evidence" - } -] +[ + { + "category": "air_purifier", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 43, + "name": "Bergpalme", + "botanical_name": "Chamaedorea elegans", + "risk_flags": "air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence" + }, + { + "category": "air_purifier", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 48, + "name": "Dieffenbachie", + "botanical_name": "Dieffenbachia seguine", + "risk_flags": "air_purifier_requires_external_evidence" + }, + { + "category": "air_purifier", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 14, + "name": "Maisstrauch", + "botanical_name": "Dracaena fragrans", + "risk_flags": "air_purifier_requires_external_evidence" + }, + { + "category": "air_purifier", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 13, + "name": "Drachenbaum", + "botanical_name": "Dracaena marginata", + "risk_flags": "air_purifier_requires_external_evidence" + }, + { + "category": "air_purifier", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 42, + "name": "Goldfruchtpalme", + "botanical_name": "Dypsis lutescens", + "risk_flags": "air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence" + }, + { + "category": "air_purifier", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 16, + "name": "Marmor-Efeutute", + "botanical_name": "Epipremnum aureum Marble Queen", + "risk_flags": "air_purifier_requires_external_evidence" + }, + { + "category": "air_purifier", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 53, + "name": "Neon-Efeutute", + "botanical_name": "Epipremnum pinnatum Neon", + "risk_flags": "air_purifier_requires_external_evidence" + }, + { + "category": "air_purifier", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 1, + "name": "Birkenfeige", + "botanical_name": "Ficus benjamina", + "risk_flags": "air_purifier_requires_external_evidence" + }, + { + "category": "air_purifier", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 38, + "name": "Gummibaum", + "botanical_name": "Ficus elastica", + "risk_flags": "air_purifier_requires_external_evidence" + }, + { + "category": "air_purifier", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 68, + "name": "Gerbera", + "botanical_name": "Gerbera jamesonii", + "risk_flags": "air_purifier_requires_external_evidence" + }, + { + "category": "air_purifier", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 37, + "name": "Efeu", + "botanical_name": "Hedera helix", + "risk_flags": "air_purifier_requires_external_evidence" + }, + { + "category": "air_purifier", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 10, + "name": "Strahlenaralie", + "botanical_name": "Schefflera arboricola", + "risk_flags": "air_purifier_requires_external_evidence" + }, + { + "category": "bright_light", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 68, + "name": "Gerbera", + "botanical_name": "Gerbera jamesonii", + "risk_flags": "air_purifier_requires_external_evidence" + }, + { + "category": "bright_light", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 23, + "name": "Echter Lavendel", + "botanical_name": "Lavandula angustifolia", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "easy", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 89, + "name": "Kap-Aloe", + "botanical_name": "Aloe arborescens", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "easy", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 92, + "name": "Chili", + "botanical_name": "Capsicum annuum", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "easy", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 43, + "name": "Bergpalme", + "botanical_name": "Chamaedorea elegans", + "risk_flags": "air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence" + }, + { + "category": "easy", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 138, + "name": "Roemische Kamille", + "botanical_name": "Chamaemelum nobile", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "easy", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 101, + "name": "Kamille", + "botanical_name": "Chamomilla recutita", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "easy", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 48, + "name": "Dieffenbachie", + "botanical_name": "Dieffenbachia seguine", + "risk_flags": "air_purifier_requires_external_evidence" + }, + { + "category": "easy", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 14, + "name": "Maisstrauch", + "botanical_name": "Dracaena fragrans", + "risk_flags": "air_purifier_requires_external_evidence" + }, + { + "category": "easy", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 13, + "name": "Drachenbaum", + "botanical_name": "Dracaena marginata", + "risk_flags": "air_purifier_requires_external_evidence" + }, + { + "category": "easy", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 16, + "name": "Marmor-Efeutute", + "botanical_name": "Epipremnum aureum Marble Queen", + "risk_flags": "air_purifier_requires_external_evidence" + }, + { + "category": "easy", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 53, + "name": "Neon-Efeutute", + "botanical_name": "Epipremnum pinnatum Neon", + "risk_flags": "air_purifier_requires_external_evidence" + }, + { + "category": "easy", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 38, + "name": "Gummibaum", + "botanical_name": "Ficus elastica", + "risk_flags": "air_purifier_requires_external_evidence" + }, + { + "category": "easy", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 100, + "name": "Erdbeere", + "botanical_name": "Fragaria ananassa", + "risk_flags": "pet_friendly_requires_external_evidence" + }, + { + "category": "easy", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 37, + "name": "Efeu", + "botanical_name": "Hedera helix", + "risk_flags": "air_purifier_requires_external_evidence" + }, + { + "category": "easy", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 102, + "name": "Zitronenmelisse", + "botanical_name": "Melissa officinalis", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "easy", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 25, + "name": "Basilikum", + "botanical_name": "Ocimum basilicum", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "easy", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 28, + "name": "Oregano", + "botanical_name": "Origanum vulgare", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "easy", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 31, + "name": "Rosengeranie", + "botanical_name": "Pelargonium graveolens", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "easy", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 102, + "name": "Rippenpeperomie", + "botanical_name": "Peperomia caperata", + "risk_flags": "pet_friendly_requires_external_evidence" + }, + { + "category": "easy", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 103, + "name": "Spiegelpeperomie", + "botanical_name": "Peperomia obtusifolia", + "risk_flags": "pet_friendly_requires_external_evidence" + }, + { + "category": "easy", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 230, + "name": "Raindrop-Peperomie", + "botanical_name": "Peperomia polybotrya", + "risk_flags": "pet_friendly_requires_external_evidence" + }, + { + "category": "easy", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 34, + "name": "Petunie", + "botanical_name": "Petunia hybrida", + "risk_flags": "pet_friendly_requires_external_evidence" + }, + { + "category": "easy", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 228, + "name": "Aluminium-Pflanze", + "botanical_name": "Pilea cadierei", + "risk_flags": "pet_friendly_requires_external_evidence" + }, + { + "category": "easy", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 2, + "name": "Ufopflanze", + "botanical_name": "Pilea peperomioides", + "risk_flags": "pet_friendly_requires_external_evidence" + }, + { + "category": "easy", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 24, + "name": "Rosmarin", + "botanical_name": "Rosmarinus officinalis", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "easy", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 103, + "name": "Salbei", + "botanical_name": "Salvia officinalis", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "easy", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 10, + "name": "Strahlenaralie", + "botanical_name": "Schefflera arboricola", + "risk_flags": "air_purifier_requires_external_evidence" + }, + { + "category": "easy", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 27, + "name": "Thymian", + "botanical_name": "Thymus vulgaris", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "flowering", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 108, + "name": "Schafgarbe", + "botanical_name": "Achillea millefolium", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "flowering", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 107, + "name": "Arnika", + "botanical_name": "Arnica montana", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "flowering", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 187, + "name": "Ringelblume", + "botanical_name": "Calendula officinalis", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "flowering", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 160, + "name": "Maigloeckchen", + "botanical_name": "Convallaria majalis", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "flowering", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 109, + "name": "Roter Fingerhut", + "botanical_name": "Digitalis purpurea", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "flowering", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 106, + "name": "Sonnenhut", + "botanical_name": "Echinacea purpurea", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "flowering", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 68, + "name": "Gerbera", + "botanical_name": "Gerbera jamesonii", + "risk_flags": "air_purifier_requires_external_evidence" + }, + { + "category": "flowering", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 119, + "name": "Zaubernuss", + "botanical_name": "Hamamelis mollis", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "flowering", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 105, + "name": "Johanniskraut", + "botanical_name": "Hypericum perforatum", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "flowering", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 34, + "name": "Petunie", + "botanical_name": "Petunia hybrida", + "risk_flags": "pet_friendly_requires_external_evidence" + }, + { + "category": "flowering", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 112, + "name": "Schwarzer Holunder", + "botanical_name": "Sambucus nigra", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "flowering", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 104, + "name": "Baldrian", + "botanical_name": "Valeriana officinalis", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "flowering", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 192, + "name": "Koenigskerze", + "botanical_name": "Verbascum thapsus", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "hanging", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 16, + "name": "Marmor-Efeutute", + "botanical_name": "Epipremnum aureum Marble Queen", + "risk_flags": "air_purifier_requires_external_evidence" + }, + { + "category": "hanging", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 53, + "name": "Neon-Efeutute", + "botanical_name": "Epipremnum pinnatum Neon", + "risk_flags": "air_purifier_requires_external_evidence" + }, + { + "category": "hanging", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 37, + "name": "Efeu", + "botanical_name": "Hedera helix", + "risk_flags": "air_purifier_requires_external_evidence" + }, + { + "category": "high_humidity", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 74, + "name": "Kurkuma", + "botanical_name": "Curcuma longa", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "high_humidity", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 240, + "name": "Calathea lancifolia", + "botanical_name": "Goeppertia insignis", + "risk_flags": "pet_friendly_requires_external_evidence" + }, + { + "category": "high_humidity", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 241, + "name": "Calathea ornata", + "botanical_name": "Goeppertia ornata", + "risk_flags": "pet_friendly_requires_external_evidence" + }, + { + "category": "high_humidity", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 51, + "name": "Gebet-Pflanze", + "botanical_name": "Maranta leuconeura", + "risk_flags": "pet_friendly_requires_external_evidence" + }, + { + "category": "high_humidity", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 238, + "name": "Bubikopf", + "botanical_name": "Soleirolia soleirolii", + "risk_flags": "pet_friendly_requires_external_evidence" + }, + { + "category": "high_humidity", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 75, + "name": "Ingwer", + "botanical_name": "Zingiber officinale", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "large", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 18, + "name": "Kap-Aloe (ferox)", + "botanical_name": "Aloe ferox", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "large", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 114, + "name": "Hange-Birke", + "botanical_name": "Betula pendula", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "large", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 113, + "name": "Silber-Weide", + "botanical_name": "Salix alba", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "low_light", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 43, + "name": "Bergpalme", + "botanical_name": "Chamaedorea elegans", + "risk_flags": "air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence" + }, + { + "category": "low_light", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 48, + "name": "Dieffenbachie", + "botanical_name": "Dieffenbachia seguine", + "risk_flags": "air_purifier_requires_external_evidence" + }, + { + "category": "low_light", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 14, + "name": "Maisstrauch", + "botanical_name": "Dracaena fragrans", + "risk_flags": "air_purifier_requires_external_evidence" + }, + { + "category": "low_light", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 37, + "name": "Efeu", + "botanical_name": "Hedera helix", + "risk_flags": "air_purifier_requires_external_evidence" + }, + { + "category": "low_light", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 3, + "name": "Kentia-Palme", + "botanical_name": "Howea forsteriana", + "risk_flags": "pet_friendly_requires_external_evidence" + }, + { + "category": "low_light", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 103, + "name": "Spiegelpeperomie", + "botanical_name": "Peperomia obtusifolia", + "risk_flags": "pet_friendly_requires_external_evidence" + }, + { + "category": "medicinal", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 108, + "name": "Schafgarbe", + "botanical_name": "Achillea millefolium", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "medicinal", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 89, + "name": "Kap-Aloe", + "botanical_name": "Aloe arborescens", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "medicinal", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 18, + "name": "Kap-Aloe (ferox)", + "botanical_name": "Aloe ferox", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "medicinal", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 107, + "name": "Arnika", + "botanical_name": "Arnica montana", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "medicinal", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 110, + "name": "Wermut", + "botanical_name": "Artemisia absinthium", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "medicinal", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 114, + "name": "Hange-Birke", + "botanical_name": "Betula pendula", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "medicinal", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 187, + "name": "Ringelblume", + "botanical_name": "Calendula officinalis", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "medicinal", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 92, + "name": "Chili", + "botanical_name": "Capsicum annuum", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "medicinal", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 138, + "name": "Roemische Kamille", + "botanical_name": "Chamaemelum nobile", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "medicinal", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 101, + "name": "Kamille", + "botanical_name": "Chamomilla recutita", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "medicinal", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 160, + "name": "Maigloeckchen", + "botanical_name": "Convallaria majalis", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "medicinal", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 74, + "name": "Kurkuma", + "botanical_name": "Curcuma longa", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "medicinal", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 109, + "name": "Roter Fingerhut", + "botanical_name": "Digitalis purpurea", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "medicinal", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 106, + "name": "Sonnenhut", + "botanical_name": "Echinacea purpurea", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "medicinal", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 210, + "name": "Eukalyptus", + "botanical_name": "Eucalyptus globulus", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "medicinal", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 216, + "name": "Ginkgo", + "botanical_name": "Ginkgo biloba", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "medicinal", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 119, + "name": "Zaubernuss", + "botanical_name": "Hamamelis mollis", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "medicinal", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 105, + "name": "Johanniskraut", + "botanical_name": "Hypericum perforatum", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "medicinal", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 23, + "name": "Echter Lavendel", + "botanical_name": "Lavandula angustifolia", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "medicinal", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 102, + "name": "Zitronenmelisse", + "botanical_name": "Melissa officinalis", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "medicinal", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 25, + "name": "Basilikum", + "botanical_name": "Ocimum basilicum", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "medicinal", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 28, + "name": "Oregano", + "botanical_name": "Origanum vulgare", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "medicinal", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 31, + "name": "Rosengeranie", + "botanical_name": "Pelargonium graveolens", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "medicinal", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 24, + "name": "Rosmarin", + "botanical_name": "Rosmarinus officinalis", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "medicinal", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 113, + "name": "Silber-Weide", + "botanical_name": "Salix alba", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "medicinal", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 103, + "name": "Salbei", + "botanical_name": "Salvia officinalis", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "medicinal", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 112, + "name": "Schwarzer Holunder", + "botanical_name": "Sambucus nigra", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "medicinal", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 27, + "name": "Thymian", + "botanical_name": "Thymus vulgaris", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "medicinal", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 111, + "name": "Grosse Brennessel", + "botanical_name": "Urtica dioica", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "medicinal", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 104, + "name": "Baldrian", + "botanical_name": "Valeriana officinalis", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "medicinal", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 192, + "name": "Koenigskerze", + "botanical_name": "Verbascum thapsus", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "medicinal", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 75, + "name": "Ingwer", + "botanical_name": "Zingiber officinale", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "patterned", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 240, + "name": "Calathea lancifolia", + "botanical_name": "Goeppertia insignis", + "risk_flags": "pet_friendly_requires_external_evidence" + }, + { + "category": "patterned", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 241, + "name": "Calathea ornata", + "botanical_name": "Goeppertia ornata", + "risk_flags": "pet_friendly_requires_external_evidence" + }, + { + "category": "patterned", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 51, + "name": "Gebet-Pflanze", + "botanical_name": "Maranta leuconeura", + "risk_flags": "pet_friendly_requires_external_evidence" + }, + { + "category": "patterned", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 229, + "name": "Wassermelonen-Peperomie", + "botanical_name": "Peperomia argyreia", + "risk_flags": "pet_friendly_requires_external_evidence" + }, + { + "category": "patterned", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 228, + "name": "Aluminium-Pflanze", + "botanical_name": "Pilea cadierei", + "risk_flags": "pet_friendly_requires_external_evidence" + }, + { + "category": "pet_friendly", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 43, + "name": "Bergpalme", + "botanical_name": "Chamaedorea elegans", + "risk_flags": "air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence" + }, + { + "category": "pet_friendly", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 42, + "name": "Goldfruchtpalme", + "botanical_name": "Dypsis lutescens", + "risk_flags": "air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence" + }, + { + "category": "pet_friendly", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 100, + "name": "Erdbeere", + "botanical_name": "Fragaria ananassa", + "risk_flags": "pet_friendly_requires_external_evidence" + }, + { + "category": "pet_friendly", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 240, + "name": "Calathea lancifolia", + "botanical_name": "Goeppertia insignis", + "risk_flags": "pet_friendly_requires_external_evidence" + }, + { + "category": "pet_friendly", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 241, + "name": "Calathea ornata", + "botanical_name": "Goeppertia ornata", + "risk_flags": "pet_friendly_requires_external_evidence" + }, + { + "category": "pet_friendly", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 3, + "name": "Kentia-Palme", + "botanical_name": "Howea forsteriana", + "risk_flags": "pet_friendly_requires_external_evidence" + }, + { + "category": "pet_friendly", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 51, + "name": "Gebet-Pflanze", + "botanical_name": "Maranta leuconeura", + "risk_flags": "pet_friendly_requires_external_evidence" + }, + { + "category": "pet_friendly", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 229, + "name": "Wassermelonen-Peperomie", + "botanical_name": "Peperomia argyreia", + "risk_flags": "pet_friendly_requires_external_evidence" + }, + { + "category": "pet_friendly", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 102, + "name": "Rippenpeperomie", + "botanical_name": "Peperomia caperata", + "risk_flags": "pet_friendly_requires_external_evidence" + }, + { + "category": "pet_friendly", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 103, + "name": "Spiegelpeperomie", + "botanical_name": "Peperomia obtusifolia", + "risk_flags": "pet_friendly_requires_external_evidence" + }, + { + "category": "pet_friendly", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 230, + "name": "Raindrop-Peperomie", + "botanical_name": "Peperomia polybotrya", + "risk_flags": "pet_friendly_requires_external_evidence" + }, + { + "category": "pet_friendly", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 34, + "name": "Petunie", + "botanical_name": "Petunia hybrida", + "risk_flags": "pet_friendly_requires_external_evidence" + }, + { + "category": "pet_friendly", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 228, + "name": "Aluminium-Pflanze", + "botanical_name": "Pilea cadierei", + "risk_flags": "pet_friendly_requires_external_evidence" + }, + { + "category": "pet_friendly", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 2, + "name": "Ufopflanze", + "botanical_name": "Pilea peperomioides", + "risk_flags": "pet_friendly_requires_external_evidence" + }, + { + "category": "pet_friendly", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 238, + "name": "Bubikopf", + "botanical_name": "Soleirolia soleirolii", + "risk_flags": "pet_friendly_requires_external_evidence" + }, + { + "category": "succulent", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 89, + "name": "Kap-Aloe", + "botanical_name": "Aloe arborescens", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "succulent", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 18, + "name": "Kap-Aloe (ferox)", + "botanical_name": "Aloe ferox", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "sun", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 108, + "name": "Schafgarbe", + "botanical_name": "Achillea millefolium", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "sun", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 89, + "name": "Kap-Aloe", + "botanical_name": "Aloe arborescens", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "sun", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 18, + "name": "Kap-Aloe (ferox)", + "botanical_name": "Aloe ferox", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "sun", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 107, + "name": "Arnika", + "botanical_name": "Arnica montana", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "sun", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 110, + "name": "Wermut", + "botanical_name": "Artemisia absinthium", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "sun", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 187, + "name": "Ringelblume", + "botanical_name": "Calendula officinalis", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "sun", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 92, + "name": "Chili", + "botanical_name": "Capsicum annuum", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "sun", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 138, + "name": "Roemische Kamille", + "botanical_name": "Chamaemelum nobile", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "sun", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 101, + "name": "Kamille", + "botanical_name": "Chamomilla recutita", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "sun", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 106, + "name": "Sonnenhut", + "botanical_name": "Echinacea purpurea", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "sun", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 210, + "name": "Eukalyptus", + "botanical_name": "Eucalyptus globulus", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "sun", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 100, + "name": "Erdbeere", + "botanical_name": "Fragaria ananassa", + "risk_flags": "pet_friendly_requires_external_evidence" + }, + { + "category": "sun", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 216, + "name": "Ginkgo", + "botanical_name": "Ginkgo biloba", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "sun", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 105, + "name": "Johanniskraut", + "botanical_name": "Hypericum perforatum", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "sun", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 23, + "name": "Echter Lavendel", + "botanical_name": "Lavandula angustifolia", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "sun", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 25, + "name": "Basilikum", + "botanical_name": "Ocimum basilicum", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "sun", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 28, + "name": "Oregano", + "botanical_name": "Origanum vulgare", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "sun", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 31, + "name": "Rosengeranie", + "botanical_name": "Pelargonium graveolens", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "sun", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 34, + "name": "Petunie", + "botanical_name": "Petunia hybrida", + "risk_flags": "pet_friendly_requires_external_evidence" + }, + { + "category": "sun", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 24, + "name": "Rosmarin", + "botanical_name": "Rosmarinus officinalis", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "sun", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 103, + "name": "Salbei", + "botanical_name": "Salvia officinalis", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "sun", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 27, + "name": "Thymian", + "botanical_name": "Thymus vulgaris", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "sun", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 192, + "name": "Koenigskerze", + "botanical_name": "Verbascum thapsus", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "tree", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 114, + "name": "Hange-Birke", + "botanical_name": "Betula pendula", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "tree", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 43, + "name": "Bergpalme", + "botanical_name": "Chamaedorea elegans", + "risk_flags": "air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence" + }, + { + "category": "tree", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 14, + "name": "Maisstrauch", + "botanical_name": "Dracaena fragrans", + "risk_flags": "air_purifier_requires_external_evidence" + }, + { + "category": "tree", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 13, + "name": "Drachenbaum", + "botanical_name": "Dracaena marginata", + "risk_flags": "air_purifier_requires_external_evidence" + }, + { + "category": "tree", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 42, + "name": "Goldfruchtpalme", + "botanical_name": "Dypsis lutescens", + "risk_flags": "air_purifier_requires_external_evidence|pet_friendly_requires_external_evidence" + }, + { + "category": "tree", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 210, + "name": "Eukalyptus", + "botanical_name": "Eucalyptus globulus", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "tree", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 1, + "name": "Birkenfeige", + "botanical_name": "Ficus benjamina", + "risk_flags": "air_purifier_requires_external_evidence" + }, + { + "category": "tree", + "source_file": "constants/lexiconBatch1.ts", + "source_index": 38, + "name": "Gummibaum", + "botanical_name": "Ficus elastica", + "risk_flags": "air_purifier_requires_external_evidence" + }, + { + "category": "tree", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 216, + "name": "Ginkgo", + "botanical_name": "Ginkgo biloba", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "tree", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 3, + "name": "Kentia-Palme", + "botanical_name": "Howea forsteriana", + "risk_flags": "pet_friendly_requires_external_evidence" + }, + { + "category": "tree", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 113, + "name": "Silber-Weide", + "botanical_name": "Salix alba", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "tree", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 112, + "name": "Schwarzer Holunder", + "botanical_name": "Sambucus nigra", + "risk_flags": "medicinal_requires_external_evidence" + }, + { + "category": "tree", + "source_file": "constants/lexiconBatch2.ts", + "source_index": 10, + "name": "Strahlenaralie", + "botanical_name": "Schefflera arboricola", + "risk_flags": "air_purifier_requires_external_evidence" + } +] diff --git a/audits/semantic-search/wave1-findings.md b/audits/semantic-search/wave1-findings.md index 6c12942..640dc7a 100644 --- a/audits/semantic-search/wave1-findings.md +++ b/audits/semantic-search/wave1-findings.md @@ -1,30 +1,30 @@ -# Wave 1 Findings - -Date: 2026-03-12 - -Scope: -- `pet_friendly` -- `air_purifier` - -Changes applied to source data: -- Added `pet_friendly` to `Dypsis lutescens` (`Goldfruchtpalme`) -- Added `pet_friendly` to `Chamaedorea elegans` (`Bergpalme`) -- Added `pet_friendly` to `Howea forsteriana` (`Kentia-Palme`) -- Added `pet_friendly` to `Pilea cadierei` (`Aluminium-Pflanze`) -- Added `pet_friendly` to `Goeppertia insignis` (`Calathea lancifolia`) based on ASPCA `Calathea spp.` coverage -- Added `pet_friendly` to `Goeppertia ornata` (`Calathea ornata`) based on ASPCA `Calathea spp.` coverage -- Removed `air_purifier` from `Tillandsia usneoides` (`Spanisches Moos`) -- Removed `air_purifier` from `Phlebodium aureum` (`Blaues Kanaelfarn`) - -Evidence basis used: -- ASPCA non-toxic entries for `Areca Palm`, `Parlor Palm`, `Kentia Palm` -- ASPCA non-toxic entries for `Aluminum Plant` and `Calathea spp.` -- Conservative removal for `Tillandsia usneoides` and `Phlebodium aureum` because no equally strong primary air-purifier support was confirmed during this wave - -Deliberately not changed in this wave: -- Borderline or genus-adjacent `pet_friendly` candidates without direct enough evidence in hand -- Most remaining `air_purifier` entries, because several are plausible but need a stricter literature pass rather than guesswork - -Operational note: -- These source changes do not update the persisted backend catalog automatically. -- Production still needs a catalog rebuild via `server/scripts/rebuild-from-batches.js` and a deploy. +# Wave 1 Findings + +Date: 2026-03-12 + +Scope: +- `pet_friendly` +- `air_purifier` + +Changes applied to source data: +- Added `pet_friendly` to `Dypsis lutescens` (`Goldfruchtpalme`) +- Added `pet_friendly` to `Chamaedorea elegans` (`Bergpalme`) +- Added `pet_friendly` to `Howea forsteriana` (`Kentia-Palme`) +- Added `pet_friendly` to `Pilea cadierei` (`Aluminium-Pflanze`) +- Added `pet_friendly` to `Goeppertia insignis` (`Calathea lancifolia`) based on ASPCA `Calathea spp.` coverage +- Added `pet_friendly` to `Goeppertia ornata` (`Calathea ornata`) based on ASPCA `Calathea spp.` coverage +- Removed `air_purifier` from `Tillandsia usneoides` (`Spanisches Moos`) +- Removed `air_purifier` from `Phlebodium aureum` (`Blaues Kanaelfarn`) + +Evidence basis used: +- ASPCA non-toxic entries for `Areca Palm`, `Parlor Palm`, `Kentia Palm` +- ASPCA non-toxic entries for `Aluminum Plant` and `Calathea spp.` +- Conservative removal for `Tillandsia usneoides` and `Phlebodium aureum` because no equally strong primary air-purifier support was confirmed during this wave + +Deliberately not changed in this wave: +- Borderline or genus-adjacent `pet_friendly` candidates without direct enough evidence in hand +- Most remaining `air_purifier` entries, because several are plausible but need a stricter literature pass rather than guesswork + +Operational note: +- These source changes do not update the persisted backend catalog automatically. +- Production still needs a catalog rebuild via `server/scripts/rebuild-from-batches.js` and a deploy. diff --git a/audits/semantic-search/wave2-findings.md b/audits/semantic-search/wave2-findings.md index a0dc04b..6f92d3c 100644 --- a/audits/semantic-search/wave2-findings.md +++ b/audits/semantic-search/wave2-findings.md @@ -1,28 +1,28 @@ -# Wave 2 Findings - -Date: 2026-03-12 - -Scope: -- `low_light` -- `bright_light` -- `sun` - -Changes applied to source data: -- Removed `low_light` from `Saintpaulia ionantha` (`Afrikanisches Veilchen`) -- Removed `low_light` from `Clivia miniata` (`Riemenblatt`) -- Removed `sun` from `Helleborus orientalis` (`Lenzrose`) by overriding the default flower categories to `['flowering']` - -Evidence basis used: -- `Saintpaulia ionantha`: bright indirect light guidance, not a true low-light placement -- `Clivia miniata`: bright indirect / filtered light guidance, not a dark-corner low-light placement -- `Helleborus orientalis`: part-shade / shade-oriented placement, so `sun` was too broad - -Deliberately not changed in this wave: -- `Haworthia fasciata` and `Gasteria carinata` in `low_light`, because they are borderline tolerance cases and need a tighter horticultural pass before retagging -- `Wasabi` in `bright_light`, because the current label can still be read as bright indirect rather than direct sun -- `Hydrangea macrophylla` in `bright_light`, because the existing tag remains plausible for bright, non-scorching conditions -- broad `sun` garden inventories that are locally consistent and would need species-by-species horticultural review rather than heuristic edits - -Operational note: -- These source changes do not update the persisted backend catalog automatically. -- Production still needs a catalog rebuild via `server/scripts/rebuild-from-batches.js` and a deploy. +# Wave 2 Findings + +Date: 2026-03-12 + +Scope: +- `low_light` +- `bright_light` +- `sun` + +Changes applied to source data: +- Removed `low_light` from `Saintpaulia ionantha` (`Afrikanisches Veilchen`) +- Removed `low_light` from `Clivia miniata` (`Riemenblatt`) +- Removed `sun` from `Helleborus orientalis` (`Lenzrose`) by overriding the default flower categories to `['flowering']` + +Evidence basis used: +- `Saintpaulia ionantha`: bright indirect light guidance, not a true low-light placement +- `Clivia miniata`: bright indirect / filtered light guidance, not a dark-corner low-light placement +- `Helleborus orientalis`: part-shade / shade-oriented placement, so `sun` was too broad + +Deliberately not changed in this wave: +- `Haworthia fasciata` and `Gasteria carinata` in `low_light`, because they are borderline tolerance cases and need a tighter horticultural pass before retagging +- `Wasabi` in `bright_light`, because the current label can still be read as bright indirect rather than direct sun +- `Hydrangea macrophylla` in `bright_light`, because the existing tag remains plausible for bright, non-scorching conditions +- broad `sun` garden inventories that are locally consistent and would need species-by-species horticultural review rather than heuristic edits + +Operational note: +- These source changes do not update the persisted backend catalog automatically. +- Production still needs a catalog rebuild via `server/scripts/rebuild-from-batches.js` and a deploy. diff --git a/audits/semantic-search/wave3-findings.md b/audits/semantic-search/wave3-findings.md index d81087b..ed6a967 100644 --- a/audits/semantic-search/wave3-findings.md +++ b/audits/semantic-search/wave3-findings.md @@ -1,37 +1,37 @@ -# Wave 3 Findings - -Date: 2026-03-12 - -Scope: -- `easy` -- `high_humidity` -- `medicinal` - -Changes applied to source data: -- Removed `easy` from `Ficus retusa` (`Bonsai-Feige`) -- Removed `easy` from `Mimosa pudica` (`Schamkraut`) -- Removed `medicinal` from `Petroselinum crispum` (`Petersilie`) -- Removed `medicinal` from `Allium schoenoprasum` (`Schnittlauch`) -- Removed `medicinal` from `Vanilla planifolia` (`Vanille`) -- Removed `medicinal` from `Coffea arabica` (`Kaffeestrauch`) -- Removed `medicinal` from `Camellia sinensis` (`Teestrauch`) -- Removed `medicinal` from `Citrus limon`, `Citrus sinensis`, `Punica granatum`, `Psidium guajava`, `Carica papaya` -- Removed `medicinal` from `Solanum lycopersicum` (`Tomate`), `Spinacia oleracea` (`Spinat`), `Daucus carota` (`Karotte`) -- Removed `medicinal` from `Tagetes patula` (`Studentenblume`) -- Removed `medicinal` from `Eutrema japonicum` (`Wasabi`) -- Removed the implicit `medicinal` default from `createHerbEntry()` so generic kitchen-herb imports no longer auto-enter the medicinal category -- Re-added `medicinal` explicitly for `Chamaemelum nobile` (`Roemische Kamille`) - -Evidence basis used: -- `medicinal` is now treated as a conservative herbal/medical identity tag, not a catch-all for edible, aromatic, vitamin-rich, or beverage plants -- entries whose local descriptions are purely culinary, fruit, vegetable, or ornamental were de-scoped from `medicinal` -- `high_humidity` did not receive source-data changes in this wave because the current set looked locally coherent enough that heuristic edits would add more risk than value - -Deliberately not changed in this wave: -- many classic medicinal herbs that remain intentionally tagged, such as `Kamille`, `Salbei`, `Lavendel`, `Zitronenmelisse`, `Johanniskraut`, `Baldrian`, `Ingwer`, `Kurkuma`, `Eukalyptus`, `Ginkgo`, `Thymian` -- borderline `easy` cases beyond `Bonsai-Feige` and `Schamkraut` -- `high_humidity` entries without clear contradiction in local care/descriptive text - -Operational note: -- These source changes do not update the persisted backend catalog automatically. -- Production still needs a catalog rebuild via `server/scripts/rebuild-from-batches.js` and a deploy. +# Wave 3 Findings + +Date: 2026-03-12 + +Scope: +- `easy` +- `high_humidity` +- `medicinal` + +Changes applied to source data: +- Removed `easy` from `Ficus retusa` (`Bonsai-Feige`) +- Removed `easy` from `Mimosa pudica` (`Schamkraut`) +- Removed `medicinal` from `Petroselinum crispum` (`Petersilie`) +- Removed `medicinal` from `Allium schoenoprasum` (`Schnittlauch`) +- Removed `medicinal` from `Vanilla planifolia` (`Vanille`) +- Removed `medicinal` from `Coffea arabica` (`Kaffeestrauch`) +- Removed `medicinal` from `Camellia sinensis` (`Teestrauch`) +- Removed `medicinal` from `Citrus limon`, `Citrus sinensis`, `Punica granatum`, `Psidium guajava`, `Carica papaya` +- Removed `medicinal` from `Solanum lycopersicum` (`Tomate`), `Spinacia oleracea` (`Spinat`), `Daucus carota` (`Karotte`) +- Removed `medicinal` from `Tagetes patula` (`Studentenblume`) +- Removed `medicinal` from `Eutrema japonicum` (`Wasabi`) +- Removed the implicit `medicinal` default from `createHerbEntry()` so generic kitchen-herb imports no longer auto-enter the medicinal category +- Re-added `medicinal` explicitly for `Chamaemelum nobile` (`Roemische Kamille`) + +Evidence basis used: +- `medicinal` is now treated as a conservative herbal/medical identity tag, not a catch-all for edible, aromatic, vitamin-rich, or beverage plants +- entries whose local descriptions are purely culinary, fruit, vegetable, or ornamental were de-scoped from `medicinal` +- `high_humidity` did not receive source-data changes in this wave because the current set looked locally coherent enough that heuristic edits would add more risk than value + +Deliberately not changed in this wave: +- many classic medicinal herbs that remain intentionally tagged, such as `Kamille`, `Salbei`, `Lavendel`, `Zitronenmelisse`, `Johanniskraut`, `Baldrian`, `Ingwer`, `Kurkuma`, `Eukalyptus`, `Ginkgo`, `Thymian` +- borderline `easy` cases beyond `Bonsai-Feige` and `Schamkraut` +- `high_humidity` entries without clear contradiction in local care/descriptive text + +Operational note: +- These source changes do not update the persisted backend catalog automatically. +- Production still needs a catalog rebuild via `server/scripts/rebuild-from-batches.js` and a deploy. diff --git a/audits/semantic-search/wave4-findings.md b/audits/semantic-search/wave4-findings.md index 682c8cd..0992b94 100644 --- a/audits/semantic-search/wave4-findings.md +++ b/audits/semantic-search/wave4-findings.md @@ -1,32 +1,32 @@ -# Wave 4 Findings - -Date: 2026-03-12 - -Scope: -- `tree` -- `large` -- `patterned` -- `flowering` - -Changes applied to source data: -- Removed `patterned` from `Acer palmatum` (`Faecherahorn`) -- Removed `patterned` from `Beta vulgaris` (`Mangold`) -- Removed `large` from `Buxus sempervirens` (`Buchsbaum`) -- Removed `large` from `Ilex aquifolium` (`Stechpalme`) -- Removed `large` from `Prunus laurocerasus` (`Kirschlorbeer`) -- Removed `large` from `Thaumatophyllum xanadu` (`Philodendron Xanadu`) -- Removed `tree` from `Coffea arabica Nana` (`Kaffeepflanze arabica nana`) - -Evidence basis used: -- `patterned` is treated as a foliage-pattern identity tag, not a generic color, form, or ornamental-value tag -- `large` is treated conservatively for clearly size-defining growth, not as an automatic consequence of every tree/shrub import -- `tree` on the dwarf coffee plant was too broad in the current houseplant context - -Deliberately not changed in this wave: -- `flowering` received no source-data changes because the current set looked locally coherent enough for this pass -- borderline foliage cases like `Monstera obliqua` remained unchanged because its fenestrated leaf look can still be argued as a visual-pattern discovery target -- clearly large species and true tree-form entries were left intact - -Operational note: -- These source changes do not update the persisted backend catalog automatically. -- Production still needs a catalog rebuild via `server/scripts/rebuild-from-batches.js` and a deploy. +# Wave 4 Findings + +Date: 2026-03-12 + +Scope: +- `tree` +- `large` +- `patterned` +- `flowering` + +Changes applied to source data: +- Removed `patterned` from `Acer palmatum` (`Faecherahorn`) +- Removed `patterned` from `Beta vulgaris` (`Mangold`) +- Removed `large` from `Buxus sempervirens` (`Buchsbaum`) +- Removed `large` from `Ilex aquifolium` (`Stechpalme`) +- Removed `large` from `Prunus laurocerasus` (`Kirschlorbeer`) +- Removed `large` from `Thaumatophyllum xanadu` (`Philodendron Xanadu`) +- Removed `tree` from `Coffea arabica Nana` (`Kaffeepflanze arabica nana`) + +Evidence basis used: +- `patterned` is treated as a foliage-pattern identity tag, not a generic color, form, or ornamental-value tag +- `large` is treated conservatively for clearly size-defining growth, not as an automatic consequence of every tree/shrub import +- `tree` on the dwarf coffee plant was too broad in the current houseplant context + +Deliberately not changed in this wave: +- `flowering` received no source-data changes because the current set looked locally coherent enough for this pass +- borderline foliage cases like `Monstera obliqua` remained unchanged because its fenestrated leaf look can still be argued as a visual-pattern discovery target +- clearly large species and true tree-form entries were left intact + +Operational note: +- These source changes do not update the persisted backend catalog automatically. +- Production still needs a catalog rebuild via `server/scripts/rebuild-from-batches.js` and a deploy. diff --git a/audits/semantic-search/wave5-findings.md b/audits/semantic-search/wave5-findings.md index 9afb1e6..b17f6e6 100644 --- a/audits/semantic-search/wave5-findings.md +++ b/audits/semantic-search/wave5-findings.md @@ -1,26 +1,26 @@ -# Wave 5 Findings - -Date: 2026-03-12 - -Scope: -- `hanging` -- `succulent` - -Changes applied to source data: -- Added `succulent` to `Hoya carnosa` (`Wachsblume`) -- Removed `hanging` from `Passiflora caerulea` (`Passionsblume`) -- Removed `hanging` from `Cucumis sativus` (`Gurke`) - -Evidence basis used: -- `succulent` was added only where the local source text explicitly supported water-storing or fleshy foliage traits; `Hoya carnosa` already described `dicken, wachsartigen Blaettern` and sat next to the already-succulent `Hoya bella` -- `hanging` was treated as a trailing, cascading, or hanging-basket discovery tag, not a generic catch-all for any climbing or vining species -- `Passiflora caerulea` and `Cucumis sativus` read locally as climbers/vines rather than clear hanging-basket plants - -Deliberately not changed in this wave: -- `Beaucarnea recurvata` kept `succulent` because the source text explicitly mentions a swollen water-storing stem base -- trailing epiphytes and epiphytic cacti like `Dischidia ruscifolia`, `Rhipsalis baccifera`, and `Hoya bella` remained unchanged because the local descriptions still support `succulent` and/or `hanging` -- carnivorous hanging candidates like `Nepenthes alata` remained unchanged because the category still works for hanging-display discovery - -Operational note: -- These source changes do not update the persisted backend catalog automatically. -- Production still needs a catalog rebuild via `server/scripts/rebuild-from-batches.js` and a deploy. +# Wave 5 Findings + +Date: 2026-03-12 + +Scope: +- `hanging` +- `succulent` + +Changes applied to source data: +- Added `succulent` to `Hoya carnosa` (`Wachsblume`) +- Removed `hanging` from `Passiflora caerulea` (`Passionsblume`) +- Removed `hanging` from `Cucumis sativus` (`Gurke`) + +Evidence basis used: +- `succulent` was added only where the local source text explicitly supported water-storing or fleshy foliage traits; `Hoya carnosa` already described `dicken, wachsartigen Blaettern` and sat next to the already-succulent `Hoya bella` +- `hanging` was treated as a trailing, cascading, or hanging-basket discovery tag, not a generic catch-all for any climbing or vining species +- `Passiflora caerulea` and `Cucumis sativus` read locally as climbers/vines rather than clear hanging-basket plants + +Deliberately not changed in this wave: +- `Beaucarnea recurvata` kept `succulent` because the source text explicitly mentions a swollen water-storing stem base +- trailing epiphytes and epiphytic cacti like `Dischidia ruscifolia`, `Rhipsalis baccifera`, and `Hoya bella` remained unchanged because the local descriptions still support `succulent` and/or `hanging` +- carnivorous hanging candidates like `Nepenthes alata` remained unchanged because the category still works for hanging-display discovery + +Operational note: +- These source changes do not update the persisted backend catalog automatically. +- Production still needs a catalog rebuild via `server/scripts/rebuild-from-batches.js` and a deploy. diff --git a/babel.config.js b/babel.config.js index 9d89e13..471d972 100644 --- a/babel.config.js +++ b/babel.config.js @@ -1,6 +1,6 @@ -module.exports = function (api) { - api.cache(true); - return { - presets: ['babel-preset-expo'], - }; -}; +module.exports = function (api) { + api.cache(true); + return { + presets: ['babel-preset-expo'], + }; +}; diff --git a/components/AnimatedSplashScreen.tsx b/components/AnimatedSplashScreen.tsx index 81230b1..790c6c4 100644 --- a/components/AnimatedSplashScreen.tsx +++ b/components/AnimatedSplashScreen.tsx @@ -1,60 +1,60 @@ -import React, { useState, useEffect } from 'react'; -import { StyleSheet } from 'react-native'; -import { Video, ResizeMode } from 'expo-av'; -import * as SplashScreen from 'expo-splash-screen'; -import Animated, { FadeOut } from 'react-native-reanimated'; -import { useApp } from '../context/AppContext'; -import { useColors } from '../constants/Colors'; - -interface Props { - isAppReady: boolean; - onAnimationComplete: () => void; -} - -export function AnimatedSplashScreen({ isAppReady, onAnimationComplete }: Props) { - const [hasPlayedEnough, setHasPlayedEnough] = useState(false); - - useEffect(() => { - // Ensure the video plays for at least 2 seconds before we allow it to finish, - // so it doesn't flash too fast and provides a premium feel. - const timer = setTimeout(() => { - setHasPlayedEnough(true); - }, 2000); - return () => clearTimeout(timer); - }, []); - - useEffect(() => { - if (isAppReady && hasPlayedEnough) { - onAnimationComplete(); - } - }, [isAppReady, hasPlayedEnough, onAnimationComplete]); - - // Determine the background color to blend perfectly - const { isDarkMode, colorPalette } = useApp(); - const colors = useColors(isDarkMode, colorPalette); - return ( - - - - - ); -} +import React, { useState, useEffect } from 'react'; +import { StyleSheet } from 'react-native'; +import { Video, ResizeMode } from 'expo-av'; +import * as SplashScreen from 'expo-splash-screen'; +import Animated, { FadeOut } from 'react-native-reanimated'; +import { useApp } from '../context/AppContext'; +import { useColors } from '../constants/Colors'; + +interface Props { + isAppReady: boolean; + onAnimationComplete: () => void; +} + +export function AnimatedSplashScreen({ isAppReady, onAnimationComplete }: Props) { + const [hasPlayedEnough, setHasPlayedEnough] = useState(false); + + useEffect(() => { + // Ensure the video plays for at least 2 seconds before we allow it to finish, + // so it doesn't flash too fast and provides a premium feel. + const timer = setTimeout(() => { + setHasPlayedEnough(true); + }, 2000); + return () => clearTimeout(timer); + }, []); + + useEffect(() => { + if (isAppReady && hasPlayedEnough) { + onAnimationComplete(); + } + }, [isAppReady, hasPlayedEnough, onAnimationComplete]); + + // Determine the background color to blend perfectly + const { isDarkMode, colorPalette } = useApp(); + const colors = useColors(isDarkMode, colorPalette); + return ( + + + + + ); +} diff --git a/components/CoachMarksOverlay.tsx b/components/CoachMarksOverlay.tsx index 7564b3c..e01d130 100644 --- a/components/CoachMarksOverlay.tsx +++ b/components/CoachMarksOverlay.tsx @@ -6,7 +6,6 @@ import { StyleSheet, Dimensions, Animated, - Platform, } from 'react-native'; import { Ionicons } from '@expo/vector-icons'; import { useCoachMarks } from '../context/CoachMarksContext'; @@ -19,14 +18,13 @@ const TOOLTIP_VERTICAL_OFFSET = 32; export const CoachMarksOverlay: React.FC = () => { const { isActive, currentStep, steps, layouts, next, skip } = useCoachMarks(); - const { isDarkMode, colorPalette } = useApp(); + 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; - // Fade in when tour starts or step changes useEffect(() => { if (isActive) { fadeAnim.setValue(0); @@ -36,24 +34,22 @@ export const CoachMarksOverlay: React.FC = () => { Animated.spring(scaleAnim, { toValue: 1, tension: 80, friction: 9, useNativeDriver: true }), ]).start(); - // Pulse animation on highlight 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(); } - }, [isActive, currentStep]); + }, [currentStep, fadeAnim, isActive, pulseAnim, scaleAnim]); if (!isActive || steps.length === 0) return null; const step = steps[currentStep]; const layout = layouts[step.elementKey]; - // Fallback wenn Element noch nicht gemessen const highlight = layout ? { x: layout.x - HIGHLIGHT_PADDING, @@ -64,10 +60,13 @@ export const CoachMarksOverlay: React.FC = () => { } : { x: SCREEN_W / 2 - 40, y: SCREEN_H / 2 - 40, w: 80, h: 80, r: 40 }; - // Tooltip-Position berechnen const tooltipW = 260; const tooltipMaxH = 140; - let tooltipX = Math.max(12, Math.min(SCREEN_W - tooltipW - 12, highlight.x + highlight.w / 2 - tooltipW / 2)); + 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; @@ -80,39 +79,43 @@ export const CoachMarksOverlay: React.FC = () => { if (tooltipY + tooltipMaxH > SCREEN_H - 60) tooltipY = highlight.y - tooltipMaxH - 24; } - // Keep coachmark bubbles slightly higher to avoid overlap with bright focus circles. tooltipY -= TOOLTIP_VERTICAL_OFFSET; - const minTooltipY = 24; - const maxTooltipY = SCREEN_H - tooltipMaxH - 24; - tooltipY = Math.max(minTooltipY, Math.min(maxTooltipY, tooltipY)); + tooltipY = Math.max(24, Math.min(SCREEN_H - tooltipMaxH - 24, tooltipY)); const arrowPointsUp = tooltipY > highlight.y; return ( - {/* Dark overlay — 4 Rechtecke um die Aussparung */} - {/* Oben */} - {/* Links */} - - {/* Rechts */} - - {/* Unten */} - + + + - {/* Pulsierender Ring um das Highlight */} { pointerEvents="none" /> - {/* Tooltip-Karte */} { }, ]} > - {/* Arrow */} { ]} /> - {/* Schritt-Indikator */} {steps.map((_, i) => ( { - Überspringen + {t.coachSkip} { activeOpacity={0.82} > - {currentStep === steps.length - 1 ? 'Fertig' : 'Weiter'} + {currentStep === steps.length - 1 ? t.coachDone : t.coachNext} void; - t: any; - isDark: boolean; - colorPalette: ColorPalette; -} - -export const PlantCard: React.FC = ({ - plant, - width, - onPress, - t, - isDark, - colorPalette, -}) => { - const colors = useColors(isDark, colorPalette); - const isUrgent = plant.careInfo?.waterIntervalDays <= 1; - const wateringText = plant.careInfo?.waterIntervalDays - ? (isUrgent - ? t.waterToday - : t.inXDays.replace('{0}', plant.careInfo.waterIntervalDays.toString())) - : t.showDetails; // Default for lexicon entries - - return ( - - - - - {/* Badge */} - - - {wateringText} - - - {/* Content */} - - {plant.name} - {plant.botanicalName} - - - ); -}; - -const styles = StyleSheet.create({ - container: { - aspectRatio: 0.8, - borderRadius: 18, - overflow: 'hidden', - shadowColor: '#000', - shadowOffset: { width: 0, height: 2 }, - shadowOpacity: 0.1, - shadowRadius: 6, - elevation: 4, - }, - image: { width: '100%', height: '100%', resizeMode: 'cover' }, - gradient: { - ...StyleSheet.absoluteFillObject, - opacity: 0.8, - }, - badge: { - position: 'absolute', - top: 10, - left: 10, - flexDirection: 'row', - alignItems: 'center', - gap: 4, - paddingHorizontal: 8, - paddingVertical: 4, - borderRadius: 12, - }, - badgeText: { fontSize: 9, fontWeight: '700' }, - content: { position: 'absolute', bottom: 14, left: 10, right: 10 }, - name: { fontSize: 16, fontWeight: '700' }, - botanical: { fontSize: 11 }, -}); +import React from 'react'; +import { View, Text, StyleSheet, TouchableOpacity } from 'react-native'; +import { Ionicons } from '@expo/vector-icons'; +import { ColorPalette } from '../types'; +import { useColors } from '../constants/Colors'; +import { SafeImage } from './SafeImage'; + +interface PlantCardProps { + plant: { + name: string; + botanicalName?: string; + imageUri: string; + careInfo: { + waterIntervalDays: number; + }; + }; + width: number; + onPress: () => void; + t: any; + isDark: boolean; + colorPalette: ColorPalette; +} + +export const PlantCard: React.FC = ({ + plant, + width, + onPress, + t, + isDark, + colorPalette, +}) => { + const colors = useColors(isDark, colorPalette); + const isUrgent = plant.careInfo?.waterIntervalDays <= 1; + const wateringText = plant.careInfo?.waterIntervalDays + ? (isUrgent + ? t.waterToday + : t.inXDays.replace('{0}', plant.careInfo.waterIntervalDays.toString())) + : t.showDetails; // Default for lexicon entries + + return ( + + + + + {/* Badge */} + + + {wateringText} + + + {/* Content */} + + {plant.name} + {plant.botanicalName} + + + ); +}; + +const styles = StyleSheet.create({ + container: { + aspectRatio: 0.8, + borderRadius: 18, + overflow: 'hidden', + shadowColor: '#000', + shadowOffset: { width: 0, height: 2 }, + shadowOpacity: 0.1, + shadowRadius: 6, + elevation: 4, + }, + image: { width: '100%', height: '100%', resizeMode: 'cover' }, + gradient: { + ...StyleSheet.absoluteFillObject, + opacity: 0.8, + }, + badge: { + position: 'absolute', + top: 10, + left: 10, + flexDirection: 'row', + alignItems: 'center', + gap: 4, + paddingHorizontal: 8, + paddingVertical: 4, + borderRadius: 12, + }, + badgeText: { fontSize: 9, fontWeight: '700' }, + content: { position: 'absolute', bottom: 14, left: 10, right: 10 }, + name: { fontSize: 16, fontWeight: '700' }, + botanical: { fontSize: 11 }, +}); diff --git a/components/ResultCard.tsx b/components/ResultCard.tsx index 6ca63de..d555443 100644 --- a/components/ResultCard.tsx +++ b/components/ResultCard.tsx @@ -1,266 +1,266 @@ -import React, { useState } from 'react'; -import { View, Text, StyleSheet, ScrollView, TouchableOpacity, Share, Alert } from 'react-native'; -import { Ionicons } from '@expo/vector-icons'; -import { SafeAreaView, useSafeAreaInsets } from 'react-native-safe-area-context'; -import { ColorPalette, IdentificationResult } from '../types'; -import { useColors } from '../constants/Colors'; -import { SafeImage } from './SafeImage'; - -interface ResultCardProps { - result: IdentificationResult; - imageUri: string; - onSave: () => void; - onClose: () => void; - t: any; - isDark: boolean; - colorPalette: ColorPalette; - isGuest?: boolean; -} - -export const ResultCard: React.FC = ({ - result, - imageUri, - onSave, - onClose, - t, - isDark, - colorPalette, - isGuest = false, -}) => { - const colors = useColors(isDark, colorPalette); - const insets = useSafeAreaInsets(); - const [showDetails, setShowDetails] = useState(false); - - const handleShare = async () => { - try { - await Share.share({ - message: `I just identified a ${result.name} (${result.botanicalName}) with ${Math.round(result.confidence * 100)}% confidence using GreenLens!`, - }); - } catch (error: any) { - Alert.alert('Error', error.message); - } - }; - - return ( - - {/* Header */} - - - - - - {t.result} - - - - - - - - {/* Hero Image */} - - - - - - {Math.round(result.confidence * 100)}% {t.match} - - - - - {/* Info */} - {result.name} - {result.botanicalName} - - {result.description || t.noDescription} - - - {/* Care Check */} - - {t.careCheck} - setShowDetails(!showDetails)}> - - {showDetails ? t.hideDetails : t.showDetails} - - - - - - {[ - { icon: 'water' as const, label: t.water, value: result.careInfo.waterIntervalDays <= 7 ? t.waterModerate : t.waterLittle, color: colors.info, bg: colors.infoSoft }, - { icon: 'sunny' as const, label: t.light, value: result.careInfo.light, color: colors.warning, bg: colors.warningSoft }, - { icon: 'thermometer' as const, label: t.temp, value: result.careInfo.temp, color: colors.danger, bg: colors.dangerSoft }, - ].map((item) => ( - - - - - {item.label} - {item.value} - - ))} - - - {showDetails && ( - - {t.detailedCare} - {[ - { text: t.careTextWater.replace('{0}', result.careInfo.waterIntervalDays.toString()), color: colors.success }, - { text: t.careTextLight.replace('{0}', result.careInfo.light), color: colors.warning }, - { text: t.careTextTemp.replace('{0}', result.careInfo.temp), color: colors.danger }, - ].map((item, i) => ( - - - {item.text} - - ))} - - )} - - {/* Save */} - - - {t.dataSavedLocally} - - - - - - {isGuest ? t.registerToSave : t.addToPlants} - - - - - ); -}; - -const styles = StyleSheet.create({ - container: { flex: 1 }, - header: { - position: 'absolute', - top: 0, - left: 0, - right: 0, - zIndex: 10, - flexDirection: 'row', - justifyContent: 'space-between', - alignItems: 'center', - paddingHorizontal: 20, - }, - headerBtn: { - borderRadius: 20, - padding: 8, - borderWidth: 1, - }, - headerBadge: { - borderRadius: 20, - paddingHorizontal: 12, - paddingVertical: 4, - borderWidth: 1, - }, - headerBadgeText: { fontWeight: '700', fontSize: 13 }, - scrollContent: { paddingHorizontal: 16 }, - heroContainer: { - width: '100%', - aspectRatio: 4 / 3, - borderRadius: 24, - overflow: 'hidden', - marginBottom: 20, - shadowColor: '#000', - shadowOffset: { width: 0, height: 4 }, - shadowOpacity: 0.15, - shadowRadius: 8, - elevation: 6, - }, - heroImage: { width: '100%', height: '100%', resizeMode: 'cover' }, - confidenceBadge: { - position: 'absolute', - bottom: 14, - left: 14, - borderRadius: 20, - paddingHorizontal: 10, - paddingVertical: 6, - flexDirection: 'row', - alignItems: 'center', - gap: 4, - }, - confidenceText: { fontSize: 11, fontWeight: '700' }, - plantName: { fontSize: 28, fontWeight: '700', marginBottom: 2 }, - botanical: { fontSize: 13, fontStyle: 'italic', marginBottom: 14 }, - description: { fontSize: 13, lineHeight: 20, marginBottom: 24 }, - careHeader: { - flexDirection: 'row', - justifyContent: 'space-between', - alignItems: 'flex-end', - marginBottom: 12, - }, - sectionTitle: { fontSize: 16, fontWeight: '700' }, - detailsToggle: { fontSize: 10, fontWeight: '700', textTransform: 'uppercase', letterSpacing: 0.5 }, - careGrid: { flexDirection: 'row', gap: 10, marginBottom: 20 }, - careCard: { - flex: 1, - alignItems: 'center', - padding: 12, - borderRadius: 18, - borderWidth: 1, - gap: 6, - }, - careIcon: { width: 32, height: 32, borderRadius: 16, justifyContent: 'center', alignItems: 'center' }, - careLabel: { fontSize: 10, fontWeight: '500' }, - careValue: { - width: '100%', - fontSize: 11, - lineHeight: 14, - fontWeight: '700', - textAlign: 'center', - flexShrink: 1, - }, - detailsBox: { - borderRadius: 18, - borderWidth: 1, - padding: 16, - marginBottom: 20, - gap: 10, - }, - detailsTitle: { fontSize: 11, fontWeight: '700', textTransform: 'uppercase', letterSpacing: 0.5 }, - detailRow: { flexDirection: 'row', alignItems: 'flex-start', gap: 10 }, - detailDot: { width: 6, height: 6, borderRadius: 3, marginTop: 6 }, - detailText: { fontSize: 13, flex: 1 }, - localInfo: { flexDirection: 'row', justifyContent: 'center', alignItems: 'center', gap: 6, marginBottom: 12 }, - localIcon: { width: 12, height: 12, borderRadius: 2, borderWidth: 1, borderColor: '#d6d3d1' }, - localText: { fontSize: 11 }, - saveBtn: { - flexDirection: 'row', - justifyContent: 'center', - alignItems: 'center', - gap: 8, - backgroundColor: '#4ade80', - paddingVertical: 16, - borderRadius: 14, - shadowColor: '#4ade80', - shadowOffset: { width: 0, height: 4 }, - shadowOpacity: 0.3, - shadowRadius: 8, - elevation: 6, - }, - saveBtnText: { fontWeight: '700', fontSize: 14 }, -}); +import React, { useState } from 'react'; +import { View, Text, StyleSheet, ScrollView, TouchableOpacity, Share, Alert } from 'react-native'; +import { Ionicons } from '@expo/vector-icons'; +import { SafeAreaView, useSafeAreaInsets } from 'react-native-safe-area-context'; +import { ColorPalette, IdentificationResult } from '../types'; +import { useColors } from '../constants/Colors'; +import { SafeImage } from './SafeImage'; + +interface ResultCardProps { + result: IdentificationResult; + imageUri: string; + onSave: () => void; + onClose: () => void; + t: any; + isDark: boolean; + colorPalette: ColorPalette; + isGuest?: boolean; +} + +export const ResultCard: React.FC = ({ + result, + imageUri, + onSave, + onClose, + t, + isDark, + colorPalette, + isGuest = false, +}) => { + const colors = useColors(isDark, colorPalette); + const insets = useSafeAreaInsets(); + const [showDetails, setShowDetails] = useState(false); + + const handleShare = async () => { + try { + await Share.share({ + message: `I just identified a ${result.name} (${result.botanicalName}) with ${Math.round(result.confidence * 100)}% confidence using GreenLens!`, + }); + } catch (error: any) { + Alert.alert('Error', error.message); + } + }; + + return ( + + {/* Header */} + + + + + + {t.result} + + + + + + + + {/* Hero Image */} + + + + + + {Math.round(result.confidence * 100)}% {t.match} + + + + + {/* Info */} + {result.name} + {result.botanicalName} + + {result.description || t.noDescription} + + + {/* Care Check */} + + {t.careCheck} + setShowDetails(!showDetails)}> + + {showDetails ? t.hideDetails : t.showDetails} + + + + + + {[ + { icon: 'water' as const, label: t.water, value: result.careInfo.waterIntervalDays <= 7 ? t.waterModerate : t.waterLittle, color: colors.info, bg: colors.infoSoft }, + { icon: 'sunny' as const, label: t.light, value: result.careInfo.light, color: colors.warning, bg: colors.warningSoft }, + { icon: 'thermometer' as const, label: t.temp, value: result.careInfo.temp, color: colors.danger, bg: colors.dangerSoft }, + ].map((item) => ( + + + + + {item.label} + {item.value} + + ))} + + + {showDetails && ( + + {t.detailedCare} + {[ + { text: t.careTextWater.replace('{0}', result.careInfo.waterIntervalDays.toString()), color: colors.success }, + { text: t.careTextLight.replace('{0}', result.careInfo.light), color: colors.warning }, + { text: t.careTextTemp.replace('{0}', result.careInfo.temp), color: colors.danger }, + ].map((item, i) => ( + + + {item.text} + + ))} + + )} + + {/* Save */} + + + {t.dataSavedLocally} + + + + + + {isGuest ? t.registerToSave : t.addToPlants} + + + + + ); +}; + +const styles = StyleSheet.create({ + container: { flex: 1 }, + header: { + position: 'absolute', + top: 0, + left: 0, + right: 0, + zIndex: 10, + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + paddingHorizontal: 20, + }, + headerBtn: { + borderRadius: 20, + padding: 8, + borderWidth: 1, + }, + headerBadge: { + borderRadius: 20, + paddingHorizontal: 12, + paddingVertical: 4, + borderWidth: 1, + }, + headerBadgeText: { fontWeight: '700', fontSize: 13 }, + scrollContent: { paddingHorizontal: 16 }, + heroContainer: { + width: '100%', + aspectRatio: 4 / 3, + borderRadius: 24, + overflow: 'hidden', + marginBottom: 20, + shadowColor: '#000', + shadowOffset: { width: 0, height: 4 }, + shadowOpacity: 0.15, + shadowRadius: 8, + elevation: 6, + }, + heroImage: { width: '100%', height: '100%', resizeMode: 'cover' }, + confidenceBadge: { + position: 'absolute', + bottom: 14, + left: 14, + borderRadius: 20, + paddingHorizontal: 10, + paddingVertical: 6, + flexDirection: 'row', + alignItems: 'center', + gap: 4, + }, + confidenceText: { fontSize: 11, fontWeight: '700' }, + plantName: { fontSize: 28, fontWeight: '700', marginBottom: 2 }, + botanical: { fontSize: 13, fontStyle: 'italic', marginBottom: 14 }, + description: { fontSize: 13, lineHeight: 20, marginBottom: 24 }, + careHeader: { + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'flex-end', + marginBottom: 12, + }, + sectionTitle: { fontSize: 16, fontWeight: '700' }, + detailsToggle: { fontSize: 10, fontWeight: '700', textTransform: 'uppercase', letterSpacing: 0.5 }, + careGrid: { flexDirection: 'row', gap: 10, marginBottom: 20 }, + careCard: { + flex: 1, + alignItems: 'center', + padding: 12, + borderRadius: 18, + borderWidth: 1, + gap: 6, + }, + careIcon: { width: 32, height: 32, borderRadius: 16, justifyContent: 'center', alignItems: 'center' }, + careLabel: { fontSize: 10, fontWeight: '500' }, + careValue: { + width: '100%', + fontSize: 11, + lineHeight: 14, + fontWeight: '700', + textAlign: 'center', + flexShrink: 1, + }, + detailsBox: { + borderRadius: 18, + borderWidth: 1, + padding: 16, + marginBottom: 20, + gap: 10, + }, + detailsTitle: { fontSize: 11, fontWeight: '700', textTransform: 'uppercase', letterSpacing: 0.5 }, + detailRow: { flexDirection: 'row', alignItems: 'flex-start', gap: 10 }, + detailDot: { width: 6, height: 6, borderRadius: 3, marginTop: 6 }, + detailText: { fontSize: 13, flex: 1 }, + localInfo: { flexDirection: 'row', justifyContent: 'center', alignItems: 'center', gap: 6, marginBottom: 12 }, + localIcon: { width: 12, height: 12, borderRadius: 2, borderWidth: 1, borderColor: '#d6d3d1' }, + localText: { fontSize: 11 }, + saveBtn: { + flexDirection: 'row', + justifyContent: 'center', + alignItems: 'center', + gap: 8, + backgroundColor: '#4ade80', + paddingVertical: 16, + borderRadius: 14, + shadowColor: '#4ade80', + shadowOffset: { width: 0, height: 4 }, + shadowOpacity: 0.3, + shadowRadius: 8, + elevation: 6, + }, + saveBtnText: { fontWeight: '700', fontSize: 14 }, +}); diff --git a/components/SafeImage.tsx b/components/SafeImage.tsx index df256b2..ba0a842 100644 --- a/components/SafeImage.tsx +++ b/components/SafeImage.tsx @@ -1,134 +1,134 @@ -import React from 'react'; -import { Image, ImageProps, StyleSheet, Text, View } from 'react-native'; -import { - DEFAULT_PLANT_IMAGE_URI, - getCategoryFallbackImage, - getPlantImageSourceFallbackUri, - getWikimediaFilePathFromThumbnailUrl, - resolveImageUri, - tryResolveImageUri, -} from '../utils/imageUri'; - -type SafeImageFallbackMode = 'category' | 'default' | 'none'; - -interface SafeImageProps extends Omit { - uri?: string | null; - categories?: string[]; - fallbackMode?: SafeImageFallbackMode; - placeholderLabel?: string; -} - -const getPlaceholderInitial = (label?: string): string => { - if (!label) return '?'; - const trimmed = label.trim(); - if (!trimmed) return '?'; - return trimmed.charAt(0).toUpperCase(); -}; - -export const SafeImage: React.FC = ({ - uri, - categories, - fallbackMode = 'category', - placeholderLabel, - onError, - style, - ...props -}) => { - const categoryFallback = categories && categories.length > 0 - ? getCategoryFallbackImage(categories) - : DEFAULT_PLANT_IMAGE_URI; - const selectedFallback = fallbackMode === 'category' - ? categoryFallback - : DEFAULT_PLANT_IMAGE_URI; - - const [resolvedUri, setResolvedUri] = React.useState(() => { - const strictResolved = tryResolveImageUri(uri); - if (strictResolved) return strictResolved; - return fallbackMode === 'none' ? '' : selectedFallback; - }); - const [showPlaceholder, setShowPlaceholder] = React.useState(() => { - if (fallbackMode !== 'none') return false; - return !tryResolveImageUri(uri); - }); - const [retryCount, setRetryCount] = React.useState(0); - const lastAttemptUri = React.useRef(null); - - React.useEffect(() => { - const strictResolved = tryResolveImageUri(uri); - setResolvedUri(strictResolved || (fallbackMode === 'none' ? '' : selectedFallback)); - setShowPlaceholder(fallbackMode === 'none' && !strictResolved); - setRetryCount(0); - lastAttemptUri.current = strictResolved; - }, [uri, fallbackMode, selectedFallback]); - - if (fallbackMode === 'none' && showPlaceholder) { - return ( - - {getPlaceholderInitial(placeholderLabel)} - - ); - } - - return ( - { - onError?.(event); - - const currentUri = resolvedUri || selectedFallback; - - // Smart Retry Logic for Wikimedia (first failure only) - if (retryCount === 0 && currentUri.includes('upload.wikimedia.org')) { - const fileName = getWikimediaFilePathFromThumbnailUrl(currentUri); - if (fileName) { - const redirectUrl = `https://commons.wikimedia.org/wiki/Special:FilePath/${encodeURIComponent(fileName)}`; - setRetryCount(1); - setResolvedUri(redirectUrl); - lastAttemptUri.current = redirectUrl; - return; - } - } - - const sourceFallbackUri = getPlantImageSourceFallbackUri(uri); - if (sourceFallbackUri && sourceFallbackUri !== currentUri && lastAttemptUri.current !== sourceFallbackUri) { - setResolvedUri(sourceFallbackUri); - lastAttemptUri.current = sourceFallbackUri; - return; - } - - // If we get here, either it wasn't a Wikimedia URL, or filename extraction failed, - // or the retry itself failed. - if (fallbackMode === 'none') { - setShowPlaceholder(true); - return; - } - - setResolvedUri((current) => { - if (current === DEFAULT_PLANT_IMAGE_URI) return current; - if (current === selectedFallback) return DEFAULT_PLANT_IMAGE_URI; - return selectedFallback; - }); - - // Prevent infinite loops if fallbacks also fail - setRetryCount(current => current + 1); - }} - /> - ); -}; - -const styles = StyleSheet.create({ - placeholder: { - alignItems: 'center', - justifyContent: 'center', - backgroundColor: '#e7ece8', - }, - placeholderText: { - fontSize: 18, - fontWeight: '700', - color: '#5f6f63', - }, -}); +import React from 'react'; +import { Image, ImageProps, StyleSheet, Text, View } from 'react-native'; +import { + DEFAULT_PLANT_IMAGE_URI, + getCategoryFallbackImage, + getPlantImageSourceFallbackUri, + getWikimediaFilePathFromThumbnailUrl, + resolveImageUri, + tryResolveImageUri, +} from '../utils/imageUri'; + +type SafeImageFallbackMode = 'category' | 'default' | 'none'; + +interface SafeImageProps extends Omit { + uri?: string | null; + categories?: string[]; + fallbackMode?: SafeImageFallbackMode; + placeholderLabel?: string; +} + +const getPlaceholderInitial = (label?: string): string => { + if (!label) return '?'; + const trimmed = label.trim(); + if (!trimmed) return '?'; + return trimmed.charAt(0).toUpperCase(); +}; + +export const SafeImage: React.FC = ({ + uri, + categories, + fallbackMode = 'category', + placeholderLabel, + onError, + style, + ...props +}) => { + const categoryFallback = categories && categories.length > 0 + ? getCategoryFallbackImage(categories) + : DEFAULT_PLANT_IMAGE_URI; + const selectedFallback = fallbackMode === 'category' + ? categoryFallback + : DEFAULT_PLANT_IMAGE_URI; + + const [resolvedUri, setResolvedUri] = React.useState(() => { + const strictResolved = tryResolveImageUri(uri); + if (strictResolved) return strictResolved; + return fallbackMode === 'none' ? '' : selectedFallback; + }); + const [showPlaceholder, setShowPlaceholder] = React.useState(() => { + if (fallbackMode !== 'none') return false; + return !tryResolveImageUri(uri); + }); + const [retryCount, setRetryCount] = React.useState(0); + const lastAttemptUri = React.useRef(null); + + React.useEffect(() => { + const strictResolved = tryResolveImageUri(uri); + setResolvedUri(strictResolved || (fallbackMode === 'none' ? '' : selectedFallback)); + setShowPlaceholder(fallbackMode === 'none' && !strictResolved); + setRetryCount(0); + lastAttemptUri.current = strictResolved; + }, [uri, fallbackMode, selectedFallback]); + + if (fallbackMode === 'none' && showPlaceholder) { + return ( + + {getPlaceholderInitial(placeholderLabel)} + + ); + } + + return ( + { + onError?.(event); + + const currentUri = resolvedUri || selectedFallback; + + // Smart Retry Logic for Wikimedia (first failure only) + if (retryCount === 0 && currentUri.includes('upload.wikimedia.org')) { + const fileName = getWikimediaFilePathFromThumbnailUrl(currentUri); + if (fileName) { + const redirectUrl = `https://commons.wikimedia.org/wiki/Special:FilePath/${encodeURIComponent(fileName)}`; + setRetryCount(1); + setResolvedUri(redirectUrl); + lastAttemptUri.current = redirectUrl; + return; + } + } + + const sourceFallbackUri = getPlantImageSourceFallbackUri(uri); + if (sourceFallbackUri && sourceFallbackUri !== currentUri && lastAttemptUri.current !== sourceFallbackUri) { + setResolvedUri(sourceFallbackUri); + lastAttemptUri.current = sourceFallbackUri; + return; + } + + // If we get here, either it wasn't a Wikimedia URL, or filename extraction failed, + // or the retry itself failed. + if (fallbackMode === 'none') { + setShowPlaceholder(true); + return; + } + + setResolvedUri((current) => { + if (current === DEFAULT_PLANT_IMAGE_URI) return current; + if (current === selectedFallback) return DEFAULT_PLANT_IMAGE_URI; + return selectedFallback; + }); + + // Prevent infinite loops if fallbacks also fail + setRetryCount(current => current + 1); + }} + /> + ); +}; + +const styles = StyleSheet.create({ + placeholder: { + alignItems: 'center', + justifyContent: 'center', + backgroundColor: '#e7ece8', + }, + placeholderText: { + fontSize: 18, + fontWeight: '700', + color: '#5f6f63', + }, +}); diff --git a/components/SplashScreen.tsx b/components/SplashScreen.tsx index 562cbc9..b770f51 100644 --- a/components/SplashScreen.tsx +++ b/components/SplashScreen.tsx @@ -1,70 +1,70 @@ -import React, { useEffect, useRef } from 'react'; -import { View, Text, Animated, StyleSheet, Image } from 'react-native'; - -export default function SplashScreen() { - const fadeAnim = useRef(new Animated.Value(0)).current; - - useEffect(() => { - Animated.timing(fadeAnim, { - toValue: 1, - duration: 800, - useNativeDriver: true, - }).start(); - }, []); - - return ( - - - - - - GreenLens - Identify any plant - - - ); -} - -const styles = StyleSheet.create({ - container: { - flex: 1, - backgroundColor: '#1c1917', - alignItems: 'center', - justifyContent: 'center', - }, - content: { - alignItems: 'center', - }, - iconContainer: { - width: 100, - height: 100, - borderRadius: 24, - backgroundColor: '#ffffff', - elevation: 8, - shadowColor: '#4ade80', - shadowOffset: { width: 0, height: 4 }, - shadowOpacity: 0.2, - shadowRadius: 12, - marginBottom: 8, - overflow: 'hidden', - }, - icon: { - width: '100%', - height: '100%', - }, - title: { - fontSize: 36, - fontWeight: '700', - color: '#fafaf9', - marginTop: 16, - }, - subtitle: { - fontSize: 16, - color: '#a8a29e', - marginTop: 8, - }, -}); +import React, { useEffect, useRef } from 'react'; +import { View, Text, Animated, StyleSheet, Image } from 'react-native'; + +export default function SplashScreen() { + const fadeAnim = useRef(new Animated.Value(0)).current; + + useEffect(() => { + Animated.timing(fadeAnim, { + toValue: 1, + duration: 800, + useNativeDriver: true, + }).start(); + }, []); + + return ( + + + + + + GreenLens + Identify any plant + + + ); +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: '#1c1917', + alignItems: 'center', + justifyContent: 'center', + }, + content: { + alignItems: 'center', + }, + iconContainer: { + width: 100, + height: 100, + borderRadius: 24, + backgroundColor: '#ffffff', + elevation: 8, + shadowColor: '#4ade80', + shadowOffset: { width: 0, height: 4 }, + shadowOpacity: 0.2, + shadowRadius: 12, + marginBottom: 8, + overflow: 'hidden', + }, + icon: { + width: '100%', + height: '100%', + }, + title: { + fontSize: 36, + fontWeight: '700', + color: '#fafaf9', + marginTop: 16, + }, + subtitle: { + fontSize: 16, + color: '#a8a29e', + marginTop: 8, + }, +}); diff --git a/components/ThemeBackdrop.tsx b/components/ThemeBackdrop.tsx index f63acef..3a0e4e0 100644 --- a/components/ThemeBackdrop.tsx +++ b/components/ThemeBackdrop.tsx @@ -1,108 +1,108 @@ -import React, { useMemo } from 'react'; -import { StyleSheet, View } from 'react-native'; -import { AppColors } from '../constants/Colors'; - -interface ThemeBackdropProps { - colors: AppColors; -} - -const texturePoints = [ - [4, 6, 2], [12, 14, 1], [20, 9, 2], [26, 19, 1], [34, 8, 2], [42, 16, 1], - [50, 10, 1], [58, 18, 2], [66, 7, 1], [74, 15, 2], [82, 11, 1], [90, 17, 2], - [8, 30, 1], [16, 25, 2], [24, 33, 1], [32, 27, 2], [40, 35, 1], [48, 28, 2], - [56, 36, 1], [64, 26, 2], [72, 34, 1], [80, 29, 2], [88, 37, 1], [94, 31, 2], - [6, 48, 2], [14, 44, 1], [22, 52, 2], [30, 46, 1], [38, 54, 2], [46, 49, 1], - [54, 56, 2], [62, 45, 1], [70, 53, 2], [78, 47, 1], [86, 55, 2], [92, 50, 1], - [10, 70, 1], [18, 64, 2], [26, 72, 1], [34, 67, 2], [42, 74, 1], [50, 68, 2], - [58, 76, 1], [66, 65, 2], [74, 73, 1], [82, 69, 2], [90, 77, 1], [96, 71, 2], -]; - -const parseColor = (value: string) => { - if (value.startsWith('#')) { - const cleaned = value.replace('#', ''); - const normalized = cleaned.length === 3 - ? cleaned.split('').map((c) => `${c}${c}`).join('') - : cleaned; - const int = Number.parseInt(normalized, 16); - return { - r: (int >> 16) & 255, - g: (int >> 8) & 255, - b: int & 255, - a: 1, - }; - } - - const match = value.match(/rgba?\(([^)]+)\)/i); - if (!match) return { r: 0, g: 0, b: 0, a: 0 }; - const parts = match[1].split(',').map((part) => part.trim()); - return { - r: Number.parseFloat(parts[0]) || 0, - g: Number.parseFloat(parts[1]) || 0, - b: Number.parseFloat(parts[2]) || 0, - a: parts.length > 3 ? Number.parseFloat(parts[3]) || 0 : 1, - }; -}; - -const mixColor = (start: string, end: string, ratio: number) => { - const a = parseColor(start); - const b = parseColor(end); - const t = Math.max(0, Math.min(1, ratio)); - const r = Math.round(a.r + (b.r - a.r) * t); - const g = Math.round(a.g + (b.g - a.g) * t); - const bl = Math.round(a.b + (b.b - a.b) * t); - const alpha = a.a + (b.a - a.a) * t; - return `rgba(${r}, ${g}, ${bl}, ${alpha})`; -}; - -const ThemeBackdropInner: React.FC = ({ colors }) => { - const gradientStrips = useMemo(() => - Array.from({ length: 18 }).map((_, index, arr) => { - const ratio = index / (arr.length - 1); - return mixColor(colors.pageGradientStart, colors.pageGradientEnd, ratio); - }), - [colors.pageGradientStart, colors.pageGradientEnd]); - - return ( - - - {gradientStrips.map((stripColor, index) => ( - - ))} - - - {texturePoints.map(([x, y, size], index) => ( - - ))} - - - ); -}; - -export const ThemeBackdrop = React.memo(ThemeBackdropInner); - -const styles = StyleSheet.create({ - gradientLayer: { ...StyleSheet.absoluteFillObject }, - gradientStrip: { flex: 1 }, - textureLayer: { - ...StyleSheet.absoluteFillObject, - }, - noiseDot: { - position: 'absolute', - }, -}); +import React, { useMemo } from 'react'; +import { StyleSheet, View } from 'react-native'; +import { AppColors } from '../constants/Colors'; + +interface ThemeBackdropProps { + colors: AppColors; +} + +const texturePoints = [ + [4, 6, 2], [12, 14, 1], [20, 9, 2], [26, 19, 1], [34, 8, 2], [42, 16, 1], + [50, 10, 1], [58, 18, 2], [66, 7, 1], [74, 15, 2], [82, 11, 1], [90, 17, 2], + [8, 30, 1], [16, 25, 2], [24, 33, 1], [32, 27, 2], [40, 35, 1], [48, 28, 2], + [56, 36, 1], [64, 26, 2], [72, 34, 1], [80, 29, 2], [88, 37, 1], [94, 31, 2], + [6, 48, 2], [14, 44, 1], [22, 52, 2], [30, 46, 1], [38, 54, 2], [46, 49, 1], + [54, 56, 2], [62, 45, 1], [70, 53, 2], [78, 47, 1], [86, 55, 2], [92, 50, 1], + [10, 70, 1], [18, 64, 2], [26, 72, 1], [34, 67, 2], [42, 74, 1], [50, 68, 2], + [58, 76, 1], [66, 65, 2], [74, 73, 1], [82, 69, 2], [90, 77, 1], [96, 71, 2], +]; + +const parseColor = (value: string) => { + if (value.startsWith('#')) { + const cleaned = value.replace('#', ''); + const normalized = cleaned.length === 3 + ? cleaned.split('').map((c) => `${c}${c}`).join('') + : cleaned; + const int = Number.parseInt(normalized, 16); + return { + r: (int >> 16) & 255, + g: (int >> 8) & 255, + b: int & 255, + a: 1, + }; + } + + const match = value.match(/rgba?\(([^)]+)\)/i); + if (!match) return { r: 0, g: 0, b: 0, a: 0 }; + const parts = match[1].split(',').map((part) => part.trim()); + return { + r: Number.parseFloat(parts[0]) || 0, + g: Number.parseFloat(parts[1]) || 0, + b: Number.parseFloat(parts[2]) || 0, + a: parts.length > 3 ? Number.parseFloat(parts[3]) || 0 : 1, + }; +}; + +const mixColor = (start: string, end: string, ratio: number) => { + const a = parseColor(start); + const b = parseColor(end); + const t = Math.max(0, Math.min(1, ratio)); + const r = Math.round(a.r + (b.r - a.r) * t); + const g = Math.round(a.g + (b.g - a.g) * t); + const bl = Math.round(a.b + (b.b - a.b) * t); + const alpha = a.a + (b.a - a.a) * t; + return `rgba(${r}, ${g}, ${bl}, ${alpha})`; +}; + +const ThemeBackdropInner: React.FC = ({ colors }) => { + const gradientStrips = useMemo(() => + Array.from({ length: 18 }).map((_, index, arr) => { + const ratio = index / (arr.length - 1); + return mixColor(colors.pageGradientStart, colors.pageGradientEnd, ratio); + }), + [colors.pageGradientStart, colors.pageGradientEnd]); + + return ( + + + {gradientStrips.map((stripColor, index) => ( + + ))} + + + {texturePoints.map(([x, y, size], index) => ( + + ))} + + + ); +}; + +export const ThemeBackdrop = React.memo(ThemeBackdropInner); + +const styles = StyleSheet.create({ + gradientLayer: { ...StyleSheet.absoluteFillObject }, + gradientStrip: { flex: 1 }, + textureLayer: { + ...StyleSheet.absoluteFillObject, + }, + noiseDot: { + position: 'absolute', + }, +}); diff --git a/components/Toast.tsx b/components/Toast.tsx index 09bc108..14d1cdd 100644 --- a/components/Toast.tsx +++ b/components/Toast.tsx @@ -1,79 +1,79 @@ -import React, { useEffect, useRef } from 'react'; -import { Animated, Text, StyleSheet, View } from 'react-native'; -import { Ionicons } from '@expo/vector-icons'; -import { useColors } from '../constants/Colors'; -import { ColorPalette } from '../types'; - -interface ToastProps { - message: string; - isVisible: boolean; - onClose: () => void; - isDark?: boolean; - colorPalette?: ColorPalette; -} - -export const Toast: React.FC = ({ - message, - isVisible, - onClose, - isDark = false, - colorPalette = 'forest', -}) => { - const colors = useColors(isDark, colorPalette); - const opacity = useRef(new Animated.Value(0)).current; - const translateY = useRef(new Animated.Value(20)).current; - - useEffect(() => { - if (isVisible) { - Animated.parallel([ - Animated.timing(opacity, { toValue: 1, duration: 300, useNativeDriver: true }), - Animated.timing(translateY, { toValue: 0, duration: 300, useNativeDriver: true }), - ]).start(); - - const timer = setTimeout(() => { - Animated.parallel([ - Animated.timing(opacity, { toValue: 0, duration: 300, useNativeDriver: true }), - Animated.timing(translateY, { toValue: 20, duration: 300, useNativeDriver: true }), - ]).start(() => onClose()); - }, 3000); - - return () => clearTimeout(timer); - } - }, [isVisible]); - - if (!isVisible) return null; - - return ( - - - - {message} - - - ); -}; - -const styles = StyleSheet.create({ - container: { - position: 'absolute', - bottom: 100, - left: 0, - right: 0, - alignItems: 'center', - zIndex: 70, - pointerEvents: 'none', - }, - toast: { - flexDirection: 'row', - alignItems: 'center', - gap: 8, - paddingHorizontal: 16, - paddingVertical: 12, - borderRadius: 24, - shadowOffset: { width: 0, height: 4 }, - shadowOpacity: 0.2, - shadowRadius: 8, - elevation: 8, - }, - text: { fontSize: 13, fontWeight: '500' }, -}); +import React, { useEffect, useRef } from 'react'; +import { Animated, Text, StyleSheet, View } from 'react-native'; +import { Ionicons } from '@expo/vector-icons'; +import { useColors } from '../constants/Colors'; +import { ColorPalette } from '../types'; + +interface ToastProps { + message: string; + isVisible: boolean; + onClose: () => void; + isDark?: boolean; + colorPalette?: ColorPalette; +} + +export const Toast: React.FC = ({ + message, + isVisible, + onClose, + isDark = false, + colorPalette = 'forest', +}) => { + const colors = useColors(isDark, colorPalette); + const opacity = useRef(new Animated.Value(0)).current; + const translateY = useRef(new Animated.Value(20)).current; + + useEffect(() => { + if (isVisible) { + Animated.parallel([ + Animated.timing(opacity, { toValue: 1, duration: 300, useNativeDriver: true }), + Animated.timing(translateY, { toValue: 0, duration: 300, useNativeDriver: true }), + ]).start(); + + const timer = setTimeout(() => { + Animated.parallel([ + Animated.timing(opacity, { toValue: 0, duration: 300, useNativeDriver: true }), + Animated.timing(translateY, { toValue: 20, duration: 300, useNativeDriver: true }), + ]).start(() => onClose()); + }, 3000); + + return () => clearTimeout(timer); + } + }, [isVisible]); + + if (!isVisible) return null; + + return ( + + + + {message} + + + ); +}; + +const styles = StyleSheet.create({ + container: { + position: 'absolute', + bottom: 100, + left: 0, + right: 0, + alignItems: 'center', + zIndex: 70, + pointerEvents: 'none', + }, + toast: { + flexDirection: 'row', + alignItems: 'center', + gap: 8, + paddingHorizontal: 16, + paddingVertical: 12, + borderRadius: 24, + shadowOffset: { width: 0, height: 4 }, + shadowOpacity: 0.2, + shadowRadius: 8, + elevation: 8, + }, + text: { fontSize: 13, fontWeight: '500' }, +}); diff --git a/constants/Colors.ts b/constants/Colors.ts index 82362cd..404f650 100644 --- a/constants/Colors.ts +++ b/constants/Colors.ts @@ -1,354 +1,354 @@ -import { AppColorScheme, ColorPalette } from '../types'; - -interface SchemeColors { - text: string; - textSecondary: string; - textMuted: string; - textOnImage: string; - background: string; - surface: string; - surfaceMuted: string; - surfaceStrong: string; - border: string; - borderStrong: string; - overlay: string; - overlayStrong: string; - heroButton: string; - heroButtonBorder: string; - tabBarBg: string; - tabBarBorder: string; - inputBg: string; - inputBorder: string; - cardBg: string; - cardBorder: string; - cardShadow: string; - chipBg: string; - chipBorder: string; - pageBase: string; - pageGradientStart: string; - pageGradientEnd: string; - pageTexture: string; -} - -interface PaletteColors { - primary: string; - primaryDark: string; - info: string; - warning: string; - danger: string; - success: string; - accent: string; -} - -interface PaletteSurfaceTone { - background: string; - surface: string; - surfaceMuted: string; - surfaceStrong: string; - border: string; - borderStrong: string; - tabBarBg: string; - tabBarBorder: string; - pageBase: string; - pageGradientStart: string; - pageGradientEnd: string; - pageTexture: string; -} - -interface PaletteThemeTone { - light: PaletteSurfaceTone; - dark: PaletteSurfaceTone; -} - -export interface AppColors extends SchemeColors, PaletteColors { - onPrimary: string; - primarySoft: string; - infoSoft: string; - warningSoft: string; - dangerSoft: string; - successSoft: string; - primaryTint: string; - infoTint: string; - warningTint: string; - dangerTint: string; - successTint: string; - mutedChip: string; - fabBg: string; - fabShadow: string; - iconOnImage: string; -} - -const textByScheme: Record< - AppColorScheme, - Pick -> = { - light: { - text: '#1f2520', - textSecondary: '#4d5650', - textMuted: '#6e7871', - textOnImage: '#f7f8f7', - overlay: 'rgba(16, 20, 17, 0.4)', - overlayStrong: 'rgba(13, 17, 14, 0.78)', - }, - dark: { - text: '#f0f3f1', - textSecondary: '#c9d0cb', - textMuted: '#a1aba4', - textOnImage: '#f5f7f6', - overlay: 'rgba(9, 11, 10, 0.52)', - overlayStrong: 'rgba(8, 10, 9, 0.86)', - }, -}; - -const paletteSurfaces: Record = { - forest: { - light: { - background: '#ecf3ed', - surface: '#f5faf6', - surfaceMuted: '#e4ede6', - surfaceStrong: '#d8e3d9', - border: '#c7d4c8', - borderStrong: '#b3c4b5', - tabBarBg: '#f1f7f2', - tabBarBorder: '#ccd9ce', - pageBase: '#e9f1ea', - pageGradientStart: '#dde9de', - pageGradientEnd: '#f1f5f0', - pageTexture: '#4b6a50', - }, - dark: { - background: '#111813', - surface: '#17211a', - surfaceMuted: '#1d2920', - surfaceStrong: '#243128', - border: '#2b3a2f', - borderStrong: '#394c3d', - tabBarBg: '#141d17', - tabBarBorder: '#2f4033', - pageBase: '#111813', - pageGradientStart: '#15211a', - pageGradientEnd: '#0f1511', - pageTexture: '#91b196', - }, - }, - ocean: { - light: { - background: '#ebf1f8', - surface: '#f4f8fc', - surfaceMuted: '#e1e8f1', - surfaceStrong: '#d4deeb', - border: '#c2cfde', - borderStrong: '#acbdd1', - tabBarBg: '#eef4fa', - tabBarBorder: '#c8d6e6', - pageBase: '#e9f0f7', - pageGradientStart: '#d9e3f0', - pageGradientEnd: '#eef3f8', - pageTexture: '#4c6480', - }, - dark: { - background: '#10171f', - surface: '#16202b', - surfaceMuted: '#1c2734', - surfaceStrong: '#243143', - border: '#2c3b4d', - borderStrong: '#3a4e64', - tabBarBg: '#131c26', - tabBarBorder: '#324357', - pageBase: '#10171f', - pageGradientStart: '#152230', - pageGradientEnd: '#0f151d', - pageTexture: '#96aac2', - }, - }, - sunset: { - light: { - background: '#f7eee8', - surface: '#fdf7f3', - surfaceMuted: '#f2e5da', - surfaceStrong: '#ead8c8', - border: '#dbc4b1', - borderStrong: '#cfb197', - tabBarBg: '#f9f0e8', - tabBarBorder: '#decaB9', - pageBase: '#f6ece4', - pageGradientStart: '#efdccd', - pageGradientEnd: '#f8f1eb', - pageTexture: '#8a644e', - }, - dark: { - background: '#1b1410', - surface: '#271c16', - surfaceMuted: '#31231b', - surfaceStrong: '#3f2d22', - border: '#4a372a', - borderStrong: '#604633', - tabBarBg: '#231913', - tabBarBorder: '#553d2c', - pageBase: '#1a1410', - pageGradientStart: '#2a1d15', - pageGradientEnd: '#16110d', - pageTexture: '#c8a690', - }, - }, - mono: { - light: { - background: '#eff1f3', - surface: '#f7f8fa', - surfaceMuted: '#e5e8ec', - surfaceStrong: '#d8dde3', - border: '#c8ced6', - borderStrong: '#b4bdc8', - tabBarBg: '#f2f4f7', - tabBarBorder: '#cdd3db', - pageBase: '#eceff2', - pageGradientStart: '#dfe4ea', - pageGradientEnd: '#f2f4f6', - pageTexture: '#666f7b', - }, - dark: { - background: '#131518', - surface: '#1b1f24', - surfaceMuted: '#232932', - surfaceStrong: '#2d3540', - border: '#343f4c', - borderStrong: '#455364', - tabBarBg: '#171b20', - tabBarBorder: '#3a4552', - pageBase: '#131518', - pageGradientStart: '#1a2028', - pageGradientEnd: '#111418', - pageTexture: '#a1adbc', - }, - }, -}; - -const palettes: Record = { - forest: { - primary: '#5fa779', - primaryDark: '#3d7f57', - info: '#4e7fb3', - warning: '#bb8a36', - danger: '#be5d5d', - success: '#4f9767', - accent: '#4a8e7f', - }, - ocean: { - primary: '#5a90be', - primaryDark: '#3d6f99', - info: '#4e79b1', - warning: '#bc8b37', - danger: '#be6464', - success: '#4f8b80', - accent: '#4f8fa0', - }, - sunset: { - primary: '#c98965', - primaryDark: '#a36442', - info: '#6c89b4', - warning: '#bd8742', - danger: '#b8666d', - success: '#769f6e', - accent: '#b47453', - }, - mono: { - primary: '#7b8796', - primaryDark: '#5b6574', - info: '#748498', - warning: '#9d8b5a', - danger: '#a86868', - success: '#6f8b75', - accent: '#6c7785', - }, -}; - -const hexToRgb = (hex: string) => { - const cleaned = hex.replace('#', ''); - const normalized = - cleaned.length === 3 - ? cleaned - .split('') - .map((char) => `${char}${char}`) - .join('') - : cleaned; - const int = Number.parseInt(normalized, 16); - return { - r: (int >> 16) & 255, - g: (int >> 8) & 255, - b: int & 255, - }; -}; - -const withOpacity = (hex: string, opacity: number) => { - const { r, g, b } = hexToRgb(hex); - return `rgba(${r}, ${g}, ${b}, ${opacity})`; -}; - -const mixColors = (baseHex: string, tintHex: string, tintWeight: number) => { - const base = hexToRgb(baseHex); - const tint = hexToRgb(tintHex); - const weight = Math.max(0, Math.min(1, tintWeight)); - const r = Math.round(base.r + (tint.r - base.r) * weight); - const g = Math.round(base.g + (tint.g - base.g) * weight); - const b = Math.round(base.b + (tint.b - base.b) * weight); - return `rgb(${r}, ${g}, ${b})`; -}; - -const getOnColor = (hex: string) => { - const { r, g, b } = hexToRgb(hex); - const luminance = (0.2126 * r + 0.7152 * g + 0.0722 * b) / 255; - return luminance > 0.58 ? '#111111' : '#ffffff'; -}; - -export const useColors = ( - isDark: boolean, - palette: ColorPalette = 'forest' -): AppColors => { - const schemeKey: AppColorScheme = isDark ? 'dark' : 'light'; - const textColors = textByScheme[schemeKey]; - const paletteColors = palettes[palette]; - const tone = paletteSurfaces[palette][schemeKey]; - - return { - ...textColors, - ...paletteColors, - background: tone.background, - surface: tone.surface, - surfaceMuted: tone.surfaceMuted, - surfaceStrong: tone.surfaceStrong, - border: tone.border, - borderStrong: tone.borderStrong, - tabBarBg: tone.tabBarBg, - tabBarBorder: tone.tabBarBorder, - inputBg: tone.surfaceMuted, - inputBorder: tone.borderStrong, - cardBg: withOpacity(tone.surface, isDark ? 0.9 : 0.92), - cardBorder: withOpacity(tone.borderStrong, isDark ? 0.7 : 0.82), - cardShadow: withOpacity('#000000', isDark ? 0.26 : 0.12), - chipBg: tone.surfaceStrong, - chipBorder: tone.border, - pageBase: tone.pageBase, - pageGradientStart: withOpacity(tone.pageGradientStart, isDark ? 0.44 : 0.52), - pageGradientEnd: withOpacity(tone.pageGradientEnd, isDark ? 0.34 : 0.44), - pageTexture: withOpacity(tone.pageTexture, isDark ? 0.09 : 0.07), - overlay: textColors.overlay, - overlayStrong: textColors.overlayStrong, - heroButton: withOpacity(tone.surface, isDark ? 0.9 : 0.94), - heroButtonBorder: withOpacity(tone.borderStrong, isDark ? 0.7 : 0.8), - onPrimary: getOnColor(paletteColors.primary), - primarySoft: withOpacity(paletteColors.primary, isDark ? 0.26 : 0.18), - infoSoft: withOpacity(paletteColors.info, isDark ? 0.24 : 0.16), - warningSoft: withOpacity(paletteColors.warning, isDark ? 0.24 : 0.18), - dangerSoft: withOpacity(paletteColors.danger, isDark ? 0.2 : 0.14), - successSoft: withOpacity(paletteColors.success, isDark ? 0.2 : 0.14), - primaryTint: mixColors(tone.surfaceStrong, paletteColors.primary, isDark ? 0.22 : 0.2), - infoTint: mixColors(tone.surfaceStrong, paletteColors.info, isDark ? 0.2 : 0.18), - warningTint: mixColors(tone.surfaceStrong, paletteColors.warning, isDark ? 0.22 : 0.2), - dangerTint: mixColors(tone.surfaceStrong, paletteColors.danger, isDark ? 0.2 : 0.18), - successTint: mixColors(tone.surfaceStrong, paletteColors.success, isDark ? 0.2 : 0.18), - mutedChip: tone.surfaceStrong, - fabBg: paletteColors.primary, - fabShadow: withOpacity(paletteColors.primaryDark, 0.75), - iconOnImage: '#ffffff', - }; -}; +import { AppColorScheme, ColorPalette } from '../types'; + +interface SchemeColors { + text: string; + textSecondary: string; + textMuted: string; + textOnImage: string; + background: string; + surface: string; + surfaceMuted: string; + surfaceStrong: string; + border: string; + borderStrong: string; + overlay: string; + overlayStrong: string; + heroButton: string; + heroButtonBorder: string; + tabBarBg: string; + tabBarBorder: string; + inputBg: string; + inputBorder: string; + cardBg: string; + cardBorder: string; + cardShadow: string; + chipBg: string; + chipBorder: string; + pageBase: string; + pageGradientStart: string; + pageGradientEnd: string; + pageTexture: string; +} + +interface PaletteColors { + primary: string; + primaryDark: string; + info: string; + warning: string; + danger: string; + success: string; + accent: string; +} + +interface PaletteSurfaceTone { + background: string; + surface: string; + surfaceMuted: string; + surfaceStrong: string; + border: string; + borderStrong: string; + tabBarBg: string; + tabBarBorder: string; + pageBase: string; + pageGradientStart: string; + pageGradientEnd: string; + pageTexture: string; +} + +interface PaletteThemeTone { + light: PaletteSurfaceTone; + dark: PaletteSurfaceTone; +} + +export interface AppColors extends SchemeColors, PaletteColors { + onPrimary: string; + primarySoft: string; + infoSoft: string; + warningSoft: string; + dangerSoft: string; + successSoft: string; + primaryTint: string; + infoTint: string; + warningTint: string; + dangerTint: string; + successTint: string; + mutedChip: string; + fabBg: string; + fabShadow: string; + iconOnImage: string; +} + +const textByScheme: Record< + AppColorScheme, + Pick +> = { + light: { + text: '#1f2520', + textSecondary: '#4d5650', + textMuted: '#6e7871', + textOnImage: '#f7f8f7', + overlay: 'rgba(16, 20, 17, 0.4)', + overlayStrong: 'rgba(13, 17, 14, 0.78)', + }, + dark: { + text: '#f0f3f1', + textSecondary: '#c9d0cb', + textMuted: '#a1aba4', + textOnImage: '#f5f7f6', + overlay: 'rgba(9, 11, 10, 0.52)', + overlayStrong: 'rgba(8, 10, 9, 0.86)', + }, +}; + +const paletteSurfaces: Record = { + forest: { + light: { + background: '#ecf3ed', + surface: '#f5faf6', + surfaceMuted: '#e4ede6', + surfaceStrong: '#d8e3d9', + border: '#c7d4c8', + borderStrong: '#b3c4b5', + tabBarBg: '#f1f7f2', + tabBarBorder: '#ccd9ce', + pageBase: '#e9f1ea', + pageGradientStart: '#dde9de', + pageGradientEnd: '#f1f5f0', + pageTexture: '#4b6a50', + }, + dark: { + background: '#111813', + surface: '#17211a', + surfaceMuted: '#1d2920', + surfaceStrong: '#243128', + border: '#2b3a2f', + borderStrong: '#394c3d', + tabBarBg: '#141d17', + tabBarBorder: '#2f4033', + pageBase: '#111813', + pageGradientStart: '#15211a', + pageGradientEnd: '#0f1511', + pageTexture: '#91b196', + }, + }, + ocean: { + light: { + background: '#ebf1f8', + surface: '#f4f8fc', + surfaceMuted: '#e1e8f1', + surfaceStrong: '#d4deeb', + border: '#c2cfde', + borderStrong: '#acbdd1', + tabBarBg: '#eef4fa', + tabBarBorder: '#c8d6e6', + pageBase: '#e9f0f7', + pageGradientStart: '#d9e3f0', + pageGradientEnd: '#eef3f8', + pageTexture: '#4c6480', + }, + dark: { + background: '#10171f', + surface: '#16202b', + surfaceMuted: '#1c2734', + surfaceStrong: '#243143', + border: '#2c3b4d', + borderStrong: '#3a4e64', + tabBarBg: '#131c26', + tabBarBorder: '#324357', + pageBase: '#10171f', + pageGradientStart: '#152230', + pageGradientEnd: '#0f151d', + pageTexture: '#96aac2', + }, + }, + sunset: { + light: { + background: '#f7eee8', + surface: '#fdf7f3', + surfaceMuted: '#f2e5da', + surfaceStrong: '#ead8c8', + border: '#dbc4b1', + borderStrong: '#cfb197', + tabBarBg: '#f9f0e8', + tabBarBorder: '#decaB9', + pageBase: '#f6ece4', + pageGradientStart: '#efdccd', + pageGradientEnd: '#f8f1eb', + pageTexture: '#8a644e', + }, + dark: { + background: '#1b1410', + surface: '#271c16', + surfaceMuted: '#31231b', + surfaceStrong: '#3f2d22', + border: '#4a372a', + borderStrong: '#604633', + tabBarBg: '#231913', + tabBarBorder: '#553d2c', + pageBase: '#1a1410', + pageGradientStart: '#2a1d15', + pageGradientEnd: '#16110d', + pageTexture: '#c8a690', + }, + }, + mono: { + light: { + background: '#eff1f3', + surface: '#f7f8fa', + surfaceMuted: '#e5e8ec', + surfaceStrong: '#d8dde3', + border: '#c8ced6', + borderStrong: '#b4bdc8', + tabBarBg: '#f2f4f7', + tabBarBorder: '#cdd3db', + pageBase: '#eceff2', + pageGradientStart: '#dfe4ea', + pageGradientEnd: '#f2f4f6', + pageTexture: '#666f7b', + }, + dark: { + background: '#131518', + surface: '#1b1f24', + surfaceMuted: '#232932', + surfaceStrong: '#2d3540', + border: '#343f4c', + borderStrong: '#455364', + tabBarBg: '#171b20', + tabBarBorder: '#3a4552', + pageBase: '#131518', + pageGradientStart: '#1a2028', + pageGradientEnd: '#111418', + pageTexture: '#a1adbc', + }, + }, +}; + +const palettes: Record = { + forest: { + primary: '#5fa779', + primaryDark: '#3d7f57', + info: '#4e7fb3', + warning: '#bb8a36', + danger: '#be5d5d', + success: '#4f9767', + accent: '#4a8e7f', + }, + ocean: { + primary: '#5a90be', + primaryDark: '#3d6f99', + info: '#4e79b1', + warning: '#bc8b37', + danger: '#be6464', + success: '#4f8b80', + accent: '#4f8fa0', + }, + sunset: { + primary: '#c98965', + primaryDark: '#a36442', + info: '#6c89b4', + warning: '#bd8742', + danger: '#b8666d', + success: '#769f6e', + accent: '#b47453', + }, + mono: { + primary: '#7b8796', + primaryDark: '#5b6574', + info: '#748498', + warning: '#9d8b5a', + danger: '#a86868', + success: '#6f8b75', + accent: '#6c7785', + }, +}; + +const hexToRgb = (hex: string) => { + const cleaned = hex.replace('#', ''); + const normalized = + cleaned.length === 3 + ? cleaned + .split('') + .map((char) => `${char}${char}`) + .join('') + : cleaned; + const int = Number.parseInt(normalized, 16); + return { + r: (int >> 16) & 255, + g: (int >> 8) & 255, + b: int & 255, + }; +}; + +const withOpacity = (hex: string, opacity: number) => { + const { r, g, b } = hexToRgb(hex); + return `rgba(${r}, ${g}, ${b}, ${opacity})`; +}; + +const mixColors = (baseHex: string, tintHex: string, tintWeight: number) => { + const base = hexToRgb(baseHex); + const tint = hexToRgb(tintHex); + const weight = Math.max(0, Math.min(1, tintWeight)); + const r = Math.round(base.r + (tint.r - base.r) * weight); + const g = Math.round(base.g + (tint.g - base.g) * weight); + const b = Math.round(base.b + (tint.b - base.b) * weight); + return `rgb(${r}, ${g}, ${b})`; +}; + +const getOnColor = (hex: string) => { + const { r, g, b } = hexToRgb(hex); + const luminance = (0.2126 * r + 0.7152 * g + 0.0722 * b) / 255; + return luminance > 0.58 ? '#111111' : '#ffffff'; +}; + +export const useColors = ( + isDark: boolean, + palette: ColorPalette = 'forest' +): AppColors => { + const schemeKey: AppColorScheme = isDark ? 'dark' : 'light'; + const textColors = textByScheme[schemeKey]; + const paletteColors = palettes[palette]; + const tone = paletteSurfaces[palette][schemeKey]; + + return { + ...textColors, + ...paletteColors, + background: tone.background, + surface: tone.surface, + surfaceMuted: tone.surfaceMuted, + surfaceStrong: tone.surfaceStrong, + border: tone.border, + borderStrong: tone.borderStrong, + tabBarBg: tone.tabBarBg, + tabBarBorder: tone.tabBarBorder, + inputBg: tone.surfaceMuted, + inputBorder: tone.borderStrong, + cardBg: withOpacity(tone.surface, isDark ? 0.9 : 0.92), + cardBorder: withOpacity(tone.borderStrong, isDark ? 0.7 : 0.82), + cardShadow: withOpacity('#000000', isDark ? 0.26 : 0.12), + chipBg: tone.surfaceStrong, + chipBorder: tone.border, + pageBase: tone.pageBase, + pageGradientStart: withOpacity(tone.pageGradientStart, isDark ? 0.44 : 0.52), + pageGradientEnd: withOpacity(tone.pageGradientEnd, isDark ? 0.34 : 0.44), + pageTexture: withOpacity(tone.pageTexture, isDark ? 0.09 : 0.07), + overlay: textColors.overlay, + overlayStrong: textColors.overlayStrong, + heroButton: withOpacity(tone.surface, isDark ? 0.9 : 0.94), + heroButtonBorder: withOpacity(tone.borderStrong, isDark ? 0.7 : 0.8), + onPrimary: getOnColor(paletteColors.primary), + primarySoft: withOpacity(paletteColors.primary, isDark ? 0.26 : 0.18), + infoSoft: withOpacity(paletteColors.info, isDark ? 0.24 : 0.16), + warningSoft: withOpacity(paletteColors.warning, isDark ? 0.24 : 0.18), + dangerSoft: withOpacity(paletteColors.danger, isDark ? 0.2 : 0.14), + successSoft: withOpacity(paletteColors.success, isDark ? 0.2 : 0.14), + primaryTint: mixColors(tone.surfaceStrong, paletteColors.primary, isDark ? 0.22 : 0.2), + infoTint: mixColors(tone.surfaceStrong, paletteColors.info, isDark ? 0.2 : 0.18), + warningTint: mixColors(tone.surfaceStrong, paletteColors.warning, isDark ? 0.22 : 0.2), + dangerTint: mixColors(tone.surfaceStrong, paletteColors.danger, isDark ? 0.2 : 0.18), + successTint: mixColors(tone.surfaceStrong, paletteColors.success, isDark ? 0.2 : 0.18), + mutedChip: tone.surfaceStrong, + fabBg: paletteColors.primary, + fabShadow: withOpacity(paletteColors.primaryDark, 0.75), + iconOnImage: '#ffffff', + }; +}; diff --git a/constants/lexiconBatch1.ts b/constants/lexiconBatch1.ts index d4a7e6f..53b9dd0 100644 --- a/constants/lexiconBatch1.ts +++ b/constants/lexiconBatch1.ts @@ -1,1006 +1,1006 @@ -export interface LexiconBatchEntry { - name: string; - botanicalName: string; - confidence: number; - careInfo: { - waterIntervalDays: number; - light: string; - temp: string; - }; - description?: string; - imageUri: string; - categories: string[]; -} - -export const LEXICON_BATCH_1_ENTRIES: LexiconBatchEntry[] = [ - { - name: 'Birkenfeige', - botanicalName: 'Ficus benjamina', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '16-24 °C' }, - description: 'Die Birkenfeige ist ein eleganter Zimmerstrauch mit haengenden Aesten und kleinen, glaenzenden Blaettern.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/1/19/Starr-080608-7576-Ficus_benjamina-habit_with_Laysan_albatross-Gym_Sand_Island-Midway_Atoll_%2824823189861%29.jpg/500px-Starr-080608-7576-Ficus_benjamina-habit_with_Laysan_albatross-Gym_Sand_Island-Midway_Atoll_%2824823189861%29.jpg', - categories: ['tree', 'air_purifier'], - }, - { - name: 'Ufopflanze', - botanicalName: 'Pilea peperomioides', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '13-30 °C' }, - description: 'Die Ufopflanze hat unverwechselbare, runde Blaetter auf langen Stielen. Bildet leicht Ableger zum Verschenken.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/6d/Pilea_peperomioides_Chinese_money_plant.jpg/500px-Pilea_peperomioides_Chinese_money_plant.jpg', - categories: ['easy', 'pet_friendly'], - }, - { - name: 'Paradiesvogelblume', - botanicalName: 'Strelitzia reginae', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Volles Sonnenlicht', temp: '18-26 °C' }, - description: 'Die Paradiesvogelblume beeindruckt mit leuchtend orangefarbenen und blauen Blueten, die einem Vogel aehneln.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/5/55/Bird_of_Paradise_flower.JPG/500px-Bird_of_Paradise_flower.JPG', - categories: ['flowering', 'sun', 'large'], - }, - { - name: 'Echeverie', - botanicalName: 'Echeveria elegans', - confidence: 1.0, - careInfo: { waterIntervalDays: 14, light: 'Volles Sonnenlicht', temp: '15-25 °C' }, - description: 'Die Echeverie bildet symmetrische, rosettenfoermige Sukkulenten mit blaugruenen Blaettern. Pflegeleicht.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/5/5d/Echeveria_elegans_-_1.png/500px-Echeveria_elegans_-_1.png', - categories: ['easy', 'succulent', 'sun'], - }, - { - name: 'Jadepflanze', - botanicalName: 'Crassula ovata', - confidence: 1.0, - careInfo: { waterIntervalDays: 14, light: 'Helles bis volles Licht', temp: '15-24 °C' }, - description: 'Die Jadepflanze ist eine langlebige Sukkulente mit dicken, ovalen Blaettern. In Japan gilt sie als Gluecksbringer.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/5/5a/Crassula_ovata_700.jpg/500px-Crassula_ovata_700.jpg', - categories: ['easy', 'succulent', 'sun'], - }, - { - name: 'Zebra-Haworthie', - botanicalName: 'Haworthia fasciata', - confidence: 1.0, - careInfo: { waterIntervalDays: 14, light: 'Helles indirektes Licht', temp: '15-25 °C' }, - description: 'Die Zebra-Haworthie ist eine kompakte Sukkulente mit weissen Querstreifen auf dunkelgruenen Blaettern.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/5/5c/1_Haworthia_fasciata_-MBB_Kabeljouws_River.jpg/500px-1_Haworthia_fasciata_-MBB_Kabeljouws_River.jpg', - categories: ['easy', 'succulent', 'low_light'], - }, - { - name: 'Eselschwanz', - botanicalName: 'Sedum morganianum', - confidence: 1.0, - careInfo: { waterIntervalDays: 14, light: 'Volles Sonnenlicht', temp: '15-25 °C' }, - description: 'Der Eselschwanz ist eine haengende Sukkulente mit langen Trieben aus dichten, blaugruenen Blaettchen.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/e/e5/Donkey%27s_tail_in_bloom_March_06.jpg/500px-Donkey%27s_tail_in_bloom_March_06.jpg', - categories: ['easy', 'succulent', 'hanging', 'sun'], - }, - { - name: 'Weihnachtskaktus', - botanicalName: 'Schlumbergera truncata', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '15-21 °C' }, - description: 'Der Weihnachtskaktus erfreut zur Weihnachtszeit mit leuchtenden Blueten in Rosa, Rot oder Weiss.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/f/f1/Schlumbergera_truncata_%28Exotic_Flora_Plate_20%29.jpg/500px-Schlumbergera_truncata_%28Exotic_Flora_Plate_20%29.jpg', - categories: ['easy', 'succulent', 'flowering'], - }, - { - name: 'Kalanchoe', - botanicalName: 'Kalanchoe blossfeldiana', - confidence: 1.0, - careInfo: { waterIntervalDays: 10, light: 'Helles bis volles Licht', temp: '15-25 °C' }, - description: 'Die Kalanchoe ist eine beliebte Bluehpflanze mit leuchtenden Blueten in Rot, Orange, Gelb oder Rosa.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/8/8d/Kalanchoe_blossfeldiana_3.jpg/500px-Kalanchoe_blossfeldiana_3.jpg', - categories: ['easy', 'succulent', 'flowering', 'sun'], - }, - { - name: 'Schwarze Rose (Aeonium)', - botanicalName: 'Aeonium arboreum', - confidence: 1.0, - careInfo: { waterIntervalDays: 10, light: 'Volles Sonnenlicht', temp: '10-25 °C' }, - description: 'Das Aeonium bildet dekorative, rosettenfoermige Sukkulenten an verzweigten Stielen.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/2/28/Madeira%2C_Palheiro_Gardens_-_Aeonium_arboreum_%28Marokko%29_IMG_2310.JPG/500px-Madeira%2C_Palheiro_Gardens_-_Aeonium_arboreum_%28Marokko%29_IMG_2310.JPG', - categories: ['succulent', 'sun'], - }, - { - name: 'Agave', - botanicalName: 'Agave americana', - confidence: 1.0, - careInfo: { waterIntervalDays: 21, light: 'Volles Sonnenlicht', temp: '10-35 °C' }, - description: 'Die Agave ist eine imposante Sukkulente mit steifen, blaugruenen Blaettern mit Stacheln. Sie bluet nur einmal.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/3/3b/Agave_July_2011-1.jpg/500px-Agave_July_2011-1.jpg', - categories: ['succulent', 'sun', 'large'], - }, - { - name: 'Bleistiftkaktus', - botanicalName: 'Euphorbia tirucalli', - confidence: 1.0, - careInfo: { waterIntervalDays: 14, light: 'Volles Sonnenlicht', temp: '18-30 °C' }, - description: 'Der Bleistiftkaktus ist eine sukkulente Wolfsmilch mit duennen, zylindrischen Zweigen ohne Blaetter.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/2/22/Euphorbia_tirucalli_in_the_wild_by_tonrulkens.jpg/500px-Euphorbia_tirucalli_in_the_wild_by_tonrulkens.jpg', - categories: ['easy', 'succulent', 'sun'], - }, - { - name: 'Drachenbaum', - botanicalName: 'Dracaena marginata', - confidence: 1.0, - careInfo: { waterIntervalDays: 10, light: 'Helles indirektes Licht', temp: '15-25 °C' }, - description: 'Der Drachenbaum ist eine schlanke Zimmerpflanze mit roten, schmalen Blaettern auf langen Staemmen.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/61/Dracaena_reflexa.JPG/500px-Dracaena_reflexa.JPG', - categories: ['easy', 'air_purifier', 'tree'], - }, - { - name: 'Maisstrauch', - botanicalName: 'Dracaena fragrans', - confidence: 1.0, - careInfo: { waterIntervalDays: 10, light: 'Helles indirektes Licht', temp: '15-25 °C' }, - description: 'Der Maisstrauch ist eine robuste Zimmerpflanze mit breiten, gestreiften Blaettern. Gedeiht auch bei wenig Licht.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/d/db/Dracaena_fragrans_%282%29.jpg/500px-Dracaena_fragrans_%282%29.jpg', - categories: ['easy', 'low_light', 'air_purifier', 'tree'], - }, - { - name: 'Herzblatt-Philodendron', - botanicalName: 'Philodendron hederaceum', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Indirektes Licht', temp: '18-28 °C' }, - description: 'Der Herzblatt-Philodendron ist eine pflegeleichte Kletter- oder Haengepflanze mit herzfoermigen Blaettern.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/b/bb/Philodendron_scandens_subsp_oxycardium2.jpg/500px-Philodendron_scandens_subsp_oxycardium2.jpg', - categories: ['easy', 'low_light', 'hanging'], - }, - { - name: 'Marmor-Efeutute', - botanicalName: 'Epipremnum aureum Marble Queen', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '15-30 °C' }, - description: 'Die Marmor-Efeutute hat cremeweiss-gruen marmorierte Blaetter. Eine dekorative Variante der klassischen Efeutute.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/c/ca/Epipremnum_aureum_Marble_Queen.jpg/500px-Epipremnum_aureum_Marble_Queen.jpg', - categories: ['easy', 'hanging', 'air_purifier'], - }, - { - name: 'Zebrakraut', - botanicalName: 'Tradescantia zebrina', - confidence: 1.0, - careInfo: { waterIntervalDays: 5, light: 'Helles indirektes Licht', temp: '15-25 °C' }, - description: 'Das Zebrakraut faellt durch seine silbrig-lila gestreiften Blaetter auf. Schnellwachsende Haengepflanze.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/f/fd/Zebrina_pendula_20060521_2_closer.jpg/500px-Zebrina_pendula_20060521_2_closer.jpg', - categories: ['easy', 'hanging', 'patterned'], - }, - { - name: 'Koenigsbegonie', - botanicalName: 'Begonia rex', - confidence: 1.0, - careInfo: { waterIntervalDays: 5, light: 'Indirektes Licht', temp: '18-25 °C' }, - description: 'Die Koenigsbegonie beeindruckt mit prachtvoll gemusterten Blaettern in Silber, Rot und Gruen.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/62/Painted_Leaved_Begonia._Begonia_rex_Putz._Flore_des_serres_et_des_jardins_de_l%27Europe_v.12_%281857%29.jpg/500px-Painted_Leaved_Begonia._Begonia_rex_Putz._Flore_des_serres_et_des_jardins_de_l%27Europe_v.12_%281857%29.jpg', - categories: ['patterned', 'high_humidity'], - }, - { - name: 'Alpenveilchen', - botanicalName: 'Cyclamen persicum', - confidence: 1.0, - careInfo: { waterIntervalDays: 5, light: 'Helles indirektes Licht', temp: '12-18 °C' }, - description: 'Das Alpenveilchen bluet im Herbst und Winter mit eleganten Blueten in Rosa, Rot oder Weiss.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/68/Yagur_%E2%80%93_Nesher%2C_the_Green_Path_%E2%80%93_Mount_Carmel_016.JPG/500px-Yagur_%E2%80%93_Nesher%2C_the_Green_Path_%E2%80%93_Mount_Carmel_016.JPG', - categories: ['flowering'], - }, - { - name: 'Fleissiges Lieschen', - botanicalName: 'Impatiens walleriana', - confidence: 1.0, - careInfo: { waterIntervalDays: 2, light: 'Helles indirektes Licht', temp: '16-24 °C' }, - description: 'Das Fleissige Lieschen bluet von Fruehling bis Herbst unermudlich in vielen Farben.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/2/28/Impatienswalleriana.jpg/500px-Impatienswalleriana.jpg', - categories: ['easy', 'flowering'], - }, - { - name: 'Hibiskus', - botanicalName: 'Hibiscus rosa-sinensis', - confidence: 1.0, - careInfo: { waterIntervalDays: 3, light: 'Volles Sonnenlicht', temp: '18-28 °C' }, - description: 'Der Hibiskus begeistert mit grossen, trompetenfoermigen Blueten in Rot, Orange und Rosa.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/2/21/Hibiscus_Brilliant.jpg/500px-Hibiscus_Brilliant.jpg', - categories: ['flowering', 'sun', 'bright_light'], - }, - { - name: 'Gardenie', - botanicalName: 'Gardenia jasminoides', - confidence: 1.0, - careInfo: { waterIntervalDays: 5, light: 'Helles indirektes Licht', temp: '18-23 °C' }, - description: 'Die Gardenie fasziniert mit cremefarbenen, intensiv duftenden Blueten. Anspruchsvoll in der Pflege.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/5/54/Gardenia_jasminoides_flower_Argentina.jpg/500px-Gardenia_jasminoides_flower_Argentina.jpg', - categories: ['flowering', 'high_humidity'], - }, - { - name: 'Echter Lavendel', - botanicalName: 'Lavandula angustifolia', - confidence: 1.0, - careInfo: { waterIntervalDays: 10, light: 'Volles Sonnenlicht', temp: '10-25 °C' }, - description: 'Der Echte Lavendel ist ein aromatischer Halbstrauch mit lilafarbenen Bluetenaehren. Herrlicher Duft.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/4/40/Lavandula_angustifolia_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-087.jpg', - categories: ['medicinal', 'sun', 'bright_light'], - }, - { - name: 'Rosmarin', - botanicalName: 'Rosmarinus officinalis', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Volles Sonnenlicht', temp: '10-25 °C' }, - description: 'Rosmarin ist ein aromatisches Kraut mit nadelartigen Blaettern und blauen Blueten. In der Kueche unverzichtbar.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/a/a3/Rosemary_in_bloom.JPG/500px-Rosemary_in_bloom.JPG', - categories: ['easy', 'medicinal', 'sun'], - }, - { - name: 'Basilikum', - botanicalName: 'Ocimum basilicum', - confidence: 1.0, - careInfo: { waterIntervalDays: 2, light: 'Volles Sonnenlicht', temp: '18-30 °C' }, - description: 'Basilikum ist das beliebteste Kuechenkraut mit intensiv aromatischen, gruenen Blaettern. Fuer Pesto verwendet.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/9/97/Ocimum_basilicum_8zz.jpg/500px-Ocimum_basilicum_8zz.jpg', - categories: ['easy', 'medicinal', 'sun'], - }, - { - name: 'Gruene Minze', - botanicalName: 'Mentha spicata', - confidence: 1.0, - careInfo: { waterIntervalDays: 3, light: 'Helles bis volles Licht', temp: '15-25 °C' }, - description: 'Die Gruene Minze ist ein wuchsfreudiges Kuechenkraut mit frischem, minzigem Duft. Fuer Tee und Cocktails.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/0/05/Minze.jpg/500px-Minze.jpg', - categories: ['easy'], - }, - { - name: 'Thymian', - botanicalName: 'Thymus vulgaris', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Volles Sonnenlicht', temp: '10-25 °C' }, - description: 'Thymian ist ein kleiner, aromatischer Strauch mit winzigen Blaettern und rosa Blueten. Wichtiges Kuechenkraut.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/4/4f/Thymus_vulgaris1.JPG/500px-Thymus_vulgaris1.JPG', - categories: ['easy', 'medicinal', 'sun'], - }, - { - name: 'Oregano', - botanicalName: 'Origanum vulgare', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Volles Sonnenlicht', temp: '15-25 °C' }, - description: 'Oregano ist ein aromatisches Kuechenkraut mit runden, behaarten Blaettern. In mediterraner Kueche beliebt.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/1/14/Origanum_vulgare_-_harilik_pune.jpg/500px-Origanum_vulgare_-_harilik_pune.jpg', - categories: ['easy', 'medicinal', 'sun'], - }, - { - name: 'Petersilie', - botanicalName: 'Petroselinum crispum', - confidence: 1.0, - careInfo: { waterIntervalDays: 3, light: 'Helles Licht', temp: '10-25 °C' }, - description: 'Petersilie ist eines der meistgenutzten Kuechenkraeuter mit frisch-aromatischem Geschmack. Reich an Vitaminen.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/e/e4/Petroselinum.jpg/500px-Petroselinum.jpg', - categories: ['easy'], - }, - { - name: 'Schnittlauch', - botanicalName: 'Allium schoenoprasum', - confidence: 1.0, - careInfo: { waterIntervalDays: 3, light: 'Helles bis volles Licht', temp: '10-25 °C' }, - description: 'Schnittlauch ist ein beliebtes Kuechenkraut mit roehrenfoermigen Blaettern und lila Blueten.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/4/49/Allium_schoenoprasum_-_Bombus_lapidarius_-_Tootsi.jpg/500px-Allium_schoenoprasum_-_Bombus_lapidarius_-_Tootsi.jpg', - categories: ['easy'], - }, - { - name: 'Rosengeranie', - botanicalName: 'Pelargonium graveolens', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Volles Sonnenlicht', temp: '15-25 °C' }, - description: 'Die Rosengeranie ist eine Duftpflanze mit tief eingeschnittenen Blaettern und rosaenlichem Aroma.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/b/b7/%28MHNT%29_Pelargonium_graveolens_flower_and_leaves.jpg/500px-%28MHNT%29_Pelargonium_graveolens_flower_and_leaves.jpg', - categories: ['easy', 'medicinal', 'sun'], - }, - { - name: 'Blutroter Storchschnabel', - botanicalName: 'Geranium sanguineum', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Helles bis volles Licht', temp: '10-25 °C' }, - description: 'Der Blutrote Storchschnabel ist ein zierlicher Storchschnabel mit intensiv magentafarbenen Blueten.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/8/8c/2012-07-03_Bloody_Crane%27s-bill%2C_Hauxley%2C_Northumberland_1.jpg/500px-2012-07-03_Bloody_Crane%27s-bill%2C_Hauxley%2C_Northumberland_1.jpg', - categories: ['easy', 'flowering'], - }, - { - name: 'Fuchsie', - botanicalName: 'Fuchsia hybrida', - confidence: 1.0, - careInfo: { waterIntervalDays: 3, light: 'Helles indirektes Licht', temp: '14-22 °C' }, - description: 'Die Fuchsie haengt mit eleganten, zweifarbigen Blueten wie kleine Ohrringe herab. Ideal fuer Ampeln.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/b/bf/Brincos_De_Princesa.jpg/500px-Brincos_De_Princesa.jpg', - categories: ['flowering', 'hanging'], - }, - { - name: 'Petunie', - botanicalName: 'Petunia hybrida', - confidence: 1.0, - careInfo: { waterIntervalDays: 2, light: 'Volles Sonnenlicht', temp: '15-25 °C' }, - description: 'Die Petunie ist eine der beliebtesten Balkonpflanzen mit trichterfoermigen Blueten in unzaehligen Farben.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/5/55/PetuniaFlower.JPG/500px-PetuniaFlower.JPG', - categories: ['easy', 'flowering', 'sun', 'pet_friendly'], - }, - { - name: 'Stiefmuetterchen', - botanicalName: 'Viola wittrockiana', - confidence: 1.0, - careInfo: { waterIntervalDays: 3, light: 'Helles bis volles Licht', temp: '5-18 °C' }, - description: 'Das Stiefmuetterchen ist ein bekannter Fruehjahrsblueher mit charakteristisch gezeichneten Blueten.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/b/b8/PansyScan_%28cropped%29.jpg/500px-PansyScan_%28cropped%29.jpg', - categories: ['easy', 'flowering'], - }, - { - name: 'Primel', - botanicalName: 'Primula vulgaris', - confidence: 1.0, - careInfo: { waterIntervalDays: 4, light: 'Helles indirektes Licht', temp: '10-18 °C' }, - description: 'Die Primel ist einer der ersten Fruehjahrs­boten mit lebhaften Blueten in Gelb, Pink, Rot und Lila.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/a/ad/Prole%C4%87no_cve%C4%87e_3.JPG/500px-Prole%C4%87no_cve%C4%87e_3.JPG', - categories: ['flowering'], - }, - { - name: 'Efeu', - botanicalName: 'Hedera helix', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Wenig bis helles Licht', temp: '10-20 °C' }, - description: 'Efeu ist eine robuste Kletter- und Haengepflanze mit charakteristischen, dreilappigen Blaettern. Sehr langlebig.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/5/5a/Hedera_helix_Dover.jpg/500px-Hedera_helix_Dover.jpg', - categories: ['easy', 'low_light', 'hanging', 'air_purifier'], - }, - { - name: 'Gummibaum', - botanicalName: 'Ficus elastica', - confidence: 1.0, - careInfo: { waterIntervalDays: 10, light: 'Helles indirektes Licht', temp: '16-24 °C' }, - description: 'Der Gummibaum ist eine imposante Zimmerpflanze mit grossen, glaenzenden, lederartigen Blaettern. Reinigt die Luft.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/1/16/Ficus_elastica_leaves_02.JPG/500px-Ficus_elastica_leaves_02.JPG', - categories: ['easy', 'air_purifier', 'tree'], - }, - { - name: 'Geigenfeige', - botanicalName: 'Ficus lyrata', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '18-27 °C' }, - description: 'Die Geigenfeige ist ein Trendbaum mit grossen, geigenfoermigen Blaettern. Benoetigt viel Licht.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/8/84/Starr_031108-0130_Ficus_lyrata.jpg/500px-Starr_031108-0130_Ficus_lyrata.jpg', - categories: ['tree', 'bright_light', 'large'], - }, - { - name: 'Yucca-Palme', - botanicalName: 'Yucca elephantipes', - confidence: 1.0, - careInfo: { waterIntervalDays: 14, light: 'Helles bis volles Licht', temp: '15-28 °C' }, - description: 'Die Yucca-Palme ist eine robuste Zimmerpflanze mit starrem, immergruenem Blaetterschopf auf einem dicken Stamm.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/b/bd/Yucca_gigantea_-_Jard%C3%ADn_Bot%C3%A1nico_Canario_Viera_y_Clavijo_-_Gran_Canaria.jpg/500px-Yucca_gigantea_-_Jard%C3%ADn_Bot%C3%A1nico_Canario_Viera_y_Clavijo_-_Gran_Canaria.jpg', - categories: ['easy', 'tree', 'sun'], - }, - { - name: 'Pferdeschwanzpalme', - botanicalName: 'Beaucarnea recurvata', - confidence: 1.0, - careInfo: { waterIntervalDays: 21, light: 'Volles Sonnenlicht', temp: '15-30 °C' }, - description: 'Die Pferdeschwanzpalme hat einen verdickten Stammbasis als Wasserspeicher und lange, schmale Blaetter.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/7/7e/Beaucarnea_recurvata%2C_Ocampo%2C_Tamaulipas%2C_Mexico_1.jpg/500px-Beaucarnea_recurvata%2C_Ocampo%2C_Tamaulipas%2C_Mexico_1.jpg', - categories: ['easy', 'succulent', 'tree', 'sun'], - }, - { - name: 'Goldfruchtpalme', - botanicalName: 'Dypsis lutescens', - confidence: 1.0, - careInfo: { waterIntervalDays: 5, light: 'Helles indirektes Licht', temp: '18-27 °C' }, - description: 'Die Goldfruchtpalme ist eine elegante Zimmerpalme mit gelblich-gruenen Stielen und gefiederten Wedeln.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/2/22/%E6%95%A3%E5%B0%BE%E8%91%B5Dypsis_lutescens_20210511145013_05.jpg/500px-%E6%95%A3%E5%B0%BE%E8%91%B5Dypsis_lutescens_20210511145013_05.jpg', - categories: ['air_purifier', 'tree', 'pet_friendly'], - }, - { - name: 'Bergpalme', - botanicalName: 'Chamaedorea elegans', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Wenig bis helles Licht', temp: '15-25 °C' }, - description: 'Die Bergpalme ist eine kompakte Zimmerpalme fuer schattigere Standorte. Ideal fuer dunkle Innenraeume.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/64/Chamaedorea_elegans_Mart.JPG/500px-Chamaedorea_elegans_Mart.JPG', - categories: ['easy', 'low_light', 'tree', 'air_purifier', 'pet_friendly'], - }, - { - name: 'Zwergdattelpalme', - botanicalName: 'Phoenix roebelenii', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Helles bis volles Licht', temp: '18-27 °C' }, - description: 'Die Zwergdattelpalme ist eine zierliche Palme mit eleganten, gebogenen Fiederblaettern. Tropisches Flair.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/1/1d/Starr_070124-3839_Phoenix_roebelenii.jpg/500px-Starr_070124-3839_Phoenix_roebelenii.jpg', - categories: ['tree', 'bright_light'], - }, - { - name: 'Stab-Palme', - botanicalName: 'Rhapis excelsa', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '15-25 °C' }, - description: 'Die Stab-Palme ist eine elegante Zimmerpalme mit faecher­foermigen Blaettern auf duennen, bambusartigen Staemmen.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/0/0c/Arya_-_Rhapis_excelsa_at_hotel_citradream_Cirebon_2019_0.jpg/500px-Arya_-_Rhapis_excelsa_at_hotel_citradream_Cirebon_2019_0.jpg', - categories: ['low_light', 'tree'], - }, - { - name: 'Amazona-Taro', - botanicalName: 'Alocasia amazonica', - confidence: 1.0, - careInfo: { waterIntervalDays: 5, light: 'Indirektes Licht', temp: '18-27 °C' }, - description: 'Der Amazona-Taro besticht mit dunkelgruenen, pfeilfoermigen Blaettern mit markant weissen Rippen.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/c/cf/Alocasia_x_amazonica_a1.jpg/500px-Alocasia_x_amazonica_a1.jpg', - categories: ['patterned', 'high_humidity', 'large'], - }, - { - name: 'Taro', - botanicalName: 'Colocasia esculenta', - confidence: 1.0, - careInfo: { waterIntervalDays: 3, light: 'Helles indirektes Licht', temp: '18-30 °C' }, - description: 'Der Taro ist eine tropische Pflanze mit grossen, herzfoermigen Blaettern. Die Knollen sind Nahrungsquelle.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/3/30/Songe-R%C3%A9union.JPG/500px-Songe-R%C3%A9union.JPG', - categories: ['high_humidity', 'large'], - }, - { - name: 'Dieffenbachie', - botanicalName: 'Dieffenbachia seguine', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '18-26 °C' }, - description: 'Die Dieffenbachie ist eine tropische Blattschmuckpflanze mit grossen, gruen-weiss gefleckten Blaettern.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/8/80/Dieffenbachia_seguine1FKST.jpg/500px-Dieffenbachia_seguine1FKST.jpg', - categories: ['easy', 'low_light', 'air_purifier'], - }, - { - name: 'Buntblatt', - botanicalName: 'Caladium bicolor', - confidence: 1.0, - careInfo: { waterIntervalDays: 5, light: 'Indirektes Licht', temp: '20-30 °C' }, - description: 'Das Buntblatt beeindruckt mit transparenten, bunt gemusterten Blaettern in Pink, Rot, Weiss und Gruen.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/f/f8/Caladium_bicolor_2.jpg/500px-Caladium_bicolor_2.jpg', - categories: ['patterned', 'high_humidity'], - }, - { - name: 'Aglaoneme', - botanicalName: 'Aglaonema commutatum', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Wenig bis helles Licht', temp: '15-26 °C' }, - description: 'Die Aglaoneme ist eine dekorative Zimmerpflanze mit silbrig-gruen gemusterten Blaettern. Tolerant gegenueber wenig Licht.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/c/c7/Aglaonema_commutatum_kz1.jpg/500px-Aglaonema_commutatum_kz1.jpg', - categories: ['easy', 'low_light', 'patterned'], - }, - { - name: 'Gebet-Pflanze', - botanicalName: 'Maranta leuconeura', - confidence: 1.0, - careInfo: { waterIntervalDays: 5, light: 'Indirektes Licht', temp: '18-27 °C' }, - description: 'Die Gebet-Pflanze faltet ihre gemusterten Blaetter nachts wie Haende zusammen. Faszinierende rote und gruene Muster.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/4/4a/Maranta_leuconeura3.jpg/500px-Maranta_leuconeura3.jpg', - categories: ['patterned', 'high_humidity', 'pet_friendly'], - }, - { - name: 'Stromanthe', - botanicalName: 'Stromanthe sanguinea', - confidence: 1.0, - careInfo: { waterIntervalDays: 5, light: 'Helles indirektes Licht', temp: '18-25 °C' }, - description: 'Die Stromanthe hat dekorative Blaetter mit weissem Muster und leuchtend roter Unterseite. Familie der Marantaceen.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/3/38/Stromanthe_sanguinea_in_garden_in_Manaus%2C_Brazil.jpg/500px-Stromanthe_sanguinea_in_garden_in_Manaus%2C_Brazil.jpg', - categories: ['patterned', 'high_humidity'], - }, - { - name: 'Ctenanthe', - botanicalName: 'Ctenanthe burle-marxii', - confidence: 1.0, - careInfo: { waterIntervalDays: 5, light: 'Indirektes Licht', temp: '18-25 °C' }, - description: 'Die Ctenanthe hat faszinierend gemusterte Blaetter mit dunkelgruunem Fischgraetenmuster auf hellgruunem Hintergrund.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/7/7d/Ctenanthe_burle-marxii.jpg/500px-Ctenanthe_burle-marxii.jpg', - categories: ['patterned', 'high_humidity'], - }, - { - name: 'Kleeblume', - botanicalName: 'Oxalis triangularis', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '15-24 °C' }, - description: 'Die Kleeblume hat tiefviolette, dreieckige Blaetter und zarte rosa Blueten. Sie faltet die Blaetter bei Dunkelheit.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/1/15/Oxalis_triangularis6.jpg/500px-Oxalis_triangularis6.jpg', - categories: ['flowering', 'patterned'], - }, - { - name: 'Satinpothos', - botanicalName: 'Scindapsus pictus', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '18-28 °C' }, - description: 'Der Satinpothos hat samtig-glaenzende, silbrig gefleckte Blaetter auf langen, haengenden Ranken.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/c/ca/Scindapsus_pictus_01.jpg/500px-Scindapsus_pictus_01.jpg', - categories: ['easy', 'hanging', 'patterned'], - }, - { - name: 'Pfeilblatt', - botanicalName: 'Syngonium podophyllum', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '16-27 °C' }, - description: 'Das Pfeilblatt hat charakteristisch pfeilfoermige Blaetter, die sich mit dem Alter weiterentwickeln.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/5/58/Zingiber_malaysianum.jpg/500px-Zingiber_malaysianum.jpg', - categories: ['easy', 'hanging'], - }, - { - name: 'Wachsblume', - botanicalName: 'Hoya carnosa', - confidence: 1.0, - careInfo: { waterIntervalDays: 10, light: 'Helles indirektes Licht', temp: '16-27 °C' }, - description: 'Die Wachsblume ist eine Kletterpflanze mit dicken, wachsartigen Blaettern und sternfoermigen, duftenden Blueten.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/e/ea/NKN-2007-06-13_114250_Hoya_Carnosa_%28Yvan_Leduc_author_for_Wikipedia%29.jpg/500px-NKN-2007-06-13_114250_Hoya_Carnosa_%28Yvan_Leduc_author_for_Wikipedia%29.jpg', - categories: ['easy', 'flowering', 'hanging', 'succulent'], - }, - { - name: 'Kleine Wachsblume', - botanicalName: 'Hoya bella', - confidence: 1.0, - careInfo: { waterIntervalDays: 10, light: 'Helles indirektes Licht', temp: '18-27 °C' }, - description: 'Die Kleine Wachsblume traegt zierliche, sternfoermige weisse Blueten mit rosa Mitte. Haengende Sukkulente.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/d/d1/%E7%BE%8E%E9%BA%97%E6%AF%AC%E8%98%AD_Hoya_bella_-%E9%A6%99%E6%B8%AF%E5%85%AC%E5%9C%92_Hong_Kong_Park-_%289240227808%29.jpg/500px-%E7%BE%8E%E9%BA%97%E6%AF%AC%E8%98%AD_Hoya_bella_-%E9%A6%99%E6%B8%AF%E5%85%AC%E5%9C%92_Hong_Kong_Park-_%289240227808%29.jpg', - categories: ['flowering', 'hanging', 'succulent'], - }, - { - name: 'Jasmin', - botanicalName: 'Jasminum polyanthum', - confidence: 1.0, - careInfo: { waterIntervalDays: 5, light: 'Helles bis volles Licht', temp: '10-22 °C' }, - description: 'Der Jasmin ist eine Kletterpflanze mit intensiv duftenden, weissen Blueten. Er bluet im Winter und Fruehling.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/2/2d/%28MHNT%29_Jasminum_polyanthum_%E2%80%93_flowers_and_buds.jpg/500px-%28MHNT%29_Jasminum_polyanthum_%E2%80%93_flowers_and_buds.jpg', - categories: ['flowering'], - }, - { - name: 'Madagaskar-Jasmin', - botanicalName: 'Stephanotis floribunda', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '18-25 °C' }, - description: 'Der Madagaskar-Jasmin hat dicke, glaenzende Blaetter und wachsweisse, intensiv duftende Blueten. Klassische Hochzeitsblume.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/3/31/Stephanotis_floribunda3L._Marie.jpg/500px-Stephanotis_floribunda3L._Marie.jpg', - categories: ['flowering'], - }, - { - name: 'Bleiwurz', - botanicalName: 'Plumbago auriculata', - confidence: 1.0, - careInfo: { waterIntervalDays: 5, light: 'Volles Sonnenlicht', temp: '15-27 °C' }, - description: 'Die Bleiwurz ist ein halbimmergruener Strauch mit himmelblauen Blueten, der fast das ganze Jahr bluet.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/e/e1/Plumbago_auriculata_2718.jpg/500px-Plumbago_auriculata_2718.jpg', - categories: ['flowering', 'sun', 'bright_light'], - }, - { - name: 'Bougainvillea', - botanicalName: 'Bougainvillea spectabilis', - confidence: 1.0, - careInfo: { waterIntervalDays: 5, light: 'Volles Sonnenlicht', temp: '18-30 °C' }, - description: 'Die Bougainvillea ist eine rankenreiche Kletterpflanze mit leuchtend farbigen Hochblaettern in Rot, Orange oder Pink.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/a/ae/Starr_030418-0061_Bougainvillea_spectabilis.jpg/500px-Starr_030418-0061_Bougainvillea_spectabilis.jpg', - categories: ['flowering', 'sun', 'bright_light'], - }, - { - name: 'Passionsblume', - botanicalName: 'Passiflora caerulea', - confidence: 1.0, - careInfo: { waterIntervalDays: 5, light: 'Helles bis volles Licht', temp: '15-27 °C' }, - description: 'Die Passionsblume ist eine faszinierende Kletterpflanze mit komplex strukturierten, blau-weissen Blueten.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/9/9a/Passiflora_caerulea_%282019-06-24%29_frontal-view.jpg/500px-Passiflora_caerulea_%282019-06-24%29_frontal-view.jpg', - categories: ['flowering'], - }, - { - name: 'Suesskartoffel', - botanicalName: 'Ipomoea batatas', - confidence: 1.0, - careInfo: { waterIntervalDays: 5, light: 'Volles Sonnenlicht', temp: '20-30 °C' }, - description: 'Die Suesskartoffel-Zierpflanze hat dekorative, herzfoermige Blaetter in gruen oder dunkelviolett. Ideal als Haengepflanze.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/5/58/Ipomoea_batatas_006.JPG/500px-Ipomoea_batatas_006.JPG', - categories: ['easy', 'hanging', 'sun'], - }, - { - name: 'Chinesischer Blauregen', - botanicalName: 'Wisteria sinensis', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Volles Sonnenlicht', temp: '10-25 °C' }, - description: 'Der Chinesische Blauregen ist ein ueppiger Kletterkuenstler mit langen, duftenden Bluetentrauben in Lila.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/7/7a/Chinesischer_Blauregen_Detail_Bl%C3%BCtentraube.JPG/500px-Chinesischer_Blauregen_Detail_Bl%C3%BCtentraube.JPG', - categories: ['flowering', 'sun', 'large'], - }, - { - name: 'Chinesische Rose', - botanicalName: 'Rosa chinensis', - confidence: 1.0, - careInfo: { waterIntervalDays: 5, light: 'Volles Sonnenlicht', temp: '15-25 °C' }, - description: 'Die Chinesische Rose ist eine der Stammarten vieler Gartenrosen und bluet fast ununterbrochen.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/2/2a/Rosa_chinensis.jpg/500px-Rosa_chinensis.jpg', - categories: ['flowering', 'sun'], - }, - { - name: 'Chrysantheme', - botanicalName: 'Chrysanthemum indicum', - confidence: 1.0, - careInfo: { waterIntervalDays: 4, light: 'Helles bis volles Licht', temp: '12-22 °C' }, - description: 'Die Chrysantheme ist die klassische Herbstblume mit ueppigen, dichten Blueten in vielen Farben.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/d/d6/Chrysanthemum_indicum1.jpg/500px-Chrysanthemum_indicum1.jpg', - categories: ['flowering'], - }, - { - name: 'Gerbera', - botanicalName: 'Gerbera jamesonii', - confidence: 1.0, - careInfo: { waterIntervalDays: 5, light: 'Helles bis volles Licht', temp: '15-25 °C' }, - description: 'Die Gerbera ist eine farbenfrohe Schnittblume mit grossen, sonnenblumenaehnlichen Blueten. Sehr beliebt.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/0/0b/Gerbera_jamesonii_%28Asteraceae%29.jpg/500px-Gerbera_jamesonii_%28Asteraceae%29.jpg', - categories: ['flowering', 'bright_light', 'air_purifier'], - }, - { - name: 'Schmetterlingsorchidee', - botanicalName: 'Phalaenopsis amabilis', - confidence: 1.0, - careInfo: { waterIntervalDays: 10, light: 'Helles indirektes Licht', temp: '18-28 °C' }, - description: 'Die Schmetterlingsorchidee ist die bekannteste Zimmerorchidee. Sie bluet bei guter Pflege monatelang.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/5/59/Phalaenopsis_amabilis_Orchi_198.jpg/500px-Phalaenopsis_amabilis_Orchi_198.jpg', - categories: ['flowering', 'high_humidity'], - }, - { - name: 'Dendrobium', - botanicalName: 'Dendrobium nobile', - confidence: 1.0, - careInfo: { waterIntervalDays: 10, light: 'Helles indirektes Licht', temp: '15-28 °C' }, - description: 'Das Dendrobium ist eine beliebte Zimmerorchidee mit langen Pseudobulben, die im Winter mit Blueten besetzt werden.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/b/bb/Dendrobium_nobile_-_flower_view_01.jpg/500px-Dendrobium_nobile_-_flower_view_01.jpg', - categories: ['flowering', 'high_humidity'], - }, - { - name: 'Zymbidium', - botanicalName: 'Cymbidium lowianum', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Helles Licht', temp: '12-24 °C' }, - description: 'Das Zymbidium ist eine robuste Orchidee mit langen, grassartigen Blaettern und eleganten Bluetenrispen.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/b/b7/Cymbidium_lowianum_-_Bot-DSCF1035.jpg', - categories: ['flowering'], - }, - { - name: 'Vanda-Orchidee', - botanicalName: 'Vanda coerulea', - confidence: 1.0, - careInfo: { waterIntervalDays: 3, light: 'Helles bis volles Licht', temp: '20-30 °C' }, - description: 'Die Vanda-Orchidee ist bekannt fuer ihre seltene blaue Bluetenfarbe. Epiphytische Orchidee mit grossen Blueten.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/b/b3/An_orchid_%28Vanda_caerulea%29%3B_flowering_stem._Watercolour._Wellcome_V0043303.jpg/500px-An_orchid_%28Vanda_caerulea%29%3B_flowering_stem._Watercolour._Wellcome_V0043303.jpg', - categories: ['flowering', 'high_humidity', 'bright_light'], - }, - { - name: 'Cattleya-Orchidee', - botanicalName: 'Cattleya labiata', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '18-28 °C' }, - description: 'Die Cattleya ist die Koenigin der Orchideen mit ueppigen, duftenden Blueten in Lila, Rosa und Weiss.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/e/e6/Labiata.jpg/500px-Labiata.jpg', - categories: ['flowering', 'high_humidity'], - }, - { - name: 'Tanzerinnen-Orchidee', - botanicalName: 'Oncidium sphacelatum', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '18-27 °C' }, - description: 'Die Tanzerinnen-Orchidee traegt lange Rispen mit Hunderten kleiner, gelb-brauner Blueten. Sehr reichliche Bluetracht.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/3/37/Oncidium_sphacelatum03.jpg/500px-Oncidium_sphacelatum03.jpg', - categories: ['flowering', 'high_humidity'], - }, - { - name: 'Stiefmuetterchen-Orchidee', - botanicalName: 'Miltoniopsis roezlii', - confidence: 1.0, - careInfo: { waterIntervalDays: 5, light: 'Indirektes Licht', temp: '15-22 °C' }, - description: 'Die Stiefmuetterchen-Orchidee hat grosse, flache Blueten. Bevorzugt kuehle Temperaturen und hohe Luftfeuchtigkeit.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/b/bd/Miltoniopsis_roezlii_%28as_Odontoglossum_roezlii%29_-_pl._30_-_Bateman%2C_Monogr.Odont.jpg/500px-Miltoniopsis_roezlii_%28as_Odontoglossum_roezlii%29_-_pl._30_-_Bateman%2C_Monogr.Odont.jpg', - categories: ['flowering', 'high_humidity'], - }, - { - name: 'Vanille', - botanicalName: 'Vanilla planifolia', - confidence: 1.0, - careInfo: { waterIntervalDays: 5, light: 'Helles indirektes Licht', temp: '20-30 °C' }, - description: 'Die Vanille ist eine kletternde Orchidee, aus deren Fruechten das beliebte Gewuerz gewonnen wird.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/e/e6/Vanilla_planifolia_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-278.jpg/500px-Vanilla_planifolia_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-278.jpg', - categories: ['flowering', 'high_humidity'], - }, - { - name: 'Goldene Tonne', - botanicalName: 'Echinocactus grusonii', - confidence: 1.0, - careInfo: { waterIntervalDays: 21, light: 'Volles Sonnenlicht', temp: '15-35 °C' }, - description: 'Die Goldene Tonne ist ein ikonischer kugelfoermiger Kaktus mit goldgelben Stacheln. Waechst langsam aber imposant.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/2/25/Echinocactus_grusonii_%28aka%29.jpg/500px-Echinocactus_grusonii_%28aka%29.jpg', - categories: ['easy', 'succulent', 'sun'], - }, - { - name: 'Fass-Kaktus', - botanicalName: 'Ferocactus cylindraceus', - confidence: 1.0, - careInfo: { waterIntervalDays: 21, light: 'Volles Sonnenlicht', temp: '15-35 °C' }, - description: 'Der Fass-Kaktus ist ein zylindrischer Wuestenkaktus mit langen, roten Stacheln. Sehr langlebig.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/0/05/Ferocactus-cylindraceus.jpg/500px-Ferocactus-cylindraceus.jpg', - categories: ['easy', 'succulent', 'sun'], - }, - { - name: 'Mammillaria', - botanicalName: 'Mammillaria zeilmanniana', - confidence: 1.0, - careInfo: { waterIntervalDays: 14, light: 'Volles Sonnenlicht', temp: '15-35 °C' }, - description: 'Die Mammillaria ist ein kompakter, kugelfoermiger Kaktus, der im Fruehling einen Kranz aus rosa Blueten traegt.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/a/af/Mammillaria_zeilmanniana.jpg/500px-Mammillaria_zeilmanniana.jpg', - categories: ['easy', 'succulent', 'flowering', 'sun'], - }, - { - name: 'Mond-Kaktus', - botanicalName: 'Gymnocalycium mihanovichii', - confidence: 1.0, - careInfo: { waterIntervalDays: 14, light: 'Indirektes Licht', temp: '15-30 °C' }, - description: 'Der Mond-Kaktus ist eine farbenfrohe Veredelung eines chlorophylllosen Kaktus auf einem gruenen Unterlagekaktus.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/5/51/Gymnocalycium_mihanovichii_4.JPG/500px-Gymnocalycium_mihanovichii_4.JPG', - categories: ['easy', 'succulent'], - }, - { - name: 'Peruanischer Fackelkaktus', - botanicalName: 'Cereus peruvianus', - confidence: 1.0, - careInfo: { waterIntervalDays: 21, light: 'Volles Sonnenlicht', temp: '15-35 °C' }, - description: 'Der Peruanische Fackelkaktus ist ein saeulenfoermiger Kaktus, der im Innenraum bis zu 2 m hoch werden kann.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/5/53/Cereus_repandus_in_Aruba_-_on_the_way_back_from_Altovista_chapel_%282896840490%29.jpg/500px-Cereus_repandus_in_Aruba_-_on_the_way_back_from_Altovista_chapel_%282896840490%29.jpg', - categories: ['easy', 'succulent', 'sun', 'large'], - }, - { - name: 'Hasenohren-Kaktus', - botanicalName: 'Opuntia microdasys', - confidence: 1.0, - careInfo: { waterIntervalDays: 21, light: 'Volles Sonnenlicht', temp: '10-35 °C' }, - description: 'Der Hasenohren-Kaktus hat flache, ovale Triebe mit dichten weissen Glochiden. Klassischer Zimmerkaktus.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/3/36/Opuntia_microdasys_3.jpg/500px-Opuntia_microdasys_3.jpg', - categories: ['easy', 'succulent', 'sun'], - }, - { - name: 'San-Pedro-Kaktus', - botanicalName: 'Echinopsis pachanoi', - confidence: 1.0, - careInfo: { waterIntervalDays: 14, light: 'Volles Sonnenlicht', temp: '10-35 °C' }, - description: 'Der San-Pedro-Kaktus ist ein schnell wachsender, saeulenfoermiger Kaktus aus den Anden.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/62/Starr_070320-5799_Echinopsis_pachanoi.jpg/500px-Starr_070320-5799_Echinopsis_pachanoi.jpg', - categories: ['easy', 'succulent', 'sun'], - }, - { - name: 'Koenigin der Nacht', - botanicalName: 'Epiphyllum oxypetalum', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Indirektes Licht', temp: '18-27 °C' }, - description: 'Die Koenigin der Nacht bluet nur eine einzige Nacht lang mit riesigen, intensiv duftenden weissen Blueten.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/6e/Epiphyllum_oxypetalum_flower.JPG/500px-Epiphyllum_oxypetalum_flower.JPG', - categories: ['flowering', 'succulent'], - }, - { - name: 'Korallenkaktus', - botanicalName: 'Rhipsalis baccifera', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Indirektes Licht', temp: '18-27 °C' }, - description: 'Der Korallenkaktus ist ein epiphytischer Kaktus mit duennen, haengenden Trieben und kleinen weissen Beeren.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/b/ba/Rhipsalis_baccifera_01_ies.jpg/500px-Rhipsalis_baccifera_01_ies.jpg', - categories: ['succulent', 'hanging'], - }, - { - name: 'Wuestenrose', - botanicalName: 'Adenium obesum', - confidence: 1.0, - careInfo: { waterIntervalDays: 10, light: 'Volles Sonnenlicht', temp: '20-35 °C' }, - description: 'Die Wuestenrose ist eine sukkulente Zimmerpflanze mit dickem Stamm und leuchtend pinken Blueten.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/4/4a/Adenium_Obesum_Flower_Side_Macro_Mar22_D72_23052-58_ZS_P.jpg/500px-Adenium_Obesum_Flower_Side_Macro_Mar22_D72_23052-58_ZS_P.jpg', - categories: ['succulent', 'flowering', 'sun'], - }, - { - name: 'Geisterpflanze', - botanicalName: 'Graptopetalum paraguayense', - confidence: 1.0, - careInfo: { waterIntervalDays: 14, light: 'Volles Sonnenlicht', temp: '15-25 °C' }, - description: 'Die Geisterpflanze hat zartgraue bis perlmutt-rosafarbene, rosettenfoermige Blaetter. Sehr robuste Sukkulente.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/5/59/%28MHNT%29_Graptopetalum_paraguayense_-_leaves.jpg/500px-%28MHNT%29_Graptopetalum_paraguayense_-_leaves.jpg', - categories: ['easy', 'succulent', 'sun'], - }, - { - name: 'Mondstein-Pflanze', - botanicalName: 'Pachyphytum oviferum', - confidence: 1.0, - careInfo: { waterIntervalDays: 14, light: 'Volles Sonnenlicht', temp: '15-25 °C' }, - description: 'Die Mondstein-Pflanze hat dicke, ovale Blaetter mit einem pastellrosafarbenen, mehligen Ueberzug.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/8/8f/%28MHNT%29_Pachyphytum_oviferum_-_Habitus.jpg/500px-%28MHNT%29_Pachyphytum_oviferum_-_Habitus.jpg', - categories: ['easy', 'succulent', 'sun'], - }, - { - name: 'Kap-Aloe', - botanicalName: 'Aloe arborescens', - confidence: 1.0, - careInfo: { waterIntervalDays: 14, light: 'Volles Sonnenlicht', temp: '10-30 °C' }, - description: 'Die Kap-Aloe ist eine strauchige Aloe mit schmalen, gezaehnten Blaettern und leuchtend roten Bluetenaehren im Winter.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/b/b9/Aloe_arborescens_Compton.JPG/500px-Aloe_arborescens_Compton.JPG', - categories: ['easy', 'succulent', 'medicinal', 'sun'], - }, - { - name: 'Gasteria', - botanicalName: 'Gasteria carinata', - confidence: 1.0, - careInfo: { waterIntervalDays: 14, light: 'Helles indirektes Licht', temp: '15-25 °C' }, - description: 'Die Gasteria ist eine kleine Sukkulente mit zweireihig angeordneten, zungenfoermigen, gefleckten Blaettern.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/9/91/2_Gasteria_carinata_var_carinata.jpg/500px-2_Gasteria_carinata_var_carinata.jpg', - categories: ['easy', 'succulent', 'low_light'], - }, - { - name: 'Japanische Azalee', - botanicalName: 'Rhododendron simsii', - confidence: 1.0, - careInfo: { waterIntervalDays: 4, light: 'Helles indirektes Licht', temp: '10-18 °C' }, - description: 'Die Japanische Azalee bluet im Winter und Fruehling ueppig mit leuchtend roten, rosa oder weissen Blueten.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/67/Rhododendron_simsii-bunga_2-Lany_pirna.jpg/500px-Rhododendron_simsii-bunga_2-Lany_pirna.jpg', - categories: ['flowering'], - }, - { - name: 'Indische Azalee', - botanicalName: 'Azalea indica', - confidence: 1.0, - careInfo: { waterIntervalDays: 4, light: 'Helles indirektes Licht', temp: '10-20 °C' }, - description: 'Die Indische Azalee ist ein beliebter Zierstrauch mit grossen, auffaelligen Blueten in Rosa- und Rottönen.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/d/de/Rhododendron_indicum1.jpg/500px-Rhododendron_indicum1.jpg', - categories: ['flowering'], - }, - { - name: 'Kamelie', - botanicalName: 'Camellia japonica', - confidence: 1.0, - careInfo: { waterIntervalDays: 5, light: 'Helles indirektes Licht', temp: '7-18 °C' }, - description: 'Die Kamelie ist ein eleganter Zierstrauch mit glaenzenden Blaettern und rosenaehnlichen Blueten von Januar bis April.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/e/e9/Camellia_japonica_NBG.jpg/500px-Camellia_japonica_NBG.jpg', - categories: ['flowering'], - }, - { - name: 'Afrikanisches Veilchen', - botanicalName: 'Saintpaulia ionantha', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '18-25 °C' }, - description: 'Das Afrikanische Veilchen ist eine kleine, kompakte Bluehpflanze mit samtigen Blaettern und violetten Blueten.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/5/57/Streptocarpus_ionanthus_%28as_Saintpaulia_ionantha%29_-_Curtis%27_121_%28Ser._3_no._51%29_pl._7408_%281895%29.jpg/500px-Streptocarpus_ionanthus_%28as_Saintpaulia_ionantha%29_-_Curtis%27_121_%28Ser._3_no._51%29_pl._7408_%281895%29.jpg', - categories: ['easy', 'flowering'], - }, - { - name: 'Drehfrucht', - botanicalName: 'Streptocarpus hybridus', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '15-22 °C' }, - description: 'Die Drehfrucht ist ein Gesneriengewaechs mit langen, gerippten Blaettern und trichterfoermigen Blueten in Lila oder Rosa.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/e/ee/2007-03-20Streptocarpus03.jpg/500px-2007-03-20Streptocarpus03.jpg', - categories: ['flowering'], - }, - { - name: 'Gloxinie', - botanicalName: 'Gloxinia speciosa', - confidence: 1.0, - careInfo: { waterIntervalDays: 5, light: 'Helles indirektes Licht', temp: '18-25 °C' }, - description: 'Die Gloxinie hat grosse, samtartige Blueten in Violett, Rosa oder Weiss mit farbigen Raendern.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/1/13/Florada_da_Glox%C3%ADnia.jpg/500px-Florada_da_Glox%C3%ADnia.jpg', - categories: ['flowering', 'high_humidity'], - }, - { - name: 'Columnea', - botanicalName: 'Columnea gloriosa', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '18-25 °C' }, - description: 'Die Columnea ist eine haengende Zimmerpflanze mit kleinen, behaarten Blaettern und leuchtend roten, roehrenfoermigen Blueten.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/3/32/Columnea_gloriosa_%2849470911201%29.jpg/500px-Columnea_gloriosa_%2849470911201%29.jpg', - categories: ['flowering', 'hanging', 'high_humidity'], - }, - { - name: 'Lippenstiftpflanze', - botanicalName: 'Aeschynanthus radicans', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '18-27 °C' }, - description: 'Die Lippenstiftpflanze hat haengende Triebe mit glaenzenden Blaettern und leuchtend roten Roehrenbluten.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/5/52/Aeschynanthus_radicans.jpg/500px-Aeschynanthus_radicans.jpg', - categories: ['flowering', 'hanging', 'high_humidity'], - }, - { - name: 'Herzkette', - botanicalName: 'Ceropegia woodii', - confidence: 1.0, - careInfo: { waterIntervalDays: 14, light: 'Helles indirektes Licht', temp: '15-27 °C' }, - description: 'Die Herzkette hat duenne, haengende Ranken mit herzfoermigen, silbergrau gemusterten Blaettchen.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/5/55/Ceropegia_linearis_subsp_woodii.jpg', - categories: ['easy', 'succulent', 'hanging', 'patterned'], - }, - { - name: 'Perlenschnur-Pflanze', - botanicalName: 'Senecio rowleyanus', - confidence: 1.0, - careInfo: { waterIntervalDays: 14, light: 'Helles bis volles Licht', temp: '15-27 °C' }, - description: 'Die Perlenschnur-Pflanze hat haengende Ranken mit kugelfoermigen, perlenaehnlichen Blaettern. Einzigartige Sukkulente.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/f/fd/Senecio_rowleyanus_leaves.jpg/500px-Senecio_rowleyanus_leaves.jpg', - categories: ['easy', 'succulent', 'hanging'], - }, - { - name: 'Dischidia', - botanicalName: 'Dischidia ruscifolia', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '18-27 °C' }, - description: 'Die Dischidia ist eine epiphytische Haengepflanze mit kleinen, runden Blaettern entlang duenner Ranken.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/e/ec/%E7%99%BE%E8%90%AC%E5%BF%83_Dischidia_ruscifolia_-%E9%A6%99%E6%B8%AF%E5%8B%95%E6%A4%8D%E7%89%A9%E5%85%AC%E5%9C%92_Hong_Kong_Botanical_Garden-_%289240152650%29.jpg/500px-%E7%99%BE%E8%90%AC%E5%BF%83_Dischidia_ruscifolia_-%E9%A6%99%E6%B8%AF%E5%8B%95%E6%A4%8D%E7%89%A9%E5%85%AC%E5%9C%92_Hong_Kong_Botanical_Garden-_%289240152650%29.jpg', - categories: ['succulent', 'hanging'], - }, - { - name: 'Rippenpeperomie', - botanicalName: 'Peperomia caperata', - confidence: 1.0, - careInfo: { waterIntervalDays: 10, light: 'Helles indirektes Licht', temp: '18-26 °C' }, - description: 'Die Rippenpeperomie hat tief gerippte, dunkelgruene bis violette Blaetter mit einer samtigen Textur.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/1/14/Peperomia_caperata_1-OB9.jpg/500px-Peperomia_caperata_1-OB9.jpg', - categories: ['easy', 'pet_friendly'], - }, - { - name: 'Spiegelpeperomie', - botanicalName: 'Peperomia obtusifolia', - confidence: 1.0, - careInfo: { waterIntervalDays: 10, light: 'Helles indirektes Licht', temp: '16-26 °C' }, - description: 'Die Spiegelpeperomie hat glaenzende, lederartige, oval-runde Blaetter in tiefem Gruen. Sehr robust.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/1/19/Peperomia_obtusifolia_3-OB9.jpg/500px-Peperomia_obtusifolia_3-OB9.jpg', - categories: ['easy', 'pet_friendly', 'low_light'], - }, - { - name: 'Riemenblatt', - botanicalName: 'Clivia miniata', - confidence: 1.0, - careInfo: { waterIntervalDays: 10, light: 'Helles indirektes Licht', temp: '15-24 °C' }, - description: 'Das Riemenblatt ist eine dekorative Zimmerpflanze mit leuchtend orangefarbenen Blueten im Fruehling.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/c/c2/Clivia_miniata%2C_blomme_en_vrugte%2C_Manie_van_der_Schijff_BT%2C_a.jpg/500px-Clivia_miniata%2C_blomme_en_vrugte%2C_Manie_van_der_Schijff_BT%2C_a.jpg', - categories: ['flowering'], - }, - { - name: 'Ritterstern', - botanicalName: 'Hippeastrum hybrid', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Helles bis volles Licht', temp: '18-25 °C' }, - description: 'Der Ritterstern beeindruckt im Winter mit riesigen, trompetenfoermigen Blueten in Rot, Pink oder Weiss.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/f/fc/Hippeastrum_hybrid_1.jpg/500px-Hippeastrum_hybrid_1.jpg', - categories: ['flowering', 'bright_light'], - }, - { - name: 'Osterglocke', - botanicalName: 'Narcissus pseudonarcissus', - confidence: 1.0, - careInfo: { waterIntervalDays: 5, light: 'Helles bis volles Licht', temp: '10-18 °C' }, - description: 'Die Osterglocke ist der klassische Fruehjahrsblueher mit leuchtend gelben, trompetenfoermigen Blueten.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/a/a4/Narcissus_pseudonarcissus_flower_300303.jpg/500px-Narcissus_pseudonarcissus_flower_300303.jpg', - categories: ['flowering'], - }, - { - name: 'Tulpe', - botanicalName: 'Tulipa gesneriana', - confidence: 1.0, - careInfo: { waterIntervalDays: 5, light: 'Helles bis volles Licht', temp: '8-18 °C' }, - description: 'Die Tulpe ist eine der beliebtesten Fruehjahrsblueher mit kelchfoermigen Blueten in unzaehligen Farben.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/9/9e/%D7%A6%D7%91%D7%A2%D7%95%D7%A0%D7%99%D7%9D.JPG/500px-%D7%A6%D7%91%D7%A2%D7%95%D7%A0%D7%99%D7%9D.JPG', - categories: ['easy', 'flowering'], - }, - { - name: 'Hyazinthe', - botanicalName: 'Hyacinthus orientalis', - confidence: 1.0, - careInfo: { waterIntervalDays: 5, light: 'Helles bis volles Licht', temp: '10-18 °C' }, - description: 'Die Hyazinthe bezaubert mit dichten Bluetenrispen und intensivem Duft in Blau, Rosa, Weiss oder Gelb.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/8/82/Hyacinth_flower.jpg/500px-Hyacinth_flower.jpg', - categories: ['easy', 'flowering'], - }, - { - name: 'Traubenhyazinthe', - botanicalName: 'Muscari armeniacum', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Helles bis volles Licht', temp: '8-18 °C' }, - description: 'Die Traubenhyazinthe bildet dichte Trauben aus kleinen, blauen bis violetten Gloeckchen. Zuverlaessige Fruejahrszwiebel.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/1/1a/Muscari_armeniacum_4.jpg/500px-Muscari_armeniacum_4.jpg', - categories: ['easy', 'flowering'], - }, - { - name: 'Krokus', - botanicalName: 'Crocus vernus', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Helles bis volles Licht', temp: '5-15 °C' }, - description: 'Der Krokus ist einer der ersten Fruehjahrs­boten mit kelchfoermigen Blueten in Lila, Weiss und Gelb.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/e/e2/Crocus_vernus_with_bee.jpg/500px-Crocus_vernus_with_bee.jpg', - categories: ['easy', 'flowering'], - } -]; +export interface LexiconBatchEntry { + name: string; + botanicalName: string; + confidence: number; + careInfo: { + waterIntervalDays: number; + light: string; + temp: string; + }; + description?: string; + imageUri: string; + categories: string[]; +} + +export const LEXICON_BATCH_1_ENTRIES: LexiconBatchEntry[] = [ + { + name: 'Birkenfeige', + botanicalName: 'Ficus benjamina', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '16-24 °C' }, + description: 'Die Birkenfeige ist ein eleganter Zimmerstrauch mit haengenden Aesten und kleinen, glaenzenden Blaettern.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/1/19/Starr-080608-7576-Ficus_benjamina-habit_with_Laysan_albatross-Gym_Sand_Island-Midway_Atoll_%2824823189861%29.jpg/500px-Starr-080608-7576-Ficus_benjamina-habit_with_Laysan_albatross-Gym_Sand_Island-Midway_Atoll_%2824823189861%29.jpg', + categories: ['tree', 'air_purifier'], + }, + { + name: 'Ufopflanze', + botanicalName: 'Pilea peperomioides', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '13-30 °C' }, + description: 'Die Ufopflanze hat unverwechselbare, runde Blaetter auf langen Stielen. Bildet leicht Ableger zum Verschenken.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/6d/Pilea_peperomioides_Chinese_money_plant.jpg/500px-Pilea_peperomioides_Chinese_money_plant.jpg', + categories: ['easy', 'pet_friendly'], + }, + { + name: 'Paradiesvogelblume', + botanicalName: 'Strelitzia reginae', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Volles Sonnenlicht', temp: '18-26 °C' }, + description: 'Die Paradiesvogelblume beeindruckt mit leuchtend orangefarbenen und blauen Blueten, die einem Vogel aehneln.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/5/55/Bird_of_Paradise_flower.JPG/500px-Bird_of_Paradise_flower.JPG', + categories: ['flowering', 'sun', 'large'], + }, + { + name: 'Echeverie', + botanicalName: 'Echeveria elegans', + confidence: 1.0, + careInfo: { waterIntervalDays: 14, light: 'Volles Sonnenlicht', temp: '15-25 °C' }, + description: 'Die Echeverie bildet symmetrische, rosettenfoermige Sukkulenten mit blaugruenen Blaettern. Pflegeleicht.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/5/5d/Echeveria_elegans_-_1.png/500px-Echeveria_elegans_-_1.png', + categories: ['easy', 'succulent', 'sun'], + }, + { + name: 'Jadepflanze', + botanicalName: 'Crassula ovata', + confidence: 1.0, + careInfo: { waterIntervalDays: 14, light: 'Helles bis volles Licht', temp: '15-24 °C' }, + description: 'Die Jadepflanze ist eine langlebige Sukkulente mit dicken, ovalen Blaettern. In Japan gilt sie als Gluecksbringer.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/5/5a/Crassula_ovata_700.jpg/500px-Crassula_ovata_700.jpg', + categories: ['easy', 'succulent', 'sun'], + }, + { + name: 'Zebra-Haworthie', + botanicalName: 'Haworthia fasciata', + confidence: 1.0, + careInfo: { waterIntervalDays: 14, light: 'Helles indirektes Licht', temp: '15-25 °C' }, + description: 'Die Zebra-Haworthie ist eine kompakte Sukkulente mit weissen Querstreifen auf dunkelgruenen Blaettern.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/5/5c/1_Haworthia_fasciata_-MBB_Kabeljouws_River.jpg/500px-1_Haworthia_fasciata_-MBB_Kabeljouws_River.jpg', + categories: ['easy', 'succulent', 'low_light'], + }, + { + name: 'Eselschwanz', + botanicalName: 'Sedum morganianum', + confidence: 1.0, + careInfo: { waterIntervalDays: 14, light: 'Volles Sonnenlicht', temp: '15-25 °C' }, + description: 'Der Eselschwanz ist eine haengende Sukkulente mit langen Trieben aus dichten, blaugruenen Blaettchen.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/e/e5/Donkey%27s_tail_in_bloom_March_06.jpg/500px-Donkey%27s_tail_in_bloom_March_06.jpg', + categories: ['easy', 'succulent', 'hanging', 'sun'], + }, + { + name: 'Weihnachtskaktus', + botanicalName: 'Schlumbergera truncata', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '15-21 °C' }, + description: 'Der Weihnachtskaktus erfreut zur Weihnachtszeit mit leuchtenden Blueten in Rosa, Rot oder Weiss.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/f/f1/Schlumbergera_truncata_%28Exotic_Flora_Plate_20%29.jpg/500px-Schlumbergera_truncata_%28Exotic_Flora_Plate_20%29.jpg', + categories: ['easy', 'succulent', 'flowering'], + }, + { + name: 'Kalanchoe', + botanicalName: 'Kalanchoe blossfeldiana', + confidence: 1.0, + careInfo: { waterIntervalDays: 10, light: 'Helles bis volles Licht', temp: '15-25 °C' }, + description: 'Die Kalanchoe ist eine beliebte Bluehpflanze mit leuchtenden Blueten in Rot, Orange, Gelb oder Rosa.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/8/8d/Kalanchoe_blossfeldiana_3.jpg/500px-Kalanchoe_blossfeldiana_3.jpg', + categories: ['easy', 'succulent', 'flowering', 'sun'], + }, + { + name: 'Schwarze Rose (Aeonium)', + botanicalName: 'Aeonium arboreum', + confidence: 1.0, + careInfo: { waterIntervalDays: 10, light: 'Volles Sonnenlicht', temp: '10-25 °C' }, + description: 'Das Aeonium bildet dekorative, rosettenfoermige Sukkulenten an verzweigten Stielen.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/2/28/Madeira%2C_Palheiro_Gardens_-_Aeonium_arboreum_%28Marokko%29_IMG_2310.JPG/500px-Madeira%2C_Palheiro_Gardens_-_Aeonium_arboreum_%28Marokko%29_IMG_2310.JPG', + categories: ['succulent', 'sun'], + }, + { + name: 'Agave', + botanicalName: 'Agave americana', + confidence: 1.0, + careInfo: { waterIntervalDays: 21, light: 'Volles Sonnenlicht', temp: '10-35 °C' }, + description: 'Die Agave ist eine imposante Sukkulente mit steifen, blaugruenen Blaettern mit Stacheln. Sie bluet nur einmal.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/3/3b/Agave_July_2011-1.jpg/500px-Agave_July_2011-1.jpg', + categories: ['succulent', 'sun', 'large'], + }, + { + name: 'Bleistiftkaktus', + botanicalName: 'Euphorbia tirucalli', + confidence: 1.0, + careInfo: { waterIntervalDays: 14, light: 'Volles Sonnenlicht', temp: '18-30 °C' }, + description: 'Der Bleistiftkaktus ist eine sukkulente Wolfsmilch mit duennen, zylindrischen Zweigen ohne Blaetter.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/2/22/Euphorbia_tirucalli_in_the_wild_by_tonrulkens.jpg/500px-Euphorbia_tirucalli_in_the_wild_by_tonrulkens.jpg', + categories: ['easy', 'succulent', 'sun'], + }, + { + name: 'Drachenbaum', + botanicalName: 'Dracaena marginata', + confidence: 1.0, + careInfo: { waterIntervalDays: 10, light: 'Helles indirektes Licht', temp: '15-25 °C' }, + description: 'Der Drachenbaum ist eine schlanke Zimmerpflanze mit roten, schmalen Blaettern auf langen Staemmen.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/61/Dracaena_reflexa.JPG/500px-Dracaena_reflexa.JPG', + categories: ['easy', 'air_purifier', 'tree'], + }, + { + name: 'Maisstrauch', + botanicalName: 'Dracaena fragrans', + confidence: 1.0, + careInfo: { waterIntervalDays: 10, light: 'Helles indirektes Licht', temp: '15-25 °C' }, + description: 'Der Maisstrauch ist eine robuste Zimmerpflanze mit breiten, gestreiften Blaettern. Gedeiht auch bei wenig Licht.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/d/db/Dracaena_fragrans_%282%29.jpg/500px-Dracaena_fragrans_%282%29.jpg', + categories: ['easy', 'low_light', 'air_purifier', 'tree'], + }, + { + name: 'Herzblatt-Philodendron', + botanicalName: 'Philodendron hederaceum', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Indirektes Licht', temp: '18-28 °C' }, + description: 'Der Herzblatt-Philodendron ist eine pflegeleichte Kletter- oder Haengepflanze mit herzfoermigen Blaettern.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/b/bb/Philodendron_scandens_subsp_oxycardium2.jpg/500px-Philodendron_scandens_subsp_oxycardium2.jpg', + categories: ['easy', 'low_light', 'hanging'], + }, + { + name: 'Marmor-Efeutute', + botanicalName: 'Epipremnum aureum Marble Queen', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '15-30 °C' }, + description: 'Die Marmor-Efeutute hat cremeweiss-gruen marmorierte Blaetter. Eine dekorative Variante der klassischen Efeutute.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/c/ca/Epipremnum_aureum_Marble_Queen.jpg/500px-Epipremnum_aureum_Marble_Queen.jpg', + categories: ['easy', 'hanging', 'air_purifier'], + }, + { + name: 'Zebrakraut', + botanicalName: 'Tradescantia zebrina', + confidence: 1.0, + careInfo: { waterIntervalDays: 5, light: 'Helles indirektes Licht', temp: '15-25 °C' }, + description: 'Das Zebrakraut faellt durch seine silbrig-lila gestreiften Blaetter auf. Schnellwachsende Haengepflanze.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/f/fd/Zebrina_pendula_20060521_2_closer.jpg/500px-Zebrina_pendula_20060521_2_closer.jpg', + categories: ['easy', 'hanging', 'patterned'], + }, + { + name: 'Koenigsbegonie', + botanicalName: 'Begonia rex', + confidence: 1.0, + careInfo: { waterIntervalDays: 5, light: 'Indirektes Licht', temp: '18-25 °C' }, + description: 'Die Koenigsbegonie beeindruckt mit prachtvoll gemusterten Blaettern in Silber, Rot und Gruen.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/62/Painted_Leaved_Begonia._Begonia_rex_Putz._Flore_des_serres_et_des_jardins_de_l%27Europe_v.12_%281857%29.jpg/500px-Painted_Leaved_Begonia._Begonia_rex_Putz._Flore_des_serres_et_des_jardins_de_l%27Europe_v.12_%281857%29.jpg', + categories: ['patterned', 'high_humidity'], + }, + { + name: 'Alpenveilchen', + botanicalName: 'Cyclamen persicum', + confidence: 1.0, + careInfo: { waterIntervalDays: 5, light: 'Helles indirektes Licht', temp: '12-18 °C' }, + description: 'Das Alpenveilchen bluet im Herbst und Winter mit eleganten Blueten in Rosa, Rot oder Weiss.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/68/Yagur_%E2%80%93_Nesher%2C_the_Green_Path_%E2%80%93_Mount_Carmel_016.JPG/500px-Yagur_%E2%80%93_Nesher%2C_the_Green_Path_%E2%80%93_Mount_Carmel_016.JPG', + categories: ['flowering'], + }, + { + name: 'Fleissiges Lieschen', + botanicalName: 'Impatiens walleriana', + confidence: 1.0, + careInfo: { waterIntervalDays: 2, light: 'Helles indirektes Licht', temp: '16-24 °C' }, + description: 'Das Fleissige Lieschen bluet von Fruehling bis Herbst unermudlich in vielen Farben.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/2/28/Impatienswalleriana.jpg/500px-Impatienswalleriana.jpg', + categories: ['easy', 'flowering'], + }, + { + name: 'Hibiskus', + botanicalName: 'Hibiscus rosa-sinensis', + confidence: 1.0, + careInfo: { waterIntervalDays: 3, light: 'Volles Sonnenlicht', temp: '18-28 °C' }, + description: 'Der Hibiskus begeistert mit grossen, trompetenfoermigen Blueten in Rot, Orange und Rosa.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/2/21/Hibiscus_Brilliant.jpg/500px-Hibiscus_Brilliant.jpg', + categories: ['flowering', 'sun', 'bright_light'], + }, + { + name: 'Gardenie', + botanicalName: 'Gardenia jasminoides', + confidence: 1.0, + careInfo: { waterIntervalDays: 5, light: 'Helles indirektes Licht', temp: '18-23 °C' }, + description: 'Die Gardenie fasziniert mit cremefarbenen, intensiv duftenden Blueten. Anspruchsvoll in der Pflege.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/5/54/Gardenia_jasminoides_flower_Argentina.jpg/500px-Gardenia_jasminoides_flower_Argentina.jpg', + categories: ['flowering', 'high_humidity'], + }, + { + name: 'Echter Lavendel', + botanicalName: 'Lavandula angustifolia', + confidence: 1.0, + careInfo: { waterIntervalDays: 10, light: 'Volles Sonnenlicht', temp: '10-25 °C' }, + description: 'Der Echte Lavendel ist ein aromatischer Halbstrauch mit lilafarbenen Bluetenaehren. Herrlicher Duft.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/4/40/Lavandula_angustifolia_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-087.jpg', + categories: ['medicinal', 'sun', 'bright_light'], + }, + { + name: 'Rosmarin', + botanicalName: 'Rosmarinus officinalis', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Volles Sonnenlicht', temp: '10-25 °C' }, + description: 'Rosmarin ist ein aromatisches Kraut mit nadelartigen Blaettern und blauen Blueten. In der Kueche unverzichtbar.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/a/a3/Rosemary_in_bloom.JPG/500px-Rosemary_in_bloom.JPG', + categories: ['easy', 'medicinal', 'sun'], + }, + { + name: 'Basilikum', + botanicalName: 'Ocimum basilicum', + confidence: 1.0, + careInfo: { waterIntervalDays: 2, light: 'Volles Sonnenlicht', temp: '18-30 °C' }, + description: 'Basilikum ist das beliebteste Kuechenkraut mit intensiv aromatischen, gruenen Blaettern. Fuer Pesto verwendet.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/9/97/Ocimum_basilicum_8zz.jpg/500px-Ocimum_basilicum_8zz.jpg', + categories: ['easy', 'medicinal', 'sun'], + }, + { + name: 'Gruene Minze', + botanicalName: 'Mentha spicata', + confidence: 1.0, + careInfo: { waterIntervalDays: 3, light: 'Helles bis volles Licht', temp: '15-25 °C' }, + description: 'Die Gruene Minze ist ein wuchsfreudiges Kuechenkraut mit frischem, minzigem Duft. Fuer Tee und Cocktails.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/0/05/Minze.jpg/500px-Minze.jpg', + categories: ['easy'], + }, + { + name: 'Thymian', + botanicalName: 'Thymus vulgaris', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Volles Sonnenlicht', temp: '10-25 °C' }, + description: 'Thymian ist ein kleiner, aromatischer Strauch mit winzigen Blaettern und rosa Blueten. Wichtiges Kuechenkraut.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/4/4f/Thymus_vulgaris1.JPG/500px-Thymus_vulgaris1.JPG', + categories: ['easy', 'medicinal', 'sun'], + }, + { + name: 'Oregano', + botanicalName: 'Origanum vulgare', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Volles Sonnenlicht', temp: '15-25 °C' }, + description: 'Oregano ist ein aromatisches Kuechenkraut mit runden, behaarten Blaettern. In mediterraner Kueche beliebt.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/1/14/Origanum_vulgare_-_harilik_pune.jpg/500px-Origanum_vulgare_-_harilik_pune.jpg', + categories: ['easy', 'medicinal', 'sun'], + }, + { + name: 'Petersilie', + botanicalName: 'Petroselinum crispum', + confidence: 1.0, + careInfo: { waterIntervalDays: 3, light: 'Helles Licht', temp: '10-25 °C' }, + description: 'Petersilie ist eines der meistgenutzten Kuechenkraeuter mit frisch-aromatischem Geschmack. Reich an Vitaminen.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/e/e4/Petroselinum.jpg/500px-Petroselinum.jpg', + categories: ['easy'], + }, + { + name: 'Schnittlauch', + botanicalName: 'Allium schoenoprasum', + confidence: 1.0, + careInfo: { waterIntervalDays: 3, light: 'Helles bis volles Licht', temp: '10-25 °C' }, + description: 'Schnittlauch ist ein beliebtes Kuechenkraut mit roehrenfoermigen Blaettern und lila Blueten.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/4/49/Allium_schoenoprasum_-_Bombus_lapidarius_-_Tootsi.jpg/500px-Allium_schoenoprasum_-_Bombus_lapidarius_-_Tootsi.jpg', + categories: ['easy'], + }, + { + name: 'Rosengeranie', + botanicalName: 'Pelargonium graveolens', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Volles Sonnenlicht', temp: '15-25 °C' }, + description: 'Die Rosengeranie ist eine Duftpflanze mit tief eingeschnittenen Blaettern und rosaenlichem Aroma.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/b/b7/%28MHNT%29_Pelargonium_graveolens_flower_and_leaves.jpg/500px-%28MHNT%29_Pelargonium_graveolens_flower_and_leaves.jpg', + categories: ['easy', 'medicinal', 'sun'], + }, + { + name: 'Blutroter Storchschnabel', + botanicalName: 'Geranium sanguineum', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Helles bis volles Licht', temp: '10-25 °C' }, + description: 'Der Blutrote Storchschnabel ist ein zierlicher Storchschnabel mit intensiv magentafarbenen Blueten.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/8/8c/2012-07-03_Bloody_Crane%27s-bill%2C_Hauxley%2C_Northumberland_1.jpg/500px-2012-07-03_Bloody_Crane%27s-bill%2C_Hauxley%2C_Northumberland_1.jpg', + categories: ['easy', 'flowering'], + }, + { + name: 'Fuchsie', + botanicalName: 'Fuchsia hybrida', + confidence: 1.0, + careInfo: { waterIntervalDays: 3, light: 'Helles indirektes Licht', temp: '14-22 °C' }, + description: 'Die Fuchsie haengt mit eleganten, zweifarbigen Blueten wie kleine Ohrringe herab. Ideal fuer Ampeln.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/b/bf/Brincos_De_Princesa.jpg/500px-Brincos_De_Princesa.jpg', + categories: ['flowering', 'hanging'], + }, + { + name: 'Petunie', + botanicalName: 'Petunia hybrida', + confidence: 1.0, + careInfo: { waterIntervalDays: 2, light: 'Volles Sonnenlicht', temp: '15-25 °C' }, + description: 'Die Petunie ist eine der beliebtesten Balkonpflanzen mit trichterfoermigen Blueten in unzaehligen Farben.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/5/55/PetuniaFlower.JPG/500px-PetuniaFlower.JPG', + categories: ['easy', 'flowering', 'sun', 'pet_friendly'], + }, + { + name: 'Stiefmuetterchen', + botanicalName: 'Viola wittrockiana', + confidence: 1.0, + careInfo: { waterIntervalDays: 3, light: 'Helles bis volles Licht', temp: '5-18 °C' }, + description: 'Das Stiefmuetterchen ist ein bekannter Fruehjahrsblueher mit charakteristisch gezeichneten Blueten.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/b/b8/PansyScan_%28cropped%29.jpg/500px-PansyScan_%28cropped%29.jpg', + categories: ['easy', 'flowering'], + }, + { + name: 'Primel', + botanicalName: 'Primula vulgaris', + confidence: 1.0, + careInfo: { waterIntervalDays: 4, light: 'Helles indirektes Licht', temp: '10-18 °C' }, + description: 'Die Primel ist einer der ersten Fruehjahrs­boten mit lebhaften Blueten in Gelb, Pink, Rot und Lila.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/a/ad/Prole%C4%87no_cve%C4%87e_3.JPG/500px-Prole%C4%87no_cve%C4%87e_3.JPG', + categories: ['flowering'], + }, + { + name: 'Efeu', + botanicalName: 'Hedera helix', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Wenig bis helles Licht', temp: '10-20 °C' }, + description: 'Efeu ist eine robuste Kletter- und Haengepflanze mit charakteristischen, dreilappigen Blaettern. Sehr langlebig.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/5/5a/Hedera_helix_Dover.jpg/500px-Hedera_helix_Dover.jpg', + categories: ['easy', 'low_light', 'hanging', 'air_purifier'], + }, + { + name: 'Gummibaum', + botanicalName: 'Ficus elastica', + confidence: 1.0, + careInfo: { waterIntervalDays: 10, light: 'Helles indirektes Licht', temp: '16-24 °C' }, + description: 'Der Gummibaum ist eine imposante Zimmerpflanze mit grossen, glaenzenden, lederartigen Blaettern. Reinigt die Luft.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/1/16/Ficus_elastica_leaves_02.JPG/500px-Ficus_elastica_leaves_02.JPG', + categories: ['easy', 'air_purifier', 'tree'], + }, + { + name: 'Geigenfeige', + botanicalName: 'Ficus lyrata', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '18-27 °C' }, + description: 'Die Geigenfeige ist ein Trendbaum mit grossen, geigenfoermigen Blaettern. Benoetigt viel Licht.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/8/84/Starr_031108-0130_Ficus_lyrata.jpg/500px-Starr_031108-0130_Ficus_lyrata.jpg', + categories: ['tree', 'bright_light', 'large'], + }, + { + name: 'Yucca-Palme', + botanicalName: 'Yucca elephantipes', + confidence: 1.0, + careInfo: { waterIntervalDays: 14, light: 'Helles bis volles Licht', temp: '15-28 °C' }, + description: 'Die Yucca-Palme ist eine robuste Zimmerpflanze mit starrem, immergruenem Blaetterschopf auf einem dicken Stamm.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/b/bd/Yucca_gigantea_-_Jard%C3%ADn_Bot%C3%A1nico_Canario_Viera_y_Clavijo_-_Gran_Canaria.jpg/500px-Yucca_gigantea_-_Jard%C3%ADn_Bot%C3%A1nico_Canario_Viera_y_Clavijo_-_Gran_Canaria.jpg', + categories: ['easy', 'tree', 'sun'], + }, + { + name: 'Pferdeschwanzpalme', + botanicalName: 'Beaucarnea recurvata', + confidence: 1.0, + careInfo: { waterIntervalDays: 21, light: 'Volles Sonnenlicht', temp: '15-30 °C' }, + description: 'Die Pferdeschwanzpalme hat einen verdickten Stammbasis als Wasserspeicher und lange, schmale Blaetter.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/7/7e/Beaucarnea_recurvata%2C_Ocampo%2C_Tamaulipas%2C_Mexico_1.jpg/500px-Beaucarnea_recurvata%2C_Ocampo%2C_Tamaulipas%2C_Mexico_1.jpg', + categories: ['easy', 'succulent', 'tree', 'sun'], + }, + { + name: 'Goldfruchtpalme', + botanicalName: 'Dypsis lutescens', + confidence: 1.0, + careInfo: { waterIntervalDays: 5, light: 'Helles indirektes Licht', temp: '18-27 °C' }, + description: 'Die Goldfruchtpalme ist eine elegante Zimmerpalme mit gelblich-gruenen Stielen und gefiederten Wedeln.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/2/22/%E6%95%A3%E5%B0%BE%E8%91%B5Dypsis_lutescens_20210511145013_05.jpg/500px-%E6%95%A3%E5%B0%BE%E8%91%B5Dypsis_lutescens_20210511145013_05.jpg', + categories: ['air_purifier', 'tree', 'pet_friendly'], + }, + { + name: 'Bergpalme', + botanicalName: 'Chamaedorea elegans', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Wenig bis helles Licht', temp: '15-25 °C' }, + description: 'Die Bergpalme ist eine kompakte Zimmerpalme fuer schattigere Standorte. Ideal fuer dunkle Innenraeume.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/64/Chamaedorea_elegans_Mart.JPG/500px-Chamaedorea_elegans_Mart.JPG', + categories: ['easy', 'low_light', 'tree', 'air_purifier', 'pet_friendly'], + }, + { + name: 'Zwergdattelpalme', + botanicalName: 'Phoenix roebelenii', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Helles bis volles Licht', temp: '18-27 °C' }, + description: 'Die Zwergdattelpalme ist eine zierliche Palme mit eleganten, gebogenen Fiederblaettern. Tropisches Flair.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/1/1d/Starr_070124-3839_Phoenix_roebelenii.jpg/500px-Starr_070124-3839_Phoenix_roebelenii.jpg', + categories: ['tree', 'bright_light'], + }, + { + name: 'Stab-Palme', + botanicalName: 'Rhapis excelsa', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '15-25 °C' }, + description: 'Die Stab-Palme ist eine elegante Zimmerpalme mit faecher­foermigen Blaettern auf duennen, bambusartigen Staemmen.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/0/0c/Arya_-_Rhapis_excelsa_at_hotel_citradream_Cirebon_2019_0.jpg/500px-Arya_-_Rhapis_excelsa_at_hotel_citradream_Cirebon_2019_0.jpg', + categories: ['low_light', 'tree'], + }, + { + name: 'Amazona-Taro', + botanicalName: 'Alocasia amazonica', + confidence: 1.0, + careInfo: { waterIntervalDays: 5, light: 'Indirektes Licht', temp: '18-27 °C' }, + description: 'Der Amazona-Taro besticht mit dunkelgruenen, pfeilfoermigen Blaettern mit markant weissen Rippen.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/c/cf/Alocasia_x_amazonica_a1.jpg/500px-Alocasia_x_amazonica_a1.jpg', + categories: ['patterned', 'high_humidity', 'large'], + }, + { + name: 'Taro', + botanicalName: 'Colocasia esculenta', + confidence: 1.0, + careInfo: { waterIntervalDays: 3, light: 'Helles indirektes Licht', temp: '18-30 °C' }, + description: 'Der Taro ist eine tropische Pflanze mit grossen, herzfoermigen Blaettern. Die Knollen sind Nahrungsquelle.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/3/30/Songe-R%C3%A9union.JPG/500px-Songe-R%C3%A9union.JPG', + categories: ['high_humidity', 'large'], + }, + { + name: 'Dieffenbachie', + botanicalName: 'Dieffenbachia seguine', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '18-26 °C' }, + description: 'Die Dieffenbachie ist eine tropische Blattschmuckpflanze mit grossen, gruen-weiss gefleckten Blaettern.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/8/80/Dieffenbachia_seguine1FKST.jpg/500px-Dieffenbachia_seguine1FKST.jpg', + categories: ['easy', 'low_light', 'air_purifier'], + }, + { + name: 'Buntblatt', + botanicalName: 'Caladium bicolor', + confidence: 1.0, + careInfo: { waterIntervalDays: 5, light: 'Indirektes Licht', temp: '20-30 °C' }, + description: 'Das Buntblatt beeindruckt mit transparenten, bunt gemusterten Blaettern in Pink, Rot, Weiss und Gruen.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/f/f8/Caladium_bicolor_2.jpg/500px-Caladium_bicolor_2.jpg', + categories: ['patterned', 'high_humidity'], + }, + { + name: 'Aglaoneme', + botanicalName: 'Aglaonema commutatum', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Wenig bis helles Licht', temp: '15-26 °C' }, + description: 'Die Aglaoneme ist eine dekorative Zimmerpflanze mit silbrig-gruen gemusterten Blaettern. Tolerant gegenueber wenig Licht.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/c/c7/Aglaonema_commutatum_kz1.jpg/500px-Aglaonema_commutatum_kz1.jpg', + categories: ['easy', 'low_light', 'patterned'], + }, + { + name: 'Gebet-Pflanze', + botanicalName: 'Maranta leuconeura', + confidence: 1.0, + careInfo: { waterIntervalDays: 5, light: 'Indirektes Licht', temp: '18-27 °C' }, + description: 'Die Gebet-Pflanze faltet ihre gemusterten Blaetter nachts wie Haende zusammen. Faszinierende rote und gruene Muster.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/4/4a/Maranta_leuconeura3.jpg/500px-Maranta_leuconeura3.jpg', + categories: ['patterned', 'high_humidity', 'pet_friendly'], + }, + { + name: 'Stromanthe', + botanicalName: 'Stromanthe sanguinea', + confidence: 1.0, + careInfo: { waterIntervalDays: 5, light: 'Helles indirektes Licht', temp: '18-25 °C' }, + description: 'Die Stromanthe hat dekorative Blaetter mit weissem Muster und leuchtend roter Unterseite. Familie der Marantaceen.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/3/38/Stromanthe_sanguinea_in_garden_in_Manaus%2C_Brazil.jpg/500px-Stromanthe_sanguinea_in_garden_in_Manaus%2C_Brazil.jpg', + categories: ['patterned', 'high_humidity'], + }, + { + name: 'Ctenanthe', + botanicalName: 'Ctenanthe burle-marxii', + confidence: 1.0, + careInfo: { waterIntervalDays: 5, light: 'Indirektes Licht', temp: '18-25 °C' }, + description: 'Die Ctenanthe hat faszinierend gemusterte Blaetter mit dunkelgruunem Fischgraetenmuster auf hellgruunem Hintergrund.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/7/7d/Ctenanthe_burle-marxii.jpg/500px-Ctenanthe_burle-marxii.jpg', + categories: ['patterned', 'high_humidity'], + }, + { + name: 'Kleeblume', + botanicalName: 'Oxalis triangularis', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '15-24 °C' }, + description: 'Die Kleeblume hat tiefviolette, dreieckige Blaetter und zarte rosa Blueten. Sie faltet die Blaetter bei Dunkelheit.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/1/15/Oxalis_triangularis6.jpg/500px-Oxalis_triangularis6.jpg', + categories: ['flowering', 'patterned'], + }, + { + name: 'Satinpothos', + botanicalName: 'Scindapsus pictus', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '18-28 °C' }, + description: 'Der Satinpothos hat samtig-glaenzende, silbrig gefleckte Blaetter auf langen, haengenden Ranken.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/c/ca/Scindapsus_pictus_01.jpg/500px-Scindapsus_pictus_01.jpg', + categories: ['easy', 'hanging', 'patterned'], + }, + { + name: 'Pfeilblatt', + botanicalName: 'Syngonium podophyllum', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '16-27 °C' }, + description: 'Das Pfeilblatt hat charakteristisch pfeilfoermige Blaetter, die sich mit dem Alter weiterentwickeln.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/5/58/Zingiber_malaysianum.jpg/500px-Zingiber_malaysianum.jpg', + categories: ['easy', 'hanging'], + }, + { + name: 'Wachsblume', + botanicalName: 'Hoya carnosa', + confidence: 1.0, + careInfo: { waterIntervalDays: 10, light: 'Helles indirektes Licht', temp: '16-27 °C' }, + description: 'Die Wachsblume ist eine Kletterpflanze mit dicken, wachsartigen Blaettern und sternfoermigen, duftenden Blueten.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/e/ea/NKN-2007-06-13_114250_Hoya_Carnosa_%28Yvan_Leduc_author_for_Wikipedia%29.jpg/500px-NKN-2007-06-13_114250_Hoya_Carnosa_%28Yvan_Leduc_author_for_Wikipedia%29.jpg', + categories: ['easy', 'flowering', 'hanging', 'succulent'], + }, + { + name: 'Kleine Wachsblume', + botanicalName: 'Hoya bella', + confidence: 1.0, + careInfo: { waterIntervalDays: 10, light: 'Helles indirektes Licht', temp: '18-27 °C' }, + description: 'Die Kleine Wachsblume traegt zierliche, sternfoermige weisse Blueten mit rosa Mitte. Haengende Sukkulente.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/d/d1/%E7%BE%8E%E9%BA%97%E6%AF%AC%E8%98%AD_Hoya_bella_-%E9%A6%99%E6%B8%AF%E5%85%AC%E5%9C%92_Hong_Kong_Park-_%289240227808%29.jpg/500px-%E7%BE%8E%E9%BA%97%E6%AF%AC%E8%98%AD_Hoya_bella_-%E9%A6%99%E6%B8%AF%E5%85%AC%E5%9C%92_Hong_Kong_Park-_%289240227808%29.jpg', + categories: ['flowering', 'hanging', 'succulent'], + }, + { + name: 'Jasmin', + botanicalName: 'Jasminum polyanthum', + confidence: 1.0, + careInfo: { waterIntervalDays: 5, light: 'Helles bis volles Licht', temp: '10-22 °C' }, + description: 'Der Jasmin ist eine Kletterpflanze mit intensiv duftenden, weissen Blueten. Er bluet im Winter und Fruehling.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/2/2d/%28MHNT%29_Jasminum_polyanthum_%E2%80%93_flowers_and_buds.jpg/500px-%28MHNT%29_Jasminum_polyanthum_%E2%80%93_flowers_and_buds.jpg', + categories: ['flowering'], + }, + { + name: 'Madagaskar-Jasmin', + botanicalName: 'Stephanotis floribunda', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '18-25 °C' }, + description: 'Der Madagaskar-Jasmin hat dicke, glaenzende Blaetter und wachsweisse, intensiv duftende Blueten. Klassische Hochzeitsblume.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/3/31/Stephanotis_floribunda3L._Marie.jpg/500px-Stephanotis_floribunda3L._Marie.jpg', + categories: ['flowering'], + }, + { + name: 'Bleiwurz', + botanicalName: 'Plumbago auriculata', + confidence: 1.0, + careInfo: { waterIntervalDays: 5, light: 'Volles Sonnenlicht', temp: '15-27 °C' }, + description: 'Die Bleiwurz ist ein halbimmergruener Strauch mit himmelblauen Blueten, der fast das ganze Jahr bluet.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/e/e1/Plumbago_auriculata_2718.jpg/500px-Plumbago_auriculata_2718.jpg', + categories: ['flowering', 'sun', 'bright_light'], + }, + { + name: 'Bougainvillea', + botanicalName: 'Bougainvillea spectabilis', + confidence: 1.0, + careInfo: { waterIntervalDays: 5, light: 'Volles Sonnenlicht', temp: '18-30 °C' }, + description: 'Die Bougainvillea ist eine rankenreiche Kletterpflanze mit leuchtend farbigen Hochblaettern in Rot, Orange oder Pink.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/a/ae/Starr_030418-0061_Bougainvillea_spectabilis.jpg/500px-Starr_030418-0061_Bougainvillea_spectabilis.jpg', + categories: ['flowering', 'sun', 'bright_light'], + }, + { + name: 'Passionsblume', + botanicalName: 'Passiflora caerulea', + confidence: 1.0, + careInfo: { waterIntervalDays: 5, light: 'Helles bis volles Licht', temp: '15-27 °C' }, + description: 'Die Passionsblume ist eine faszinierende Kletterpflanze mit komplex strukturierten, blau-weissen Blueten.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/9/9a/Passiflora_caerulea_%282019-06-24%29_frontal-view.jpg/500px-Passiflora_caerulea_%282019-06-24%29_frontal-view.jpg', + categories: ['flowering'], + }, + { + name: 'Suesskartoffel', + botanicalName: 'Ipomoea batatas', + confidence: 1.0, + careInfo: { waterIntervalDays: 5, light: 'Volles Sonnenlicht', temp: '20-30 °C' }, + description: 'Die Suesskartoffel-Zierpflanze hat dekorative, herzfoermige Blaetter in gruen oder dunkelviolett. Ideal als Haengepflanze.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/5/58/Ipomoea_batatas_006.JPG/500px-Ipomoea_batatas_006.JPG', + categories: ['easy', 'hanging', 'sun'], + }, + { + name: 'Chinesischer Blauregen', + botanicalName: 'Wisteria sinensis', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Volles Sonnenlicht', temp: '10-25 °C' }, + description: 'Der Chinesische Blauregen ist ein ueppiger Kletterkuenstler mit langen, duftenden Bluetentrauben in Lila.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/7/7a/Chinesischer_Blauregen_Detail_Bl%C3%BCtentraube.JPG/500px-Chinesischer_Blauregen_Detail_Bl%C3%BCtentraube.JPG', + categories: ['flowering', 'sun', 'large'], + }, + { + name: 'Chinesische Rose', + botanicalName: 'Rosa chinensis', + confidence: 1.0, + careInfo: { waterIntervalDays: 5, light: 'Volles Sonnenlicht', temp: '15-25 °C' }, + description: 'Die Chinesische Rose ist eine der Stammarten vieler Gartenrosen und bluet fast ununterbrochen.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/2/2a/Rosa_chinensis.jpg/500px-Rosa_chinensis.jpg', + categories: ['flowering', 'sun'], + }, + { + name: 'Chrysantheme', + botanicalName: 'Chrysanthemum indicum', + confidence: 1.0, + careInfo: { waterIntervalDays: 4, light: 'Helles bis volles Licht', temp: '12-22 °C' }, + description: 'Die Chrysantheme ist die klassische Herbstblume mit ueppigen, dichten Blueten in vielen Farben.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/d/d6/Chrysanthemum_indicum1.jpg/500px-Chrysanthemum_indicum1.jpg', + categories: ['flowering'], + }, + { + name: 'Gerbera', + botanicalName: 'Gerbera jamesonii', + confidence: 1.0, + careInfo: { waterIntervalDays: 5, light: 'Helles bis volles Licht', temp: '15-25 °C' }, + description: 'Die Gerbera ist eine farbenfrohe Schnittblume mit grossen, sonnenblumenaehnlichen Blueten. Sehr beliebt.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/0/0b/Gerbera_jamesonii_%28Asteraceae%29.jpg/500px-Gerbera_jamesonii_%28Asteraceae%29.jpg', + categories: ['flowering', 'bright_light', 'air_purifier'], + }, + { + name: 'Schmetterlingsorchidee', + botanicalName: 'Phalaenopsis amabilis', + confidence: 1.0, + careInfo: { waterIntervalDays: 10, light: 'Helles indirektes Licht', temp: '18-28 °C' }, + description: 'Die Schmetterlingsorchidee ist die bekannteste Zimmerorchidee. Sie bluet bei guter Pflege monatelang.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/5/59/Phalaenopsis_amabilis_Orchi_198.jpg/500px-Phalaenopsis_amabilis_Orchi_198.jpg', + categories: ['flowering', 'high_humidity'], + }, + { + name: 'Dendrobium', + botanicalName: 'Dendrobium nobile', + confidence: 1.0, + careInfo: { waterIntervalDays: 10, light: 'Helles indirektes Licht', temp: '15-28 °C' }, + description: 'Das Dendrobium ist eine beliebte Zimmerorchidee mit langen Pseudobulben, die im Winter mit Blueten besetzt werden.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/b/bb/Dendrobium_nobile_-_flower_view_01.jpg/500px-Dendrobium_nobile_-_flower_view_01.jpg', + categories: ['flowering', 'high_humidity'], + }, + { + name: 'Zymbidium', + botanicalName: 'Cymbidium lowianum', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Helles Licht', temp: '12-24 °C' }, + description: 'Das Zymbidium ist eine robuste Orchidee mit langen, grassartigen Blaettern und eleganten Bluetenrispen.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/b/b7/Cymbidium_lowianum_-_Bot-DSCF1035.jpg', + categories: ['flowering'], + }, + { + name: 'Vanda-Orchidee', + botanicalName: 'Vanda coerulea', + confidence: 1.0, + careInfo: { waterIntervalDays: 3, light: 'Helles bis volles Licht', temp: '20-30 °C' }, + description: 'Die Vanda-Orchidee ist bekannt fuer ihre seltene blaue Bluetenfarbe. Epiphytische Orchidee mit grossen Blueten.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/b/b3/An_orchid_%28Vanda_caerulea%29%3B_flowering_stem._Watercolour._Wellcome_V0043303.jpg/500px-An_orchid_%28Vanda_caerulea%29%3B_flowering_stem._Watercolour._Wellcome_V0043303.jpg', + categories: ['flowering', 'high_humidity', 'bright_light'], + }, + { + name: 'Cattleya-Orchidee', + botanicalName: 'Cattleya labiata', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '18-28 °C' }, + description: 'Die Cattleya ist die Koenigin der Orchideen mit ueppigen, duftenden Blueten in Lila, Rosa und Weiss.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/e/e6/Labiata.jpg/500px-Labiata.jpg', + categories: ['flowering', 'high_humidity'], + }, + { + name: 'Tanzerinnen-Orchidee', + botanicalName: 'Oncidium sphacelatum', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '18-27 °C' }, + description: 'Die Tanzerinnen-Orchidee traegt lange Rispen mit Hunderten kleiner, gelb-brauner Blueten. Sehr reichliche Bluetracht.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/3/37/Oncidium_sphacelatum03.jpg/500px-Oncidium_sphacelatum03.jpg', + categories: ['flowering', 'high_humidity'], + }, + { + name: 'Stiefmuetterchen-Orchidee', + botanicalName: 'Miltoniopsis roezlii', + confidence: 1.0, + careInfo: { waterIntervalDays: 5, light: 'Indirektes Licht', temp: '15-22 °C' }, + description: 'Die Stiefmuetterchen-Orchidee hat grosse, flache Blueten. Bevorzugt kuehle Temperaturen und hohe Luftfeuchtigkeit.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/b/bd/Miltoniopsis_roezlii_%28as_Odontoglossum_roezlii%29_-_pl._30_-_Bateman%2C_Monogr.Odont.jpg/500px-Miltoniopsis_roezlii_%28as_Odontoglossum_roezlii%29_-_pl._30_-_Bateman%2C_Monogr.Odont.jpg', + categories: ['flowering', 'high_humidity'], + }, + { + name: 'Vanille', + botanicalName: 'Vanilla planifolia', + confidence: 1.0, + careInfo: { waterIntervalDays: 5, light: 'Helles indirektes Licht', temp: '20-30 °C' }, + description: 'Die Vanille ist eine kletternde Orchidee, aus deren Fruechten das beliebte Gewuerz gewonnen wird.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/e/e6/Vanilla_planifolia_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-278.jpg/500px-Vanilla_planifolia_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-278.jpg', + categories: ['flowering', 'high_humidity'], + }, + { + name: 'Goldene Tonne', + botanicalName: 'Echinocactus grusonii', + confidence: 1.0, + careInfo: { waterIntervalDays: 21, light: 'Volles Sonnenlicht', temp: '15-35 °C' }, + description: 'Die Goldene Tonne ist ein ikonischer kugelfoermiger Kaktus mit goldgelben Stacheln. Waechst langsam aber imposant.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/2/25/Echinocactus_grusonii_%28aka%29.jpg/500px-Echinocactus_grusonii_%28aka%29.jpg', + categories: ['easy', 'succulent', 'sun'], + }, + { + name: 'Fass-Kaktus', + botanicalName: 'Ferocactus cylindraceus', + confidence: 1.0, + careInfo: { waterIntervalDays: 21, light: 'Volles Sonnenlicht', temp: '15-35 °C' }, + description: 'Der Fass-Kaktus ist ein zylindrischer Wuestenkaktus mit langen, roten Stacheln. Sehr langlebig.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/0/05/Ferocactus-cylindraceus.jpg/500px-Ferocactus-cylindraceus.jpg', + categories: ['easy', 'succulent', 'sun'], + }, + { + name: 'Mammillaria', + botanicalName: 'Mammillaria zeilmanniana', + confidence: 1.0, + careInfo: { waterIntervalDays: 14, light: 'Volles Sonnenlicht', temp: '15-35 °C' }, + description: 'Die Mammillaria ist ein kompakter, kugelfoermiger Kaktus, der im Fruehling einen Kranz aus rosa Blueten traegt.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/a/af/Mammillaria_zeilmanniana.jpg/500px-Mammillaria_zeilmanniana.jpg', + categories: ['easy', 'succulent', 'flowering', 'sun'], + }, + { + name: 'Mond-Kaktus', + botanicalName: 'Gymnocalycium mihanovichii', + confidence: 1.0, + careInfo: { waterIntervalDays: 14, light: 'Indirektes Licht', temp: '15-30 °C' }, + description: 'Der Mond-Kaktus ist eine farbenfrohe Veredelung eines chlorophylllosen Kaktus auf einem gruenen Unterlagekaktus.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/5/51/Gymnocalycium_mihanovichii_4.JPG/500px-Gymnocalycium_mihanovichii_4.JPG', + categories: ['easy', 'succulent'], + }, + { + name: 'Peruanischer Fackelkaktus', + botanicalName: 'Cereus peruvianus', + confidence: 1.0, + careInfo: { waterIntervalDays: 21, light: 'Volles Sonnenlicht', temp: '15-35 °C' }, + description: 'Der Peruanische Fackelkaktus ist ein saeulenfoermiger Kaktus, der im Innenraum bis zu 2 m hoch werden kann.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/5/53/Cereus_repandus_in_Aruba_-_on_the_way_back_from_Altovista_chapel_%282896840490%29.jpg/500px-Cereus_repandus_in_Aruba_-_on_the_way_back_from_Altovista_chapel_%282896840490%29.jpg', + categories: ['easy', 'succulent', 'sun', 'large'], + }, + { + name: 'Hasenohren-Kaktus', + botanicalName: 'Opuntia microdasys', + confidence: 1.0, + careInfo: { waterIntervalDays: 21, light: 'Volles Sonnenlicht', temp: '10-35 °C' }, + description: 'Der Hasenohren-Kaktus hat flache, ovale Triebe mit dichten weissen Glochiden. Klassischer Zimmerkaktus.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/3/36/Opuntia_microdasys_3.jpg/500px-Opuntia_microdasys_3.jpg', + categories: ['easy', 'succulent', 'sun'], + }, + { + name: 'San-Pedro-Kaktus', + botanicalName: 'Echinopsis pachanoi', + confidence: 1.0, + careInfo: { waterIntervalDays: 14, light: 'Volles Sonnenlicht', temp: '10-35 °C' }, + description: 'Der San-Pedro-Kaktus ist ein schnell wachsender, saeulenfoermiger Kaktus aus den Anden.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/62/Starr_070320-5799_Echinopsis_pachanoi.jpg/500px-Starr_070320-5799_Echinopsis_pachanoi.jpg', + categories: ['easy', 'succulent', 'sun'], + }, + { + name: 'Koenigin der Nacht', + botanicalName: 'Epiphyllum oxypetalum', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Indirektes Licht', temp: '18-27 °C' }, + description: 'Die Koenigin der Nacht bluet nur eine einzige Nacht lang mit riesigen, intensiv duftenden weissen Blueten.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/6e/Epiphyllum_oxypetalum_flower.JPG/500px-Epiphyllum_oxypetalum_flower.JPG', + categories: ['flowering', 'succulent'], + }, + { + name: 'Korallenkaktus', + botanicalName: 'Rhipsalis baccifera', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Indirektes Licht', temp: '18-27 °C' }, + description: 'Der Korallenkaktus ist ein epiphytischer Kaktus mit duennen, haengenden Trieben und kleinen weissen Beeren.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/b/ba/Rhipsalis_baccifera_01_ies.jpg/500px-Rhipsalis_baccifera_01_ies.jpg', + categories: ['succulent', 'hanging'], + }, + { + name: 'Wuestenrose', + botanicalName: 'Adenium obesum', + confidence: 1.0, + careInfo: { waterIntervalDays: 10, light: 'Volles Sonnenlicht', temp: '20-35 °C' }, + description: 'Die Wuestenrose ist eine sukkulente Zimmerpflanze mit dickem Stamm und leuchtend pinken Blueten.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/4/4a/Adenium_Obesum_Flower_Side_Macro_Mar22_D72_23052-58_ZS_P.jpg/500px-Adenium_Obesum_Flower_Side_Macro_Mar22_D72_23052-58_ZS_P.jpg', + categories: ['succulent', 'flowering', 'sun'], + }, + { + name: 'Geisterpflanze', + botanicalName: 'Graptopetalum paraguayense', + confidence: 1.0, + careInfo: { waterIntervalDays: 14, light: 'Volles Sonnenlicht', temp: '15-25 °C' }, + description: 'Die Geisterpflanze hat zartgraue bis perlmutt-rosafarbene, rosettenfoermige Blaetter. Sehr robuste Sukkulente.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/5/59/%28MHNT%29_Graptopetalum_paraguayense_-_leaves.jpg/500px-%28MHNT%29_Graptopetalum_paraguayense_-_leaves.jpg', + categories: ['easy', 'succulent', 'sun'], + }, + { + name: 'Mondstein-Pflanze', + botanicalName: 'Pachyphytum oviferum', + confidence: 1.0, + careInfo: { waterIntervalDays: 14, light: 'Volles Sonnenlicht', temp: '15-25 °C' }, + description: 'Die Mondstein-Pflanze hat dicke, ovale Blaetter mit einem pastellrosafarbenen, mehligen Ueberzug.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/8/8f/%28MHNT%29_Pachyphytum_oviferum_-_Habitus.jpg/500px-%28MHNT%29_Pachyphytum_oviferum_-_Habitus.jpg', + categories: ['easy', 'succulent', 'sun'], + }, + { + name: 'Kap-Aloe', + botanicalName: 'Aloe arborescens', + confidence: 1.0, + careInfo: { waterIntervalDays: 14, light: 'Volles Sonnenlicht', temp: '10-30 °C' }, + description: 'Die Kap-Aloe ist eine strauchige Aloe mit schmalen, gezaehnten Blaettern und leuchtend roten Bluetenaehren im Winter.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/b/b9/Aloe_arborescens_Compton.JPG/500px-Aloe_arborescens_Compton.JPG', + categories: ['easy', 'succulent', 'medicinal', 'sun'], + }, + { + name: 'Gasteria', + botanicalName: 'Gasteria carinata', + confidence: 1.0, + careInfo: { waterIntervalDays: 14, light: 'Helles indirektes Licht', temp: '15-25 °C' }, + description: 'Die Gasteria ist eine kleine Sukkulente mit zweireihig angeordneten, zungenfoermigen, gefleckten Blaettern.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/9/91/2_Gasteria_carinata_var_carinata.jpg/500px-2_Gasteria_carinata_var_carinata.jpg', + categories: ['easy', 'succulent', 'low_light'], + }, + { + name: 'Japanische Azalee', + botanicalName: 'Rhododendron simsii', + confidence: 1.0, + careInfo: { waterIntervalDays: 4, light: 'Helles indirektes Licht', temp: '10-18 °C' }, + description: 'Die Japanische Azalee bluet im Winter und Fruehling ueppig mit leuchtend roten, rosa oder weissen Blueten.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/67/Rhododendron_simsii-bunga_2-Lany_pirna.jpg/500px-Rhododendron_simsii-bunga_2-Lany_pirna.jpg', + categories: ['flowering'], + }, + { + name: 'Indische Azalee', + botanicalName: 'Azalea indica', + confidence: 1.0, + careInfo: { waterIntervalDays: 4, light: 'Helles indirektes Licht', temp: '10-20 °C' }, + description: 'Die Indische Azalee ist ein beliebter Zierstrauch mit grossen, auffaelligen Blueten in Rosa- und Rottönen.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/d/de/Rhododendron_indicum1.jpg/500px-Rhododendron_indicum1.jpg', + categories: ['flowering'], + }, + { + name: 'Kamelie', + botanicalName: 'Camellia japonica', + confidence: 1.0, + careInfo: { waterIntervalDays: 5, light: 'Helles indirektes Licht', temp: '7-18 °C' }, + description: 'Die Kamelie ist ein eleganter Zierstrauch mit glaenzenden Blaettern und rosenaehnlichen Blueten von Januar bis April.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/e/e9/Camellia_japonica_NBG.jpg/500px-Camellia_japonica_NBG.jpg', + categories: ['flowering'], + }, + { + name: 'Afrikanisches Veilchen', + botanicalName: 'Saintpaulia ionantha', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '18-25 °C' }, + description: 'Das Afrikanische Veilchen ist eine kleine, kompakte Bluehpflanze mit samtigen Blaettern und violetten Blueten.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/5/57/Streptocarpus_ionanthus_%28as_Saintpaulia_ionantha%29_-_Curtis%27_121_%28Ser._3_no._51%29_pl._7408_%281895%29.jpg/500px-Streptocarpus_ionanthus_%28as_Saintpaulia_ionantha%29_-_Curtis%27_121_%28Ser._3_no._51%29_pl._7408_%281895%29.jpg', + categories: ['easy', 'flowering'], + }, + { + name: 'Drehfrucht', + botanicalName: 'Streptocarpus hybridus', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '15-22 °C' }, + description: 'Die Drehfrucht ist ein Gesneriengewaechs mit langen, gerippten Blaettern und trichterfoermigen Blueten in Lila oder Rosa.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/e/ee/2007-03-20Streptocarpus03.jpg/500px-2007-03-20Streptocarpus03.jpg', + categories: ['flowering'], + }, + { + name: 'Gloxinie', + botanicalName: 'Gloxinia speciosa', + confidence: 1.0, + careInfo: { waterIntervalDays: 5, light: 'Helles indirektes Licht', temp: '18-25 °C' }, + description: 'Die Gloxinie hat grosse, samtartige Blueten in Violett, Rosa oder Weiss mit farbigen Raendern.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/1/13/Florada_da_Glox%C3%ADnia.jpg/500px-Florada_da_Glox%C3%ADnia.jpg', + categories: ['flowering', 'high_humidity'], + }, + { + name: 'Columnea', + botanicalName: 'Columnea gloriosa', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '18-25 °C' }, + description: 'Die Columnea ist eine haengende Zimmerpflanze mit kleinen, behaarten Blaettern und leuchtend roten, roehrenfoermigen Blueten.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/3/32/Columnea_gloriosa_%2849470911201%29.jpg/500px-Columnea_gloriosa_%2849470911201%29.jpg', + categories: ['flowering', 'hanging', 'high_humidity'], + }, + { + name: 'Lippenstiftpflanze', + botanicalName: 'Aeschynanthus radicans', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '18-27 °C' }, + description: 'Die Lippenstiftpflanze hat haengende Triebe mit glaenzenden Blaettern und leuchtend roten Roehrenbluten.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/5/52/Aeschynanthus_radicans.jpg/500px-Aeschynanthus_radicans.jpg', + categories: ['flowering', 'hanging', 'high_humidity'], + }, + { + name: 'Herzkette', + botanicalName: 'Ceropegia woodii', + confidence: 1.0, + careInfo: { waterIntervalDays: 14, light: 'Helles indirektes Licht', temp: '15-27 °C' }, + description: 'Die Herzkette hat duenne, haengende Ranken mit herzfoermigen, silbergrau gemusterten Blaettchen.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/5/55/Ceropegia_linearis_subsp_woodii.jpg', + categories: ['easy', 'succulent', 'hanging', 'patterned'], + }, + { + name: 'Perlenschnur-Pflanze', + botanicalName: 'Senecio rowleyanus', + confidence: 1.0, + careInfo: { waterIntervalDays: 14, light: 'Helles bis volles Licht', temp: '15-27 °C' }, + description: 'Die Perlenschnur-Pflanze hat haengende Ranken mit kugelfoermigen, perlenaehnlichen Blaettern. Einzigartige Sukkulente.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/f/fd/Senecio_rowleyanus_leaves.jpg/500px-Senecio_rowleyanus_leaves.jpg', + categories: ['easy', 'succulent', 'hanging'], + }, + { + name: 'Dischidia', + botanicalName: 'Dischidia ruscifolia', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '18-27 °C' }, + description: 'Die Dischidia ist eine epiphytische Haengepflanze mit kleinen, runden Blaettern entlang duenner Ranken.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/e/ec/%E7%99%BE%E8%90%AC%E5%BF%83_Dischidia_ruscifolia_-%E9%A6%99%E6%B8%AF%E5%8B%95%E6%A4%8D%E7%89%A9%E5%85%AC%E5%9C%92_Hong_Kong_Botanical_Garden-_%289240152650%29.jpg/500px-%E7%99%BE%E8%90%AC%E5%BF%83_Dischidia_ruscifolia_-%E9%A6%99%E6%B8%AF%E5%8B%95%E6%A4%8D%E7%89%A9%E5%85%AC%E5%9C%92_Hong_Kong_Botanical_Garden-_%289240152650%29.jpg', + categories: ['succulent', 'hanging'], + }, + { + name: 'Rippenpeperomie', + botanicalName: 'Peperomia caperata', + confidence: 1.0, + careInfo: { waterIntervalDays: 10, light: 'Helles indirektes Licht', temp: '18-26 °C' }, + description: 'Die Rippenpeperomie hat tief gerippte, dunkelgruene bis violette Blaetter mit einer samtigen Textur.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/1/14/Peperomia_caperata_1-OB9.jpg/500px-Peperomia_caperata_1-OB9.jpg', + categories: ['easy', 'pet_friendly'], + }, + { + name: 'Spiegelpeperomie', + botanicalName: 'Peperomia obtusifolia', + confidence: 1.0, + careInfo: { waterIntervalDays: 10, light: 'Helles indirektes Licht', temp: '16-26 °C' }, + description: 'Die Spiegelpeperomie hat glaenzende, lederartige, oval-runde Blaetter in tiefem Gruen. Sehr robust.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/1/19/Peperomia_obtusifolia_3-OB9.jpg/500px-Peperomia_obtusifolia_3-OB9.jpg', + categories: ['easy', 'pet_friendly', 'low_light'], + }, + { + name: 'Riemenblatt', + botanicalName: 'Clivia miniata', + confidence: 1.0, + careInfo: { waterIntervalDays: 10, light: 'Helles indirektes Licht', temp: '15-24 °C' }, + description: 'Das Riemenblatt ist eine dekorative Zimmerpflanze mit leuchtend orangefarbenen Blueten im Fruehling.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/c/c2/Clivia_miniata%2C_blomme_en_vrugte%2C_Manie_van_der_Schijff_BT%2C_a.jpg/500px-Clivia_miniata%2C_blomme_en_vrugte%2C_Manie_van_der_Schijff_BT%2C_a.jpg', + categories: ['flowering'], + }, + { + name: 'Ritterstern', + botanicalName: 'Hippeastrum hybrid', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Helles bis volles Licht', temp: '18-25 °C' }, + description: 'Der Ritterstern beeindruckt im Winter mit riesigen, trompetenfoermigen Blueten in Rot, Pink oder Weiss.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/f/fc/Hippeastrum_hybrid_1.jpg/500px-Hippeastrum_hybrid_1.jpg', + categories: ['flowering', 'bright_light'], + }, + { + name: 'Osterglocke', + botanicalName: 'Narcissus pseudonarcissus', + confidence: 1.0, + careInfo: { waterIntervalDays: 5, light: 'Helles bis volles Licht', temp: '10-18 °C' }, + description: 'Die Osterglocke ist der klassische Fruehjahrsblueher mit leuchtend gelben, trompetenfoermigen Blueten.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/a/a4/Narcissus_pseudonarcissus_flower_300303.jpg/500px-Narcissus_pseudonarcissus_flower_300303.jpg', + categories: ['flowering'], + }, + { + name: 'Tulpe', + botanicalName: 'Tulipa gesneriana', + confidence: 1.0, + careInfo: { waterIntervalDays: 5, light: 'Helles bis volles Licht', temp: '8-18 °C' }, + description: 'Die Tulpe ist eine der beliebtesten Fruehjahrsblueher mit kelchfoermigen Blueten in unzaehligen Farben.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/9/9e/%D7%A6%D7%91%D7%A2%D7%95%D7%A0%D7%99%D7%9D.JPG/500px-%D7%A6%D7%91%D7%A2%D7%95%D7%A0%D7%99%D7%9D.JPG', + categories: ['easy', 'flowering'], + }, + { + name: 'Hyazinthe', + botanicalName: 'Hyacinthus orientalis', + confidence: 1.0, + careInfo: { waterIntervalDays: 5, light: 'Helles bis volles Licht', temp: '10-18 °C' }, + description: 'Die Hyazinthe bezaubert mit dichten Bluetenrispen und intensivem Duft in Blau, Rosa, Weiss oder Gelb.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/8/82/Hyacinth_flower.jpg/500px-Hyacinth_flower.jpg', + categories: ['easy', 'flowering'], + }, + { + name: 'Traubenhyazinthe', + botanicalName: 'Muscari armeniacum', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Helles bis volles Licht', temp: '8-18 °C' }, + description: 'Die Traubenhyazinthe bildet dichte Trauben aus kleinen, blauen bis violetten Gloeckchen. Zuverlaessige Fruejahrszwiebel.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/1/1a/Muscari_armeniacum_4.jpg/500px-Muscari_armeniacum_4.jpg', + categories: ['easy', 'flowering'], + }, + { + name: 'Krokus', + botanicalName: 'Crocus vernus', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Helles bis volles Licht', temp: '5-15 °C' }, + description: 'Der Krokus ist einer der ersten Fruehjahrs­boten mit kelchfoermigen Blueten in Lila, Weiss und Gelb.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/e/e2/Crocus_vernus_with_bee.jpg/500px-Crocus_vernus_with_bee.jpg', + categories: ['easy', 'flowering'], + } +]; diff --git a/constants/lexiconBatch2.ts b/constants/lexiconBatch2.ts index c23a43f..b8b137c 100644 --- a/constants/lexiconBatch2.ts +++ b/constants/lexiconBatch2.ts @@ -1,1439 +1,1439 @@ -import type { LexiconBatchEntry } from './lexiconBatch1'; - -const BULK_HERB_CARE = { waterIntervalDays: 5, light: 'Helles bis volles Licht', temp: '12-24 C' }; -const BULK_FLOWER_CARE = { waterIntervalDays: 4, light: 'Volles bis helles Licht', temp: '10-24 C' }; -const BULK_TREE_CARE = { waterIntervalDays: 7, light: 'Volles bis helles Licht', temp: '5-25 C' }; -const BULK_HOUSEPLANT_CARE = { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '18-27 C' }; -const BULK_HUMID_HOUSEPLANT_CARE = { waterIntervalDays: 5, light: 'Helles indirektes Licht', temp: '18-28 C' }; -const BULK_SUCCULENT_HANGING_CARE = { waterIntervalDays: 10, light: 'Helles bis volles Licht', temp: '18-30 C' }; - -const createPendingEntry = ( - entry: Omit, -): LexiconBatchEntry => ({ - ...entry, - confidence: 1.0, - imageUri: `wikimedia-search:${entry.botanicalName}`, -}); - -const createHerbEntry = ( - name: string, - botanicalName: string, - overrides: Partial> = {}, -): LexiconBatchEntry => createPendingEntry({ - name, - botanicalName, - careInfo: overrides.careInfo || BULK_HERB_CARE, - description: overrides.description || `${name} ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.`, - categories: overrides.categories || ['easy', 'sun'], -}); - -const createHerbPinnedEntry = ( - name: string, - botanicalName: string, - imageUri: string, - overrides: Partial> = {}, -): LexiconBatchEntry => ({ - ...createHerbEntry(name, botanicalName, overrides), - imageUri, -}); - -const createFlowerEntry = ( - name: string, - botanicalName: string, - overrides: Partial> = {}, -): LexiconBatchEntry => createPendingEntry({ - name, - botanicalName, - careInfo: overrides.careInfo || BULK_FLOWER_CARE, - description: overrides.description || `${name} ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.`, - categories: overrides.categories || ['flowering', 'sun'], -}); - -const createTreeEntry = ( - name: string, - botanicalName: string, - overrides: Partial> = {}, -): LexiconBatchEntry => createPendingEntry({ - name, - botanicalName, - careInfo: overrides.careInfo || BULK_TREE_CARE, - description: overrides.description || `${name} ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.`, - categories: overrides.categories || ['tree', 'sun', 'large'], -}); - -const createHouseplantEntry = ( - name: string, - botanicalName: string, - overrides: Partial> = {}, -): LexiconBatchEntry => createPendingEntry({ - name, - botanicalName, - careInfo: overrides.careInfo || BULK_HOUSEPLANT_CARE, - description: overrides.description || `${name} ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.`, - categories: overrides.categories || ['bright_light'], -}); - -const createHouseplantSearchEntry = ( - name: string, - botanicalName: string, - searchQuery: string, - overrides: Partial> = {}, -): LexiconBatchEntry => ({ - ...createHouseplantEntry(name, botanicalName, overrides), - imageUri: `wikimedia-search:${searchQuery}`, -}); - -const createHouseplantPinnedEntry = ( - name: string, - botanicalName: string, - imageUri: string, - overrides: Partial> = {}, -): LexiconBatchEntry => ({ - ...createHouseplantEntry(name, botanicalName, overrides), - imageUri, -}); - -export const LEXICON_BATCH_2_ENTRIES: LexiconBatchEntry[] = [ - { - name: 'Weisse Strelitzie', - botanicalName: 'Strelitzia nicolai', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Helles bis volles Licht', temp: '18-27 °C' }, - description: 'Die Weisse Strelitzie ist ein beeindruckender Zimmerstrauch mit grossen, blaugruenen Blaettern und weiss-blauen Blueten.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/b/ba/Strelitzia_nicolai_3.jpg/500px-Strelitzia_nicolai_3.jpg', - categories: ['large', 'tree', 'bright_light'], - }, - { - name: 'Bananenpflanze', - botanicalName: 'Musa acuminata', - confidence: 1.0, - careInfo: { waterIntervalDays: 5, light: 'Helles bis volles Licht', temp: '20-30 °C' }, - description: 'Die Bananenpflanze ist eine tropische Staude mit riesigen, glaenzenden Blaettern. Im Zimmer selten fruechttragend.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/7/7d/Musa_acuminata_in_india01.jpg/500px-Musa_acuminata_in_india01.jpg', - categories: ['large', 'high_humidity'], - }, - { - name: 'Kentia-Palme', - botanicalName: 'Howea forsteriana', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '18-25 °C' }, - description: 'Die Kentia-Palme ist eine der elegantesten Zimmerpalmen mit langen, herabhängenden Fiederblaettern.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/9/99/Howea_forsteriana_Lord_Howe_Island.jpg/500px-Howea_forsteriana_Lord_Howe_Island.jpg', - categories: ['tree', 'low_light', 'pet_friendly'], - }, - { - name: 'Chinesische Fächerpalme', - botanicalName: 'Livistona chinensis', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Helles bis volles Licht', temp: '15-25 °C' }, - description: 'Die Chinesische Fächerpalme hat grosse, faecher­foermige Blaetter auf einem einzelnen Stamm. Sehr dekorativ.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/f/f6/Livistona-chinensis.jpg/500px-Livistona-chinensis.jpg', - categories: ['tree', 'bright_light'], - }, - { - name: 'Mexikanische Fächerpalme', - botanicalName: 'Washingtonia robusta', - confidence: 1.0, - careInfo: { waterIntervalDays: 10, light: 'Volles Sonnenlicht', temp: '15-35 °C' }, - description: 'Die Mexikanische Fächerpalme ist eine schlanke, hohe Palme mit faecher­foermigen Blaettern. Sehr hitzetolerant.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/b/b8/Arecales_-_Washingtonia_robusta_-_1.jpg/500px-Arecales_-_Washingtonia_robusta_-_1.jpg', - categories: ['tree', 'sun', 'large'], - }, - { - name: 'Schraubenbaum', - botanicalName: 'Pandanus veitchii', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Helles bis volles Licht', temp: '18-27 °C' }, - description: 'Der Schraubenbaum hat spiralfoermig angeordnete, gruenweiss gestreifte Blaetter. Sehr dekorativ und exotisch.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/f/fb/Pandanus_tectorius.jpg/500px-Pandanus_tectorius.jpg', - categories: ['patterned', 'bright_light'], - }, - { - name: 'Bambusrohr', - botanicalName: 'Bambusa vulgaris', - confidence: 1.0, - careInfo: { waterIntervalDays: 5, light: 'Helles bis volles Licht', temp: '15-30 °C' }, - description: 'Das Bambusrohr ist eine schnell wachsende Bambusart mit gelbgruenen Halmen. Sehr dekorativ und vielseitig nutzbar.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/1/10/Golden_Bamboo%28Bambusa_vulgaris%29_in_Hong_Kong.jpg/500px-Golden_Bamboo%28Bambusa_vulgaris%29_in_Hong_Kong.jpg', - categories: ['easy', 'large'], - }, - { - name: 'Goldener Bambus', - botanicalName: 'Phyllostachys aurea', - confidence: 1.0, - careInfo: { waterIntervalDays: 5, light: 'Helles bis volles Licht', temp: '10-30 °C' }, - description: 'Der Goldene Bambus hat elegante, goldgelbe Halme mit engstehenden Knoten. Sehr dekorativ als Sichtschutz.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/3/3b/Phyllostachys_aurea0.jpg/500px-Phyllostachys_aurea0.jpg', - categories: ['easy', 'large'], - }, - { - name: 'Paragraphenpflanze', - botanicalName: 'Cyperus alternifolius', - confidence: 1.0, - careInfo: { waterIntervalDays: 3, light: 'Helles bis volles Licht', temp: '18-27 °C' }, - description: 'Die Paragraphenpflanze hat lange, grasartige Blaetter, die sternfoermig vom Stiel abstehen. Sie liebt viel Wasser.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/7/76/Cyperus_alternifolius_2.jpg', - categories: ['high_humidity'], - }, - { - name: 'Strahlenaralie', - botanicalName: 'Schefflera arboricola', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '15-25 °C' }, - description: 'Die Strahlenaralie hat fingerfoermig angeordnete, glaenzende Blaetter auf langen Stielen. Sehr robuste Zimmerpflanze.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/8/82/Schefflera_arboricola%2C_vrugte%2C_a%2C_Pretoria.jpg/500px-Schefflera_arboricola%2C_vrugte%2C_a%2C_Pretoria.jpg', - categories: ['easy', 'air_purifier', 'tree'], - }, - { - name: 'Grosse Strahlenaralie', - botanicalName: 'Schefflera actinophylla', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '18-27 °C' }, - description: 'Die Grosse Strahlenaralie kann grosse, handfoermige Blaetter entwickeln. Sie ist ideal als Zimmerstrauch.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/b/bc/Octopus_Tree_%28Schefflera_actinophylla%29_at_Hyderabad%2C_AP_W_283.jpg', - categories: ['easy', 'tree', 'large'], - }, - { - name: 'Fatsia', - botanicalName: 'Fatsia japonica', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '10-20 °C' }, - description: 'Die Fatsia ist ein dekorativer Zimmerstrauch mit grossen, handfoermigen, glaenzenden Blaettern. Sehr robust.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/f/f4/Old_Fatsia_japonica_with_blosems.jpg/500px-Old_Fatsia_japonica_with_blosems.jpg', - categories: ['easy', 'low_light'], - }, - { - name: 'Japanische Aucube', - botanicalName: 'Aucuba japonica', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Wenig bis helles Licht', temp: '10-20 °C' }, - description: 'Die Japanische Aucube hat glaenzende, gruene oder gelbgefleckte Blaetter. Sehr schattenvertraeglich.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/c/c6/Aucuba_japonica_Gold_Dust_NBG_LR.jpg/500px-Aucuba_japonica_Gold_Dust_NBG_LR.jpg', - categories: ['easy', 'low_light'], - }, - { - name: 'Keulenlilie', - botanicalName: 'Cordyline australis', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Helles bis volles Licht', temp: '10-25 °C' }, - description: 'Die Keulenlilie hat lange, schmale, gruene oder rotbraune Blaetter in einem dekorativen Schopf.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/f/f7/CabbageTreeKaihoka.jpg/500px-CabbageTreeKaihoka.jpg', - categories: ['easy', 'tree', 'sun'], - }, - { - name: 'Tiroler Keulenlilie', - botanicalName: 'Cordyline fruticosa', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '18-27 °C' }, - description: 'Die Tiroler Keulenlilie hat leuchtend rote, gruene oder buntlaubige Blaetter. Eine exotische Zimmerpflanze.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/2/2d/Cordyline_fruticosa_%2820262433874%29.jpg/500px-Cordyline_fruticosa_%2820262433874%29.jpg', - categories: ['easy'], - }, - { - name: 'Schusterpflanze', - botanicalName: 'Aspidistra elatior', - confidence: 1.0, - careInfo: { waterIntervalDays: 14, light: 'Wenig bis helles Licht', temp: '10-20 °C' }, - description: 'Die Schusterpflanze ist eine extrem robuste Zimmerpflanze mit langen, dunkelgruenen Blaettern. Vertraegt tiefe Temperaturen.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/f/fc/Aspidistra_elatior1.jpg/500px-Aspidistra_elatior1.jpg', - categories: ['easy', 'low_light'], - }, - { - name: 'Zylindrischer Bogenhanf', - botanicalName: 'Sansevieria cylindrica', - confidence: 1.0, - careInfo: { waterIntervalDays: 14, light: 'Helles bis volles Licht', temp: '15-27 °C' }, - description: 'Der Zylindrische Bogenhanf hat zylindrische, aufrechte Blaetter, die sich nach oben verjuengen. Sehr pflegeleicht.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/c/c8/Sansevieria_cylindrica_flowers_7.jpg/500px-Sansevieria_cylindrica_flowers_7.jpg', - categories: ['easy', 'succulent', 'sun'], - }, - { - name: 'Kap-Aloe (ferox)', - botanicalName: 'Aloe ferox', - confidence: 1.0, - careInfo: { waterIntervalDays: 14, light: 'Volles Sonnenlicht', temp: '10-30 °C' }, - description: 'Aloe ferox ist eine grosse, imposante Aloe mit stachligen, blaugruenen Blaettern und leuchtend roten Bluetenaehren.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/9/9e/Aloe_Ferox_between_Cofimvaba_and_Ngcobo.jpg', - categories: ['succulent', 'medicinal', 'sun', 'large'], - }, - { - name: 'Christusdorn', - botanicalName: 'Euphorbia milii', - confidence: 1.0, - careInfo: { waterIntervalDays: 10, light: 'Helles bis volles Licht', temp: '15-28 °C' }, - description: 'Der Christusdorn ist eine sukkulente Wolfsmilch mit stacheligen Zweigen und kleinen roten oder gelben Hochblaettern.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/7/77/Euphorbia_Milii_flowers.jpg/500px-Euphorbia_Milii_flowers.jpg', - categories: ['easy', 'succulent', 'flowering', 'sun'], - }, - { - name: 'Weihnachtsstern', - botanicalName: 'Euphorbia pulcherrima', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '15-22 °C' }, - description: 'Der Weihnachtsstern ist die klassische Winterpflanze mit leuchtend roten Hochblaettern. Er steht symbolisch fuer Weihnachten.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/e/e1/Weihnachtsstern_-_gro%C3%9F.jpg/500px-Weihnachtsstern_-_gro%C3%9F.jpg', - categories: ['flowering'], - }, - { - name: 'Kaninchen-Ohren', - botanicalName: 'Kalanchoe tomentosa', - confidence: 1.0, - careInfo: { waterIntervalDays: 14, light: 'Helles bis volles Licht', temp: '15-25 °C' }, - description: 'Kaninchen-Ohren haben weisslich-filzige Blaetter mit braunen Raendern, die Kaninchen­ohren aehneln. Sehr dekorativ.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/0/04/Kalanchoe_tomentosa_01.jpg/500px-Kalanchoe_tomentosa_01.jpg', - categories: ['easy', 'succulent', 'sun'], - }, - { - name: 'Brutblatt', - botanicalName: 'Kalanchoe daigremontiana', - confidence: 1.0, - careInfo: { waterIntervalDays: 14, light: 'Helles bis volles Licht', temp: '15-25 °C' }, - description: 'Das Brutblatt bildet entlang des Blattrandes zahlreiche kleine Jungpflanzen. Eine faszinierende Sukkulente.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/f/fc/Vivipary_in_Kalanchoe_daigremontiana.jpg/500px-Vivipary_in_Kalanchoe_daigremontiana.jpg', - categories: ['easy', 'succulent', 'sun'], - }, - { - name: 'Lebende Steine', - botanicalName: 'Lithops julii', - confidence: 1.0, - careInfo: { waterIntervalDays: 21, light: 'Volles Sonnenlicht', temp: '10-30 °C' }, - description: 'Lebende Steine sind faszinierende Mimikry-Sukkulenten, die Kieselsteinen taeuschen aehnlich sehen. Sehr trockenheitsresistent.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/0/0f/Lithops_julii_fulleri.jpg/500px-Lithops_julii_fulleri.jpg', - categories: ['succulent', 'sun'], - }, - { - name: 'Konophytum', - botanicalName: 'Conophytum calculus', - confidence: 1.0, - careInfo: { waterIntervalDays: 21, light: 'Volles Sonnenlicht', temp: '10-25 °C' }, - description: 'Das Konophytum ist eine sehr kompakte Sukkulente, die zwei Blaetter zu einer kugelfoermigen Form verschmilzt.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/b/b0/1_Conophytum_calculus_-_RSA_3.jpg/500px-1_Conophytum_calculus_-_RSA_3.jpg', - categories: ['succulent', 'sun'], - }, - { - name: 'Aasblume', - botanicalName: 'Stapelia grandiflora', - confidence: 1.0, - careInfo: { waterIntervalDays: 14, light: 'Helles bis volles Licht', temp: '18-30 °C' }, - description: 'Die Aasblume hat fleischige, gruene Staengel und riesige, sternfoermige Blueten mit aasartigem Duft.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/9/98/Stapelia_grandiflora_22102013_1_%2810606394434%29.jpg/500px-Stapelia_grandiflora_22102013_1_%2810606394434%29.jpg', - categories: ['succulent', 'flowering', 'sun'], - }, - { - name: 'Moos-Crassula', - botanicalName: 'Crassula muscosa', - confidence: 1.0, - careInfo: { waterIntervalDays: 14, light: 'Helles bis volles Licht', temp: '15-25 °C' }, - description: 'Die Moos-Crassula hat dicht aneinandergereihte, winzige gruene Blaetter auf unverzweigten Trieben. Sieht aus wie Moos.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/5/5e/Crassula_muscosa_Grubosz_2006-05-03_01.jpg/500px-Crassula_muscosa_Grubosz_2006-05-03_01.jpg', - categories: ['easy', 'succulent', 'sun'], - }, - { - name: 'Speckbaum', - botanicalName: 'Portulacaria afra', - confidence: 1.0, - careInfo: { waterIntervalDays: 14, light: 'Helles bis volles Licht', temp: '15-30 °C' }, - description: 'Der Speckbaum ist eine sukkulente Pflanze mit roten Stielen und kleinen, runden, glaenzenden Blaettern.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/4/46/Portulacaria_afra_02.JPG/500px-Portulacaria_afra_02.JPG', - categories: ['easy', 'succulent', 'sun'], - }, - { - name: 'Blauer Kreuzkraut', - botanicalName: 'Senecio serpens', - confidence: 1.0, - careInfo: { waterIntervalDays: 14, light: 'Helles bis volles Licht', temp: '15-25 °C' }, - description: 'Der Blaue Kreuzkraut hat zylindrische, blaublaugruene Blaetter und einen kriechenden Wuchs. Sehr dekorativ.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/5/57/Senecio_serpens_04.jpg/500px-Senecio_serpens_04.jpg', - categories: ['easy', 'succulent', 'sun'], - }, - { - name: 'Kotyledon', - botanicalName: 'Cotyledon orbiculata', - confidence: 1.0, - careInfo: { waterIntervalDays: 14, light: 'Helles bis volles Licht', temp: '15-25 °C' }, - description: 'Kotyledon hat dickfleischige, runde Blaetter mit einem mehligen, weisslichen Belag. Sehr trockenheitsresistent.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/9/90/Cotyledon_orbiculata_-_pigs_ear_-_Cape_Point_-_South_Africa_2.JPG/500px-Cotyledon_orbiculata_-_pigs_ear_-_Cape_Point_-_South_Africa_2.JPG', - categories: ['easy', 'succulent', 'sun'], - }, - { - name: 'Dudleya', - botanicalName: 'Dudleya brittonii', - confidence: 1.0, - careInfo: { waterIntervalDays: 14, light: 'Volles Sonnenlicht', temp: '10-25 °C' }, - description: 'Dudleya ist eine rosetten­bildende Sukkulente mit silbrig-weissen, mehligen Blaettern. Sehr elegant.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/1/10/Dudleya_Brittonii.jpg/500px-Dudleya_Brittonii.jpg', - categories: ['easy', 'succulent', 'sun'], - }, - { - name: 'Adromischus', - botanicalName: 'Adromischus cristatus', - confidence: 1.0, - careInfo: { waterIntervalDays: 14, light: 'Helles bis volles Licht', temp: '15-25 °C' }, - description: 'Adromischus ist eine kompakte Sukkulente mit ungewoehnlich wellenrandigen Blaettern auf kurzen Staengeln.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/1/15/Adromischus_cristatus_-_Gaiser_Conservatory_%28Manito_Park%29_-_IMG_7008.JPG/500px-Adromischus_cristatus_-_Gaiser_Conservatory_%28Manito_Park%29_-_IMG_7008.JPG', - categories: ['easy', 'succulent', 'sun'], - }, - { - name: 'Spanisches Moos', - botanicalName: 'Tillandsia usneoides', - confidence: 1.0, - careInfo: { waterIntervalDays: 3, light: 'Helles bis volles Licht', temp: '15-30 °C' }, - description: 'Das Spanische Moos ist eine epiphytische Bromelie ohne Wurzeln, die in der Luft haengt. Es benoetigt nur Feuchtigkeitsbespruehing.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/1/13/Spanish_moss_at_the_Mcbryde_Garden_in_hawaii.jpg/500px-Spanish_moss_at_the_Mcbryde_Garden_in_hawaii.jpg', - categories: ['easy', 'hanging'], - }, - { - name: 'Luftpflanze', - botanicalName: 'Tillandsia ionantha', - confidence: 1.0, - careInfo: { waterIntervalDays: 3, light: 'Helles bis volles Licht', temp: '15-30 °C' }, - description: 'Die Luftpflanze ist eine kompakte Bromelie ohne Topferde. Sie nimmt Wasser und Naehrstoffe ueber die Blattschuppen auf.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/b/b5/Purple_sky_plant_-_Andrey_Zharkikh.jpg/500px-Purple_sky_plant_-_Andrey_Zharkikh.jpg', - categories: ['easy'], - }, - { - name: 'Silbervase', - botanicalName: 'Aechmea fasciata', - confidence: 1.0, - careInfo: { waterIntervalDays: 10, light: 'Helles indirektes Licht', temp: '18-25 °C' }, - description: 'Die Silbervase ist eine Bromelie mit silbrig gebänderten Blaettern und einem rosafarbenen Bluetenstand.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/2/23/Aechmea_fasciata2.jpg/500px-Aechmea_fasciata2.jpg', - categories: ['flowering', 'patterned'], - }, - { - name: 'Flammen-Bromelie', - botanicalName: 'Vriesea splendens', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '18-25 °C' }, - description: 'Die Flammen-Bromelie hat gebänderte, dunkelgruene Blaetter und einen spektakulaeren, roten Bluetenstand.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/b/b6/Bromelia1.jpg/500px-Bromelia1.jpg', - categories: ['flowering', 'patterned', 'high_humidity'], - }, - { - name: 'Guzmania', - botanicalName: 'Guzmania lingulata', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '18-27 °C' }, - description: 'Die Guzmania ist eine Bromelie mit glänzenden, gruenen Blaettern und einem leuchtend roten, sternfoermigen Bluetenstand.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/8/84/Bromeliaceae03.jpg/500px-Bromeliaceae03.jpg', - categories: ['flowering', 'high_humidity'], - }, - { - name: 'Neoregelia', - botanicalName: 'Neoregelia carolinae', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Helles bis volles Licht', temp: '18-27 °C' }, - description: 'Die Neoregelia ist eine Bromelie, bei der das Herzblatt zur Bluetzeit leuchtend rot wird. Sehr dekorativ.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/2/27/Neoregelia_carolinae_BotGardBln310505a.jpg/500px-Neoregelia_carolinae_BotGardBln310505a.jpg', - categories: ['flowering', 'patterned', 'bright_light'], - }, - { - name: 'Billbergia', - botanicalName: 'Billbergia nutans', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '15-25 °C' }, - description: 'Die Billbergia ist eine robuste Bromelie mit schmalen, gruenen Blaettern und hängenden, blauen und gruenen Blueten.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/9/9e/Billbergia_nutans1SHSU.jpg', - categories: ['easy', 'flowering'], - }, - { - name: 'Cryptanthus', - botanicalName: 'Cryptanthus bivittatus', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '18-27 °C' }, - description: 'Cryptanthus ist eine niedrig wachsende Bromelie mit sternfoermigen Rosetten und gemusterten Blaettern. Fuer Terrarien.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/d/d1/CryptanthusBivittatus.jpg/500px-CryptanthusBivittatus.jpg', - categories: ['patterned', 'high_humidity'], - }, - { - name: 'Blaues Kanaelfarn', - botanicalName: 'Phlebodium aureum', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '18-27 °C' }, - description: 'Der Blaue Kanaelfarn hat wachsartige, blaugruene Wedel und glaenzende Wurzelstaemme. Sehr dekorativ.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/2/2d/Starr_050107-2831_Phlebodium_aureum.jpg/500px-Starr_050107-2831_Phlebodium_aureum.jpg', - categories: ['high_humidity'], - }, - { - name: 'Geweihfarn', - botanicalName: 'Platycerium bifurcatum', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '15-25 °C' }, - description: 'Der Geweihfarn hat gespaltene Wedel, die einem Hirschgeweih aehneln. Er ist ein epiphytischer Farn fuer Holz.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/5/5a/Platycerium_bifurcatum_kz01.jpg/500px-Platycerium_bifurcatum_kz01.jpg', - categories: ['hanging', 'high_humidity'], - }, - { - name: 'Frauenhaarfarn', - botanicalName: 'Adiantum raddianum', - confidence: 1.0, - careInfo: { waterIntervalDays: 3, light: 'Helles indirektes Licht', temp: '18-27 °C' }, - description: 'Der Frauenhaarfarn hat zarte, feingliedrige Wedel auf schwarzen, draht­aehnlichen Stielen. Liebt Feuchtigkeit.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/4/45/Starr_030807-0143_Adiantum_raddianum.jpg/500px-Starr_030807-0143_Adiantum_raddianum.jpg', - categories: ['high_humidity'], - }, - { - name: 'Vogelnest-Farn', - botanicalName: 'Asplenium nidus', - confidence: 1.0, - careInfo: { waterIntervalDays: 5, light: 'Helles indirektes Licht', temp: '18-27 °C' }, - description: 'Der Vogelnest-Farn hat ganzrandige, glaenzende Wedel, die eine Nestform bilden. Sehr dekorativ und robust.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/8/84/Asplenium_nidus_%28Bukidnon%2C_Philippines%29_02.jpg/500px-Asplenium_nidus_%28Bukidnon%2C_Philippines%29_02.jpg', - categories: ['easy', 'high_humidity', 'low_light'], - }, - { - name: 'Tueipelfarn', - botanicalName: 'Polypodium vulgare', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '10-20 °C' }, - description: 'Der Tueipelfarn ist ein heimischer Farn mit gelappten Wedeln und runden Sporenhaeufchen auf der Unterseite.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/5/56/T%C3%BCpfelfarn_%28Polypodium_vulgare%29.jpg/500px-T%C3%BCpfelfarn_%28Polypodium_vulgare%29.jpg', - categories: ['easy'], - }, - { - name: 'Regenbogenmoos', - botanicalName: 'Selaginella uncinata', - confidence: 1.0, - careInfo: { waterIntervalDays: 5, light: 'Helles indirektes Licht', temp: '18-27 °C' }, - description: 'Das Regenbogenmoos hat schuppenfoermige Blaetter, die im Licht schillernd irisieren. Dekorativ fuer Terrarien.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/3/34/Selaginella_uncinata_-_Berlin_Botanical_Garden_-_IMG_8722.JPG/500px-Selaginella_uncinata_-_Berlin_Botanical_Garden_-_IMG_8722.JPG', - categories: ['high_humidity', 'patterned'], - }, - { - name: 'Tueipelfarn (Microsorum)', - botanicalName: 'Microsorum punctatum', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '18-27 °C' }, - description: 'Microsorum punctatum ist ein tropischer Farn mit langen, ungeteilten, glaenzenden Wedeln. Fuer feuchte Standorte.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/9/9f/Microsorum_punctatum.jpg/500px-Microsorum_punctatum.jpg', - categories: ['high_humidity'], - }, - { - name: 'Monstera adansonii', - botanicalName: 'Monstera adansonii', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '18-27 °C' }, - description: 'Monstera adansonii hat herzfoermige Blaetter mit zahlreichen runden Lochern. Eine rankende Zimmerpflanze.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/f/fb/Monstera_adansonii_79319231.jpg/500px-Monstera_adansonii_79319231.jpg', - categories: ['easy', 'hanging'], - }, - { - name: 'Monstera obliqua', - botanicalName: 'Monstera obliqua', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '18-27 °C' }, - description: 'Monstera obliqua ist eine seltene Monstera-Art mit filigranen Blaettern, die hauptsaechlich aus Lochern bestehen.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/4/4d/Obiqula.jpg/500px-Obiqula.jpg', - categories: ['hanging', 'patterned'], - }, - { - name: 'Philodendron gloriosum', - botanicalName: 'Philodendron gloriosum', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '18-27 °C' }, - description: 'Philodendron gloriosum hat grosse, samtige, herzfoermige Blaetter mit weissen Rippen. Eine atemberaubende Pflanze.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/e/e1/Philodendron_gloriosum_%2829587099650%29.jpg/500px-Philodendron_gloriosum_%2829587099650%29.jpg', - categories: ['patterned', 'high_humidity', 'large'], - }, - { - name: 'Philodendron bipinnatifidum', - botanicalName: 'Philodendron bipinnatifidum', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '18-27 °C' }, - description: 'Philodendron bipinnatifidum hat grosse, tief gelappte Blaetter. Er entwickelt einen beeindruckenden, baumfoermigen Wuchs.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/c/c1/Tree1.JPG/500px-Tree1.JPG', - categories: ['easy', 'large'], - }, - { - name: 'Roter Philodendron', - botanicalName: 'Philodendron erubescens', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '18-27 °C' }, - description: 'Der Rote Philodendron hat glaenzende, herzfoermige Blaetter, die jung roetrlich erscheinen. Sehr dekorativ.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/c/c7/Philodendron_erubescens_-_Leaves.jpg/500px-Philodendron_erubescens_-_Leaves.jpg', - categories: ['easy', 'hanging'], - }, - { - name: 'Mini-Monstera', - botanicalName: 'Rhaphidophora tetrasperma', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '18-27 °C' }, - description: 'Die Mini-Monstera hat monstera­aehnliche, gelochte Blaetter auf einer kompakten, klettternden Pflanze. Sehr trendig.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/d/db/Rhaphidophora_tetrasperma.jpg/500px-Rhaphidophora_tetrasperma.jpg', - categories: ['easy', 'hanging'], - }, - { - name: 'Neon-Efeutute', - botanicalName: 'Epipremnum pinnatum Neon', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '15-30 °C' }, - description: 'Die Neon-Efeutute hat leuchtend limonengruene Blaetter. Sehr auffaellig und pflegeleicht.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/d/de/Epipremnum_pinnatum_%27Neon%27%2C_Longwood_Gardens_01.jpg/500px-Epipremnum_pinnatum_%27Neon%27%2C_Longwood_Gardens_01.jpg', - categories: ['easy', 'hanging', 'air_purifier'], - }, - { - name: 'Lila Tradescantia', - botanicalName: 'Tradescantia pallida', - confidence: 1.0, - careInfo: { waterIntervalDays: 5, light: 'Helles bis volles Licht', temp: '15-25 °C' }, - description: 'Die Lila Tradescantia hat leuchtend purpurrote Blaetter und ist sehr auffaellig. Sie liebt viel Licht.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/5/5a/Tradescantia_pallida_kz03.jpg/500px-Tradescantia_pallida_kz03.jpg', - categories: ['easy', 'hanging', 'sun'], - }, - { - name: 'Weisse Tradescantia', - botanicalName: 'Tradescantia fluminensis', - confidence: 1.0, - careInfo: { waterIntervalDays: 5, light: 'Helles indirektes Licht', temp: '15-25 °C' }, - description: 'Die Weisse Tradescantia hat gruene Blaetter mit weisslichen Unterseiten. Sehr robust und schnellwachsend.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/e/ef/Tradescantia_fluminensis_%28Flowers%29.jpg/500px-Tradescantia_fluminensis_%28Flowers%29.jpg', - categories: ['easy', 'hanging'], - }, - { - name: 'Callisia', - botanicalName: 'Callisia repens', - confidence: 1.0, - careInfo: { waterIntervalDays: 5, light: 'Helles indirektes Licht', temp: '15-25 °C' }, - description: 'Callisia repens ist ein kleines, kriechendes Kraut mit winzigen, gruenen Blaettern. Ideal fuer haengende Behaelter.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/7/7c/Callisia_repens_starr.jpg/500px-Callisia_repens_starr.jpg', - categories: ['easy', 'hanging'], - }, - { - name: 'Forellen-Begonie', - botanicalName: 'Begonia maculata', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '18-27 °C' }, - description: 'Die Forellen-Begonie hat olivgruene Blaetter mit silbernen Punkten und einer roten Unterseite. Atemberaubend.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/d/df/Begonia_maculata3073316230.jpg/500px-Begonia_maculata3073316230.jpg', - categories: ['patterned', 'high_humidity'], - }, - { - name: 'Knollen-Begonie', - botanicalName: 'Begonia tuberhybrida', - confidence: 1.0, - careInfo: { waterIntervalDays: 5, light: 'Helles indirektes Licht', temp: '15-22 °C' }, - description: 'Die Knollen-Begonie hat riesige, rosenaehnliche Blueten in leuchtendem Rot, Orange, Gelb oder Weiss.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/b/b7/Begonia-tuberhybride_Red.jpg/500px-Begonia-tuberhybride_Red.jpg', - categories: ['flowering', 'high_humidity'], - }, - { - name: 'Neuguinea-Balsamine', - botanicalName: 'Impatiens hawkeri', - confidence: 1.0, - careInfo: { waterIntervalDays: 3, light: 'Helles indirektes Licht', temp: '18-27 °C' }, - description: 'Die Neuguinea-Balsamine hat grosse, leuchtende Blueten und ist sehr bluehfreudig. Ideal fuer Terrassen.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/f/f7/Impatiens_hawkeri%2C_beijo-pintado_%28flores_vermelhas%29_07.jpg/500px-Impatiens_hawkeri%2C_beijo-pintado_%28flores_vermelhas%29_07.jpg', - categories: ['easy', 'flowering'], - }, - { - name: 'Triphylla-Fuchsie', - botanicalName: 'Fuchsia triphylla', - confidence: 1.0, - careInfo: { waterIntervalDays: 3, light: 'Helles indirektes Licht', temp: '15-22 °C' }, - description: 'Die Triphylla-Fuchsie hat lange, roehrenfoermige, orangefarbe Blueten in haengenden Trauben. Sehr exotisch.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/9/90/Fuchsia_triphylla_kz01.jpg/500px-Fuchsia_triphylla_kz01.jpg', - categories: ['flowering', 'hanging'], - }, - { - name: 'Efeu-Geranie', - botanicalName: 'Pelargonium peltatum', - confidence: 1.0, - careInfo: { waterIntervalDays: 5, light: 'Helles bis volles Licht', temp: '15-25 °C' }, - description: 'Die Efeu-Geranie hat efeufoermige, glaenzende Blaetter und bluet den ganzen Sommer in leuchtenden Farben.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/9/98/Pelargonium_peltatum_flower.jpg/500px-Pelargonium_peltatum_flower.jpg', - categories: ['easy', 'flowering', 'hanging', 'sun'], - }, - { - name: 'Duftsteinrich', - botanicalName: 'Lobularia maritima', - confidence: 1.0, - careInfo: { waterIntervalDays: 3, light: 'Helles bis volles Licht', temp: '10-22 °C' }, - description: 'Der Duftsteinrich ist ein niedrig wachsendes Pflanzchen mit winzigen, weissen oder lilafarbenen Blueten und suessem Duft.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/a/a0/Smagliczka_nadmorska_1.jpg/500px-Smagliczka_nadmorska_1.jpg', - categories: ['easy', 'flowering'], - }, - { - name: 'Calibrachoa', - botanicalName: 'Calibrachoa hybrida', - confidence: 1.0, - careInfo: { waterIntervalDays: 2, light: 'Volles Sonnenlicht', temp: '15-25 °C' }, - description: 'Calibrachoa ist eine petunienaehnliche Haengepflanze mit unzaehligen, kleinen Trichterbluten in allen Farben.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/f/fb/Calibrachoa_flower_red.jpg/500px-Calibrachoa_flower_red.jpg', - categories: ['easy', 'flowering', 'hanging', 'sun'], - }, - { - name: 'Wandelroeschen', - botanicalName: 'Lantana camara', - confidence: 1.0, - careInfo: { waterIntervalDays: 5, light: 'Volles Sonnenlicht', temp: '18-28 °C' }, - description: 'Das Wandelroeschen hat kugelige Bluetenkoepfe, die die Farbe von Gelb ueber Orange zu Rot wechseln. Sehr attraktiv.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/5/52/LantanaFlowerLeaves.jpg/500px-LantanaFlowerLeaves.jpg', - categories: ['flowering', 'sun', 'bright_light'], - }, - { - name: 'Zinnie', - botanicalName: 'Zinnia elegans', - confidence: 1.0, - careInfo: { waterIntervalDays: 3, light: 'Volles Sonnenlicht', temp: '18-30 °C' }, - description: 'Die Zinnie ist eine leuchtende Sommerblume mit grossen, dahlienaehnlichen Blueten. Sehr robust und hitzetolerant.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/6e/Zinnienbl%C3%BCte_Zinnia_elegans_stack15_20190722-RM-7222254.jpg/500px-Zinnienbl%C3%BCte_Zinnia_elegans_stack15_20190722-RM-7222254.jpg', - categories: ['easy', 'flowering', 'sun'], - }, - { - name: 'Studentenblume', - botanicalName: 'Tagetes patula', - confidence: 1.0, - careInfo: { waterIntervalDays: 3, light: 'Volles Sonnenlicht', temp: '15-28 °C' }, - description: 'Die Studentenblume ist eine robuste Sommerblume mit orangen oder gelben Blueten. Sie haelt Schadlinge fern.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/e/e7/French_marigold_Tagetes_patula.jpg/500px-French_marigold_Tagetes_patula.jpg', - categories: ['easy', 'flowering', 'sun'], - }, - { - name: 'Blumenschilfrohr', - botanicalName: 'Canna indica', - confidence: 1.0, - careInfo: { waterIntervalDays: 5, light: 'Volles Sonnenlicht', temp: '18-28 °C' }, - description: 'Das Blumenschilfrohr hat grosse, tropisch wirkende Blaetter und auffaellige Blueten in Rot, Orange oder Gelb.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/1/1c/Cinnamon-bellied_flowerpiercer_%28Diglossa_baritula%29_male_on_Indian_shot_%28Canna_indica%29_Finca_El_Pilar.jpg/500px-Cinnamon-bellied_flowerpiercer_%28Diglossa_baritula%29_male_on_Indian_shot_%28Canna_indica%29_Finca_El_Pilar.jpg', - categories: ['flowering', 'sun', 'large'], - }, - { - name: 'Dahlie', - botanicalName: 'Dahlia pinnata', - confidence: 1.0, - careInfo: { waterIntervalDays: 5, light: 'Volles Sonnenlicht', temp: '15-25 °C' }, - description: 'Die Dahlie ist eine prachtvolle Sommerblume mit Blueten in allen Groessen und Formen. Sie wird aus Knollen gezogen.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/60/Borboletas_em_Mini-D%C3%A1lias.JPG/500px-Borboletas_em_Mini-D%C3%A1lias.JPG', - categories: ['flowering', 'sun'], - }, - { - name: 'Ostertrompete', - botanicalName: 'Lilium longiflorum', - confidence: 1.0, - careInfo: { waterIntervalDays: 5, light: 'Helles bis volles Licht', temp: '15-25 °C' }, - description: 'Die Ostertrompete hat grosse, weisse, trichterfoermige Blueten mit intensivem Duft. Klassische Osterblume.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Lilium_longiflorum_%28Easter_Lily%29.JPG/500px-Lilium_longiflorum_%28Easter_Lily%29.JPG', - categories: ['flowering', 'bright_light'], - }, - { - name: 'Calla', - botanicalName: 'Zantedeschia aethiopica', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '15-24 °C' }, - description: 'Die Calla hat elegante, trichterfoermige weisse Hochblaetter und glaenzende, herzfoermige Blaetter. Sehr edel.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/a/a2/Zantedeschia_aethiopica_-1.jpg/500px-Zantedeschia_aethiopica_-1.jpg', - categories: ['flowering', 'high_humidity'], - }, - { - name: 'Koenigs-Protea', - botanicalName: 'Protea cynaroides', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Volles Sonnenlicht', temp: '10-25 °C' }, - description: 'Die Koenigs-Protea ist die Nationalblume Suedafrikas mit riesigen, imposanten Bluetenkoepfen. Eine echte Besonderheit.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/3/3d/Protea_cynaroides_3.jpg/500px-Protea_cynaroides_3.jpg', - categories: ['flowering', 'sun', 'large'], - }, - { - name: 'Heliconia', - botanicalName: 'Heliconia psittacorum', - confidence: 1.0, - careInfo: { waterIntervalDays: 5, light: 'Helles bis volles Licht', temp: '20-30 °C' }, - description: 'Die Heliconia hat leuchtend orangefarbe oder rote, bootsfoermige Hochblaetter. Eine exotische Tropenpflanze.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/6f/Parrot_heliconia_%28Heliconia_psittacorum%29.jpg/500px-Parrot_heliconia_%28Heliconia_psittacorum%29.jpg', - categories: ['flowering', 'high_humidity', 'bright_light'], - }, - { - name: 'Muschelingwer', - botanicalName: 'Alpinia zerumbet', - confidence: 1.0, - careInfo: { waterIntervalDays: 5, light: 'Helles bis volles Licht', temp: '20-30 °C' }, - description: 'Der Muschelingwer hat lange, elegante Blaetter und haengende Bluetenrispen mit weiss-rosa Bluetchen.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/1/1e/200410_Alpinia_zerumbet_1.JPG/500px-200410_Alpinia_zerumbet_1.JPG', - categories: ['flowering', 'high_humidity', 'large'], - }, - { - name: 'Kurkuma', - botanicalName: 'Curcuma longa', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Helles bis volles Licht', temp: '20-30 °C' }, - description: 'Kurkuma ist eine tropische Gewuerzpflanze mit breiten Blaettern und leuchtend gelber Wurzel. Wichtiges Heilgewuerz.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/a/ab/Turmeric_inflorescence.jpg/500px-Turmeric_inflorescence.jpg', - categories: ['medicinal', 'high_humidity'], - }, - { - name: 'Ingwer', - botanicalName: 'Zingiber officinale', - confidence: 1.0, - careInfo: { waterIntervalDays: 5, light: 'Helles indirektes Licht', temp: '20-30 °C' }, - description: 'Ingwer ist eine tropische Gewuerzpflanze mit aromatischen Knollen. Die Blaetter sind schilfartig.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/1/18/Koeh-146-no_text.jpg/500px-Koeh-146-no_text.jpg', - categories: ['medicinal', 'high_humidity'], - }, - { - name: 'Schamkraut', - botanicalName: 'Mimosa pudica', - confidence: 1.0, - careInfo: { waterIntervalDays: 5, light: 'Helles bis volles Licht', temp: '20-28 °C' }, - description: 'Das Schamkraut faltet seine Blaettchen blitzschnell zusammen, wenn man sie beruehrt. Ein faszinierendes Erlebnis.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/2/26/Mimosa_pudica_in_September_month.jpg/500px-Mimosa_pudica_in_September_month.jpg', - categories: ['flowering', 'bright_light'], - }, - { - name: 'Venusfliegenfalle', - botanicalName: 'Dionaea muscipula', - confidence: 1.0, - careInfo: { waterIntervalDays: 5, light: 'Volles Sonnenlicht', temp: '15-30 °C' }, - description: 'Die Venusfliegenfalle ist eine fleischfressende Pflanze mit klappfallartigen Blaettern. Faengt Insekten.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/3/37/Venus_Flytrap_showing_trigger_hairs.jpg/500px-Venus_Flytrap_showing_trigger_hairs.jpg', - categories: ['sun'], - }, - { - name: 'Purpursonnentau', - botanicalName: 'Sarracenia purpurea', - confidence: 1.0, - careInfo: { waterIntervalDays: 3, light: 'Volles Sonnenlicht', temp: '5-25 °C' }, - description: 'Der Purpursonnentau ist eine fleischfressende Kannenpflanze mit purpurroten Kannen. Faengt Insekten.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/7/7c/Sarracenia_purpurea_Flowers.JPG/500px-Sarracenia_purpurea_Flowers.JPG', - categories: ['sun', 'high_humidity'], - }, - { - name: 'Kannenpflanze', - botanicalName: 'Nepenthes alata', - confidence: 1.0, - careInfo: { waterIntervalDays: 5, light: 'Helles indirektes Licht', temp: '20-30 °C' }, - description: 'Die Kannenpflanze bildet grosse, gefuellte Kannen als Insekten­fallen. Eine faszinierende, tropische Pflanze.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/7/77/Nepenthes_alata_ASR_062007_mt_ambucao_luzon.jpg', - categories: ['high_humidity', 'hanging'], - }, - { - name: 'Sonnentau', - botanicalName: 'Drosera capensis', - confidence: 1.0, - careInfo: { waterIntervalDays: 5, light: 'Volles Sonnenlicht', temp: '15-25 °C' }, - description: 'Der Sonnentau faengt Insekten mit klebrigen Tropfen auf seinen Blaettern. Eine faszinierende fleischfressende Pflanze.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/0/0f/Drosera_capensis_bend.JPG/500px-Drosera_capensis_bend.JPG', - categories: ['sun', 'high_humidity'], - }, - { - name: 'Fettkraut', - botanicalName: 'Pinguicula grandiflora', - confidence: 1.0, - careInfo: { waterIntervalDays: 5, light: 'Helles indirektes Licht', temp: '10-20 °C' }, - description: 'Das Fettkraut faengt Insekten mit klebrigen Blaettern. Es bluet mit violetten, sporenartigen Blueten.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/b/b2/Pinguicula_grandiflora_001.jpg/500px-Pinguicula_grandiflora_001.jpg', - categories: ['flowering', 'high_humidity'], - }, - { - name: 'Wasserschlauch', - botanicalName: 'Utricularia gibba', - confidence: 1.0, - careInfo: { waterIntervalDays: 2, light: 'Helles bis volles Licht', temp: '15-25 °C' }, - description: 'Der Wasserschlauch ist eine wasserbewohnende fleischfressende Pflanze mit Schlaeuchen als Insekten­fallen.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/b/bd/Utricularia_gibba_flower_01.jpg/500px-Utricularia_gibba_flower_01.jpg', - categories: ['high_humidity', 'sun'], - }, - { - name: 'Heliamphora', - botanicalName: 'Heliamphora nutans', - confidence: 1.0, - careInfo: { waterIntervalDays: 5, light: 'Helles indirektes Licht', temp: '15-25 °C' }, - description: 'Heliamphora ist eine urtuemliche Kannenpflanze aus den Tafelbergen Venezuelas. Sehr dekorativ und selten.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/f/f9/Roraima_Heliamphora_nutans1.JPG/500px-Roraima_Heliamphora_nutans1.JPG', - categories: ['high_humidity'], - }, - { - name: 'Kaffeestrauch', - botanicalName: 'Coffea arabica', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '18-25 °C' }, - description: 'Der Kaffeestrauch hat glaenzende, dunkelgruene Blaetter und entwickelt rote Kaffe­ekirschen. Kann im Topf gehalten werden.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/c/c7/Coffee_Flowers.JPG/500px-Coffee_Flowers.JPG', - categories: ['easy'], - }, - { - name: 'Teestrauch', - botanicalName: 'Camellia sinensis', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '15-22 °C' }, - description: 'Der Teestrauch ist die Pflanze, aus deren Blaettern Tee gewonnen wird. Er hat weisse Blueten und glaenzende Blaetter.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/7/71/Csinensis.jpg/500px-Csinensis.jpg', - categories: ['flowering'], - }, - { - name: 'Zitronenbaum', - botanicalName: 'Citrus limon', - confidence: 1.0, - careInfo: { waterIntervalDays: 5, light: 'Volles Sonnenlicht', temp: '18-28 °C' }, - description: 'Der Zitronenbaum ist ein kleiner, immergruener Baum mit weissen, duftenden Blueten und gelben Fruechten.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/e/e4/P1030323.JPG/500px-P1030323.JPG', - categories: ['sun', 'tree'], - }, - { - name: 'Orangenbaum', - botanicalName: 'Citrus sinensis', - confidence: 1.0, - careInfo: { waterIntervalDays: 5, light: 'Volles Sonnenlicht', temp: '18-28 °C' }, - description: 'Der Orangenbaum ist ein kleiner, immergruener Baum mit weissen Blueten und orangen Fruechten.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/b/b0/OrangeBloss_wb.jpg/500px-OrangeBloss_wb.jpg', - categories: ['sun', 'tree'], - }, - { - name: 'Granatapfelbaum', - botanicalName: 'Punica granatum', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Volles Sonnenlicht', temp: '15-28 °C' }, - description: 'Der Granatapfelbaum hat leuchtend rote Blueten und rote, essbare Fruechte mit rubinroten Kernen.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/6a/Pomegranate_Juice_%282019%29.jpg/500px-Pomegranate_Juice_%282019%29.jpg', - categories: ['flowering', 'sun', 'tree'], - }, - { - name: 'Guave', - botanicalName: 'Psidium guajava', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Volles Sonnenlicht', temp: '18-30 °C' }, - description: 'Die Guave ist ein tropischer Obstbaum mit gelblich-weissen Fruechten. Sie ist reich an Vitamin C.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/3/3a/Psidium_guajava_fruit.jpg/500px-Psidium_guajava_fruit.jpg', - categories: ['sun', 'tree'], - }, - { - name: 'Papaya', - botanicalName: 'Carica papaya', - confidence: 1.0, - careInfo: { waterIntervalDays: 5, light: 'Volles Sonnenlicht', temp: '20-35 °C' }, - description: 'Die Papaya ist eine tropische Fruchtpflanze mit grossen, gelappten Blaettern und orangen Fruechten.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/8/84/Carica_papaya_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-029.jpg/500px-Carica_papaya_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-029.jpg', - categories: ['sun', 'large'], - }, - { - name: 'Tomate', - botanicalName: 'Solanum lycopersicum', - confidence: 1.0, - careInfo: { waterIntervalDays: 3, light: 'Volles Sonnenlicht', temp: '18-28 °C' }, - description: 'Die Tomate ist eine beliebte Gemuese- und Balkonpflanze mit roten, saftigen Fruechten. Im Topf kultivierbar.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/8/89/Tomato_je.jpg/500px-Tomato_je.jpg', - categories: ['easy'], - }, - { - name: 'Chili', - botanicalName: 'Capsicum annuum', - confidence: 1.0, - careInfo: { waterIntervalDays: 4, light: 'Volles Sonnenlicht', temp: '20-30 °C' }, - description: 'Chili ist eine beliebte Gemuese- und Zierpflanze mit leuchtenden, roten oder orangen Fruechten. Im Topf kultivierbar.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/d/d2/Capsicum_annuum_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-027.jpg/500px-Capsicum_annuum_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-027.jpg', - categories: ['easy', 'sun', 'medicinal'], - }, - { - name: 'Aubergine', - botanicalName: 'Solanum melongena', - confidence: 1.0, - careInfo: { waterIntervalDays: 5, light: 'Volles Sonnenlicht', temp: '20-30 °C' }, - description: 'Die Aubergine ist eine Gemuese­pflanze mit grossen, violetten Fruechten. Sie benoetigt viel Waerme und Sonne.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/7/76/Solanum_melongena_24_08_2012_%281%29.JPG/500px-Solanum_melongena_24_08_2012_%281%29.JPG', - categories: ['sun', 'bright_light'], - }, - { - name: 'Gurke', - botanicalName: 'Cucumis sativus', - confidence: 1.0, - careInfo: { waterIntervalDays: 3, light: 'Volles Sonnenlicht', temp: '18-28 °C' }, - description: 'Die Gurke ist eine rankende Gemuese­pflanze mit gruenen, erfrischenden Fruechten. Im Balkonkasten kultivierbar.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/9/96/ARS_cucumber.jpg/500px-ARS_cucumber.jpg', - categories: ['easy', 'sun'], - }, - { - name: 'Salat', - botanicalName: 'Lactuca sativa', - confidence: 1.0, - careInfo: { waterIntervalDays: 3, light: 'Helles bis volles Licht', temp: '10-22 °C' }, - description: 'Salat ist eine schnell wachsende Blattgemuese­pflanze. Im Topf und Balkonkasten sehr gut zu kultivieren.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/d/da/Iceberg_lettuce_in_SB.jpg/500px-Iceberg_lettuce_in_SB.jpg', - categories: ['easy'], - }, - { - name: 'Spinat', - botanicalName: 'Spinacia oleracea', - confidence: 1.0, - careInfo: { waterIntervalDays: 3, light: 'Helles bis volles Licht', temp: '10-20 °C' }, - description: 'Spinat ist ein naehrstoffreiches Blattgemuese mit dunkelgruenen Blaettern. Reich an Eisen und Vitaminen.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/3/37/Spinacia_oleracea_Spinazie_bloeiend.jpg/500px-Spinacia_oleracea_Spinazie_bloeiend.jpg', - categories: ['easy'], - }, - { - name: 'Mangold', - botanicalName: 'Beta vulgaris', - confidence: 1.0, - careInfo: { waterIntervalDays: 3, light: 'Helles bis volles Licht', temp: '10-25 °C' }, - description: 'Mangold ist ein farbenfrohes Blattgemuese mit bunten Stielen in Rot, Gelb, Orange und Weiss.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/f/ff/Beta_vulgaris_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-167.jpg', - categories: ['easy'], - }, - { - name: 'Radieschen', - botanicalName: 'Raphanus sativus', - confidence: 1.0, - careInfo: { waterIntervalDays: 2, light: 'Helles bis volles Licht', temp: '10-22 °C' }, - description: 'Das Radieschen ist ein schnellwachsendes Gemuese mit runden, roten Knollen. Es reift in nur 3-4 Wochen.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/0/0c/Radish_3371103037_4ab07db0bf_o.jpg/500px-Radish_3371103037_4ab07db0bf_o.jpg', - categories: ['easy'], - }, - { - name: 'Karotte', - botanicalName: 'Daucus carota', - confidence: 1.0, - careInfo: { waterIntervalDays: 5, light: 'Helles bis volles Licht', temp: '15-22 °C' }, - description: 'Die Karotte ist eine beliebte Gemuese­pflanze mit orangefarbenen Wurzeln. Im tiefen Topf kultivierbar.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/2/23/Daucus_carota_May_2008-1_edit.jpg/500px-Daucus_carota_May_2008-1_edit.jpg', - categories: ['easy'], - }, - { - name: 'Erdbeere', - botanicalName: 'Fragaria ananassa', - confidence: 1.0, - careInfo: { waterIntervalDays: 3, light: 'Helles bis volles Licht', temp: '15-25 °C' }, - description: 'Die Erdbeere ist ein beliebtes Obst fuer Balkon und Terrasse mit aromatischen, roten Fruechten.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/4/4c/Garden_strawberry_%28Fragaria_%C3%97_ananassa%29_single2.jpg/500px-Garden_strawberry_%28Fragaria_%C3%97_ananassa%29_single2.jpg', - categories: ['easy', 'pet_friendly', 'sun'], - }, - { - name: 'Kamille', - botanicalName: 'Chamomilla recutita', - confidence: 1.0, - careInfo: { waterIntervalDays: 5, light: 'Volles Sonnenlicht', temp: '15-25 °C' }, - description: 'Die Kamille ist ein beliebtes Heilkraut mit kleinen, weiss-gelben Blueten. Das aetherische Oel wirkt beruhigend.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/c/c8/Matricaria_February_2008-1.jpg/500px-Matricaria_February_2008-1.jpg', - categories: ['easy', 'medicinal', 'sun'], - }, - { - name: 'Zitronenmelisse', - botanicalName: 'Melissa officinalis', - confidence: 1.0, - careInfo: { waterIntervalDays: 5, light: 'Helles bis volles Licht', temp: '15-25 °C' }, - description: 'Die Zitronenmelisse ist ein zitronig duftendes Heilkraut. Sie beruhigt die Nerven und foerdert den Schlaf.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/7/70/Lemon_balm_plant.jpg/500px-Lemon_balm_plant.jpg', - categories: ['easy', 'medicinal'], - }, - { - name: 'Salbei', - botanicalName: 'Salvia officinalis', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Volles Sonnenlicht', temp: '10-25 °C' }, - description: 'Salbei ist ein aromatisches Heilkraut mit silbrig-gruenen Blaettern. Er hat antibakterielle und entzuendungshem­mende Wirkung.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/5/5a/Salvia_officinalis0.jpg/500px-Salvia_officinalis0.jpg', - categories: ['easy', 'medicinal', 'sun'], - }, - { - name: 'Baldrian', - botanicalName: 'Valeriana officinalis', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Helles bis volles Licht', temp: '15-25 °C' }, - description: 'Baldrian ist ein bekanntes Heilkraut mit weissen bis roeslichen Blueten. Die Wurzeln werden zur Schlaffoerderung verwendet.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/a/af/Valeriana_officinalis_inflorescence_-_Niitv%C3%A4lja.jpg/500px-Valeriana_officinalis_inflorescence_-_Niitv%C3%A4lja.jpg', - categories: ['medicinal', 'flowering'], - }, - { - name: 'Johanniskraut', - botanicalName: 'Hypericum perforatum', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Volles Sonnenlicht', temp: '10-25 °C' }, - description: 'Das Johanniskraut hat leuchtend gelbe Blueten und ist ein wichtiges Heilkraut gegen Depressionen und Stimmungstiefs.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/c/cf/%28MHNT%29_Hypericum_perforatum_flower_and_buttons.jpg/500px-%28MHNT%29_Hypericum_perforatum_flower_and_buttons.jpg', - categories: ['medicinal', 'flowering', 'sun'], - }, - { - name: 'Sonnenhut', - botanicalName: 'Echinacea purpurea', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Helles bis volles Licht', temp: '15-25 °C' }, - description: 'Der Sonnenhut ist eine beliebte Heilpflanze mit grossen, pinkfarbenen Blueten. Er staerkt das Immunsystem.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/8/8e/Echinacea_purpurea_Grandview_Prairie.jpg/500px-Echinacea_purpurea_Grandview_Prairie.jpg', - categories: ['medicinal', 'flowering', 'sun'], - }, - { - name: 'Arnika', - botanicalName: 'Arnica montana', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Volles Sonnenlicht', temp: '10-20 °C' }, - description: 'Arnika ist eine bekannte Heilpflanze aus den Alpen mit goldgelben Korbbluten. Sie wird fuer Muskeln und Gelenke verwendet.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/1/17/Arnica_montana_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-015.jpg/500px-Arnica_montana_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-015.jpg', - categories: ['medicinal', 'flowering', 'sun'], - }, - { - name: 'Schafgarbe', - botanicalName: 'Achillea millefolium', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Volles Sonnenlicht', temp: '10-25 °C' }, - description: 'Die Schafgarbe hat weisse oder rosafarbene Bluetenschirme und fein gefiederte Blaetter. Wichtige Heilpflanze.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/1/1a/Achillea_millefolium_%28bright%29.jpg/500px-Achillea_millefolium_%28bright%29.jpg', - categories: ['medicinal', 'flowering', 'sun'], - }, - { - name: 'Roter Fingerhut', - botanicalName: 'Digitalis purpurea', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Helles bis volles Licht', temp: '10-20 °C' }, - description: 'Der Rote Fingerhut hat hohe Bluetenstaende mit roehrenfoermigen, gepunkteten Blueten in Rosa. Wichtige Arzneipflanze.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/b/ba/Digitalis_purpurea_LC0101.jpg/500px-Digitalis_purpurea_LC0101.jpg', - categories: ['medicinal', 'flowering'], - }, - { - name: 'Wermut', - botanicalName: 'Artemisia absinthium', - confidence: 1.0, - careInfo: { waterIntervalDays: 14, light: 'Volles Sonnenlicht', temp: '10-25 °C' }, - description: 'Wermut ist ein stark aromatisches Heilkraut mit silbrig-gruenen, tief eingeschnittenen Blaettern. Fuer Kraeuterlikoere.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/e/eb/Artemisia_absinthium_P1210748.jpg/500px-Artemisia_absinthium_P1210748.jpg', - categories: ['medicinal', 'sun'], - }, - { - name: 'Grosse Brennessel', - botanicalName: 'Urtica dioica', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Helles bis volles Licht', temp: '10-25 °C' }, - description: 'Die Grosse Brennessel ist eine Heilpflanze mit brennenden Haaren. Die Blaetter sind reich an Vitaminen und Mineralien.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/6f/Fen_nettle_%28Urtica_dioica_ssp._galeopsifolia%29_-_geograph.org.uk_-_5423125.jpg/500px-Fen_nettle_%28Urtica_dioica_ssp._galeopsifolia%29_-_geograph.org.uk_-_5423125.jpg', - categories: ['medicinal'], - }, - { - name: 'Schwarzer Holunder', - botanicalName: 'Sambucus nigra', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Helles bis volles Licht', temp: '10-25 °C' }, - description: 'Der Schwarze Holunder hat weisse Doldenbluten und schwarze Beeren. Die Fruechte werden fuer Sirup und Saft verwendet.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/61/Sambucus_nigra_004.jpg/500px-Sambucus_nigra_004.jpg', - categories: ['medicinal', 'tree', 'flowering'], - }, - { - name: 'Silber-Weide', - botanicalName: 'Salix alba', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Helles bis volles Licht', temp: '10-25 °C' }, - description: 'Die Silber-Weide hat silbrig-glaenzende Blaetter. Weidenrinde enthält Salicylsaeure, die Grundlage von Aspirin.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/f/f8/Salix_alba_leaves.jpg/500px-Salix_alba_leaves.jpg', - categories: ['medicinal', 'tree', 'large'], - }, - { - name: 'Hange-Birke', - botanicalName: 'Betula pendula', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Volles Sonnenlicht', temp: '10-25 °C' }, - description: 'Die Haenge-Birke hat charakteristisch weisse Rinde und haengende Zweige. Die Blaetter werden in der Heilkunde genutzt.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/8/8a/Betula_pendula_Finland.jpg/500px-Betula_pendula_Finland.jpg', - categories: ['medicinal', 'tree', 'large'], - }, - { - name: 'Faecherahorn', - botanicalName: 'Acer palmatum', - confidence: 1.0, - careInfo: { waterIntervalDays: 5, light: 'Helles bis volles Licht', temp: '10-22 °C' }, - description: 'Der Faecherahorn ist ein japanischer Zierahorn mit feingeschnittenen, faecherfoermigen Blaettern in Gruen oder Rot.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/d/d6/Acer_palmatum0.jpg/500px-Acer_palmatum0.jpg', - categories: ['tree'], - }, - { - name: 'Bonsai-Feige', - botanicalName: 'Ficus retusa', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '16-24 °C' }, - description: 'Die Bonsai-Feige ist eine klassische Bonsai-Art mit kleinen, elliptischen Blaettern. Sehr formbar.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/c/cf/Ficus_retusa_herbarium_sheet.jpg/500px-Ficus_retusa_herbarium_sheet.jpg', - categories: ['tree'], - }, - { - name: 'Socotra-Wuestenrose', - botanicalName: 'Adenium socotranum', - confidence: 1.0, - careInfo: { waterIntervalDays: 14, light: 'Volles Sonnenlicht', temp: '20-35 °C' }, - description: 'Die Socotra-Wuestenrose ist eine seltene, endemische Art mit einem sehr dicken, knolligen Stamm und rosa Blueten.', - imageUri: 'wikimedia-search:Adenium socotranum', - categories: ['succulent', 'flowering', 'sun'], - }, - { - name: 'Tempel-Baum', - botanicalName: 'Plumeria rubra', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Volles Sonnenlicht', temp: '20-30 °C' }, - description: 'Der Tempel-Baum hat intensiv duftende, sternfoermige Blueten in Weiss, Gelb oder Rosa. Klassische Tropenblume.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/a/aa/Champa_tree_with_pink_flowers_in_Islamabad%2C_Pakistan.jpg/500px-Champa_tree_with_pink_flowers_in_Islamabad%2C_Pakistan.jpg', - categories: ['flowering', 'sun', 'tree'], - }, - { - name: 'Zaubernuss', - botanicalName: 'Hamamelis mollis', - confidence: 1.0, - careInfo: { waterIntervalDays: 10, light: 'Helles bis volles Licht', temp: '10-20 °C' }, - description: 'Die Zaubernuss bluet im Winter mit fadendunnen, gelben Bluetenkranzeln, die bis -10 Grad standhalten.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/c/ce/Hamamelis_mollis0.jpg/500px-Hamamelis_mollis0.jpg', - categories: ['flowering', 'medicinal'], - }, - { - name: 'Oleander', - botanicalName: 'Nerium oleander', - confidence: 1.0, - careInfo: { waterIntervalDays: 7, light: 'Volles Sonnenlicht', temp: '15-28 °C' }, - description: 'Der Oleander ist ein mediteraner Strauch mit leuchtend roten, rosa oder weissen Blueten. Sehr hitzetolerant.', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/c/cc/Nerium_oleander_flowers_leaves.jpg/500px-Nerium_oleander_flowers_leaves.jpg', - categories: ['flowering', 'sun', 'bright_light'], - }, - // User import: Kraeuter - createHerbEntry('Lorbeer', 'Laurus nobilis'), - createHerbEntry('Estragon', 'Artemisia dracunculus'), - createHerbEntry('Bohnenkraut', 'Satureja hortensis'), - createHerbEntry('Majoran', 'Origanum majorana'), - createHerbEntry('Kerbel', 'Anthriscus cerefolium'), - createHerbEntry('Liebstoeckel', 'Levisticum officinale'), - createHerbEntry('Zitronengras', 'Cymbopogon citratus'), - createHerbEntry('Zitronenverbene', 'Aloysia citrodora'), - createHerbEntry('Borretsch', 'Borago officinalis'), - createHerbEntry('Sauerampfer', 'Rumex acetosa'), - createHerbEntry('Stevia', 'Stevia rebaudiana'), - createHerbEntry('Katzenminze', 'Nepeta cataria'), - createHerbEntry('Currykraut', 'Helichrysum italicum'), - createHerbEntry('Shiso', 'Perilla frutescens'), - createHerbEntry('Schnittknoblauch', 'Allium tuberosum'), - createHerbEntry('Ysop', 'Hyssopus officinalis'), - createHerbEntry('Wasabi', 'Eutrema japonicum', { - careInfo: { waterIntervalDays: 4, light: 'Helles indirektes Licht', temp: '8-20 C' }, - categories: ['bright_light', 'high_humidity'], - description: 'Wasabi ist ein seltenes Wuerzkraut, das gleichmaessige Feuchte und eher kuehle Bedingungen bevorzugt.', - }), - createHerbPinnedEntry('Roemische Kamille', 'Chamaemelum nobile', 'https://upload.wikimedia.org/wikipedia/commons/f/f2/Chamaemelum_nobile_kz02.jpg', { - categories: ['easy', 'sun', 'medicinal'], - }), - createHerbEntry('Koriander', 'Coriandrum sativum'), - createHerbEntry('Dill', 'Anethum graveolens'), - - // User import: Blumen - createFlowerEntry('Sonnenblume', 'Helianthus annuus'), - createFlowerEntry('Rose', 'Rosa x hybrida', { - categories: ['flowering', 'sun', 'bright_light'], - }), - createFlowerEntry('Pfingstrose', 'Paeonia lactiflora'), - createFlowerEntry('Bart-Iris', 'Iris germanica'), - createFlowerEntry('Gaensebluemchen', 'Bellis perennis'), - createFlowerEntry('Nelke', 'Dianthus caryophyllus'), - createFlowerEntry('Loewenmaeulchen', 'Antirrhinum majus'), - createFlowerEntry('Hortensie', 'Hydrangea macrophylla', { - categories: ['flowering', 'bright_light'], - careInfo: { waterIntervalDays: 4, light: 'Helles bis halbschattiges Licht', temp: '8-24 C' }, - }), - createFlowerEntry('Flieder', 'Syringa vulgaris', { - categories: ['flowering', 'tree', 'sun'], - }), - createFlowerEntry('Kosmee', 'Cosmos bipinnatus'), - createFlowerEntry('Kapuzinerkresse', 'Tropaeolum majus'), - createFlowerEntry('Buntnessel', 'Plectranthus scutellarioides', { - categories: ['patterned', 'bright_light'], - description: 'Buntnessel ist eine farbstarke Zierpflanze, die vor allem fuer ihr dekoratives Laub beliebt ist.', - }), - createFlowerEntry('Rittersporn', 'Delphinium elatum'), - createFlowerEntry('Lupine', 'Lupinus polyphyllus'), - createFlowerEntry('Stockrose', 'Alcea rosea'), - createFlowerEntry('Prunkwinde', 'Ipomoea purpurea'), - createFlowerEntry('Clematis', 'Clematis viticella', { - categories: ['flowering', 'bright_light'], - }), - createFlowerEntry('Duftwicke', 'Lathyrus odoratus'), - createFlowerEntry('Hasengloeckchen', 'Hyacinthoides non-scripta'), - createFlowerEntry('Maigloeckchen', 'Convallaria majalis', { - categories: ['flowering', 'medicinal'], - }), - createFlowerEntry('Gladiole', 'Gladiolus hortulanus'), - createFlowerEntry('Ranunkel', 'Ranunculus asiaticus'), - createFlowerEntry('Anemone', 'Anemone coronaria'), - createFlowerEntry('Eisenkraut', 'Verbena bonariensis'), - createFlowerEntry('Flammenblume', 'Phlox paniculata'), - createFlowerEntry('Herbstaster', 'Symphyotrichum novi-belgii'), - createFlowerEntry('Rudbeckie', 'Rudbeckia hirta'), - createFlowerEntry('Feuersalbei', 'Salvia splendens'), - createFlowerEntry('Freesie', 'Freesia refracta'), - createFlowerEntry('Rhododendron', 'Rhododendron catawbiense', { - categories: ['flowering', 'tree', 'bright_light'], - }), - createFlowerEntry('Geissblatt', 'Lonicera japonica', { - categories: ['flowering', 'bright_light'], - }), - createFlowerEntry('Arabischer Jasmin', 'Jasminum sambac', { - categories: ['flowering', 'bright_light'], - }), - createFlowerEntry('Margerite', 'Leucanthemum vulgare'), - createFlowerEntry('Stehende Geranie', 'Pelargonium zonale'), - createFlowerEntry('Eisbegonie', 'Begonia semperflorens-cultorum', { - categories: ['flowering', 'bright_light'], - }), - createFlowerEntry('Gartenbalsamine', 'Impatiens balsamina', { - categories: ['flowering', 'bright_light'], - }), - createFlowerEntry('Vergissmeinnicht', 'Myosotis sylvatica'), - createFlowerEntry('Seidenpflanze', 'Asclepias tuberosa'), - createFlowerEntry('Indianernessel', 'Monarda didyma'), - createFlowerEntry('Bechermalve', 'Lavatera trimestris'), - createFlowerEntry('Maedchenauge', 'Coreopsis tinctoria'), - createFlowerEntry('Taglilie', 'Hemerocallis fulva'), - createFlowerEntry('Lenzrose', 'Helleborus orientalis', { - categories: ['flowering'], - }), - createFlowerEntry('Trompetenwinde', 'Campsis radicans', { - categories: ['flowering', 'bright_light'], - }), - createFlowerEntry('Mohn', 'Papaver rhoeas'), - createFlowerEntry('Kalifornischer Mohn', 'Eschscholzia californica'), - createFlowerEntry('Ringelblume', 'Calendula officinalis', { - categories: ['flowering', 'sun', 'medicinal'], - }), - createFlowerEntry('Kornblume', 'Centaurea cyanus'), - createFlowerEntry('Bartnelke', 'Dianthus barbatus'), - createFlowerEntry('Mittagsgold', 'Gazania rigens'), - createFlowerEntry('Heliotrop', 'Heliotropium arborescens'), - createFlowerEntry('Koenigskerze', 'Verbascum thapsus', { - categories: ['flowering', 'sun', 'medicinal'], - }), - createFlowerEntry('Ziertabak', 'Nicotiana alata'), - createFlowerEntry('Fuchsschwanz', 'Amaranthus caudatus'), - createFlowerEntry('Mehlsalbei', 'Salvia farinacea'), - createFlowerEntry('Kokardenblume', 'Gaillardia aristata'), - createFlowerEntry('Traenendes Herz', 'Lamprocapnos spectabilis', { - categories: ['flowering', 'bright_light'], - }), - createFlowerEntry('Hornveilchen', 'Viola cornuta'), - createFlowerEntry('Nemesie', 'Nemesia strumosa'), - createFlowerEntry('Kapmargerite', 'Osteospermum ecklonis'), - createFlowerEntry('Shasta-Margerite', 'Leucanthemum x superbum'), - - // User import: Baeume und Straeucher - createTreeEntry('Buchsbaum', 'Buxus sempervirens', { - categories: ['tree', 'sun'], - }), - createTreeEntry('Stechpalme', 'Ilex aquifolium', { - categories: ['tree', 'sun'], - }), - createTreeEntry('Magnolie', 'Magnolia grandiflora', { - categories: ['flowering', 'tree', 'large'], - }), - createTreeEntry('Eiche', 'Quercus robur'), - createTreeEntry('Kiefer', 'Pinus sylvestris'), - createTreeEntry('Fichte', 'Picea abies'), - createTreeEntry('Zeder', 'Cedrus libani'), - createTreeEntry('Zypresse', 'Cupressus sempervirens'), - createTreeEntry('Eukalyptus', 'Eucalyptus globulus', { - categories: ['tree', 'sun', 'medicinal'], - }), - createTreeEntry('Jacaranda', 'Jacaranda mimosifolia', { - categories: ['flowering', 'tree', 'large'], - }), - createTreeEntry('Spitzahorn', 'Acer platanoides'), - createTreeEntry('Eberesche', 'Sorbus aucuparia'), - createTreeEntry('Robinie', 'Robinia pseudoacacia'), - createTreeEntry('Flammenbaum', 'Delonix regia', { - categories: ['flowering', 'tree', 'large'], - }), - createTreeEntry('Ginkgo', 'Ginkgo biloba', { - categories: ['tree', 'sun', 'medicinal'], - }), - createTreeEntry('Trompetenbaum', 'Catalpa bignonioides'), - createTreeEntry('Kirschlorbeer', 'Prunus laurocerasus', { - categories: ['tree', 'sun'], - }), - createTreeEntry('Forsythie', 'Forsythia x intermedia', { - categories: ['flowering', 'tree', 'sun'], - }), - createTreeEntry('Gartenhibiskus', 'Hibiscus syriacus', { - categories: ['flowering', 'tree', 'sun'], - }), - createTreeEntry('Weigelie', 'Weigela florida', { - categories: ['flowering', 'tree', 'sun'], - }), - createTreeEntry('Spierstrauch', 'Spiraea japonica', { - categories: ['flowering', 'tree', 'sun'], - }), - createTreeEntry('Schmetterlingsflieder', 'Buddleja davidii', { - categories: ['flowering', 'tree', 'sun'], - }), - - // User import: Zimmerpflanzen - createHouseplantSearchEntry('Kroton', 'Codiaeum variegatum', 'Garden croton', { - categories: ['patterned', 'bright_light'], - }), - createHouseplantEntry('Alocasia zebrina', 'Alocasia zebrina', { - careInfo: BULK_HUMID_HOUSEPLANT_CARE, - categories: ['bright_light', 'high_humidity'], - }), - createHouseplantEntry('Nervenpflanze', 'Fittonia albivenis', { - careInfo: BULK_HUMID_HOUSEPLANT_CARE, - categories: ['patterned', 'high_humidity'], - }), - createHouseplantEntry('Punktblatt', 'Hypoestes phyllostachya', { - categories: ['patterned', 'bright_light'], - }), - createHouseplantEntry('Aluminium-Pflanze', 'Pilea cadierei', { - categories: ['patterned', 'easy', 'pet_friendly'], - }), - createHouseplantEntry('Wassermelonen-Peperomie', 'Peperomia argyreia', { - categories: ['patterned', 'pet_friendly'], - }), - createHouseplantEntry('Raindrop-Peperomie', 'Peperomia polybotrya', { - categories: ['easy', 'pet_friendly'], - }), - createHouseplantEntry('Glueckskastanie', 'Pachira aquatica', { - categories: ['tree', 'bright_light', 'easy'], - }), - createHouseplantEntry('Norfolk-Tanne', 'Araucaria heterophylla', { - categories: ['tree', 'bright_light'], - }), - createHouseplantEntry('Samt-Anthurie', 'Anthurium clarinervium', { - careInfo: BULK_HUMID_HOUSEPLANT_CARE, - categories: ['patterned', 'high_humidity'], - }), - createHouseplantEntry('Kristall-Anthurie', 'Anthurium crystallinum', { - careInfo: BULK_HUMID_HOUSEPLANT_CARE, - categories: ['patterned', 'high_humidity'], - }), - createHouseplantEntry('Falsche Aralie', 'Schefflera elegantissima', { - categories: ['tree', 'bright_light'], - }), - createHouseplantEntry('String of Bananas', 'Curio radicans', { - careInfo: BULK_SUCCULENT_HANGING_CARE, - categories: ['hanging', 'succulent', 'sun'], - }), - createHouseplantPinnedEntry('String of Dolphins', 'Curio x peregrinus', 'https://upload.wikimedia.org/wikipedia/commons/0/00/Dolphinplant.jpg', { - careInfo: BULK_SUCCULENT_HANGING_CARE, - categories: ['hanging', 'succulent', 'sun'], - }), - createHouseplantEntry('Bubikopf', 'Soleirolia soleirolii', { - careInfo: { waterIntervalDays: 4, light: 'Helles indirektes Licht', temp: '15-24 C' }, - categories: ['pet_friendly', 'high_humidity'], - }), - createHouseplantEntry('Palmfarn', 'Cycas revoluta', { - careInfo: { waterIntervalDays: 10, light: 'Helles bis volles Licht', temp: '18-30 C' }, - categories: ['tree', 'sun', 'large'], - }), - createHouseplantEntry('Calathea lancifolia', 'Goeppertia insignis', { - careInfo: BULK_HUMID_HOUSEPLANT_CARE, - categories: ['patterned', 'high_humidity', 'pet_friendly'], - }), - createHouseplantEntry('Calathea ornata', 'Goeppertia ornata', { - careInfo: BULK_HUMID_HOUSEPLANT_CARE, - categories: ['patterned', 'high_humidity', 'pet_friendly'], - }), - createHouseplantPinnedEntry('Philodendron Brasil', 'Philodendron hederaceum Brasil', 'https://upload.wikimedia.org/wikipedia/commons/0/0b/Philodendron_hederaceum_hederaceum_Brasil_0zz.jpg', { - categories: ['easy', 'hanging', 'low_light'], - }), - createHouseplantPinnedEntry('Philodendron Pink Princess', 'Philodendron erubescens Pink Princess', 'https://upload.wikimedia.org/wikipedia/commons/8/89/Philodendron_Pink_Princess.jpg', { - categories: ['bright_light', 'patterned'], - }), - createHouseplantEntry('Philodendron Xanadu', 'Thaumatophyllum xanadu', { - categories: ['bright_light'], - }), - createHouseplantPinnedEntry('Kaffeepflanze arabica nana', 'Coffea arabica Nana', 'https://upload.wikimedia.org/wikipedia/commons/thumb/1/13/Starr-121108-1098-Coffea_arabica-Philippine_dwarf_habit_with_Forest_and_Angela-Pali_o_Waipio-Maui_%2825102146741%29.jpg/1280px-Starr-121108-1098-Coffea_arabica-Philippine_dwarf_habit_with_Forest_and_Angela-Pali_o_Waipio-Maui_%2825102146741%29.jpg', { - categories: ['bright_light'], - }), - createHouseplantEntry('Yucca aloifolia', 'Yucca aloifolia', { - careInfo: { waterIntervalDays: 10, light: 'Volles Sonnenlicht', temp: '18-30 C' }, - categories: ['tree', 'sun', 'easy'], - }), - createHouseplantEntry('Ficus microcarpa', 'Ficus microcarpa', { - categories: ['tree', 'bright_light', 'easy'], - }), - createHouseplantEntry('Ficus altissima', 'Ficus altissima', { - categories: ['tree', 'bright_light'], - }), -]; +import type { LexiconBatchEntry } from './lexiconBatch1'; + +const BULK_HERB_CARE = { waterIntervalDays: 5, light: 'Helles bis volles Licht', temp: '12-24 C' }; +const BULK_FLOWER_CARE = { waterIntervalDays: 4, light: 'Volles bis helles Licht', temp: '10-24 C' }; +const BULK_TREE_CARE = { waterIntervalDays: 7, light: 'Volles bis helles Licht', temp: '5-25 C' }; +const BULK_HOUSEPLANT_CARE = { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '18-27 C' }; +const BULK_HUMID_HOUSEPLANT_CARE = { waterIntervalDays: 5, light: 'Helles indirektes Licht', temp: '18-28 C' }; +const BULK_SUCCULENT_HANGING_CARE = { waterIntervalDays: 10, light: 'Helles bis volles Licht', temp: '18-30 C' }; + +const createPendingEntry = ( + entry: Omit, +): LexiconBatchEntry => ({ + ...entry, + confidence: 1.0, + imageUri: `wikimedia-search:${entry.botanicalName}`, +}); + +const createHerbEntry = ( + name: string, + botanicalName: string, + overrides: Partial> = {}, +): LexiconBatchEntry => createPendingEntry({ + name, + botanicalName, + careInfo: overrides.careInfo || BULK_HERB_CARE, + description: overrides.description || `${name} ist ein bekanntes Kuechenkraut mit aromatischem Geschmack und vielseitiger Verwendung.`, + categories: overrides.categories || ['easy', 'sun'], +}); + +const createHerbPinnedEntry = ( + name: string, + botanicalName: string, + imageUri: string, + overrides: Partial> = {}, +): LexiconBatchEntry => ({ + ...createHerbEntry(name, botanicalName, overrides), + imageUri, +}); + +const createFlowerEntry = ( + name: string, + botanicalName: string, + overrides: Partial> = {}, +): LexiconBatchEntry => createPendingEntry({ + name, + botanicalName, + careInfo: overrides.careInfo || BULK_FLOWER_CARE, + description: overrides.description || `${name} ist eine beliebte Bluetenpflanze fuer Beet, Balkon oder Garten.`, + categories: overrides.categories || ['flowering', 'sun'], +}); + +const createTreeEntry = ( + name: string, + botanicalName: string, + overrides: Partial> = {}, +): LexiconBatchEntry => createPendingEntry({ + name, + botanicalName, + careInfo: overrides.careInfo || BULK_TREE_CARE, + description: overrides.description || `${name} ist ein bekanntes Zier- oder Gartengehoelz mit dekorativem Wuchs.`, + categories: overrides.categories || ['tree', 'sun', 'large'], +}); + +const createHouseplantEntry = ( + name: string, + botanicalName: string, + overrides: Partial> = {}, +): LexiconBatchEntry => createPendingEntry({ + name, + botanicalName, + careInfo: overrides.careInfo || BULK_HOUSEPLANT_CARE, + description: overrides.description || `${name} ist eine beliebte Zimmerpflanze mit dekorativem Laub oder markantem Wuchs.`, + categories: overrides.categories || ['bright_light'], +}); + +const createHouseplantSearchEntry = ( + name: string, + botanicalName: string, + searchQuery: string, + overrides: Partial> = {}, +): LexiconBatchEntry => ({ + ...createHouseplantEntry(name, botanicalName, overrides), + imageUri: `wikimedia-search:${searchQuery}`, +}); + +const createHouseplantPinnedEntry = ( + name: string, + botanicalName: string, + imageUri: string, + overrides: Partial> = {}, +): LexiconBatchEntry => ({ + ...createHouseplantEntry(name, botanicalName, overrides), + imageUri, +}); + +export const LEXICON_BATCH_2_ENTRIES: LexiconBatchEntry[] = [ + { + name: 'Weisse Strelitzie', + botanicalName: 'Strelitzia nicolai', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Helles bis volles Licht', temp: '18-27 °C' }, + description: 'Die Weisse Strelitzie ist ein beeindruckender Zimmerstrauch mit grossen, blaugruenen Blaettern und weiss-blauen Blueten.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/b/ba/Strelitzia_nicolai_3.jpg/500px-Strelitzia_nicolai_3.jpg', + categories: ['large', 'tree', 'bright_light'], + }, + { + name: 'Bananenpflanze', + botanicalName: 'Musa acuminata', + confidence: 1.0, + careInfo: { waterIntervalDays: 5, light: 'Helles bis volles Licht', temp: '20-30 °C' }, + description: 'Die Bananenpflanze ist eine tropische Staude mit riesigen, glaenzenden Blaettern. Im Zimmer selten fruechttragend.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/7/7d/Musa_acuminata_in_india01.jpg/500px-Musa_acuminata_in_india01.jpg', + categories: ['large', 'high_humidity'], + }, + { + name: 'Kentia-Palme', + botanicalName: 'Howea forsteriana', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '18-25 °C' }, + description: 'Die Kentia-Palme ist eine der elegantesten Zimmerpalmen mit langen, herabhängenden Fiederblaettern.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/9/99/Howea_forsteriana_Lord_Howe_Island.jpg/500px-Howea_forsteriana_Lord_Howe_Island.jpg', + categories: ['tree', 'low_light', 'pet_friendly'], + }, + { + name: 'Chinesische Fächerpalme', + botanicalName: 'Livistona chinensis', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Helles bis volles Licht', temp: '15-25 °C' }, + description: 'Die Chinesische Fächerpalme hat grosse, faecher­foermige Blaetter auf einem einzelnen Stamm. Sehr dekorativ.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/f/f6/Livistona-chinensis.jpg/500px-Livistona-chinensis.jpg', + categories: ['tree', 'bright_light'], + }, + { + name: 'Mexikanische Fächerpalme', + botanicalName: 'Washingtonia robusta', + confidence: 1.0, + careInfo: { waterIntervalDays: 10, light: 'Volles Sonnenlicht', temp: '15-35 °C' }, + description: 'Die Mexikanische Fächerpalme ist eine schlanke, hohe Palme mit faecher­foermigen Blaettern. Sehr hitzetolerant.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/b/b8/Arecales_-_Washingtonia_robusta_-_1.jpg/500px-Arecales_-_Washingtonia_robusta_-_1.jpg', + categories: ['tree', 'sun', 'large'], + }, + { + name: 'Schraubenbaum', + botanicalName: 'Pandanus veitchii', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Helles bis volles Licht', temp: '18-27 °C' }, + description: 'Der Schraubenbaum hat spiralfoermig angeordnete, gruenweiss gestreifte Blaetter. Sehr dekorativ und exotisch.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/f/fb/Pandanus_tectorius.jpg/500px-Pandanus_tectorius.jpg', + categories: ['patterned', 'bright_light'], + }, + { + name: 'Bambusrohr', + botanicalName: 'Bambusa vulgaris', + confidence: 1.0, + careInfo: { waterIntervalDays: 5, light: 'Helles bis volles Licht', temp: '15-30 °C' }, + description: 'Das Bambusrohr ist eine schnell wachsende Bambusart mit gelbgruenen Halmen. Sehr dekorativ und vielseitig nutzbar.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/1/10/Golden_Bamboo%28Bambusa_vulgaris%29_in_Hong_Kong.jpg/500px-Golden_Bamboo%28Bambusa_vulgaris%29_in_Hong_Kong.jpg', + categories: ['easy', 'large'], + }, + { + name: 'Goldener Bambus', + botanicalName: 'Phyllostachys aurea', + confidence: 1.0, + careInfo: { waterIntervalDays: 5, light: 'Helles bis volles Licht', temp: '10-30 °C' }, + description: 'Der Goldene Bambus hat elegante, goldgelbe Halme mit engstehenden Knoten. Sehr dekorativ als Sichtschutz.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/3/3b/Phyllostachys_aurea0.jpg/500px-Phyllostachys_aurea0.jpg', + categories: ['easy', 'large'], + }, + { + name: 'Paragraphenpflanze', + botanicalName: 'Cyperus alternifolius', + confidence: 1.0, + careInfo: { waterIntervalDays: 3, light: 'Helles bis volles Licht', temp: '18-27 °C' }, + description: 'Die Paragraphenpflanze hat lange, grasartige Blaetter, die sternfoermig vom Stiel abstehen. Sie liebt viel Wasser.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/7/76/Cyperus_alternifolius_2.jpg', + categories: ['high_humidity'], + }, + { + name: 'Strahlenaralie', + botanicalName: 'Schefflera arboricola', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '15-25 °C' }, + description: 'Die Strahlenaralie hat fingerfoermig angeordnete, glaenzende Blaetter auf langen Stielen. Sehr robuste Zimmerpflanze.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/8/82/Schefflera_arboricola%2C_vrugte%2C_a%2C_Pretoria.jpg/500px-Schefflera_arboricola%2C_vrugte%2C_a%2C_Pretoria.jpg', + categories: ['easy', 'air_purifier', 'tree'], + }, + { + name: 'Grosse Strahlenaralie', + botanicalName: 'Schefflera actinophylla', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '18-27 °C' }, + description: 'Die Grosse Strahlenaralie kann grosse, handfoermige Blaetter entwickeln. Sie ist ideal als Zimmerstrauch.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/b/bc/Octopus_Tree_%28Schefflera_actinophylla%29_at_Hyderabad%2C_AP_W_283.jpg', + categories: ['easy', 'tree', 'large'], + }, + { + name: 'Fatsia', + botanicalName: 'Fatsia japonica', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '10-20 °C' }, + description: 'Die Fatsia ist ein dekorativer Zimmerstrauch mit grossen, handfoermigen, glaenzenden Blaettern. Sehr robust.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/f/f4/Old_Fatsia_japonica_with_blosems.jpg/500px-Old_Fatsia_japonica_with_blosems.jpg', + categories: ['easy', 'low_light'], + }, + { + name: 'Japanische Aucube', + botanicalName: 'Aucuba japonica', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Wenig bis helles Licht', temp: '10-20 °C' }, + description: 'Die Japanische Aucube hat glaenzende, gruene oder gelbgefleckte Blaetter. Sehr schattenvertraeglich.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/c/c6/Aucuba_japonica_Gold_Dust_NBG_LR.jpg/500px-Aucuba_japonica_Gold_Dust_NBG_LR.jpg', + categories: ['easy', 'low_light'], + }, + { + name: 'Keulenlilie', + botanicalName: 'Cordyline australis', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Helles bis volles Licht', temp: '10-25 °C' }, + description: 'Die Keulenlilie hat lange, schmale, gruene oder rotbraune Blaetter in einem dekorativen Schopf.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/f/f7/CabbageTreeKaihoka.jpg/500px-CabbageTreeKaihoka.jpg', + categories: ['easy', 'tree', 'sun'], + }, + { + name: 'Tiroler Keulenlilie', + botanicalName: 'Cordyline fruticosa', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '18-27 °C' }, + description: 'Die Tiroler Keulenlilie hat leuchtend rote, gruene oder buntlaubige Blaetter. Eine exotische Zimmerpflanze.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/2/2d/Cordyline_fruticosa_%2820262433874%29.jpg/500px-Cordyline_fruticosa_%2820262433874%29.jpg', + categories: ['easy'], + }, + { + name: 'Schusterpflanze', + botanicalName: 'Aspidistra elatior', + confidence: 1.0, + careInfo: { waterIntervalDays: 14, light: 'Wenig bis helles Licht', temp: '10-20 °C' }, + description: 'Die Schusterpflanze ist eine extrem robuste Zimmerpflanze mit langen, dunkelgruenen Blaettern. Vertraegt tiefe Temperaturen.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/f/fc/Aspidistra_elatior1.jpg/500px-Aspidistra_elatior1.jpg', + categories: ['easy', 'low_light'], + }, + { + name: 'Zylindrischer Bogenhanf', + botanicalName: 'Sansevieria cylindrica', + confidence: 1.0, + careInfo: { waterIntervalDays: 14, light: 'Helles bis volles Licht', temp: '15-27 °C' }, + description: 'Der Zylindrische Bogenhanf hat zylindrische, aufrechte Blaetter, die sich nach oben verjuengen. Sehr pflegeleicht.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/c/c8/Sansevieria_cylindrica_flowers_7.jpg/500px-Sansevieria_cylindrica_flowers_7.jpg', + categories: ['easy', 'succulent', 'sun'], + }, + { + name: 'Kap-Aloe (ferox)', + botanicalName: 'Aloe ferox', + confidence: 1.0, + careInfo: { waterIntervalDays: 14, light: 'Volles Sonnenlicht', temp: '10-30 °C' }, + description: 'Aloe ferox ist eine grosse, imposante Aloe mit stachligen, blaugruenen Blaettern und leuchtend roten Bluetenaehren.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/9/9e/Aloe_Ferox_between_Cofimvaba_and_Ngcobo.jpg', + categories: ['succulent', 'medicinal', 'sun', 'large'], + }, + { + name: 'Christusdorn', + botanicalName: 'Euphorbia milii', + confidence: 1.0, + careInfo: { waterIntervalDays: 10, light: 'Helles bis volles Licht', temp: '15-28 °C' }, + description: 'Der Christusdorn ist eine sukkulente Wolfsmilch mit stacheligen Zweigen und kleinen roten oder gelben Hochblaettern.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/7/77/Euphorbia_Milii_flowers.jpg/500px-Euphorbia_Milii_flowers.jpg', + categories: ['easy', 'succulent', 'flowering', 'sun'], + }, + { + name: 'Weihnachtsstern', + botanicalName: 'Euphorbia pulcherrima', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '15-22 °C' }, + description: 'Der Weihnachtsstern ist die klassische Winterpflanze mit leuchtend roten Hochblaettern. Er steht symbolisch fuer Weihnachten.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/e/e1/Weihnachtsstern_-_gro%C3%9F.jpg/500px-Weihnachtsstern_-_gro%C3%9F.jpg', + categories: ['flowering'], + }, + { + name: 'Kaninchen-Ohren', + botanicalName: 'Kalanchoe tomentosa', + confidence: 1.0, + careInfo: { waterIntervalDays: 14, light: 'Helles bis volles Licht', temp: '15-25 °C' }, + description: 'Kaninchen-Ohren haben weisslich-filzige Blaetter mit braunen Raendern, die Kaninchen­ohren aehneln. Sehr dekorativ.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/0/04/Kalanchoe_tomentosa_01.jpg/500px-Kalanchoe_tomentosa_01.jpg', + categories: ['easy', 'succulent', 'sun'], + }, + { + name: 'Brutblatt', + botanicalName: 'Kalanchoe daigremontiana', + confidence: 1.0, + careInfo: { waterIntervalDays: 14, light: 'Helles bis volles Licht', temp: '15-25 °C' }, + description: 'Das Brutblatt bildet entlang des Blattrandes zahlreiche kleine Jungpflanzen. Eine faszinierende Sukkulente.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/f/fc/Vivipary_in_Kalanchoe_daigremontiana.jpg/500px-Vivipary_in_Kalanchoe_daigremontiana.jpg', + categories: ['easy', 'succulent', 'sun'], + }, + { + name: 'Lebende Steine', + botanicalName: 'Lithops julii', + confidence: 1.0, + careInfo: { waterIntervalDays: 21, light: 'Volles Sonnenlicht', temp: '10-30 °C' }, + description: 'Lebende Steine sind faszinierende Mimikry-Sukkulenten, die Kieselsteinen taeuschen aehnlich sehen. Sehr trockenheitsresistent.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/0/0f/Lithops_julii_fulleri.jpg/500px-Lithops_julii_fulleri.jpg', + categories: ['succulent', 'sun'], + }, + { + name: 'Konophytum', + botanicalName: 'Conophytum calculus', + confidence: 1.0, + careInfo: { waterIntervalDays: 21, light: 'Volles Sonnenlicht', temp: '10-25 °C' }, + description: 'Das Konophytum ist eine sehr kompakte Sukkulente, die zwei Blaetter zu einer kugelfoermigen Form verschmilzt.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/b/b0/1_Conophytum_calculus_-_RSA_3.jpg/500px-1_Conophytum_calculus_-_RSA_3.jpg', + categories: ['succulent', 'sun'], + }, + { + name: 'Aasblume', + botanicalName: 'Stapelia grandiflora', + confidence: 1.0, + careInfo: { waterIntervalDays: 14, light: 'Helles bis volles Licht', temp: '18-30 °C' }, + description: 'Die Aasblume hat fleischige, gruene Staengel und riesige, sternfoermige Blueten mit aasartigem Duft.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/9/98/Stapelia_grandiflora_22102013_1_%2810606394434%29.jpg/500px-Stapelia_grandiflora_22102013_1_%2810606394434%29.jpg', + categories: ['succulent', 'flowering', 'sun'], + }, + { + name: 'Moos-Crassula', + botanicalName: 'Crassula muscosa', + confidence: 1.0, + careInfo: { waterIntervalDays: 14, light: 'Helles bis volles Licht', temp: '15-25 °C' }, + description: 'Die Moos-Crassula hat dicht aneinandergereihte, winzige gruene Blaetter auf unverzweigten Trieben. Sieht aus wie Moos.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/5/5e/Crassula_muscosa_Grubosz_2006-05-03_01.jpg/500px-Crassula_muscosa_Grubosz_2006-05-03_01.jpg', + categories: ['easy', 'succulent', 'sun'], + }, + { + name: 'Speckbaum', + botanicalName: 'Portulacaria afra', + confidence: 1.0, + careInfo: { waterIntervalDays: 14, light: 'Helles bis volles Licht', temp: '15-30 °C' }, + description: 'Der Speckbaum ist eine sukkulente Pflanze mit roten Stielen und kleinen, runden, glaenzenden Blaettern.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/4/46/Portulacaria_afra_02.JPG/500px-Portulacaria_afra_02.JPG', + categories: ['easy', 'succulent', 'sun'], + }, + { + name: 'Blauer Kreuzkraut', + botanicalName: 'Senecio serpens', + confidence: 1.0, + careInfo: { waterIntervalDays: 14, light: 'Helles bis volles Licht', temp: '15-25 °C' }, + description: 'Der Blaue Kreuzkraut hat zylindrische, blaublaugruene Blaetter und einen kriechenden Wuchs. Sehr dekorativ.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/5/57/Senecio_serpens_04.jpg/500px-Senecio_serpens_04.jpg', + categories: ['easy', 'succulent', 'sun'], + }, + { + name: 'Kotyledon', + botanicalName: 'Cotyledon orbiculata', + confidence: 1.0, + careInfo: { waterIntervalDays: 14, light: 'Helles bis volles Licht', temp: '15-25 °C' }, + description: 'Kotyledon hat dickfleischige, runde Blaetter mit einem mehligen, weisslichen Belag. Sehr trockenheitsresistent.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/9/90/Cotyledon_orbiculata_-_pigs_ear_-_Cape_Point_-_South_Africa_2.JPG/500px-Cotyledon_orbiculata_-_pigs_ear_-_Cape_Point_-_South_Africa_2.JPG', + categories: ['easy', 'succulent', 'sun'], + }, + { + name: 'Dudleya', + botanicalName: 'Dudleya brittonii', + confidence: 1.0, + careInfo: { waterIntervalDays: 14, light: 'Volles Sonnenlicht', temp: '10-25 °C' }, + description: 'Dudleya ist eine rosetten­bildende Sukkulente mit silbrig-weissen, mehligen Blaettern. Sehr elegant.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/1/10/Dudleya_Brittonii.jpg/500px-Dudleya_Brittonii.jpg', + categories: ['easy', 'succulent', 'sun'], + }, + { + name: 'Adromischus', + botanicalName: 'Adromischus cristatus', + confidence: 1.0, + careInfo: { waterIntervalDays: 14, light: 'Helles bis volles Licht', temp: '15-25 °C' }, + description: 'Adromischus ist eine kompakte Sukkulente mit ungewoehnlich wellenrandigen Blaettern auf kurzen Staengeln.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/1/15/Adromischus_cristatus_-_Gaiser_Conservatory_%28Manito_Park%29_-_IMG_7008.JPG/500px-Adromischus_cristatus_-_Gaiser_Conservatory_%28Manito_Park%29_-_IMG_7008.JPG', + categories: ['easy', 'succulent', 'sun'], + }, + { + name: 'Spanisches Moos', + botanicalName: 'Tillandsia usneoides', + confidence: 1.0, + careInfo: { waterIntervalDays: 3, light: 'Helles bis volles Licht', temp: '15-30 °C' }, + description: 'Das Spanische Moos ist eine epiphytische Bromelie ohne Wurzeln, die in der Luft haengt. Es benoetigt nur Feuchtigkeitsbespruehing.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/1/13/Spanish_moss_at_the_Mcbryde_Garden_in_hawaii.jpg/500px-Spanish_moss_at_the_Mcbryde_Garden_in_hawaii.jpg', + categories: ['easy', 'hanging'], + }, + { + name: 'Luftpflanze', + botanicalName: 'Tillandsia ionantha', + confidence: 1.0, + careInfo: { waterIntervalDays: 3, light: 'Helles bis volles Licht', temp: '15-30 °C' }, + description: 'Die Luftpflanze ist eine kompakte Bromelie ohne Topferde. Sie nimmt Wasser und Naehrstoffe ueber die Blattschuppen auf.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/b/b5/Purple_sky_plant_-_Andrey_Zharkikh.jpg/500px-Purple_sky_plant_-_Andrey_Zharkikh.jpg', + categories: ['easy'], + }, + { + name: 'Silbervase', + botanicalName: 'Aechmea fasciata', + confidence: 1.0, + careInfo: { waterIntervalDays: 10, light: 'Helles indirektes Licht', temp: '18-25 °C' }, + description: 'Die Silbervase ist eine Bromelie mit silbrig gebänderten Blaettern und einem rosafarbenen Bluetenstand.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/2/23/Aechmea_fasciata2.jpg/500px-Aechmea_fasciata2.jpg', + categories: ['flowering', 'patterned'], + }, + { + name: 'Flammen-Bromelie', + botanicalName: 'Vriesea splendens', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '18-25 °C' }, + description: 'Die Flammen-Bromelie hat gebänderte, dunkelgruene Blaetter und einen spektakulaeren, roten Bluetenstand.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/b/b6/Bromelia1.jpg/500px-Bromelia1.jpg', + categories: ['flowering', 'patterned', 'high_humidity'], + }, + { + name: 'Guzmania', + botanicalName: 'Guzmania lingulata', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '18-27 °C' }, + description: 'Die Guzmania ist eine Bromelie mit glänzenden, gruenen Blaettern und einem leuchtend roten, sternfoermigen Bluetenstand.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/8/84/Bromeliaceae03.jpg/500px-Bromeliaceae03.jpg', + categories: ['flowering', 'high_humidity'], + }, + { + name: 'Neoregelia', + botanicalName: 'Neoregelia carolinae', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Helles bis volles Licht', temp: '18-27 °C' }, + description: 'Die Neoregelia ist eine Bromelie, bei der das Herzblatt zur Bluetzeit leuchtend rot wird. Sehr dekorativ.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/2/27/Neoregelia_carolinae_BotGardBln310505a.jpg/500px-Neoregelia_carolinae_BotGardBln310505a.jpg', + categories: ['flowering', 'patterned', 'bright_light'], + }, + { + name: 'Billbergia', + botanicalName: 'Billbergia nutans', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '15-25 °C' }, + description: 'Die Billbergia ist eine robuste Bromelie mit schmalen, gruenen Blaettern und hängenden, blauen und gruenen Blueten.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/9/9e/Billbergia_nutans1SHSU.jpg', + categories: ['easy', 'flowering'], + }, + { + name: 'Cryptanthus', + botanicalName: 'Cryptanthus bivittatus', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '18-27 °C' }, + description: 'Cryptanthus ist eine niedrig wachsende Bromelie mit sternfoermigen Rosetten und gemusterten Blaettern. Fuer Terrarien.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/d/d1/CryptanthusBivittatus.jpg/500px-CryptanthusBivittatus.jpg', + categories: ['patterned', 'high_humidity'], + }, + { + name: 'Blaues Kanaelfarn', + botanicalName: 'Phlebodium aureum', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '18-27 °C' }, + description: 'Der Blaue Kanaelfarn hat wachsartige, blaugruene Wedel und glaenzende Wurzelstaemme. Sehr dekorativ.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/2/2d/Starr_050107-2831_Phlebodium_aureum.jpg/500px-Starr_050107-2831_Phlebodium_aureum.jpg', + categories: ['high_humidity'], + }, + { + name: 'Geweihfarn', + botanicalName: 'Platycerium bifurcatum', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '15-25 °C' }, + description: 'Der Geweihfarn hat gespaltene Wedel, die einem Hirschgeweih aehneln. Er ist ein epiphytischer Farn fuer Holz.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/5/5a/Platycerium_bifurcatum_kz01.jpg/500px-Platycerium_bifurcatum_kz01.jpg', + categories: ['hanging', 'high_humidity'], + }, + { + name: 'Frauenhaarfarn', + botanicalName: 'Adiantum raddianum', + confidence: 1.0, + careInfo: { waterIntervalDays: 3, light: 'Helles indirektes Licht', temp: '18-27 °C' }, + description: 'Der Frauenhaarfarn hat zarte, feingliedrige Wedel auf schwarzen, draht­aehnlichen Stielen. Liebt Feuchtigkeit.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/4/45/Starr_030807-0143_Adiantum_raddianum.jpg/500px-Starr_030807-0143_Adiantum_raddianum.jpg', + categories: ['high_humidity'], + }, + { + name: 'Vogelnest-Farn', + botanicalName: 'Asplenium nidus', + confidence: 1.0, + careInfo: { waterIntervalDays: 5, light: 'Helles indirektes Licht', temp: '18-27 °C' }, + description: 'Der Vogelnest-Farn hat ganzrandige, glaenzende Wedel, die eine Nestform bilden. Sehr dekorativ und robust.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/8/84/Asplenium_nidus_%28Bukidnon%2C_Philippines%29_02.jpg/500px-Asplenium_nidus_%28Bukidnon%2C_Philippines%29_02.jpg', + categories: ['easy', 'high_humidity', 'low_light'], + }, + { + name: 'Tueipelfarn', + botanicalName: 'Polypodium vulgare', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '10-20 °C' }, + description: 'Der Tueipelfarn ist ein heimischer Farn mit gelappten Wedeln und runden Sporenhaeufchen auf der Unterseite.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/5/56/T%C3%BCpfelfarn_%28Polypodium_vulgare%29.jpg/500px-T%C3%BCpfelfarn_%28Polypodium_vulgare%29.jpg', + categories: ['easy'], + }, + { + name: 'Regenbogenmoos', + botanicalName: 'Selaginella uncinata', + confidence: 1.0, + careInfo: { waterIntervalDays: 5, light: 'Helles indirektes Licht', temp: '18-27 °C' }, + description: 'Das Regenbogenmoos hat schuppenfoermige Blaetter, die im Licht schillernd irisieren. Dekorativ fuer Terrarien.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/3/34/Selaginella_uncinata_-_Berlin_Botanical_Garden_-_IMG_8722.JPG/500px-Selaginella_uncinata_-_Berlin_Botanical_Garden_-_IMG_8722.JPG', + categories: ['high_humidity', 'patterned'], + }, + { + name: 'Tueipelfarn (Microsorum)', + botanicalName: 'Microsorum punctatum', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '18-27 °C' }, + description: 'Microsorum punctatum ist ein tropischer Farn mit langen, ungeteilten, glaenzenden Wedeln. Fuer feuchte Standorte.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/9/9f/Microsorum_punctatum.jpg/500px-Microsorum_punctatum.jpg', + categories: ['high_humidity'], + }, + { + name: 'Monstera adansonii', + botanicalName: 'Monstera adansonii', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '18-27 °C' }, + description: 'Monstera adansonii hat herzfoermige Blaetter mit zahlreichen runden Lochern. Eine rankende Zimmerpflanze.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/f/fb/Monstera_adansonii_79319231.jpg/500px-Monstera_adansonii_79319231.jpg', + categories: ['easy', 'hanging'], + }, + { + name: 'Monstera obliqua', + botanicalName: 'Monstera obliqua', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '18-27 °C' }, + description: 'Monstera obliqua ist eine seltene Monstera-Art mit filigranen Blaettern, die hauptsaechlich aus Lochern bestehen.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/4/4d/Obiqula.jpg/500px-Obiqula.jpg', + categories: ['hanging', 'patterned'], + }, + { + name: 'Philodendron gloriosum', + botanicalName: 'Philodendron gloriosum', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '18-27 °C' }, + description: 'Philodendron gloriosum hat grosse, samtige, herzfoermige Blaetter mit weissen Rippen. Eine atemberaubende Pflanze.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/e/e1/Philodendron_gloriosum_%2829587099650%29.jpg/500px-Philodendron_gloriosum_%2829587099650%29.jpg', + categories: ['patterned', 'high_humidity', 'large'], + }, + { + name: 'Philodendron bipinnatifidum', + botanicalName: 'Philodendron bipinnatifidum', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '18-27 °C' }, + description: 'Philodendron bipinnatifidum hat grosse, tief gelappte Blaetter. Er entwickelt einen beeindruckenden, baumfoermigen Wuchs.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/c/c1/Tree1.JPG/500px-Tree1.JPG', + categories: ['easy', 'large'], + }, + { + name: 'Roter Philodendron', + botanicalName: 'Philodendron erubescens', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '18-27 °C' }, + description: 'Der Rote Philodendron hat glaenzende, herzfoermige Blaetter, die jung roetrlich erscheinen. Sehr dekorativ.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/c/c7/Philodendron_erubescens_-_Leaves.jpg/500px-Philodendron_erubescens_-_Leaves.jpg', + categories: ['easy', 'hanging'], + }, + { + name: 'Mini-Monstera', + botanicalName: 'Rhaphidophora tetrasperma', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '18-27 °C' }, + description: 'Die Mini-Monstera hat monstera­aehnliche, gelochte Blaetter auf einer kompakten, klettternden Pflanze. Sehr trendig.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/d/db/Rhaphidophora_tetrasperma.jpg/500px-Rhaphidophora_tetrasperma.jpg', + categories: ['easy', 'hanging'], + }, + { + name: 'Neon-Efeutute', + botanicalName: 'Epipremnum pinnatum Neon', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '15-30 °C' }, + description: 'Die Neon-Efeutute hat leuchtend limonengruene Blaetter. Sehr auffaellig und pflegeleicht.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/d/de/Epipremnum_pinnatum_%27Neon%27%2C_Longwood_Gardens_01.jpg/500px-Epipremnum_pinnatum_%27Neon%27%2C_Longwood_Gardens_01.jpg', + categories: ['easy', 'hanging', 'air_purifier'], + }, + { + name: 'Lila Tradescantia', + botanicalName: 'Tradescantia pallida', + confidence: 1.0, + careInfo: { waterIntervalDays: 5, light: 'Helles bis volles Licht', temp: '15-25 °C' }, + description: 'Die Lila Tradescantia hat leuchtend purpurrote Blaetter und ist sehr auffaellig. Sie liebt viel Licht.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/5/5a/Tradescantia_pallida_kz03.jpg/500px-Tradescantia_pallida_kz03.jpg', + categories: ['easy', 'hanging', 'sun'], + }, + { + name: 'Weisse Tradescantia', + botanicalName: 'Tradescantia fluminensis', + confidence: 1.0, + careInfo: { waterIntervalDays: 5, light: 'Helles indirektes Licht', temp: '15-25 °C' }, + description: 'Die Weisse Tradescantia hat gruene Blaetter mit weisslichen Unterseiten. Sehr robust und schnellwachsend.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/e/ef/Tradescantia_fluminensis_%28Flowers%29.jpg/500px-Tradescantia_fluminensis_%28Flowers%29.jpg', + categories: ['easy', 'hanging'], + }, + { + name: 'Callisia', + botanicalName: 'Callisia repens', + confidence: 1.0, + careInfo: { waterIntervalDays: 5, light: 'Helles indirektes Licht', temp: '15-25 °C' }, + description: 'Callisia repens ist ein kleines, kriechendes Kraut mit winzigen, gruenen Blaettern. Ideal fuer haengende Behaelter.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/7/7c/Callisia_repens_starr.jpg/500px-Callisia_repens_starr.jpg', + categories: ['easy', 'hanging'], + }, + { + name: 'Forellen-Begonie', + botanicalName: 'Begonia maculata', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '18-27 °C' }, + description: 'Die Forellen-Begonie hat olivgruene Blaetter mit silbernen Punkten und einer roten Unterseite. Atemberaubend.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/d/df/Begonia_maculata3073316230.jpg/500px-Begonia_maculata3073316230.jpg', + categories: ['patterned', 'high_humidity'], + }, + { + name: 'Knollen-Begonie', + botanicalName: 'Begonia tuberhybrida', + confidence: 1.0, + careInfo: { waterIntervalDays: 5, light: 'Helles indirektes Licht', temp: '15-22 °C' }, + description: 'Die Knollen-Begonie hat riesige, rosenaehnliche Blueten in leuchtendem Rot, Orange, Gelb oder Weiss.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/b/b7/Begonia-tuberhybride_Red.jpg/500px-Begonia-tuberhybride_Red.jpg', + categories: ['flowering', 'high_humidity'], + }, + { + name: 'Neuguinea-Balsamine', + botanicalName: 'Impatiens hawkeri', + confidence: 1.0, + careInfo: { waterIntervalDays: 3, light: 'Helles indirektes Licht', temp: '18-27 °C' }, + description: 'Die Neuguinea-Balsamine hat grosse, leuchtende Blueten und ist sehr bluehfreudig. Ideal fuer Terrassen.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/f/f7/Impatiens_hawkeri%2C_beijo-pintado_%28flores_vermelhas%29_07.jpg/500px-Impatiens_hawkeri%2C_beijo-pintado_%28flores_vermelhas%29_07.jpg', + categories: ['easy', 'flowering'], + }, + { + name: 'Triphylla-Fuchsie', + botanicalName: 'Fuchsia triphylla', + confidence: 1.0, + careInfo: { waterIntervalDays: 3, light: 'Helles indirektes Licht', temp: '15-22 °C' }, + description: 'Die Triphylla-Fuchsie hat lange, roehrenfoermige, orangefarbe Blueten in haengenden Trauben. Sehr exotisch.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/9/90/Fuchsia_triphylla_kz01.jpg/500px-Fuchsia_triphylla_kz01.jpg', + categories: ['flowering', 'hanging'], + }, + { + name: 'Efeu-Geranie', + botanicalName: 'Pelargonium peltatum', + confidence: 1.0, + careInfo: { waterIntervalDays: 5, light: 'Helles bis volles Licht', temp: '15-25 °C' }, + description: 'Die Efeu-Geranie hat efeufoermige, glaenzende Blaetter und bluet den ganzen Sommer in leuchtenden Farben.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/9/98/Pelargonium_peltatum_flower.jpg/500px-Pelargonium_peltatum_flower.jpg', + categories: ['easy', 'flowering', 'hanging', 'sun'], + }, + { + name: 'Duftsteinrich', + botanicalName: 'Lobularia maritima', + confidence: 1.0, + careInfo: { waterIntervalDays: 3, light: 'Helles bis volles Licht', temp: '10-22 °C' }, + description: 'Der Duftsteinrich ist ein niedrig wachsendes Pflanzchen mit winzigen, weissen oder lilafarbenen Blueten und suessem Duft.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/a/a0/Smagliczka_nadmorska_1.jpg/500px-Smagliczka_nadmorska_1.jpg', + categories: ['easy', 'flowering'], + }, + { + name: 'Calibrachoa', + botanicalName: 'Calibrachoa hybrida', + confidence: 1.0, + careInfo: { waterIntervalDays: 2, light: 'Volles Sonnenlicht', temp: '15-25 °C' }, + description: 'Calibrachoa ist eine petunienaehnliche Haengepflanze mit unzaehligen, kleinen Trichterbluten in allen Farben.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/f/fb/Calibrachoa_flower_red.jpg/500px-Calibrachoa_flower_red.jpg', + categories: ['easy', 'flowering', 'hanging', 'sun'], + }, + { + name: 'Wandelroeschen', + botanicalName: 'Lantana camara', + confidence: 1.0, + careInfo: { waterIntervalDays: 5, light: 'Volles Sonnenlicht', temp: '18-28 °C' }, + description: 'Das Wandelroeschen hat kugelige Bluetenkoepfe, die die Farbe von Gelb ueber Orange zu Rot wechseln. Sehr attraktiv.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/5/52/LantanaFlowerLeaves.jpg/500px-LantanaFlowerLeaves.jpg', + categories: ['flowering', 'sun', 'bright_light'], + }, + { + name: 'Zinnie', + botanicalName: 'Zinnia elegans', + confidence: 1.0, + careInfo: { waterIntervalDays: 3, light: 'Volles Sonnenlicht', temp: '18-30 °C' }, + description: 'Die Zinnie ist eine leuchtende Sommerblume mit grossen, dahlienaehnlichen Blueten. Sehr robust und hitzetolerant.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/6e/Zinnienbl%C3%BCte_Zinnia_elegans_stack15_20190722-RM-7222254.jpg/500px-Zinnienbl%C3%BCte_Zinnia_elegans_stack15_20190722-RM-7222254.jpg', + categories: ['easy', 'flowering', 'sun'], + }, + { + name: 'Studentenblume', + botanicalName: 'Tagetes patula', + confidence: 1.0, + careInfo: { waterIntervalDays: 3, light: 'Volles Sonnenlicht', temp: '15-28 °C' }, + description: 'Die Studentenblume ist eine robuste Sommerblume mit orangen oder gelben Blueten. Sie haelt Schadlinge fern.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/e/e7/French_marigold_Tagetes_patula.jpg/500px-French_marigold_Tagetes_patula.jpg', + categories: ['easy', 'flowering', 'sun'], + }, + { + name: 'Blumenschilfrohr', + botanicalName: 'Canna indica', + confidence: 1.0, + careInfo: { waterIntervalDays: 5, light: 'Volles Sonnenlicht', temp: '18-28 °C' }, + description: 'Das Blumenschilfrohr hat grosse, tropisch wirkende Blaetter und auffaellige Blueten in Rot, Orange oder Gelb.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/1/1c/Cinnamon-bellied_flowerpiercer_%28Diglossa_baritula%29_male_on_Indian_shot_%28Canna_indica%29_Finca_El_Pilar.jpg/500px-Cinnamon-bellied_flowerpiercer_%28Diglossa_baritula%29_male_on_Indian_shot_%28Canna_indica%29_Finca_El_Pilar.jpg', + categories: ['flowering', 'sun', 'large'], + }, + { + name: 'Dahlie', + botanicalName: 'Dahlia pinnata', + confidence: 1.0, + careInfo: { waterIntervalDays: 5, light: 'Volles Sonnenlicht', temp: '15-25 °C' }, + description: 'Die Dahlie ist eine prachtvolle Sommerblume mit Blueten in allen Groessen und Formen. Sie wird aus Knollen gezogen.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/60/Borboletas_em_Mini-D%C3%A1lias.JPG/500px-Borboletas_em_Mini-D%C3%A1lias.JPG', + categories: ['flowering', 'sun'], + }, + { + name: 'Ostertrompete', + botanicalName: 'Lilium longiflorum', + confidence: 1.0, + careInfo: { waterIntervalDays: 5, light: 'Helles bis volles Licht', temp: '15-25 °C' }, + description: 'Die Ostertrompete hat grosse, weisse, trichterfoermige Blueten mit intensivem Duft. Klassische Osterblume.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Lilium_longiflorum_%28Easter_Lily%29.JPG/500px-Lilium_longiflorum_%28Easter_Lily%29.JPG', + categories: ['flowering', 'bright_light'], + }, + { + name: 'Calla', + botanicalName: 'Zantedeschia aethiopica', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '15-24 °C' }, + description: 'Die Calla hat elegante, trichterfoermige weisse Hochblaetter und glaenzende, herzfoermige Blaetter. Sehr edel.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/a/a2/Zantedeschia_aethiopica_-1.jpg/500px-Zantedeschia_aethiopica_-1.jpg', + categories: ['flowering', 'high_humidity'], + }, + { + name: 'Koenigs-Protea', + botanicalName: 'Protea cynaroides', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Volles Sonnenlicht', temp: '10-25 °C' }, + description: 'Die Koenigs-Protea ist die Nationalblume Suedafrikas mit riesigen, imposanten Bluetenkoepfen. Eine echte Besonderheit.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/3/3d/Protea_cynaroides_3.jpg/500px-Protea_cynaroides_3.jpg', + categories: ['flowering', 'sun', 'large'], + }, + { + name: 'Heliconia', + botanicalName: 'Heliconia psittacorum', + confidence: 1.0, + careInfo: { waterIntervalDays: 5, light: 'Helles bis volles Licht', temp: '20-30 °C' }, + description: 'Die Heliconia hat leuchtend orangefarbe oder rote, bootsfoermige Hochblaetter. Eine exotische Tropenpflanze.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/6f/Parrot_heliconia_%28Heliconia_psittacorum%29.jpg/500px-Parrot_heliconia_%28Heliconia_psittacorum%29.jpg', + categories: ['flowering', 'high_humidity', 'bright_light'], + }, + { + name: 'Muschelingwer', + botanicalName: 'Alpinia zerumbet', + confidence: 1.0, + careInfo: { waterIntervalDays: 5, light: 'Helles bis volles Licht', temp: '20-30 °C' }, + description: 'Der Muschelingwer hat lange, elegante Blaetter und haengende Bluetenrispen mit weiss-rosa Bluetchen.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/1/1e/200410_Alpinia_zerumbet_1.JPG/500px-200410_Alpinia_zerumbet_1.JPG', + categories: ['flowering', 'high_humidity', 'large'], + }, + { + name: 'Kurkuma', + botanicalName: 'Curcuma longa', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Helles bis volles Licht', temp: '20-30 °C' }, + description: 'Kurkuma ist eine tropische Gewuerzpflanze mit breiten Blaettern und leuchtend gelber Wurzel. Wichtiges Heilgewuerz.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/a/ab/Turmeric_inflorescence.jpg/500px-Turmeric_inflorescence.jpg', + categories: ['medicinal', 'high_humidity'], + }, + { + name: 'Ingwer', + botanicalName: 'Zingiber officinale', + confidence: 1.0, + careInfo: { waterIntervalDays: 5, light: 'Helles indirektes Licht', temp: '20-30 °C' }, + description: 'Ingwer ist eine tropische Gewuerzpflanze mit aromatischen Knollen. Die Blaetter sind schilfartig.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/1/18/Koeh-146-no_text.jpg/500px-Koeh-146-no_text.jpg', + categories: ['medicinal', 'high_humidity'], + }, + { + name: 'Schamkraut', + botanicalName: 'Mimosa pudica', + confidence: 1.0, + careInfo: { waterIntervalDays: 5, light: 'Helles bis volles Licht', temp: '20-28 °C' }, + description: 'Das Schamkraut faltet seine Blaettchen blitzschnell zusammen, wenn man sie beruehrt. Ein faszinierendes Erlebnis.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/2/26/Mimosa_pudica_in_September_month.jpg/500px-Mimosa_pudica_in_September_month.jpg', + categories: ['flowering', 'bright_light'], + }, + { + name: 'Venusfliegenfalle', + botanicalName: 'Dionaea muscipula', + confidence: 1.0, + careInfo: { waterIntervalDays: 5, light: 'Volles Sonnenlicht', temp: '15-30 °C' }, + description: 'Die Venusfliegenfalle ist eine fleischfressende Pflanze mit klappfallartigen Blaettern. Faengt Insekten.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/3/37/Venus_Flytrap_showing_trigger_hairs.jpg/500px-Venus_Flytrap_showing_trigger_hairs.jpg', + categories: ['sun'], + }, + { + name: 'Purpursonnentau', + botanicalName: 'Sarracenia purpurea', + confidence: 1.0, + careInfo: { waterIntervalDays: 3, light: 'Volles Sonnenlicht', temp: '5-25 °C' }, + description: 'Der Purpursonnentau ist eine fleischfressende Kannenpflanze mit purpurroten Kannen. Faengt Insekten.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/7/7c/Sarracenia_purpurea_Flowers.JPG/500px-Sarracenia_purpurea_Flowers.JPG', + categories: ['sun', 'high_humidity'], + }, + { + name: 'Kannenpflanze', + botanicalName: 'Nepenthes alata', + confidence: 1.0, + careInfo: { waterIntervalDays: 5, light: 'Helles indirektes Licht', temp: '20-30 °C' }, + description: 'Die Kannenpflanze bildet grosse, gefuellte Kannen als Insekten­fallen. Eine faszinierende, tropische Pflanze.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/7/77/Nepenthes_alata_ASR_062007_mt_ambucao_luzon.jpg', + categories: ['high_humidity', 'hanging'], + }, + { + name: 'Sonnentau', + botanicalName: 'Drosera capensis', + confidence: 1.0, + careInfo: { waterIntervalDays: 5, light: 'Volles Sonnenlicht', temp: '15-25 °C' }, + description: 'Der Sonnentau faengt Insekten mit klebrigen Tropfen auf seinen Blaettern. Eine faszinierende fleischfressende Pflanze.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/0/0f/Drosera_capensis_bend.JPG/500px-Drosera_capensis_bend.JPG', + categories: ['sun', 'high_humidity'], + }, + { + name: 'Fettkraut', + botanicalName: 'Pinguicula grandiflora', + confidence: 1.0, + careInfo: { waterIntervalDays: 5, light: 'Helles indirektes Licht', temp: '10-20 °C' }, + description: 'Das Fettkraut faengt Insekten mit klebrigen Blaettern. Es bluet mit violetten, sporenartigen Blueten.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/b/b2/Pinguicula_grandiflora_001.jpg/500px-Pinguicula_grandiflora_001.jpg', + categories: ['flowering', 'high_humidity'], + }, + { + name: 'Wasserschlauch', + botanicalName: 'Utricularia gibba', + confidence: 1.0, + careInfo: { waterIntervalDays: 2, light: 'Helles bis volles Licht', temp: '15-25 °C' }, + description: 'Der Wasserschlauch ist eine wasserbewohnende fleischfressende Pflanze mit Schlaeuchen als Insekten­fallen.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/b/bd/Utricularia_gibba_flower_01.jpg/500px-Utricularia_gibba_flower_01.jpg', + categories: ['high_humidity', 'sun'], + }, + { + name: 'Heliamphora', + botanicalName: 'Heliamphora nutans', + confidence: 1.0, + careInfo: { waterIntervalDays: 5, light: 'Helles indirektes Licht', temp: '15-25 °C' }, + description: 'Heliamphora ist eine urtuemliche Kannenpflanze aus den Tafelbergen Venezuelas. Sehr dekorativ und selten.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/f/f9/Roraima_Heliamphora_nutans1.JPG/500px-Roraima_Heliamphora_nutans1.JPG', + categories: ['high_humidity'], + }, + { + name: 'Kaffeestrauch', + botanicalName: 'Coffea arabica', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '18-25 °C' }, + description: 'Der Kaffeestrauch hat glaenzende, dunkelgruene Blaetter und entwickelt rote Kaffe­ekirschen. Kann im Topf gehalten werden.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/c/c7/Coffee_Flowers.JPG/500px-Coffee_Flowers.JPG', + categories: ['easy'], + }, + { + name: 'Teestrauch', + botanicalName: 'Camellia sinensis', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '15-22 °C' }, + description: 'Der Teestrauch ist die Pflanze, aus deren Blaettern Tee gewonnen wird. Er hat weisse Blueten und glaenzende Blaetter.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/7/71/Csinensis.jpg/500px-Csinensis.jpg', + categories: ['flowering'], + }, + { + name: 'Zitronenbaum', + botanicalName: 'Citrus limon', + confidence: 1.0, + careInfo: { waterIntervalDays: 5, light: 'Volles Sonnenlicht', temp: '18-28 °C' }, + description: 'Der Zitronenbaum ist ein kleiner, immergruener Baum mit weissen, duftenden Blueten und gelben Fruechten.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/e/e4/P1030323.JPG/500px-P1030323.JPG', + categories: ['sun', 'tree'], + }, + { + name: 'Orangenbaum', + botanicalName: 'Citrus sinensis', + confidence: 1.0, + careInfo: { waterIntervalDays: 5, light: 'Volles Sonnenlicht', temp: '18-28 °C' }, + description: 'Der Orangenbaum ist ein kleiner, immergruener Baum mit weissen Blueten und orangen Fruechten.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/b/b0/OrangeBloss_wb.jpg/500px-OrangeBloss_wb.jpg', + categories: ['sun', 'tree'], + }, + { + name: 'Granatapfelbaum', + botanicalName: 'Punica granatum', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Volles Sonnenlicht', temp: '15-28 °C' }, + description: 'Der Granatapfelbaum hat leuchtend rote Blueten und rote, essbare Fruechte mit rubinroten Kernen.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/6a/Pomegranate_Juice_%282019%29.jpg/500px-Pomegranate_Juice_%282019%29.jpg', + categories: ['flowering', 'sun', 'tree'], + }, + { + name: 'Guave', + botanicalName: 'Psidium guajava', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Volles Sonnenlicht', temp: '18-30 °C' }, + description: 'Die Guave ist ein tropischer Obstbaum mit gelblich-weissen Fruechten. Sie ist reich an Vitamin C.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/3/3a/Psidium_guajava_fruit.jpg/500px-Psidium_guajava_fruit.jpg', + categories: ['sun', 'tree'], + }, + { + name: 'Papaya', + botanicalName: 'Carica papaya', + confidence: 1.0, + careInfo: { waterIntervalDays: 5, light: 'Volles Sonnenlicht', temp: '20-35 °C' }, + description: 'Die Papaya ist eine tropische Fruchtpflanze mit grossen, gelappten Blaettern und orangen Fruechten.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/8/84/Carica_papaya_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-029.jpg/500px-Carica_papaya_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-029.jpg', + categories: ['sun', 'large'], + }, + { + name: 'Tomate', + botanicalName: 'Solanum lycopersicum', + confidence: 1.0, + careInfo: { waterIntervalDays: 3, light: 'Volles Sonnenlicht', temp: '18-28 °C' }, + description: 'Die Tomate ist eine beliebte Gemuese- und Balkonpflanze mit roten, saftigen Fruechten. Im Topf kultivierbar.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/8/89/Tomato_je.jpg/500px-Tomato_je.jpg', + categories: ['easy'], + }, + { + name: 'Chili', + botanicalName: 'Capsicum annuum', + confidence: 1.0, + careInfo: { waterIntervalDays: 4, light: 'Volles Sonnenlicht', temp: '20-30 °C' }, + description: 'Chili ist eine beliebte Gemuese- und Zierpflanze mit leuchtenden, roten oder orangen Fruechten. Im Topf kultivierbar.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/d/d2/Capsicum_annuum_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-027.jpg/500px-Capsicum_annuum_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-027.jpg', + categories: ['easy', 'sun', 'medicinal'], + }, + { + name: 'Aubergine', + botanicalName: 'Solanum melongena', + confidence: 1.0, + careInfo: { waterIntervalDays: 5, light: 'Volles Sonnenlicht', temp: '20-30 °C' }, + description: 'Die Aubergine ist eine Gemuese­pflanze mit grossen, violetten Fruechten. Sie benoetigt viel Waerme und Sonne.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/7/76/Solanum_melongena_24_08_2012_%281%29.JPG/500px-Solanum_melongena_24_08_2012_%281%29.JPG', + categories: ['sun', 'bright_light'], + }, + { + name: 'Gurke', + botanicalName: 'Cucumis sativus', + confidence: 1.0, + careInfo: { waterIntervalDays: 3, light: 'Volles Sonnenlicht', temp: '18-28 °C' }, + description: 'Die Gurke ist eine rankende Gemuese­pflanze mit gruenen, erfrischenden Fruechten. Im Balkonkasten kultivierbar.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/9/96/ARS_cucumber.jpg/500px-ARS_cucumber.jpg', + categories: ['easy', 'sun'], + }, + { + name: 'Salat', + botanicalName: 'Lactuca sativa', + confidence: 1.0, + careInfo: { waterIntervalDays: 3, light: 'Helles bis volles Licht', temp: '10-22 °C' }, + description: 'Salat ist eine schnell wachsende Blattgemuese­pflanze. Im Topf und Balkonkasten sehr gut zu kultivieren.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/d/da/Iceberg_lettuce_in_SB.jpg/500px-Iceberg_lettuce_in_SB.jpg', + categories: ['easy'], + }, + { + name: 'Spinat', + botanicalName: 'Spinacia oleracea', + confidence: 1.0, + careInfo: { waterIntervalDays: 3, light: 'Helles bis volles Licht', temp: '10-20 °C' }, + description: 'Spinat ist ein naehrstoffreiches Blattgemuese mit dunkelgruenen Blaettern. Reich an Eisen und Vitaminen.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/3/37/Spinacia_oleracea_Spinazie_bloeiend.jpg/500px-Spinacia_oleracea_Spinazie_bloeiend.jpg', + categories: ['easy'], + }, + { + name: 'Mangold', + botanicalName: 'Beta vulgaris', + confidence: 1.0, + careInfo: { waterIntervalDays: 3, light: 'Helles bis volles Licht', temp: '10-25 °C' }, + description: 'Mangold ist ein farbenfrohes Blattgemuese mit bunten Stielen in Rot, Gelb, Orange und Weiss.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/f/ff/Beta_vulgaris_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-167.jpg', + categories: ['easy'], + }, + { + name: 'Radieschen', + botanicalName: 'Raphanus sativus', + confidence: 1.0, + careInfo: { waterIntervalDays: 2, light: 'Helles bis volles Licht', temp: '10-22 °C' }, + description: 'Das Radieschen ist ein schnellwachsendes Gemuese mit runden, roten Knollen. Es reift in nur 3-4 Wochen.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/0/0c/Radish_3371103037_4ab07db0bf_o.jpg/500px-Radish_3371103037_4ab07db0bf_o.jpg', + categories: ['easy'], + }, + { + name: 'Karotte', + botanicalName: 'Daucus carota', + confidence: 1.0, + careInfo: { waterIntervalDays: 5, light: 'Helles bis volles Licht', temp: '15-22 °C' }, + description: 'Die Karotte ist eine beliebte Gemuese­pflanze mit orangefarbenen Wurzeln. Im tiefen Topf kultivierbar.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/2/23/Daucus_carota_May_2008-1_edit.jpg/500px-Daucus_carota_May_2008-1_edit.jpg', + categories: ['easy'], + }, + { + name: 'Erdbeere', + botanicalName: 'Fragaria ananassa', + confidence: 1.0, + careInfo: { waterIntervalDays: 3, light: 'Helles bis volles Licht', temp: '15-25 °C' }, + description: 'Die Erdbeere ist ein beliebtes Obst fuer Balkon und Terrasse mit aromatischen, roten Fruechten.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/4/4c/Garden_strawberry_%28Fragaria_%C3%97_ananassa%29_single2.jpg/500px-Garden_strawberry_%28Fragaria_%C3%97_ananassa%29_single2.jpg', + categories: ['easy', 'pet_friendly', 'sun'], + }, + { + name: 'Kamille', + botanicalName: 'Chamomilla recutita', + confidence: 1.0, + careInfo: { waterIntervalDays: 5, light: 'Volles Sonnenlicht', temp: '15-25 °C' }, + description: 'Die Kamille ist ein beliebtes Heilkraut mit kleinen, weiss-gelben Blueten. Das aetherische Oel wirkt beruhigend.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/c/c8/Matricaria_February_2008-1.jpg/500px-Matricaria_February_2008-1.jpg', + categories: ['easy', 'medicinal', 'sun'], + }, + { + name: 'Zitronenmelisse', + botanicalName: 'Melissa officinalis', + confidence: 1.0, + careInfo: { waterIntervalDays: 5, light: 'Helles bis volles Licht', temp: '15-25 °C' }, + description: 'Die Zitronenmelisse ist ein zitronig duftendes Heilkraut. Sie beruhigt die Nerven und foerdert den Schlaf.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/7/70/Lemon_balm_plant.jpg/500px-Lemon_balm_plant.jpg', + categories: ['easy', 'medicinal'], + }, + { + name: 'Salbei', + botanicalName: 'Salvia officinalis', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Volles Sonnenlicht', temp: '10-25 °C' }, + description: 'Salbei ist ein aromatisches Heilkraut mit silbrig-gruenen Blaettern. Er hat antibakterielle und entzuendungshem­mende Wirkung.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/5/5a/Salvia_officinalis0.jpg/500px-Salvia_officinalis0.jpg', + categories: ['easy', 'medicinal', 'sun'], + }, + { + name: 'Baldrian', + botanicalName: 'Valeriana officinalis', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Helles bis volles Licht', temp: '15-25 °C' }, + description: 'Baldrian ist ein bekanntes Heilkraut mit weissen bis roeslichen Blueten. Die Wurzeln werden zur Schlaffoerderung verwendet.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/a/af/Valeriana_officinalis_inflorescence_-_Niitv%C3%A4lja.jpg/500px-Valeriana_officinalis_inflorescence_-_Niitv%C3%A4lja.jpg', + categories: ['medicinal', 'flowering'], + }, + { + name: 'Johanniskraut', + botanicalName: 'Hypericum perforatum', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Volles Sonnenlicht', temp: '10-25 °C' }, + description: 'Das Johanniskraut hat leuchtend gelbe Blueten und ist ein wichtiges Heilkraut gegen Depressionen und Stimmungstiefs.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/c/cf/%28MHNT%29_Hypericum_perforatum_flower_and_buttons.jpg/500px-%28MHNT%29_Hypericum_perforatum_flower_and_buttons.jpg', + categories: ['medicinal', 'flowering', 'sun'], + }, + { + name: 'Sonnenhut', + botanicalName: 'Echinacea purpurea', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Helles bis volles Licht', temp: '15-25 °C' }, + description: 'Der Sonnenhut ist eine beliebte Heilpflanze mit grossen, pinkfarbenen Blueten. Er staerkt das Immunsystem.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/8/8e/Echinacea_purpurea_Grandview_Prairie.jpg/500px-Echinacea_purpurea_Grandview_Prairie.jpg', + categories: ['medicinal', 'flowering', 'sun'], + }, + { + name: 'Arnika', + botanicalName: 'Arnica montana', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Volles Sonnenlicht', temp: '10-20 °C' }, + description: 'Arnika ist eine bekannte Heilpflanze aus den Alpen mit goldgelben Korbbluten. Sie wird fuer Muskeln und Gelenke verwendet.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/1/17/Arnica_montana_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-015.jpg/500px-Arnica_montana_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-015.jpg', + categories: ['medicinal', 'flowering', 'sun'], + }, + { + name: 'Schafgarbe', + botanicalName: 'Achillea millefolium', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Volles Sonnenlicht', temp: '10-25 °C' }, + description: 'Die Schafgarbe hat weisse oder rosafarbene Bluetenschirme und fein gefiederte Blaetter. Wichtige Heilpflanze.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/1/1a/Achillea_millefolium_%28bright%29.jpg/500px-Achillea_millefolium_%28bright%29.jpg', + categories: ['medicinal', 'flowering', 'sun'], + }, + { + name: 'Roter Fingerhut', + botanicalName: 'Digitalis purpurea', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Helles bis volles Licht', temp: '10-20 °C' }, + description: 'Der Rote Fingerhut hat hohe Bluetenstaende mit roehrenfoermigen, gepunkteten Blueten in Rosa. Wichtige Arzneipflanze.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/b/ba/Digitalis_purpurea_LC0101.jpg/500px-Digitalis_purpurea_LC0101.jpg', + categories: ['medicinal', 'flowering'], + }, + { + name: 'Wermut', + botanicalName: 'Artemisia absinthium', + confidence: 1.0, + careInfo: { waterIntervalDays: 14, light: 'Volles Sonnenlicht', temp: '10-25 °C' }, + description: 'Wermut ist ein stark aromatisches Heilkraut mit silbrig-gruenen, tief eingeschnittenen Blaettern. Fuer Kraeuterlikoere.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/e/eb/Artemisia_absinthium_P1210748.jpg/500px-Artemisia_absinthium_P1210748.jpg', + categories: ['medicinal', 'sun'], + }, + { + name: 'Grosse Brennessel', + botanicalName: 'Urtica dioica', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Helles bis volles Licht', temp: '10-25 °C' }, + description: 'Die Grosse Brennessel ist eine Heilpflanze mit brennenden Haaren. Die Blaetter sind reich an Vitaminen und Mineralien.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/6f/Fen_nettle_%28Urtica_dioica_ssp._galeopsifolia%29_-_geograph.org.uk_-_5423125.jpg/500px-Fen_nettle_%28Urtica_dioica_ssp._galeopsifolia%29_-_geograph.org.uk_-_5423125.jpg', + categories: ['medicinal'], + }, + { + name: 'Schwarzer Holunder', + botanicalName: 'Sambucus nigra', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Helles bis volles Licht', temp: '10-25 °C' }, + description: 'Der Schwarze Holunder hat weisse Doldenbluten und schwarze Beeren. Die Fruechte werden fuer Sirup und Saft verwendet.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/61/Sambucus_nigra_004.jpg/500px-Sambucus_nigra_004.jpg', + categories: ['medicinal', 'tree', 'flowering'], + }, + { + name: 'Silber-Weide', + botanicalName: 'Salix alba', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Helles bis volles Licht', temp: '10-25 °C' }, + description: 'Die Silber-Weide hat silbrig-glaenzende Blaetter. Weidenrinde enthält Salicylsaeure, die Grundlage von Aspirin.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/f/f8/Salix_alba_leaves.jpg/500px-Salix_alba_leaves.jpg', + categories: ['medicinal', 'tree', 'large'], + }, + { + name: 'Hange-Birke', + botanicalName: 'Betula pendula', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Volles Sonnenlicht', temp: '10-25 °C' }, + description: 'Die Haenge-Birke hat charakteristisch weisse Rinde und haengende Zweige. Die Blaetter werden in der Heilkunde genutzt.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/8/8a/Betula_pendula_Finland.jpg/500px-Betula_pendula_Finland.jpg', + categories: ['medicinal', 'tree', 'large'], + }, + { + name: 'Faecherahorn', + botanicalName: 'Acer palmatum', + confidence: 1.0, + careInfo: { waterIntervalDays: 5, light: 'Helles bis volles Licht', temp: '10-22 °C' }, + description: 'Der Faecherahorn ist ein japanischer Zierahorn mit feingeschnittenen, faecherfoermigen Blaettern in Gruen oder Rot.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/d/d6/Acer_palmatum0.jpg/500px-Acer_palmatum0.jpg', + categories: ['tree'], + }, + { + name: 'Bonsai-Feige', + botanicalName: 'Ficus retusa', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Helles indirektes Licht', temp: '16-24 °C' }, + description: 'Die Bonsai-Feige ist eine klassische Bonsai-Art mit kleinen, elliptischen Blaettern. Sehr formbar.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/c/cf/Ficus_retusa_herbarium_sheet.jpg/500px-Ficus_retusa_herbarium_sheet.jpg', + categories: ['tree'], + }, + { + name: 'Socotra-Wuestenrose', + botanicalName: 'Adenium socotranum', + confidence: 1.0, + careInfo: { waterIntervalDays: 14, light: 'Volles Sonnenlicht', temp: '20-35 °C' }, + description: 'Die Socotra-Wuestenrose ist eine seltene, endemische Art mit einem sehr dicken, knolligen Stamm und rosa Blueten.', + imageUri: 'wikimedia-search:Adenium socotranum', + categories: ['succulent', 'flowering', 'sun'], + }, + { + name: 'Tempel-Baum', + botanicalName: 'Plumeria rubra', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Volles Sonnenlicht', temp: '20-30 °C' }, + description: 'Der Tempel-Baum hat intensiv duftende, sternfoermige Blueten in Weiss, Gelb oder Rosa. Klassische Tropenblume.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/a/aa/Champa_tree_with_pink_flowers_in_Islamabad%2C_Pakistan.jpg/500px-Champa_tree_with_pink_flowers_in_Islamabad%2C_Pakistan.jpg', + categories: ['flowering', 'sun', 'tree'], + }, + { + name: 'Zaubernuss', + botanicalName: 'Hamamelis mollis', + confidence: 1.0, + careInfo: { waterIntervalDays: 10, light: 'Helles bis volles Licht', temp: '10-20 °C' }, + description: 'Die Zaubernuss bluet im Winter mit fadendunnen, gelben Bluetenkranzeln, die bis -10 Grad standhalten.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/c/ce/Hamamelis_mollis0.jpg/500px-Hamamelis_mollis0.jpg', + categories: ['flowering', 'medicinal'], + }, + { + name: 'Oleander', + botanicalName: 'Nerium oleander', + confidence: 1.0, + careInfo: { waterIntervalDays: 7, light: 'Volles Sonnenlicht', temp: '15-28 °C' }, + description: 'Der Oleander ist ein mediteraner Strauch mit leuchtend roten, rosa oder weissen Blueten. Sehr hitzetolerant.', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/c/cc/Nerium_oleander_flowers_leaves.jpg/500px-Nerium_oleander_flowers_leaves.jpg', + categories: ['flowering', 'sun', 'bright_light'], + }, + // User import: Kraeuter + createHerbEntry('Lorbeer', 'Laurus nobilis'), + createHerbEntry('Estragon', 'Artemisia dracunculus'), + createHerbEntry('Bohnenkraut', 'Satureja hortensis'), + createHerbEntry('Majoran', 'Origanum majorana'), + createHerbEntry('Kerbel', 'Anthriscus cerefolium'), + createHerbEntry('Liebstoeckel', 'Levisticum officinale'), + createHerbEntry('Zitronengras', 'Cymbopogon citratus'), + createHerbEntry('Zitronenverbene', 'Aloysia citrodora'), + createHerbEntry('Borretsch', 'Borago officinalis'), + createHerbEntry('Sauerampfer', 'Rumex acetosa'), + createHerbEntry('Stevia', 'Stevia rebaudiana'), + createHerbEntry('Katzenminze', 'Nepeta cataria'), + createHerbEntry('Currykraut', 'Helichrysum italicum'), + createHerbEntry('Shiso', 'Perilla frutescens'), + createHerbEntry('Schnittknoblauch', 'Allium tuberosum'), + createHerbEntry('Ysop', 'Hyssopus officinalis'), + createHerbEntry('Wasabi', 'Eutrema japonicum', { + careInfo: { waterIntervalDays: 4, light: 'Helles indirektes Licht', temp: '8-20 C' }, + categories: ['bright_light', 'high_humidity'], + description: 'Wasabi ist ein seltenes Wuerzkraut, das gleichmaessige Feuchte und eher kuehle Bedingungen bevorzugt.', + }), + createHerbPinnedEntry('Roemische Kamille', 'Chamaemelum nobile', 'https://upload.wikimedia.org/wikipedia/commons/f/f2/Chamaemelum_nobile_kz02.jpg', { + categories: ['easy', 'sun', 'medicinal'], + }), + createHerbEntry('Koriander', 'Coriandrum sativum'), + createHerbEntry('Dill', 'Anethum graveolens'), + + // User import: Blumen + createFlowerEntry('Sonnenblume', 'Helianthus annuus'), + createFlowerEntry('Rose', 'Rosa x hybrida', { + categories: ['flowering', 'sun', 'bright_light'], + }), + createFlowerEntry('Pfingstrose', 'Paeonia lactiflora'), + createFlowerEntry('Bart-Iris', 'Iris germanica'), + createFlowerEntry('Gaensebluemchen', 'Bellis perennis'), + createFlowerEntry('Nelke', 'Dianthus caryophyllus'), + createFlowerEntry('Loewenmaeulchen', 'Antirrhinum majus'), + createFlowerEntry('Hortensie', 'Hydrangea macrophylla', { + categories: ['flowering', 'bright_light'], + careInfo: { waterIntervalDays: 4, light: 'Helles bis halbschattiges Licht', temp: '8-24 C' }, + }), + createFlowerEntry('Flieder', 'Syringa vulgaris', { + categories: ['flowering', 'tree', 'sun'], + }), + createFlowerEntry('Kosmee', 'Cosmos bipinnatus'), + createFlowerEntry('Kapuzinerkresse', 'Tropaeolum majus'), + createFlowerEntry('Buntnessel', 'Plectranthus scutellarioides', { + categories: ['patterned', 'bright_light'], + description: 'Buntnessel ist eine farbstarke Zierpflanze, die vor allem fuer ihr dekoratives Laub beliebt ist.', + }), + createFlowerEntry('Rittersporn', 'Delphinium elatum'), + createFlowerEntry('Lupine', 'Lupinus polyphyllus'), + createFlowerEntry('Stockrose', 'Alcea rosea'), + createFlowerEntry('Prunkwinde', 'Ipomoea purpurea'), + createFlowerEntry('Clematis', 'Clematis viticella', { + categories: ['flowering', 'bright_light'], + }), + createFlowerEntry('Duftwicke', 'Lathyrus odoratus'), + createFlowerEntry('Hasengloeckchen', 'Hyacinthoides non-scripta'), + createFlowerEntry('Maigloeckchen', 'Convallaria majalis', { + categories: ['flowering', 'medicinal'], + }), + createFlowerEntry('Gladiole', 'Gladiolus hortulanus'), + createFlowerEntry('Ranunkel', 'Ranunculus asiaticus'), + createFlowerEntry('Anemone', 'Anemone coronaria'), + createFlowerEntry('Eisenkraut', 'Verbena bonariensis'), + createFlowerEntry('Flammenblume', 'Phlox paniculata'), + createFlowerEntry('Herbstaster', 'Symphyotrichum novi-belgii'), + createFlowerEntry('Rudbeckie', 'Rudbeckia hirta'), + createFlowerEntry('Feuersalbei', 'Salvia splendens'), + createFlowerEntry('Freesie', 'Freesia refracta'), + createFlowerEntry('Rhododendron', 'Rhododendron catawbiense', { + categories: ['flowering', 'tree', 'bright_light'], + }), + createFlowerEntry('Geissblatt', 'Lonicera japonica', { + categories: ['flowering', 'bright_light'], + }), + createFlowerEntry('Arabischer Jasmin', 'Jasminum sambac', { + categories: ['flowering', 'bright_light'], + }), + createFlowerEntry('Margerite', 'Leucanthemum vulgare'), + createFlowerEntry('Stehende Geranie', 'Pelargonium zonale'), + createFlowerEntry('Eisbegonie', 'Begonia semperflorens-cultorum', { + categories: ['flowering', 'bright_light'], + }), + createFlowerEntry('Gartenbalsamine', 'Impatiens balsamina', { + categories: ['flowering', 'bright_light'], + }), + createFlowerEntry('Vergissmeinnicht', 'Myosotis sylvatica'), + createFlowerEntry('Seidenpflanze', 'Asclepias tuberosa'), + createFlowerEntry('Indianernessel', 'Monarda didyma'), + createFlowerEntry('Bechermalve', 'Lavatera trimestris'), + createFlowerEntry('Maedchenauge', 'Coreopsis tinctoria'), + createFlowerEntry('Taglilie', 'Hemerocallis fulva'), + createFlowerEntry('Lenzrose', 'Helleborus orientalis', { + categories: ['flowering'], + }), + createFlowerEntry('Trompetenwinde', 'Campsis radicans', { + categories: ['flowering', 'bright_light'], + }), + createFlowerEntry('Mohn', 'Papaver rhoeas'), + createFlowerEntry('Kalifornischer Mohn', 'Eschscholzia californica'), + createFlowerEntry('Ringelblume', 'Calendula officinalis', { + categories: ['flowering', 'sun', 'medicinal'], + }), + createFlowerEntry('Kornblume', 'Centaurea cyanus'), + createFlowerEntry('Bartnelke', 'Dianthus barbatus'), + createFlowerEntry('Mittagsgold', 'Gazania rigens'), + createFlowerEntry('Heliotrop', 'Heliotropium arborescens'), + createFlowerEntry('Koenigskerze', 'Verbascum thapsus', { + categories: ['flowering', 'sun', 'medicinal'], + }), + createFlowerEntry('Ziertabak', 'Nicotiana alata'), + createFlowerEntry('Fuchsschwanz', 'Amaranthus caudatus'), + createFlowerEntry('Mehlsalbei', 'Salvia farinacea'), + createFlowerEntry('Kokardenblume', 'Gaillardia aristata'), + createFlowerEntry('Traenendes Herz', 'Lamprocapnos spectabilis', { + categories: ['flowering', 'bright_light'], + }), + createFlowerEntry('Hornveilchen', 'Viola cornuta'), + createFlowerEntry('Nemesie', 'Nemesia strumosa'), + createFlowerEntry('Kapmargerite', 'Osteospermum ecklonis'), + createFlowerEntry('Shasta-Margerite', 'Leucanthemum x superbum'), + + // User import: Baeume und Straeucher + createTreeEntry('Buchsbaum', 'Buxus sempervirens', { + categories: ['tree', 'sun'], + }), + createTreeEntry('Stechpalme', 'Ilex aquifolium', { + categories: ['tree', 'sun'], + }), + createTreeEntry('Magnolie', 'Magnolia grandiflora', { + categories: ['flowering', 'tree', 'large'], + }), + createTreeEntry('Eiche', 'Quercus robur'), + createTreeEntry('Kiefer', 'Pinus sylvestris'), + createTreeEntry('Fichte', 'Picea abies'), + createTreeEntry('Zeder', 'Cedrus libani'), + createTreeEntry('Zypresse', 'Cupressus sempervirens'), + createTreeEntry('Eukalyptus', 'Eucalyptus globulus', { + categories: ['tree', 'sun', 'medicinal'], + }), + createTreeEntry('Jacaranda', 'Jacaranda mimosifolia', { + categories: ['flowering', 'tree', 'large'], + }), + createTreeEntry('Spitzahorn', 'Acer platanoides'), + createTreeEntry('Eberesche', 'Sorbus aucuparia'), + createTreeEntry('Robinie', 'Robinia pseudoacacia'), + createTreeEntry('Flammenbaum', 'Delonix regia', { + categories: ['flowering', 'tree', 'large'], + }), + createTreeEntry('Ginkgo', 'Ginkgo biloba', { + categories: ['tree', 'sun', 'medicinal'], + }), + createTreeEntry('Trompetenbaum', 'Catalpa bignonioides'), + createTreeEntry('Kirschlorbeer', 'Prunus laurocerasus', { + categories: ['tree', 'sun'], + }), + createTreeEntry('Forsythie', 'Forsythia x intermedia', { + categories: ['flowering', 'tree', 'sun'], + }), + createTreeEntry('Gartenhibiskus', 'Hibiscus syriacus', { + categories: ['flowering', 'tree', 'sun'], + }), + createTreeEntry('Weigelie', 'Weigela florida', { + categories: ['flowering', 'tree', 'sun'], + }), + createTreeEntry('Spierstrauch', 'Spiraea japonica', { + categories: ['flowering', 'tree', 'sun'], + }), + createTreeEntry('Schmetterlingsflieder', 'Buddleja davidii', { + categories: ['flowering', 'tree', 'sun'], + }), + + // User import: Zimmerpflanzen + createHouseplantSearchEntry('Kroton', 'Codiaeum variegatum', 'Garden croton', { + categories: ['patterned', 'bright_light'], + }), + createHouseplantEntry('Alocasia zebrina', 'Alocasia zebrina', { + careInfo: BULK_HUMID_HOUSEPLANT_CARE, + categories: ['bright_light', 'high_humidity'], + }), + createHouseplantEntry('Nervenpflanze', 'Fittonia albivenis', { + careInfo: BULK_HUMID_HOUSEPLANT_CARE, + categories: ['patterned', 'high_humidity'], + }), + createHouseplantEntry('Punktblatt', 'Hypoestes phyllostachya', { + categories: ['patterned', 'bright_light'], + }), + createHouseplantEntry('Aluminium-Pflanze', 'Pilea cadierei', { + categories: ['patterned', 'easy', 'pet_friendly'], + }), + createHouseplantEntry('Wassermelonen-Peperomie', 'Peperomia argyreia', { + categories: ['patterned', 'pet_friendly'], + }), + createHouseplantEntry('Raindrop-Peperomie', 'Peperomia polybotrya', { + categories: ['easy', 'pet_friendly'], + }), + createHouseplantEntry('Glueckskastanie', 'Pachira aquatica', { + categories: ['tree', 'bright_light', 'easy'], + }), + createHouseplantEntry('Norfolk-Tanne', 'Araucaria heterophylla', { + categories: ['tree', 'bright_light'], + }), + createHouseplantEntry('Samt-Anthurie', 'Anthurium clarinervium', { + careInfo: BULK_HUMID_HOUSEPLANT_CARE, + categories: ['patterned', 'high_humidity'], + }), + createHouseplantEntry('Kristall-Anthurie', 'Anthurium crystallinum', { + careInfo: BULK_HUMID_HOUSEPLANT_CARE, + categories: ['patterned', 'high_humidity'], + }), + createHouseplantEntry('Falsche Aralie', 'Schefflera elegantissima', { + categories: ['tree', 'bright_light'], + }), + createHouseplantEntry('String of Bananas', 'Curio radicans', { + careInfo: BULK_SUCCULENT_HANGING_CARE, + categories: ['hanging', 'succulent', 'sun'], + }), + createHouseplantPinnedEntry('String of Dolphins', 'Curio x peregrinus', 'https://upload.wikimedia.org/wikipedia/commons/0/00/Dolphinplant.jpg', { + careInfo: BULK_SUCCULENT_HANGING_CARE, + categories: ['hanging', 'succulent', 'sun'], + }), + createHouseplantEntry('Bubikopf', 'Soleirolia soleirolii', { + careInfo: { waterIntervalDays: 4, light: 'Helles indirektes Licht', temp: '15-24 C' }, + categories: ['pet_friendly', 'high_humidity'], + }), + createHouseplantEntry('Palmfarn', 'Cycas revoluta', { + careInfo: { waterIntervalDays: 10, light: 'Helles bis volles Licht', temp: '18-30 C' }, + categories: ['tree', 'sun', 'large'], + }), + createHouseplantEntry('Calathea lancifolia', 'Goeppertia insignis', { + careInfo: BULK_HUMID_HOUSEPLANT_CARE, + categories: ['patterned', 'high_humidity', 'pet_friendly'], + }), + createHouseplantEntry('Calathea ornata', 'Goeppertia ornata', { + careInfo: BULK_HUMID_HOUSEPLANT_CARE, + categories: ['patterned', 'high_humidity', 'pet_friendly'], + }), + createHouseplantPinnedEntry('Philodendron Brasil', 'Philodendron hederaceum Brasil', 'https://upload.wikimedia.org/wikipedia/commons/0/0b/Philodendron_hederaceum_hederaceum_Brasil_0zz.jpg', { + categories: ['easy', 'hanging', 'low_light'], + }), + createHouseplantPinnedEntry('Philodendron Pink Princess', 'Philodendron erubescens Pink Princess', 'https://upload.wikimedia.org/wikipedia/commons/8/89/Philodendron_Pink_Princess.jpg', { + categories: ['bright_light', 'patterned'], + }), + createHouseplantEntry('Philodendron Xanadu', 'Thaumatophyllum xanadu', { + categories: ['bright_light'], + }), + createHouseplantPinnedEntry('Kaffeepflanze arabica nana', 'Coffea arabica Nana', 'https://upload.wikimedia.org/wikipedia/commons/thumb/1/13/Starr-121108-1098-Coffea_arabica-Philippine_dwarf_habit_with_Forest_and_Angela-Pali_o_Waipio-Maui_%2825102146741%29.jpg/1280px-Starr-121108-1098-Coffea_arabica-Philippine_dwarf_habit_with_Forest_and_Angela-Pali_o_Waipio-Maui_%2825102146741%29.jpg', { + categories: ['bright_light'], + }), + createHouseplantEntry('Yucca aloifolia', 'Yucca aloifolia', { + careInfo: { waterIntervalDays: 10, light: 'Volles Sonnenlicht', temp: '18-30 C' }, + categories: ['tree', 'sun', 'easy'], + }), + createHouseplantEntry('Ficus microcarpa', 'Ficus microcarpa', { + categories: ['tree', 'bright_light', 'easy'], + }), + createHouseplantEntry('Ficus altissima', 'Ficus altissima', { + categories: ['tree', 'bright_light'], + }), +]; diff --git a/constants/searchIntentConfig.js b/constants/searchIntentConfig.js index 7c36f60..90df06a 100644 --- a/constants/searchIntentConfig.js +++ b/constants/searchIntentConfig.js @@ -1,402 +1,402 @@ -const SEARCH_INTENT_CONFIG = { - intents: { - easy: { - aliases: [ - 'easy', - 'easy care', - 'easy plant', - 'easy plants', - 'easy to care', - 'beginner', - 'beginner plant', - 'beginner plants', - 'low maintenance', - 'hard to kill', - 'starter plant', - 'starter plants', - 'pflegearm', - 'pflegeleicht', - 'anfanger', - 'anfangerpflanze', - 'anfangerpflanzen', - 'einfach', - 'unkompliziert', - 'facil cuidado', - 'facil', - 'principiante', - 'planta facil', - 'planta resistente', - ], - entryHints: [ - 'easy', - 'pflegeleicht', - 'robust', - 'resilient', - 'hardy', - 'low maintenance', - 'beginner', - 'facil', - 'resistente', - 'uncomplicated', - ], - }, - low_light: { - aliases: [ - 'low light', - 'dark corner', - 'dark room', - 'office plant', - 'office', - 'windowless room', - 'shade', - 'shady', - 'indirect light', - 'little light', - 'wenig licht', - 'dunkle ecke', - 'buero', - 'buro', - 'dunkel', - 'schatten', - 'halbschatten', - 'poca luz', - 'oficina', - 'rincon oscuro', - 'sombra', - ], - lightHints: [ - 'low light', - 'low to full light', - 'shade', - 'partial shade', - 'indirect', - 'indirect bright', - 'bright indirect', - 'wenig licht', - 'schatten', - 'halbschatten', - 'indirekt', - 'poca luz', - 'sombra', - 'luz indirecta', - ], - }, - pet_friendly: { - aliases: [ - 'pet friendly', - 'pet-safe', - 'pet safe', - 'safe for cats', - 'safe for dogs', - 'cat safe', - 'dog safe', - 'non toxic', - 'non-toxic', - 'haustierfreundlich', - 'tierfreundlich', - 'katzensicher', - 'hundefreundlich', - 'mascota', - 'pet friendly plant', - 'segura para gatos', - 'segura para perros', - 'no toxica', - 'no tóxica', - ], - entryHints: [ - 'pet friendly', - 'safe for pets', - 'safe for cats', - 'safe for dogs', - 'tierfreundlich', - 'haustierfreundlich', - 'mascota', - ], - }, - air_purifier: { - aliases: [ - 'air purifier', - 'air purifying', - 'clean air', - 'cleaner air', - 'air cleaning', - 'air freshening', - 'luftreiniger', - 'luftreinigend', - 'reinigt luft', - 'purificador', - 'aire limpio', - 'purifica aire', - ], - entryHints: [ - 'air purifier', - 'air purifying', - 'clean air', - 'luftreiniger', - 'purificador', - ], - }, - flowering: { - aliases: [ - 'flowering', - 'flowers', - 'blooms', - 'in bloom', - 'bluhend', - 'bluht', - 'blumen', - 'con flores', - 'floracion', - ], - entryHints: [ - 'flowering', - 'blooms', - 'flower', - 'bluh', - 'flor', - ], - }, - succulent: { - aliases: [ - 'succulent', - 'succulents', - 'cactus', - 'cactus-like', - 'drought tolerant', - 'sukkulente', - 'sukkulenten', - 'trockenheitsvertraglich', - 'trockenheitsvertraeglich', - 'suculenta', - 'suculentas', - ], - entryHints: [ - 'succulent', - 'cactus', - 'drought tolerant', - 'sukkulent', - 'suculenta', - ], - }, - bright_light: { - aliases: [ - 'bright light', - 'bright room', - 'bright spot', - 'east window', - 'west window', - 'sunny room', - 'helles licht', - 'hell', - 'lichtreich', - 'fensterplatz', - 'mucha luz', - 'luz brillante', - ], - lightHints: [ - 'bright light', - 'bright indirect', - 'bright', - 'helles licht', - 'helles indirektes licht', - 'luz brillante', - ], - }, - sun: { - aliases: [ - 'full sun', - 'sun', - 'sunny window', - 'direct sun', - 'south window', - 'south facing window', - 'volle sonne', - 'sonnig', - 'direkte sonne', - 'fenster sud', - 'fenster sued', - 'fenster süd', - 'ventana soleada', - 'sol directo', - ], - lightHints: [ - 'full sun', - 'sunny', - 'direct sun', - 'volles sonnenlicht', - 'sonnig', - 'sol directo', - ], - }, - high_humidity: { - aliases: [ - 'high humidity', - 'humid', - 'bathroom plant', - 'bathroom', - 'shower room', - 'humid room', - 'tropical humidity', - 'hohe luftfeuchtigkeit', - 'feucht', - 'badezimmer', - 'dusche', - 'luftfeucht', - 'humedad alta', - 'bano', - 'baño', - ], - entryHints: [ - 'high humidity', - 'humidity', - 'humid', - 'hohe luftfeuchtigkeit', - 'luftfeuchtigkeit', - 'humedad alta', - ], - }, - hanging: { - aliases: [ - 'hanging', - 'trailing', - 'hanging basket', - 'shelf plant', - 'vine plant', - 'cascading', - 'hangend', - 'ampel', - 'rankend', - 'colgante', - 'planta colgante', - ], - entryHints: [ - 'hanging', - 'trailing', - 'vine', - 'hang', - 'colgante', - ], - }, - patterned: { - aliases: [ - 'patterned', - 'patterned leaves', - 'striped', - 'variegated', - 'spotted', - 'decorative leaves', - 'fancy leaves', - 'gemustert', - 'muster', - 'gestreift', - 'bunt', - 'variegada', - 'rayada', - ], - entryHints: [ - 'patterned', - 'striped', - 'variegated', - 'spotted', - 'gemustert', - 'gestreift', - ], - }, - tree: { - aliases: [ - 'tree', - 'indoor tree', - 'small tree', - 'floor tree', - 'zimmerbaum', - 'baum', - 'arbol', - 'árbol', - ], - entryHints: [ - 'tree', - 'baum', - 'arbol', - ], - }, - large: { - aliases: [ - 'large', - 'big plant', - 'tall plant', - 'statement plant', - 'floor plant', - 'oversized plant', - 'gross', - 'groß', - 'grosse pflanze', - 'hohe pflanze', - 'planta grande', - 'planta alta', - ], - entryHints: [ - 'large', - 'big', - 'tall', - 'gross', - 'groß', - 'grande', - ], - }, - medicinal: { - aliases: [ - 'medicinal', - 'healing plant', - 'herb', - 'kitchen herb', - 'tea herb', - 'apothecary plant', - 'heilpflanze', - 'heilkraut', - 'kraut', - 'medicinal plant', - 'medicinal herb', - 'medicinales', - 'hierba', - 'hierba medicinal', - ], - entryHints: [ - 'medicinal', - 'herb', - 'heil', - 'kraut', - 'hierba', - ], - }, - }, - noiseTokens: [ - 'plant', - 'plants', - 'pflanze', - 'pflanzen', - 'planta', - 'plantas', - 'for', - 'fur', - 'fuer', - 'para', - 'mit', - 'with', - 'and', - 'und', - 'y', - 'the', - 'der', - 'die', - 'das', - 'el', - 'la', - 'de', - 'a', - 'an', - ], -}; - -module.exports = { - SEARCH_INTENT_CONFIG, -}; +const SEARCH_INTENT_CONFIG = { + intents: { + easy: { + aliases: [ + 'easy', + 'easy care', + 'easy plant', + 'easy plants', + 'easy to care', + 'beginner', + 'beginner plant', + 'beginner plants', + 'low maintenance', + 'hard to kill', + 'starter plant', + 'starter plants', + 'pflegearm', + 'pflegeleicht', + 'anfanger', + 'anfangerpflanze', + 'anfangerpflanzen', + 'einfach', + 'unkompliziert', + 'facil cuidado', + 'facil', + 'principiante', + 'planta facil', + 'planta resistente', + ], + entryHints: [ + 'easy', + 'pflegeleicht', + 'robust', + 'resilient', + 'hardy', + 'low maintenance', + 'beginner', + 'facil', + 'resistente', + 'uncomplicated', + ], + }, + low_light: { + aliases: [ + 'low light', + 'dark corner', + 'dark room', + 'office plant', + 'office', + 'windowless room', + 'shade', + 'shady', + 'indirect light', + 'little light', + 'wenig licht', + 'dunkle ecke', + 'buero', + 'buro', + 'dunkel', + 'schatten', + 'halbschatten', + 'poca luz', + 'oficina', + 'rincon oscuro', + 'sombra', + ], + lightHints: [ + 'low light', + 'low to full light', + 'shade', + 'partial shade', + 'indirect', + 'indirect bright', + 'bright indirect', + 'wenig licht', + 'schatten', + 'halbschatten', + 'indirekt', + 'poca luz', + 'sombra', + 'luz indirecta', + ], + }, + pet_friendly: { + aliases: [ + 'pet friendly', + 'pet-safe', + 'pet safe', + 'safe for cats', + 'safe for dogs', + 'cat safe', + 'dog safe', + 'non toxic', + 'non-toxic', + 'haustierfreundlich', + 'tierfreundlich', + 'katzensicher', + 'hundefreundlich', + 'mascota', + 'pet friendly plant', + 'segura para gatos', + 'segura para perros', + 'no toxica', + 'no tóxica', + ], + entryHints: [ + 'pet friendly', + 'safe for pets', + 'safe for cats', + 'safe for dogs', + 'tierfreundlich', + 'haustierfreundlich', + 'mascota', + ], + }, + air_purifier: { + aliases: [ + 'air purifier', + 'air purifying', + 'clean air', + 'cleaner air', + 'air cleaning', + 'air freshening', + 'luftreiniger', + 'luftreinigend', + 'reinigt luft', + 'purificador', + 'aire limpio', + 'purifica aire', + ], + entryHints: [ + 'air purifier', + 'air purifying', + 'clean air', + 'luftreiniger', + 'purificador', + ], + }, + flowering: { + aliases: [ + 'flowering', + 'flowers', + 'blooms', + 'in bloom', + 'bluhend', + 'bluht', + 'blumen', + 'con flores', + 'floracion', + ], + entryHints: [ + 'flowering', + 'blooms', + 'flower', + 'bluh', + 'flor', + ], + }, + succulent: { + aliases: [ + 'succulent', + 'succulents', + 'cactus', + 'cactus-like', + 'drought tolerant', + 'sukkulente', + 'sukkulenten', + 'trockenheitsvertraglich', + 'trockenheitsvertraeglich', + 'suculenta', + 'suculentas', + ], + entryHints: [ + 'succulent', + 'cactus', + 'drought tolerant', + 'sukkulent', + 'suculenta', + ], + }, + bright_light: { + aliases: [ + 'bright light', + 'bright room', + 'bright spot', + 'east window', + 'west window', + 'sunny room', + 'helles licht', + 'hell', + 'lichtreich', + 'fensterplatz', + 'mucha luz', + 'luz brillante', + ], + lightHints: [ + 'bright light', + 'bright indirect', + 'bright', + 'helles licht', + 'helles indirektes licht', + 'luz brillante', + ], + }, + sun: { + aliases: [ + 'full sun', + 'sun', + 'sunny window', + 'direct sun', + 'south window', + 'south facing window', + 'volle sonne', + 'sonnig', + 'direkte sonne', + 'fenster sud', + 'fenster sued', + 'fenster süd', + 'ventana soleada', + 'sol directo', + ], + lightHints: [ + 'full sun', + 'sunny', + 'direct sun', + 'volles sonnenlicht', + 'sonnig', + 'sol directo', + ], + }, + high_humidity: { + aliases: [ + 'high humidity', + 'humid', + 'bathroom plant', + 'bathroom', + 'shower room', + 'humid room', + 'tropical humidity', + 'hohe luftfeuchtigkeit', + 'feucht', + 'badezimmer', + 'dusche', + 'luftfeucht', + 'humedad alta', + 'bano', + 'baño', + ], + entryHints: [ + 'high humidity', + 'humidity', + 'humid', + 'hohe luftfeuchtigkeit', + 'luftfeuchtigkeit', + 'humedad alta', + ], + }, + hanging: { + aliases: [ + 'hanging', + 'trailing', + 'hanging basket', + 'shelf plant', + 'vine plant', + 'cascading', + 'hangend', + 'ampel', + 'rankend', + 'colgante', + 'planta colgante', + ], + entryHints: [ + 'hanging', + 'trailing', + 'vine', + 'hang', + 'colgante', + ], + }, + patterned: { + aliases: [ + 'patterned', + 'patterned leaves', + 'striped', + 'variegated', + 'spotted', + 'decorative leaves', + 'fancy leaves', + 'gemustert', + 'muster', + 'gestreift', + 'bunt', + 'variegada', + 'rayada', + ], + entryHints: [ + 'patterned', + 'striped', + 'variegated', + 'spotted', + 'gemustert', + 'gestreift', + ], + }, + tree: { + aliases: [ + 'tree', + 'indoor tree', + 'small tree', + 'floor tree', + 'zimmerbaum', + 'baum', + 'arbol', + 'árbol', + ], + entryHints: [ + 'tree', + 'baum', + 'arbol', + ], + }, + large: { + aliases: [ + 'large', + 'big plant', + 'tall plant', + 'statement plant', + 'floor plant', + 'oversized plant', + 'gross', + 'groß', + 'grosse pflanze', + 'hohe pflanze', + 'planta grande', + 'planta alta', + ], + entryHints: [ + 'large', + 'big', + 'tall', + 'gross', + 'groß', + 'grande', + ], + }, + medicinal: { + aliases: [ + 'medicinal', + 'healing plant', + 'herb', + 'kitchen herb', + 'tea herb', + 'apothecary plant', + 'heilpflanze', + 'heilkraut', + 'kraut', + 'medicinal plant', + 'medicinal herb', + 'medicinales', + 'hierba', + 'hierba medicinal', + ], + entryHints: [ + 'medicinal', + 'herb', + 'heil', + 'kraut', + 'hierba', + ], + }, + }, + noiseTokens: [ + 'plant', + 'plants', + 'pflanze', + 'pflanzen', + 'planta', + 'plantas', + 'for', + 'fur', + 'fuer', + 'para', + 'mit', + 'with', + 'and', + 'und', + 'y', + 'the', + 'der', + 'die', + 'das', + 'el', + 'la', + 'de', + 'a', + 'an', + ], +}; + +module.exports = { + SEARCH_INTENT_CONFIG, +}; diff --git a/context/AppContext.tsx b/context/AppContext.tsx index a69ff4a..5481750 100644 --- a/context/AppContext.tsx +++ b/context/AppContext.tsx @@ -1,476 +1,512 @@ -import React, { createContext, useContext, useState, useEffect, useCallback } from 'react'; -import { useColorScheme, Appearance } from 'react-native'; -import { - Plant, - IdentificationResult, - Language, - AppearanceMode, - AppColorScheme, - ColorPalette, -} from '../types'; -import { ImageCacheService } from '../services/imageCacheService'; +import React, { createContext, useContext, useState, useEffect, useCallback } from 'react'; +import { useColorScheme, Appearance } from 'react-native'; +import { getLocales } from 'expo-localization'; +import { + Plant, + IdentificationResult, + Language, + AppearanceMode, + AppColorScheme, + ColorPalette, +} from '../types'; +import { ImageCacheService } from '../services/imageCacheService'; import { getTranslation } from '../utils/translations'; import { backendApiClient } from '../services/backend/backendApiClient'; -import { BillingSummary, PurchaseProductId, SimulatedWebhookEvent } from '../services/backend/contracts'; -import { createIdempotencyKey } from '../utils/idempotency'; -import { AuthService, AuthSession } from '../services/authService'; -import { PlantsDb, SettingsDb, LexiconHistoryDb, AppMetaDb } from '../services/database'; - -interface AppState { - session: AuthSession | null; - plants: Plant[]; - language: Language; - appearanceMode: AppearanceMode; - colorPalette: ColorPalette; - profileName: string; - profileImageUri: string | null; - billingSummary: BillingSummary | null; - resolvedScheme: AppColorScheme; - isDarkMode: boolean; - isInitializing: boolean; - isLoadingPlants: boolean; - isLoadingBilling: boolean; - t: ReturnType; - // Actions - setAppearanceMode: (mode: AppearanceMode) => void; - setColorPalette: (palette: ColorPalette) => void; - setProfileName: (name: string) => Promise; - setProfileImage: (imageUri: string | null) => Promise; - changeLanguage: (lang: Language) => void; - savePlant: (result: IdentificationResult, imageUri: string, overrideSession?: AuthSession) => Promise; - deletePlant: (id: string) => Promise; +import { BillingSummary, PurchaseProductId, RevenueCatCustomerInfo, SimulatedWebhookEvent } from '../services/backend/contracts'; +import { createIdempotencyKey } from '../utils/idempotency'; +import { AuthService, AuthSession } from '../services/authService'; +import { PlantsDb, SettingsDb, LexiconHistoryDb, AppMetaDb } from '../services/database'; + +interface AppState { + session: AuthSession | null; + plants: Plant[]; + language: Language; + appearanceMode: AppearanceMode; + colorPalette: ColorPalette; + profileName: string; + profileImageUri: string | null; + billingSummary: BillingSummary | null; + resolvedScheme: AppColorScheme; + isDarkMode: boolean; + isInitializing: boolean; + isLoadingPlants: boolean; + isLoadingBilling: boolean; + t: ReturnType; + // Actions + setAppearanceMode: (mode: AppearanceMode) => void; + setColorPalette: (palette: ColorPalette) => void; + setProfileName: (name: string) => Promise; + setProfileImage: (imageUri: string | null) => Promise; + changeLanguage: (lang: Language) => void; + savePlant: (result: IdentificationResult, imageUri: string, overrideSession?: AuthSession) => Promise; + deletePlant: (id: string) => Promise; updatePlant: (plant: Plant) => void; refreshPlants: () => void; refreshBillingSummary: () => Promise; + syncRevenueCatState: (customerInfo: RevenueCatCustomerInfo) => Promise; simulatePurchase: (productId: PurchaseProductId) => Promise; - simulateWebhookEvent: (event: SimulatedWebhookEvent, payload?: { credits?: number }) => Promise; - getLexiconSearchHistory: () => string[]; - saveLexiconSearchQuery: (query: string) => void; - clearLexiconSearchHistory: () => void; - hydrateSession: (session: AuthSession) => Promise; - signOut: () => Promise; - setPendingPlant: (result: IdentificationResult, imageUri: string) => void; - getPendingPlant: () => { result: IdentificationResult; imageUri: string } | null; - guestScanCount: number; - incrementGuestScanCount: () => void; -} + simulateWebhookEvent: (event: SimulatedWebhookEvent, payload?: { credits?: number }) => Promise; + getLexiconSearchHistory: () => string[]; + saveLexiconSearchQuery: (query: string) => void; + clearLexiconSearchHistory: () => void; + hydrateSession: (session: AuthSession) => Promise; + signOut: () => Promise; + setPendingPlant: (result: IdentificationResult, imageUri: string) => void; + getPendingPlant: () => { result: IdentificationResult; imageUri: string } | null; + guestScanCount: number; + incrementGuestScanCount: () => void; +} + +const AppContext = createContext(null); + +const toErrorMessage = (error: unknown): string => { + if (error instanceof Error) return error.message; + return String(error); +}; + +export const useApp = () => { + const ctx = useContext(AppContext); + if (!ctx) throw new Error('useApp must be used within AppProvider'); + 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 getDeviceLanguage = (): Language => { + try { + const locale = getLocales()[0]; + const lang = (locale?.languageCode || locale?.languageTag || '').split('-')[0].toLowerCase(); + if (lang === 'de') return 'de'; + if (lang === 'es') return 'es'; + return 'en'; + } catch { + return 'en'; + } +}; + +export const AppProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => { + const [systemColorScheme, setSystemColorScheme] = useState(Appearance.getColorScheme()); + + useEffect(() => { + const subscription = Appearance.addChangeListener(({ colorScheme }) => { + setSystemColorScheme(colorScheme); + }); + return () => subscription.remove(); + }, []); + + const [session, setSession] = useState(null); + const [plants, setPlants] = useState([]); + const [language, setLanguage] = useState(getDeviceLanguage()); + const [appearanceMode, setAppearanceModeState] = useState('system'); + const [colorPalette, setColorPaletteState] = useState('forest'); + const [profileName, setProfileNameState] = useState(''); + const [profileImageUri, setProfileImageUri] = useState(null); + const [pendingPlant, setPendingPlantState] = useState<{ result: IdentificationResult; imageUri: string } | null>(null); + const [guestScanCount, setGuestScanCount] = useState(0); + const [isInitializing, setIsInitializing] = useState(true); + const [isLoadingPlants, setIsLoadingPlants] = useState(true); + const [billingSummary, setBillingSummary] = useState(null); + const [isLoadingBilling, setIsLoadingBilling] = useState(true); + + const resolvedScheme: AppColorScheme = + appearanceMode === 'system' + ? (systemColorScheme ?? 'dark') === 'dark' ? 'dark' : 'light' + : appearanceMode; + const isDarkMode = resolvedScheme === 'dark'; + const t = getTranslation(language); + + const refreshBillingSummary = useCallback(async () => { + setIsLoadingBilling(true); + try { + const summary = await backendApiClient.getBillingSummary(); + setBillingSummary(summary); + } catch (e) { + console.error('Failed to refresh billing summary', e); + } finally { + setIsLoadingBilling(false); + } + }, []); + + const resetStateForSignedOutUser = useCallback(() => { + setSession(null); + setPlants([]); + setLanguage(getDeviceLanguage()); + setAppearanceModeState('system'); + setColorPaletteState('forest'); + setProfileNameState(''); + setProfileImageUri(null); + setIsLoadingPlants(false); + // Fetch guest billing summary instead of setting it to null + refreshBillingSummary(); + }, [refreshBillingSummary]); + + const refreshPlants = useCallback(() => { + if (!session) return; + try { + setPlants(PlantsDb.getAll(session.userId)); + } catch (error) { + console.error('Failed to refresh plants list.', { + userId: session.userId, + error: toErrorMessage(error), + }); + } + }, [session]); + + const savePlant = useCallback(async (result: IdentificationResult, imageUri: string, overrideSession?: AuthSession) => { + const activeSession = overrideSession || session; + if (!activeSession) { + console.warn('Ignoring savePlant request: no active user session.'); + return; + } + + const now = new Date().toISOString(); + let finalImageUri = imageUri; + + try { + finalImageUri = await ImageCacheService.cacheImage(imageUri); + } catch (error) { + console.error('Failed to cache plant image before save.', { + userId: activeSession.userId, + error: toErrorMessage(error), + }); + } + + const newPlant: Plant = { + id: Math.random().toString(36).substr(2, 9), + name: result.name, + botanicalName: result.botanicalName, + imageUri: finalImageUri, + dateAdded: now, + careInfo: result.careInfo, + lastWatered: now, + wateringHistory: [now], + description: result.description, + notificationsEnabled: false, + }; + + try { + PlantsDb.insert(activeSession.userId, newPlant); + } catch (error) { + console.error('Failed to insert plant into SQLite.', { + userId: activeSession.userId, + plantId: newPlant.id, + plantName: newPlant.name, + error: toErrorMessage(error), + }); + throw error; + } + + try { + const reloadedPlants = PlantsDb.getAll(activeSession.userId); + const insertedPlantExists = reloadedPlants.some((plant) => plant.id === newPlant.id); + + if (!insertedPlantExists) { + console.warn('Plant was inserted but not found in immediate reload. Applying optimistic list update.', { + userId: activeSession.userId, + plantId: newPlant.id, + }); + setPlants(prev => [newPlant, ...prev.filter((plant) => plant.id !== newPlant.id)]); + return; + } + + setPlants(reloadedPlants); + } catch (error) { + console.error('Failed to refresh plants after insert. Applying optimistic fallback.', { + userId: activeSession.userId, + plantId: newPlant.id, + error: toErrorMessage(error), + }); + setPlants(prev => [newPlant, ...prev.filter((plant) => plant.id !== newPlant.id)]); + } + }, [session]); + + const deletePlant = useCallback(async (id: string) => { + if (!session) return; + const plant = plants.find(p => p.id === id); + if (plant?.imageUri) { + await ImageCacheService.deleteCachedImage(plant.imageUri); + } + PlantsDb.delete(session.userId, id); + setPlants(prev => prev.filter(p => p.id !== id)); + }, [session, plants]); + + const updatePlant = useCallback((updatedPlant: Plant) => { + if (!session) return; + PlantsDb.update(session.userId, updatedPlant); + setPlants(prev => prev.map(p => p.id === updatedPlant.id ? updatedPlant : p)); + }, [session]); + + const hydrateSession = useCallback(async (nextSession: AuthSession) => { + setSession(nextSession); + setProfileNameState(nextSession.name); + setIsLoadingPlants(true); + setIsLoadingBilling(true); + + // Settings aus SQLite + try { + const settings = SettingsDb.get(nextSession.userId); + if (settings.language_set === 1 && isLanguage(settings.language)) setLanguage(settings.language as Language); + if (isAppearanceMode(settings.appearance_mode)) setAppearanceModeState(settings.appearance_mode as AppearanceMode); + if (isColorPalette(settings.color_palette)) setColorPaletteState(settings.color_palette as ColorPalette); + setProfileImageUri(settings.profile_image); + } catch (e) { + console.error('Failed to load settings from SQLite', e); + } + + // Pflanzen laden + try { + setPlants(PlantsDb.getAll(nextSession.userId)); + } catch (error) { + console.error('Failed to load plants during app bootstrap.', { + userId: nextSession.userId, + error: toErrorMessage(error), + }); + setPlants([]); + } finally { + setIsLoadingPlants(false); + } + + // Billing laden + try { + await refreshBillingSummary(); + } catch (e) { + console.error('Initial billing summary check failed', e); + setIsLoadingBilling(false); + // Einmaliger Retry nach 2s + setTimeout(async () => { + try { + await refreshBillingSummary(); + } catch { + // silent — user can retry manually + } + }, 2000); + } + + // Check for pending plant to save after login/signup + if (pendingPlant) { + setTimeout(async () => { + try { + // Inside hydrateSession, the state 'session' might not be updated yet + // but we can pass nextSession to savePlant if we modify it, + // but savePlant uses the 'session' from the outer scope. + // However, by the time this timeout runs, the session state SHOULD be set. + await savePlant(pendingPlant.result, pendingPlant.imageUri, nextSession); + setPendingPlantState(null); + } catch (e) { + console.error('Failed to save pending plant after hydration', e); + } + }, 800); + } + }, [refreshBillingSummary, pendingPlant, savePlant]); + + const signOut = useCallback(async () => { + await AuthService.logout(); + resetStateForSignedOutUser(); + }, [resetStateForSignedOutUser]); + + // Session + Settings laden (inkl. Server-Validierung) + useEffect(() => { + (async () => { + try { + // Load guest scan count from DB + const savedCount = AppMetaDb.get('guest_scan_count'); + if (savedCount) { + setGuestScanCount(parseInt(savedCount, 10) || 0); + } + + const s = await AuthService.getSession(); + if (!s) { + resetStateForSignedOutUser(); + return; + } + // Token validieren bevor Session gesetzt wird — verhindert kurzes Dashboard-Flash + const validity = await AuthService.validateWithServer(); + if (validity === 'invalid') { + await AuthService.logout(); + resetStateForSignedOutUser(); + return; + } + await hydrateSession(s); + } catch (error) { + console.error('Critical failure during AppContext initialization', error); + resetStateForSignedOutUser(); + } finally { + setIsInitializing(false); + } + })(); + // 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 activeEntitlements = customerInfo?.entitlements?.active || {}; + const proEntitlement = activeEntitlements[entitlementId]; + const isPro = Boolean(proEntitlement); -const AppContext = createContext(null); - -const toErrorMessage = (error: unknown): string => { - if (error instanceof Error) return error.message; - return String(error); -}; - -export const useApp = () => { - const ctx = useContext(AppContext); - if (!ctx) throw new Error('useApp must be used within AppProvider'); - 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 getDeviceLanguage = (): Language => { - try { - const locale = Intl.DateTimeFormat().resolvedOptions().locale || ''; - const lang = locale.split('-')[0].toLowerCase(); - if (lang === 'de') return 'de'; - if (lang === 'es') return 'es'; - return 'en'; - } catch { - return 'en'; - } -}; - -export const AppProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => { - const [systemColorScheme, setSystemColorScheme] = useState(Appearance.getColorScheme()); - - useEffect(() => { - const subscription = Appearance.addChangeListener(({ colorScheme }) => { - setSystemColorScheme(colorScheme); + setBillingSummary((prev) => { + if (!prev) return prev; + return { + ...prev, + entitlement: { + ...prev.entitlement, + plan: isPro ? 'pro' : 'free', + provider: 'revenuecat', + status: isPro ? 'active' : 'inactive', + renewsAt: proEntitlement?.expirationDate || proEntitlement?.expiresDate || null, + }, + }; }); - return () => subscription.remove(); }, []); - const [session, setSession] = useState(null); - const [plants, setPlants] = useState([]); - const [language, setLanguage] = useState(getDeviceLanguage()); - const [appearanceMode, setAppearanceModeState] = useState('system'); - const [colorPalette, setColorPaletteState] = useState('forest'); - const [profileName, setProfileNameState] = useState(''); - const [profileImageUri, setProfileImageUri] = useState(null); - const [pendingPlant, setPendingPlantState] = useState<{ result: IdentificationResult; imageUri: string } | null>(null); - const [guestScanCount, setGuestScanCount] = useState(0); - const [isInitializing, setIsInitializing] = useState(true); - const [isLoadingPlants, setIsLoadingPlants] = useState(true); - const [billingSummary, setBillingSummary] = useState(null); - const [isLoadingBilling, setIsLoadingBilling] = useState(true); - - const resolvedScheme: AppColorScheme = - appearanceMode === 'system' - ? (systemColorScheme ?? 'dark') === 'dark' ? 'dark' : 'light' - : appearanceMode; - const isDarkMode = resolvedScheme === 'dark'; - const t = getTranslation(language); - - const refreshBillingSummary = useCallback(async () => { - setIsLoadingBilling(true); + const syncRevenueCatState = useCallback(async (customerInfo: RevenueCatCustomerInfo) => { + applyRevenueCatCustomerInfoLocally(customerInfo); try { - const summary = await backendApiClient.getBillingSummary(); - setBillingSummary(summary); - } catch (e) { - console.error('Failed to refresh billing summary', e); - } finally { - setIsLoadingBilling(false); - } - }, []); - - const resetStateForSignedOutUser = useCallback(() => { - setSession(null); - setPlants([]); - setLanguage(getDeviceLanguage()); - setAppearanceModeState('system'); - setColorPaletteState('forest'); - setProfileNameState(''); - setProfileImageUri(null); - setIsLoadingPlants(false); - // Fetch guest billing summary instead of setting it to null - refreshBillingSummary(); - }, [refreshBillingSummary]); - - const refreshPlants = useCallback(() => { - if (!session) return; - try { - setPlants(PlantsDb.getAll(session.userId)); + const response = await backendApiClient.syncRevenueCatState({ customerInfo }); + setBillingSummary(response.billing); + return response.billing; } catch (error) { - console.error('Failed to refresh plants list.', { - userId: session.userId, - error: toErrorMessage(error), - }); + console.error('Failed to sync RevenueCat state with backend', error); + return null; } - }, [session]); - - const savePlant = useCallback(async (result: IdentificationResult, imageUri: string, overrideSession?: AuthSession) => { - const activeSession = overrideSession || session; - if (!activeSession) { - console.warn('Ignoring savePlant request: no active user session.'); - return; - } - - const now = new Date().toISOString(); - let finalImageUri = imageUri; - - try { - finalImageUri = await ImageCacheService.cacheImage(imageUri); - } catch (error) { - console.error('Failed to cache plant image before save.', { - userId: activeSession.userId, - error: toErrorMessage(error), - }); - } - - const newPlant: Plant = { - id: Math.random().toString(36).substr(2, 9), - name: result.name, - botanicalName: result.botanicalName, - imageUri: finalImageUri, - dateAdded: now, - careInfo: result.careInfo, - lastWatered: now, - wateringHistory: [now], - description: result.description, - notificationsEnabled: false, - }; - - try { - PlantsDb.insert(activeSession.userId, newPlant); - } catch (error) { - console.error('Failed to insert plant into SQLite.', { - userId: activeSession.userId, - plantId: newPlant.id, - plantName: newPlant.name, - error: toErrorMessage(error), - }); - throw error; - } - - try { - const reloadedPlants = PlantsDb.getAll(activeSession.userId); - const insertedPlantExists = reloadedPlants.some((plant) => plant.id === newPlant.id); - - if (!insertedPlantExists) { - console.warn('Plant was inserted but not found in immediate reload. Applying optimistic list update.', { - userId: activeSession.userId, - plantId: newPlant.id, - }); - setPlants(prev => [newPlant, ...prev.filter((plant) => plant.id !== newPlant.id)]); - return; - } - - setPlants(reloadedPlants); - } catch (error) { - console.error('Failed to refresh plants after insert. Applying optimistic fallback.', { - userId: activeSession.userId, - plantId: newPlant.id, - error: toErrorMessage(error), - }); - setPlants(prev => [newPlant, ...prev.filter((plant) => plant.id !== newPlant.id)]); - } - }, [session]); - - const deletePlant = useCallback(async (id: string) => { - if (!session) return; - const plant = plants.find(p => p.id === id); - if (plant?.imageUri) { - await ImageCacheService.deleteCachedImage(plant.imageUri); - } - PlantsDb.delete(session.userId, id); - setPlants(prev => prev.filter(p => p.id !== id)); - }, [session, plants]); - - const updatePlant = useCallback((updatedPlant: Plant) => { - if (!session) return; - PlantsDb.update(session.userId, updatedPlant); - setPlants(prev => prev.map(p => p.id === updatedPlant.id ? updatedPlant : p)); - }, [session]); - - const hydrateSession = useCallback(async (nextSession: AuthSession) => { - setSession(nextSession); - setProfileNameState(nextSession.name); - setIsLoadingPlants(true); - setIsLoadingBilling(true); - - // Settings aus SQLite - try { - const settings = SettingsDb.get(nextSession.userId); - if (settings.language_set === 1 && isLanguage(settings.language)) setLanguage(settings.language as Language); - if (isAppearanceMode(settings.appearance_mode)) setAppearanceModeState(settings.appearance_mode as AppearanceMode); - if (isColorPalette(settings.color_palette)) setColorPaletteState(settings.color_palette as ColorPalette); - setProfileImageUri(settings.profile_image); - } catch (e) { - console.error('Failed to load settings from SQLite', e); - } - - // Pflanzen laden - try { - setPlants(PlantsDb.getAll(nextSession.userId)); - } catch (error) { - console.error('Failed to load plants during app bootstrap.', { - userId: nextSession.userId, - error: toErrorMessage(error), - }); - setPlants([]); - } finally { - setIsLoadingPlants(false); - } - - // Billing laden - try { - await refreshBillingSummary(); - } catch (e) { - console.error('Initial billing summary check failed', e); - setIsLoadingBilling(false); - // Einmaliger Retry nach 2s - setTimeout(async () => { - try { - await refreshBillingSummary(); - } catch { - // silent — user can retry manually - } - }, 2000); - } - - // Check for pending plant to save after login/signup - if (pendingPlant) { - setTimeout(async () => { - try { - // Inside hydrateSession, the state 'session' might not be updated yet - // but we can pass nextSession to savePlant if we modify it, - // but savePlant uses the 'session' from the outer scope. - // However, by the time this timeout runs, the session state SHOULD be set. - await savePlant(pendingPlant.result, pendingPlant.imageUri, nextSession); - setPendingPlantState(null); - } catch (e) { - console.error('Failed to save pending plant after hydration', e); - } - }, 800); - } - }, [refreshBillingSummary, pendingPlant, savePlant]); - - const signOut = useCallback(async () => { - await AuthService.logout(); - resetStateForSignedOutUser(); - }, [resetStateForSignedOutUser]); - - // Session + Settings laden (inkl. Server-Validierung) - useEffect(() => { - (async () => { - try { - // Load guest scan count from DB - const savedCount = AppMetaDb.get('guest_scan_count'); - if (savedCount) { - setGuestScanCount(parseInt(savedCount, 10) || 0); - } - - const s = await AuthService.getSession(); - if (!s) { - resetStateForSignedOutUser(); - return; - } - // Token validieren bevor Session gesetzt wird — verhindert kurzes Dashboard-Flash - const validity = await AuthService.validateWithServer(); - if (validity === 'invalid') { - await AuthService.logout(); - resetStateForSignedOutUser(); - return; - } - await hydrateSession(s); - } catch (error) { - console.error('Critical failure during AppContext initialization', error); - resetStateForSignedOutUser(); - } finally { - setIsInitializing(false); - } - })(); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); + }, [applyRevenueCatCustomerInfoLocally]); const simulatePurchase = useCallback(async (productId: PurchaseProductId) => { - const response = await backendApiClient.simulatePurchase({ - idempotencyKey: createIdempotencyKey('purchase', productId), - productId, - }); - setBillingSummary(response.billing); - }, []); - - const simulateWebhookEvent = useCallback(async ( - event: SimulatedWebhookEvent, - payload?: { credits?: number }, - ) => { - const response = await backendApiClient.simulateWebhook({ - idempotencyKey: createIdempotencyKey('webhook', event), - event, - payload, - }); - setBillingSummary(response.billing); - }, []); - - const setAppearanceMode = useCallback((mode: AppearanceMode) => { - setAppearanceModeState(mode); - if (session) SettingsDb.setAppearanceMode(session.userId, mode); - }, [session]); - - const setColorPalette = useCallback((palette: ColorPalette) => { - setColorPaletteState(palette); - if (session) SettingsDb.setColorPalette(session.userId, palette); - }, [session]); - - const setProfileName = useCallback(async (name: string) => { - const normalized = name.trim() || session?.name || 'GreenLens User'; - setProfileNameState(normalized); - if (session) { - SettingsDb.setName(session.userId, normalized); - await AuthService.updateSessionName(normalized); - } - }, [session]); - - const setProfileImage = useCallback(async (imageUri: string | null) => { - let nextUri = imageUri; - if (imageUri) { - try { - nextUri = await ImageCacheService.cacheImage(imageUri); - } catch (e) { - console.error('Failed to cache profile image', e); - } - } - if (profileImageUri && profileImageUri !== nextUri) { - await ImageCacheService.deleteCachedImage(profileImageUri); - } - setProfileImageUri(nextUri); - if (session) SettingsDb.setProfileImage(session.userId, nextUri); - }, [session, profileImageUri]); - - const changeLanguage = useCallback((lang: Language) => { - setLanguage(lang); - if (session) SettingsDb.setLanguage(session.userId, lang); - }, [session]); - - - // Lexicon history — synchron (SQLite sync API) - const getLexiconSearchHistory = useCallback((): string[] => { - if (!session) return []; - return LexiconHistoryDb.getAll(session.userId); - }, [session]); - - const saveLexiconSearchQuery = useCallback((query: string) => { - if (!session) return; - LexiconHistoryDb.add(session.userId, query); - }, [session]); - - const clearLexiconSearchHistory = useCallback(() => { - if (!session) return; - LexiconHistoryDb.clear(session.userId); - }, [session]); - - const setPendingPlant = useCallback((result: IdentificationResult, imageUri: string) => { - setPendingPlantState({ result, imageUri }); - }, []); - - const getPendingPlant = useCallback(() => { - return pendingPlant; - }, [pendingPlant]); - - const incrementGuestScanCount = useCallback(() => { - setGuestScanCount(prev => { - const next = prev + 1; - AppMetaDb.set('guest_scan_count', next.toString()); - return next; - }); - }, []); - - return ( - { + const response = await backendApiClient.simulateWebhook({ + idempotencyKey: createIdempotencyKey('webhook', event), + event, + payload, + }); + setBillingSummary(response.billing); + }, []); + + const setAppearanceMode = useCallback((mode: AppearanceMode) => { + setAppearanceModeState(mode); + if (session) SettingsDb.setAppearanceMode(session.userId, mode); + }, [session]); + + const setColorPalette = useCallback((palette: ColorPalette) => { + setColorPaletteState(palette); + if (session) SettingsDb.setColorPalette(session.userId, palette); + }, [session]); + + const setProfileName = useCallback(async (name: string) => { + const normalized = name.trim() || session?.name || 'GreenLens User'; + setProfileNameState(normalized); + if (session) { + SettingsDb.setName(session.userId, normalized); + await AuthService.updateSessionName(normalized); + } + }, [session]); + + const setProfileImage = useCallback(async (imageUri: string | null) => { + let nextUri = imageUri; + if (imageUri) { + try { + nextUri = await ImageCacheService.cacheImage(imageUri); + } catch (e) { + console.error('Failed to cache profile image', e); + } + } + if (profileImageUri && profileImageUri !== nextUri) { + await ImageCacheService.deleteCachedImage(profileImageUri); + } + setProfileImageUri(nextUri); + if (session) SettingsDb.setProfileImage(session.userId, nextUri); + }, [session, profileImageUri]); + + const changeLanguage = useCallback((lang: Language) => { + setLanguage(lang); + if (session) SettingsDb.setLanguage(session.userId, lang); + }, [session]); + + + // Lexicon history — synchron (SQLite sync API) + const getLexiconSearchHistory = useCallback((): string[] => { + if (!session) return []; + return LexiconHistoryDb.getAll(session.userId); + }, [session]); + + const saveLexiconSearchQuery = useCallback((query: string) => { + if (!session) return; + LexiconHistoryDb.add(session.userId, query); + }, [session]); + + const clearLexiconSearchHistory = useCallback(() => { + if (!session) return; + LexiconHistoryDb.clear(session.userId); + }, [session]); + + const setPendingPlant = useCallback((result: IdentificationResult, imageUri: string) => { + setPendingPlantState({ result, imageUri }); + }, []); + + const getPendingPlant = useCallback(() => { + return pendingPlant; + }, [pendingPlant]); + + const incrementGuestScanCount = useCallback(() => { + setGuestScanCount(prev => { + const next = prev + 1; + AppMetaDb.set('guest_scan_count', next.toString()); + return next; + }); + }, []); + + return ( + - {children} - - ); -}; + simulateWebhookEvent, + getLexiconSearchHistory, + saveLexiconSearchQuery, + clearLexiconSearchHistory, + hydrateSession, + signOut, + setPendingPlant, + getPendingPlant, + guestScanCount, + incrementGuestScanCount, + }}> + {children} + + ); +}; diff --git a/context/CoachMarksContext.tsx b/context/CoachMarksContext.tsx index 5b9a72c..b56b62a 100644 --- a/context/CoachMarksContext.tsx +++ b/context/CoachMarksContext.tsx @@ -1,77 +1,77 @@ -import React, { createContext, useContext, useState, useCallback, useRef } from 'react'; -import { LayoutRectangle } from 'react-native'; - -export interface CoachStep { - elementKey: string; - title: string; - description: string; - tooltipSide: 'above' | 'below' | 'left' | 'right'; -} - -interface CoachMarksState { - isActive: boolean; - currentStep: number; - steps: CoachStep[]; - layouts: Record; - registerLayout: (key: string, layout: LayoutRectangle) => void; - startTour: (steps: CoachStep[]) => void; - next: () => void; - skip: () => void; -} - -const CoachMarksContext = createContext(null); - -export const useCoachMarks = () => { - const ctx = useContext(CoachMarksContext); - if (!ctx) throw new Error('useCoachMarks must be within CoachMarksProvider'); - return ctx; -}; - -export const CoachMarksProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => { - const [isActive, setIsActive] = useState(false); - const [currentStep, setCurrentStep] = useState(0); - const [steps, setSteps] = useState([]); - const layouts = useRef>({}); - const [, forceRender] = useState(0); - - const registerLayout = useCallback((key: string, layout: LayoutRectangle) => { - layouts.current[key] = layout; - forceRender(n => n + 1); - }, []); - - const startTour = useCallback((newSteps: CoachStep[]) => { - setSteps(newSteps); - setCurrentStep(0); - setIsActive(true); - }, []); - - const next = useCallback(() => { - setCurrentStep(prev => { - if (prev + 1 >= steps.length) { - setIsActive(false); - return 0; - } - return prev + 1; - }); - }, [steps.length]); - - const skip = useCallback(() => { - setIsActive(false); - setCurrentStep(0); - }, []); - - return ( - - {children} - - ); -}; +import React, { createContext, useContext, useState, useCallback, useRef } from 'react'; +import { LayoutRectangle } from 'react-native'; + +export interface CoachStep { + elementKey: string; + title: string; + description: string; + tooltipSide: 'above' | 'below' | 'left' | 'right'; +} + +interface CoachMarksState { + isActive: boolean; + currentStep: number; + steps: CoachStep[]; + layouts: Record; + registerLayout: (key: string, layout: LayoutRectangle) => void; + startTour: (steps: CoachStep[]) => void; + next: () => void; + skip: () => void; +} + +const CoachMarksContext = createContext(null); + +export const useCoachMarks = () => { + const ctx = useContext(CoachMarksContext); + if (!ctx) throw new Error('useCoachMarks must be within CoachMarksProvider'); + return ctx; +}; + +export const CoachMarksProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => { + const [isActive, setIsActive] = useState(false); + const [currentStep, setCurrentStep] = useState(0); + const [steps, setSteps] = useState([]); + const layouts = useRef>({}); + const [, forceRender] = useState(0); + + const registerLayout = useCallback((key: string, layout: LayoutRectangle) => { + layouts.current[key] = layout; + forceRender(n => n + 1); + }, []); + + const startTour = useCallback((newSteps: CoachStep[]) => { + setSteps(newSteps); + setCurrentStep(0); + setIsActive(true); + }, []); + + const next = useCallback(() => { + setCurrentStep(prev => { + if (prev + 1 >= steps.length) { + setIsActive(false); + return 0; + } + return prev + 1; + }); + }, [steps.length]); + + const skip = useCallback(() => { + setIsActive(false); + setCurrentStep(0); + }, []); + + return ( + + {children} + + ); +}; diff --git a/docker-compose.yml b/docker-compose.yml index 6bc8a46..4089e19 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,54 +1,54 @@ -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: +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: diff --git a/doctor_output_utf8.txt b/doctor_output_utf8.txt index c60592d..199d097 100644 --- a/doctor_output_utf8.txt +++ b/doctor_output_utf8.txt @@ -1,48 +1,48 @@ -env: load .env.local -env: export EXPO_PUBLIC_OPENAI_API_KEY EXPO_PUBLIC_OPENAI_HEALTH_MODEL EXPO_PUBLIC_OPENAI_SCAN_MODEL EXPO_PUBLIC_PAYMENT_SERVER_URL EXPO_PUBLIC_STRIPE_PUBLISHABLE_KEY STRIPE_PUBLISHABLE_KEY STRIPE_SECRET_KEY STRIPE_WEBHOOK_SECRET -Running 17 checks on your project... -15/17 checks passed. 2 checks failed. Possible issues detected: -Use the --verbose flag to see more details about passed checks. - -Ô£û Check for common project setup issues -The .expo directory is not ignored by Git. It contains machine-specific device history and development server settings and should not be committed. -Advice: -Add ".expo/" to your .gitignore to avoid committing local Expo state. - -Ô£û Check that packages match versions required by installed Expo SDK - -ÔÜá´©Å Minor version mismatches -package expected found -react-native-worklets 0.5.1 0.7.2 - - - -1 package out of date. -Advice: -Use 'npx expo install --check' to review and upgrade your dependencies. -To ignore specific packages, add them to "expo.install.exclude" in package.json. Learn more: https://expo.fyi/dependency-validation - -node.exe : 2 checks -failed, indicating -possible issues with -the project. -In Zeile:1 Zeichen:1 -+ & "C:\Program -Files\nodejs/node.exe" -"C:\Program -Files\nodejs/node_mo -... -+ ~~~~~~~~~~~~~~~~~~~~~ -~~~~~~~~~~~~~~~~~~~~~~~ -~~~~~~~~~~~~~~~~~~~~~~~ -~~ - + CategoryInfo - : NotSpecifi - ed: (2 checks fail - ed...th the projec -t.:String) [], Rem -oteException - + FullyQualifiedEr - rorId : NativeComm - andError - +env: load .env.local +env: export EXPO_PUBLIC_OPENAI_API_KEY EXPO_PUBLIC_OPENAI_HEALTH_MODEL EXPO_PUBLIC_OPENAI_SCAN_MODEL EXPO_PUBLIC_PAYMENT_SERVER_URL EXPO_PUBLIC_STRIPE_PUBLISHABLE_KEY STRIPE_PUBLISHABLE_KEY STRIPE_SECRET_KEY STRIPE_WEBHOOK_SECRET +Running 17 checks on your project... +15/17 checks passed. 2 checks failed. Possible issues detected: +Use the --verbose flag to see more details about passed checks. + +Ô£û Check for common project setup issues +The .expo directory is not ignored by Git. It contains machine-specific device history and development server settings and should not be committed. +Advice: +Add ".expo/" to your .gitignore to avoid committing local Expo state. + +Ô£û Check that packages match versions required by installed Expo SDK + +ÔÜá´©Å Minor version mismatches +package expected found +react-native-worklets 0.5.1 0.7.2 + + + +1 package out of date. +Advice: +Use 'npx expo install --check' to review and upgrade your dependencies. +To ignore specific packages, add them to "expo.install.exclude" in package.json. Learn more: https://expo.fyi/dependency-validation + +node.exe : 2 checks +failed, indicating +possible issues with +the project. +In Zeile:1 Zeichen:1 ++ & "C:\Program +Files\nodejs/node.exe" +"C:\Program +Files\nodejs/node_mo +... ++ ~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~~~ +~~ + + CategoryInfo + : NotSpecifi + ed: (2 checks fail + ed...th the projec +t.:String) [], Rem +oteException + + FullyQualifiedEr + rorId : NativeComm + andError + diff --git a/eas.json b/eas.json index dc9ec7c..28fb7e8 100644 --- a/eas.json +++ b/eas.json @@ -1,36 +1,36 @@ -{ - "cli": { - "version": ">= 3.0.0", - "appVersionSource": "remote" - }, - "build": { - "development": { - "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" - } - } - }, - "submit": { - "production": {} - } +{ + "cli": { + "version": ">= 3.0.0", + "appVersionSource": "remote" + }, + "build": { + "development": { + "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" + } + } + }, + "submit": { + "production": {} + } } \ No newline at end of file diff --git a/f.txt b/f.txt index 13c1b7b..8d0bc39 100644 --- a/f.txt +++ b/f.txt @@ -1,23 +1,23 @@ - -Googlebot, Bingbot, GPTBot, ClaudeBot, PerplexityBot, Applebot - - - -https://www.qrmaster.net/tools/instagram-qr-code - -https://www.qrmaster.net/tools/teams-qr-code - - -https://www.qrmaster.net/tools/whatsapp-qr-code - - - - - -app\scanner.tsx: const availableCredits = ses... => const availableCredits = ses... │ -│ │ -│ 107 : null; │ -│ 108 const availableCredits = session │ -│ 109 ? (billingSummary?.credits.available ?? 0) │ -│ 110 - : Math.max(0, 5 - guestScanCount); │ + +Googlebot, Bingbot, GPTBot, ClaudeBot, PerplexityBot, Applebot + + + +https://www.qrmaster.net/tools/instagram-qr-code + +https://www.qrmaster.net/tools/teams-qr-code + + +https://www.qrmaster.net/tools/whatsapp-qr-code + + + + + +app\scanner.tsx: const availableCredits = ses... => const availableCredits = ses... │ +│ │ +│ 107 : null; │ +│ 108 const availableCredits = session │ +│ 109 ? (billingSummary?.credits.available ?? 0) │ +│ 110 - : Math.max(0, 5 - guestScanCount); │ │ 110 + : Math.max(0, 50 - guestScanCount); \ No newline at end of file diff --git a/fetch_plants.js b/fetch_plants.js index 3e936ac..d427c24 100644 --- a/fetch_plants.js +++ b/fetch_plants.js @@ -1,19 +1,19 @@ - -const { openDatabase, all, closeDatabase, getDefaultDbPath } = require('./server/lib/sqlite'); -const { getPlants } = require('./server/lib/plants'); - -async function main() { - let db; - try { - db = await openDatabase(); - const plants = await getPlants(db, { limit: 500 }); - console.log(JSON.stringify(plants, null, 2)); - } catch (error) { - console.error(error); - process.exit(1); - } finally { - if (db) await closeDatabase(db); - } -} - -main(); + +const { openDatabase, all, closeDatabase, getDefaultDbPath } = require('./server/lib/sqlite'); +const { getPlants } = require('./server/lib/plants'); + +async function main() { + let db; + try { + db = await openDatabase(); + const plants = await getPlants(db, { limit: 500 }); + console.log(JSON.stringify(plants, null, 2)); + } catch (error) { + console.error(error); + process.exit(1); + } finally { + if (db) await closeDatabase(db); + } +} + +main(); diff --git a/format_md.js b/format_md.js index 509ce55..1c2c404 100644 --- a/format_md.js +++ b/format_md.js @@ -1,23 +1,23 @@ - -const fs = require('fs'); - -function formatPlants(plants) { - let md = '# Alle Pflanzen in der Datenbank\n\n'; - md += '| Name | Botanischer Name | Kategorie | Gie├ƒintervall (Tage) | Licht | Temperatur |\n'; - md += '| :--- | :--- | :--- | :--- | :--- | :--- |\n'; - - for (const plant of plants) { - const categories = plant.categories.join(', '); - const water = plant.careInfo.waterIntervalDays || '-'; - const light = plant.careInfo.light || '-'; - const temp = plant.careInfo.temp || '-'; - md += `| ${plant.name} | *${plant.botanicalName}* | ${categories} | ${water} | ${light} | ${temp} |\n`; - } - - return md; -} - -const plants = JSON.parse(fs.readFileSync('plants_dump_utf8.json', 'utf8')); -const markdown = formatPlants(plants); -fs.writeFileSync('ALLE_PFLANZEN.md', markdown); -console.log('ALLE_PFLANZEN.md created.'); + +const fs = require('fs'); + +function formatPlants(plants) { + let md = '# Alle Pflanzen in der Datenbank\n\n'; + md += '| Name | Botanischer Name | Kategorie | Gie├ƒintervall (Tage) | Licht | Temperatur |\n'; + md += '| :--- | :--- | :--- | :--- | :--- | :--- |\n'; + + for (const plant of plants) { + const categories = plant.categories.join(', '); + const water = plant.careInfo.waterIntervalDays || '-'; + const light = plant.careInfo.light || '-'; + const temp = plant.careInfo.temp || '-'; + md += `| ${plant.name} | *${plant.botanicalName}* | ${categories} | ${water} | ${light} | ${temp} |\n`; + } + + return md; +} + +const plants = JSON.parse(fs.readFileSync('plants_dump_utf8.json', 'utf8')); +const markdown = formatPlants(plants); +fs.writeFileSync('ALLE_PFLANZEN.md', markdown); +console.log('ALLE_PFLANZEN.md created.'); diff --git a/generated/social-videos/greenlens-fast-demo.webm b/generated/social-videos/greenlens-fast-demo.webm new file mode 100644 index 0000000..d5f12b3 Binary files /dev/null and b/generated/social-videos/greenlens-fast-demo.webm differ diff --git a/generated/social-videos/greenlens-mystery-plant.webm b/generated/social-videos/greenlens-mystery-plant.webm new file mode 100644 index 0000000..c35ecae Binary files /dev/null and b/generated/social-videos/greenlens-mystery-plant.webm differ diff --git a/generated/social-videos/greenlens-plant-routine.webm b/generated/social-videos/greenlens-plant-routine.webm new file mode 100644 index 0000000..11ea938 Binary files /dev/null and b/generated/social-videos/greenlens-plant-routine.webm differ diff --git a/generated/social-videos/greenlens-sick-plant-rescue.webm b/generated/social-videos/greenlens-sick-plant-rescue.webm new file mode 100644 index 0000000..2433b3b Binary files /dev/null and b/generated/social-videos/greenlens-sick-plant-rescue.webm differ diff --git a/generated/social-videos/greenlens-yellow-leaves.webm b/generated/social-videos/greenlens-yellow-leaves.webm new file mode 100644 index 0000000..69768f9 Binary files /dev/null and b/generated/social-videos/greenlens-yellow-leaves.webm differ diff --git a/greenlens_90_day_plan.md b/greenlens_90_day_plan.md index 370394a..86154d4 100644 --- a/greenlens_90_day_plan.md +++ b/greenlens_90_day_plan.md @@ -1,114 +1,114 @@ -# 🌿 GreenLens: Der 90-Tage Masterplan - -**Mission:** Einen verlässlichen, wiederholbaren Funnel für urbane Pflanzen-Anfänger aufbauen, deren Pflanzen gerade sterben (Der "Plant ER" Wedge). -**Ziel nach 90 Tagen:** Messbare Verbesserungen bei der Aktivierung, der Paid-Conversion und dem ROI aus organischem Short-Form-Content (UGC). - ---- - -## 🎯 1. Die Strategie (Der "Wedge") - -Anstatt eine generische Pflege-App zu sein, positioniert sich GreenLens als **Notaufnahme für Pflanzen (Plant ER)**. - -* **Zielgruppe (ICP):** Urbane Anfänger, die ihre Pflanzen lieben, aber nicht verstehen. -* **Der Schmerz (Buying Trigger):** Akute Panik. Gelbe Blätter, hängende Köpfe, Schädlinge. Die Angst, die Pflanze zu verlieren. -* **Die Lösung:** Schnelle Diagnose + Klarer, sofort umsetzbarer Aktionsplan. - ---- - -## 📱 2. Die User Journey (App Funnel) - -Der Weg des Nutzers vom Problem bis zur Heilung – und wie wir damit Geld verdienen. - -| Schritt | Was passiert? | Monetarisierung | Wichtigste Metrik (KPI) | -| :--- | :--- | :--- | :--- | -| **1. Panik!** | User bemerkt Symptom & öffnet App | - | % Installs zum 1. Scan (< 10 Min) | -| **2. Diagnose** | Foto + Kontext (Licht, Wasser) erfassen | - | Scan-Abschlussrate | -| **3. Ergebnis** | AI-Diagnose (Vertrauen & Ursache) | 💰 **Ja (Credit-Verbrauch)** | Diagnose-Erfolgsrate | -| **4. Action Plan** | 7-Tage Rettungsplan starten | 💎 **Value (Aha-Moment)** | % User, die Plan starten | -| **5. Follow-Up** | 24h/72h Check-in & Re-Scan | 💰 **Ja (Credits)** | 7-Tage Re-Scan Rate | -| **6. Heilung** | Erfolg wird dokumentiert (Proof) | *Indirekt* | % gerettete Pflanzen | -| **7. Upgrade** | Paywall am perfekten Moment | 💳 **Conversion** | Kauf-Rate, ARPPU | - -> [!IMPORTANT] -> **Die goldene Regel:** Die Paywall (für Abos oder Top-Ups) erscheint erst, *nachdem* der echte Wert (die fertige Diagnose) gezeigt wurde, oder bevor der Follow-up Plan startet. - ---- - -## 🚀 3. Die Wachstums-Maschine (Instagram) - -Organisches Wachstum durch Content, der gespeichert und geteilt wird. -**Fokus:** Saves, Replies und DMs. (3 Posts / Woche, Deutsch & Englisch) - -### Die 3 Content-Pfeiler (Pillars) -1. **Plant Problems & Fixes:** Diagnose ➔ Ursache ➔ Lösung. -2. **Plant Care Basics:** Checklisten und Guides. -3. **Community / Rescue Stories:** Vorher/Nachher Rettungsaktionen (Emotionen). - -### Die stärksten Formate -* **Carousel:** "Gelbe Blätter? Die 5 Gründe & Lösungen" ➔ *Call-to-Action (CTA): Speichern (Save).* -* **Story-Quiz:** "Woran leidet diese Monstera?" ➔ *CTA: Auf Story antworten (Reply).* -* **Reel (Kurz):** Vorher/Nachher Rettung in 7 Tagen ➔ *CTA: An Freund senden (Share).* - -### Der DM-Funnel (Der Lead-Turbo) -1. **Post:** "Kommentiere GUIDE für die Notfall-Checkliste." -2. **DM 1 (Sofort):** Link zur Checkliste (Teaser!) ➔ "Mache den Pilz-Check hier: [App-Link]". -3. **DM 2 (24h später):** "Hat es deiner Pflanze geholfen?" (Feedback & Conversion). - ---- - -## 🛠️ 4. Der 90-Tage Umsetzungsplan - -Eine klare Roadmap von der Basis bis zur Skalierung. - -### Tag 0-30: Basis & Tracking (Build) -* **App:** "Meine Pflanze ist krank" Fast-Path bauen. Diagnose-Output standardisieren (Confidence Score, Schweregrad). -* **Tracking:** Den gesamten Funnel sauber in PostHog tracken. -* **Marketing:** Instagram-Engine starten (3 Pillars, 12 Posts). Lead Magnet ("Emergency Checklist") live schalten. -* **Metriken:** First-Diagnosis Rate, 7-Tage Re-Scan, Upgrade-Rate messen. - -### Tag 31-60: Onboarding & Aktivierung optimieren -* **App:** Follow-up Reminder (Push-Benachrichtigungen!) & Vorher/Nachher-Logging einbauen. -* **Testing:** Wöchentliche A/B-Tests für Paywalls (Wert-basiert) und Onboarding-Geschwindigkeit. -* **Marketing:** Gewinner-Formate auf IG identifizieren und verdoppeln. Erfolgsgeschichten (% gerettet) veröffentlichen. - -### Tag 61-90: Monetarisierung & Skalierung -* **App:** Pricing anpassen (z.B. "Plant ER Case Bundles" im Pro-Abo). -* **Marketing:** Top-UGC-Reels als Paid Ads mit Budget bewerben. -* **Ziele:** Bezahl-Conversion steigern, Churn in den ersten 30 Tagen senken, ROI der Ads belegen. - ---- - -## ⚙️ 5. Wichtige technische Änderungen - -Das muss ins Backend und Frontend eingebaut werden: - -1. **Einheitliches Tracking:** Events wie `plant_er_started`, `scan_submitted`, `paywall_shown`, `upgrade_purchased` müssen strikt implementiert werden. -2. **Erweitertes AI-Modell:** Die Antwort der OpenAI muss klare Felder liefern: - * `confidence_score`: Wie sicher ist die AI? - * `primary_cause`: Hauptursache. - * `severity`: Schweregrad (z.B. kritisch, mittel). - * `recommended_actions`: Konkrete Schritte in einem Array. - * `followup_due_at`: Wann soll der nächste Scan passieren? -3. **Outcome Tracking:** Speichern, wie viele Tage es zur Verbesserung gebraucht hat. - ---- - -## ⚠️ 6. Risiken & Lösungen - -Was den Erfolg gefährden kann – und wie wir es verhindern. - -> [!WARNING] -> **Risiko:** Die KI-Diagnose wirkt unglaubwürdig (User kündigen). -> **Lösung:** Confidence-Score transparent anzeigen + ehrliche Begründungen liefern + Follow-ups erzwingen. - -> [!WARNING] -> **Risiko:** Die frühe Paywall blockiert User beim Onboarding. -> **Lösung:** Erst Value (Diagnosen-Ergebnis), dann Monetarisierung (Behandlungsplan/Top-ups). - -> [!WARNING] -> **Risiko:** Push-Notifications kommen nicht an, Follow-ups sterben. -> **Lösung:** Opt-In für News *nicht* beim App-Start abfragen, sondern exakt dann, wenn der Behandlungsplan erstellt wird ("Sollen wir dich in 24h ans Gießen erinnern?"). - -> [!WARNING] -> **Risiko:** Die "GUIDE" DM-Strategie generiert Traffic, aber keine Installs. -> **Lösung:** Die Checkliste darf kein fertiges PDF sein, sondern ein Teaser, der den Nutzer für die finale Lösung in den Web-Scanner oder die App zieht. +# 🌿 GreenLens: Der 90-Tage Masterplan + +**Mission:** Einen verlässlichen, wiederholbaren Funnel für urbane Pflanzen-Anfänger aufbauen, deren Pflanzen gerade sterben (Der "Plant ER" Wedge). +**Ziel nach 90 Tagen:** Messbare Verbesserungen bei der Aktivierung, der Paid-Conversion und dem ROI aus organischem Short-Form-Content (UGC). + +--- + +## 🎯 1. Die Strategie (Der "Wedge") + +Anstatt eine generische Pflege-App zu sein, positioniert sich GreenLens als **Notaufnahme für Pflanzen (Plant ER)**. + +* **Zielgruppe (ICP):** Urbane Anfänger, die ihre Pflanzen lieben, aber nicht verstehen. +* **Der Schmerz (Buying Trigger):** Akute Panik. Gelbe Blätter, hängende Köpfe, Schädlinge. Die Angst, die Pflanze zu verlieren. +* **Die Lösung:** Schnelle Diagnose + Klarer, sofort umsetzbarer Aktionsplan. + +--- + +## 📱 2. Die User Journey (App Funnel) + +Der Weg des Nutzers vom Problem bis zur Heilung – und wie wir damit Geld verdienen. + +| Schritt | Was passiert? | Monetarisierung | Wichtigste Metrik (KPI) | +| :--- | :--- | :--- | :--- | +| **1. Panik!** | User bemerkt Symptom & öffnet App | - | % Installs zum 1. Scan (< 10 Min) | +| **2. Diagnose** | Foto + Kontext (Licht, Wasser) erfassen | - | Scan-Abschlussrate | +| **3. Ergebnis** | AI-Diagnose (Vertrauen & Ursache) | 💰 **Ja (Credit-Verbrauch)** | Diagnose-Erfolgsrate | +| **4. Action Plan** | 7-Tage Rettungsplan starten | 💎 **Value (Aha-Moment)** | % User, die Plan starten | +| **5. Follow-Up** | 24h/72h Check-in & Re-Scan | 💰 **Ja (Credits)** | 7-Tage Re-Scan Rate | +| **6. Heilung** | Erfolg wird dokumentiert (Proof) | *Indirekt* | % gerettete Pflanzen | +| **7. Upgrade** | Paywall am perfekten Moment | 💳 **Conversion** | Kauf-Rate, ARPPU | + +> [!IMPORTANT] +> **Die goldene Regel:** Die Paywall (für Abos oder Top-Ups) erscheint erst, *nachdem* der echte Wert (die fertige Diagnose) gezeigt wurde, oder bevor der Follow-up Plan startet. + +--- + +## 🚀 3. Die Wachstums-Maschine (Instagram) + +Organisches Wachstum durch Content, der gespeichert und geteilt wird. +**Fokus:** Saves, Replies und DMs. (3 Posts / Woche, Deutsch & Englisch) + +### Die 3 Content-Pfeiler (Pillars) +1. **Plant Problems & Fixes:** Diagnose ➔ Ursache ➔ Lösung. +2. **Plant Care Basics:** Checklisten und Guides. +3. **Community / Rescue Stories:** Vorher/Nachher Rettungsaktionen (Emotionen). + +### Die stärksten Formate +* **Carousel:** "Gelbe Blätter? Die 5 Gründe & Lösungen" ➔ *Call-to-Action (CTA): Speichern (Save).* +* **Story-Quiz:** "Woran leidet diese Monstera?" ➔ *CTA: Auf Story antworten (Reply).* +* **Reel (Kurz):** Vorher/Nachher Rettung in 7 Tagen ➔ *CTA: An Freund senden (Share).* + +### Der DM-Funnel (Der Lead-Turbo) +1. **Post:** "Kommentiere GUIDE für die Notfall-Checkliste." +2. **DM 1 (Sofort):** Link zur Checkliste (Teaser!) ➔ "Mache den Pilz-Check hier: [App-Link]". +3. **DM 2 (24h später):** "Hat es deiner Pflanze geholfen?" (Feedback & Conversion). + +--- + +## 🛠️ 4. Der 90-Tage Umsetzungsplan + +Eine klare Roadmap von der Basis bis zur Skalierung. + +### Tag 0-30: Basis & Tracking (Build) +* **App:** "Meine Pflanze ist krank" Fast-Path bauen. Diagnose-Output standardisieren (Confidence Score, Schweregrad). +* **Tracking:** Den gesamten Funnel sauber in PostHog tracken. +* **Marketing:** Instagram-Engine starten (3 Pillars, 12 Posts). Lead Magnet ("Emergency Checklist") live schalten. +* **Metriken:** First-Diagnosis Rate, 7-Tage Re-Scan, Upgrade-Rate messen. + +### Tag 31-60: Onboarding & Aktivierung optimieren +* **App:** Follow-up Reminder (Push-Benachrichtigungen!) & Vorher/Nachher-Logging einbauen. +* **Testing:** Wöchentliche A/B-Tests für Paywalls (Wert-basiert) und Onboarding-Geschwindigkeit. +* **Marketing:** Gewinner-Formate auf IG identifizieren und verdoppeln. Erfolgsgeschichten (% gerettet) veröffentlichen. + +### Tag 61-90: Monetarisierung & Skalierung +* **App:** Pricing anpassen (z.B. "Plant ER Case Bundles" im Pro-Abo). +* **Marketing:** Top-UGC-Reels als Paid Ads mit Budget bewerben. +* **Ziele:** Bezahl-Conversion steigern, Churn in den ersten 30 Tagen senken, ROI der Ads belegen. + +--- + +## ⚙️ 5. Wichtige technische Änderungen + +Das muss ins Backend und Frontend eingebaut werden: + +1. **Einheitliches Tracking:** Events wie `plant_er_started`, `scan_submitted`, `paywall_shown`, `upgrade_purchased` müssen strikt implementiert werden. +2. **Erweitertes AI-Modell:** Die Antwort der OpenAI muss klare Felder liefern: + * `confidence_score`: Wie sicher ist die AI? + * `primary_cause`: Hauptursache. + * `severity`: Schweregrad (z.B. kritisch, mittel). + * `recommended_actions`: Konkrete Schritte in einem Array. + * `followup_due_at`: Wann soll der nächste Scan passieren? +3. **Outcome Tracking:** Speichern, wie viele Tage es zur Verbesserung gebraucht hat. + +--- + +## ⚠️ 6. Risiken & Lösungen + +Was den Erfolg gefährden kann – und wie wir es verhindern. + +> [!WARNING] +> **Risiko:** Die KI-Diagnose wirkt unglaubwürdig (User kündigen). +> **Lösung:** Confidence-Score transparent anzeigen + ehrliche Begründungen liefern + Follow-ups erzwingen. + +> [!WARNING] +> **Risiko:** Die frühe Paywall blockiert User beim Onboarding. +> **Lösung:** Erst Value (Diagnosen-Ergebnis), dann Monetarisierung (Behandlungsplan/Top-ups). + +> [!WARNING] +> **Risiko:** Push-Notifications kommen nicht an, Follow-ups sterben. +> **Lösung:** Opt-In für News *nicht* beim App-Start abfragen, sondern exakt dann, wenn der Behandlungsplan erstellt wird ("Sollen wir dich in 24h ans Gießen erinnern?"). + +> [!WARNING] +> **Risiko:** Die "GUIDE" DM-Strategie generiert Traffic, aber keine Installs. +> **Lösung:** Die Checkliste darf kein fertiges PDF sein, sondern ein Teaser, der den Nutzer für die finale Lösung in den Web-Scanner oder die App zieht. diff --git a/greenlns-landing/.dockerignore b/greenlns-landing/.dockerignore index 7b54516..1436cf4 100644 --- a/greenlns-landing/.dockerignore +++ b/greenlns-landing/.dockerignore @@ -1,7 +1,7 @@ -node_modules -.next -.git -.env* -*.md -nginx -docker-compose.yml +node_modules +.next +.git +.env* +*.md +nginx +docker-compose.yml diff --git a/greenlns-landing/.gitignore b/greenlns-landing/.gitignore index 5ef6a52..517252d 100644 --- a/greenlns-landing/.gitignore +++ b/greenlns-landing/.gitignore @@ -1,41 +1,41 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# dependencies -/node_modules -/.pnp -.pnp.* -.yarn/* -!.yarn/patches -!.yarn/plugins -!.yarn/releases -!.yarn/versions - -# testing -/coverage - -# next.js -/.next/ -/out/ - -# production -/build - -# misc -.DS_Store -*.pem - -# debug -npm-debug.log* -yarn-debug.log* -yarn-error.log* -.pnpm-debug.log* - -# env files (can opt-in for committing if needed) -.env* - -# vercel -.vercel - -# typescript -*.tsbuildinfo -next-env.d.ts +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/versions + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# env files (can opt-in for committing if needed) +.env* + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/greenlns-landing/Dockerfile b/greenlns-landing/Dockerfile index f2efa3a..e7f4886 100644 --- a/greenlns-landing/Dockerfile +++ b/greenlns-landing/Dockerfile @@ -1,33 +1,33 @@ -FROM node:20-alpine AS base - -# ── Dependencies ──────────────────────────────────────────────────────────── -FROM base AS deps -WORKDIR /app -COPY package*.json ./ -RUN npm ci - -# ── Builder ───────────────────────────────────────────────────────────────── -FROM base AS builder -WORKDIR /app -COPY --from=deps /app/node_modules ./node_modules -COPY . . -RUN npm run build - -# ── Runner ────────────────────────────────────────────────────────────────── -FROM base AS runner -WORKDIR /app - -ENV NODE_ENV=production - -RUN addgroup --system --gid 1001 nodejs -RUN adduser --system --uid 1001 nextjs - -COPY --from=builder /app/public ./public -COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ -COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static - -USER nextjs - -EXPOSE 3000 - -CMD ["node", "server.js"] +FROM node:20-alpine AS base + +# ── Dependencies ──────────────────────────────────────────────────────────── +FROM base AS deps +WORKDIR /app +COPY package*.json ./ +RUN npm ci + +# ── Builder ───────────────────────────────────────────────────────────────── +FROM base AS builder +WORKDIR /app +COPY --from=deps /app/node_modules ./node_modules +COPY . . +RUN npm run build + +# ── Runner ────────────────────────────────────────────────────────────────── +FROM base AS runner +WORKDIR /app + +ENV NODE_ENV=production + +RUN addgroup --system --gid 1001 nodejs +RUN adduser --system --uid 1001 nextjs + +COPY --from=builder /app/public ./public +COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ +COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static + +USER nextjs + +EXPOSE 3000 + +CMD ["node", "server.js"] diff --git a/greenlns-landing/README.md b/greenlns-landing/README.md index e215bc4..cf26081 100644 --- a/greenlns-landing/README.md +++ b/greenlns-landing/README.md @@ -1,36 +1,36 @@ -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. +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. diff --git a/greenlns-landing/app/globals.css b/greenlns-landing/app/globals.css index eac6330..d47256c 100644 --- a/greenlns-landing/app/globals.css +++ b/greenlns-landing/app/globals.css @@ -1,1322 +1,1322 @@ -@import url('https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400;0,700;0,900;1,400;1,700;1,900&family=Inter:wght@300;400;500;600;700;800&display=swap'); - -/* ============================================ - GreenLens Design System — Premium Landing - ============================================ */ - -:root { - /* Palette */ - --dark: #131f16; - --dark-alt: #1c2e21; - --green: #2a5c3f; - --green-mid: #3d7a56; - --green-light: #56a074; - --accent: #e07a50; - --accent-h: #c96840; - --cream: #f4f1e8; - --cream-alt: #eae6d8; - --white: #ffffff; - --muted: #7a8c7d; - --text-light: rgba(244, 241, 232, 0.72); - - /* Typography */ - --display: 'Playfair Display', Georgia, serif; - --body: 'Inter', -apple-system, sans-serif; - - /* Spacing */ - --s1: 0.5rem; - --s2: 1rem; - --s3: 1.5rem; - --s4: 2rem; - --s6: 3rem; - --s8: 4rem; - --s12: 6rem; - --s16: 8rem; - - /* Radii */ - --r-sm: 8px; - --r-md: 14px; - --r-lg: 24px; - --r-xl: 36px; - --r-pill: 999px; - - /* Easing */ - --ease: cubic-bezier(0.4, 0, 0.2, 1); - --ease-out: cubic-bezier(0, 0, 0.2, 1); - --t: 0.3s var(--ease); - --t-slow: 0.7s var(--ease); -} - -/* ===== RESET ===== */ -*, -*::before, -*::after { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -html { - scroll-behavior: smooth; - font-size: 16px; -} - -body { - font-family: var(--body); - color: var(--dark); - background: var(--cream); - -webkit-font-smoothing: antialiased; - overflow-x: hidden; - line-height: 1.6; -} - -a { - text-decoration: none; - color: inherit; -} - -img, -video { - display: block; - max-width: 100%; -} - -ul { - list-style: none; -} - -button { - cursor: pointer; - font-family: inherit; -} - -/* ===== TYPOGRAPHY ===== */ -h1, -h2, -h3, -h4 { - font-family: var(--display); - line-height: 1.04; - font-weight: 900; -} - -h1 { - font-size: clamp(2.8rem, 6vw, 5.5rem); -} - -h2 { - font-size: clamp(2.2rem, 4.5vw, 4.2rem); -} - -h3 { - font-size: clamp(1.5rem, 2.5vw, 2.2rem); -} - -/* ===== UTILITY ===== */ -.container { - width: 100%; - max-width: 1320px; - margin: 0 auto; - padding: 0 var(--s4); -} - -.tag { - display: inline-block; - font-family: var(--body); - font-size: 0.7rem; - font-weight: 700; - letter-spacing: 0.18em; - text-transform: uppercase; - color: var(--accent); - margin-bottom: var(--s2); -} - -.sr-only { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0, 0, 0, 0); - border: 0; -} - -/* ===== REVEAL ANIMATIONS ===== */ -.reveal { - opacity: 0; - transform: translateY(36px); - transition: opacity 0.9s var(--ease-out), transform 0.9s var(--ease-out); -} - -.reveal.active { - opacity: 1; - transform: translateY(0); -} - -.reveal-fade { - opacity: 0; - transition: opacity 1s var(--ease-out); -} - -.reveal-fade.active { - opacity: 1; -} - -.delay-1 { - transition-delay: 0.12s; -} - -.delay-2 { - transition-delay: 0.24s; -} - -.delay-3 { - transition-delay: 0.36s; -} - -.delay-4 { - transition-delay: 0.48s; -} - -.delay-5 { - transition-delay: 0.60s; -} - -/* ============================================= - NAVBAR - ============================================= */ -.navbar { - position: fixed; - inset: 0 0 auto 0; - z-index: 999; - padding: var(--s2) 0; - transition: background var(--t), padding var(--t), box-shadow var(--t); -} - -.navbar.scrolled { - background: rgba(19, 31, 22, 0.93); - backdrop-filter: blur(18px) saturate(160%); - -webkit-backdrop-filter: blur(18px) saturate(160%); - padding: 0.65rem 0; - box-shadow: 0 2px 40px rgba(0, 0, 0, 0.25); -} - -.navbar .container { - display: flex; - align-items: center; - justify-content: space-between; -} - -.nav-logo { - font-family: var(--display); - font-size: 1.3rem; - font-weight: 900; - color: var(--cream); - letter-spacing: 0.08em; -} - -.nav-links { - display: flex; - align-items: center; - gap: var(--s4); -} - -.nav-links a { - font-size: 0.8rem; - font-weight: 500; - color: var(--text-light); - letter-spacing: 0.04em; - transition: color var(--t); -} - -.nav-links a:hover { - color: var(--cream); -} - -.nav-cta { - background: var(--accent) !important; - color: #fff !important; - padding: 0.6rem 1.4rem; - border-radius: var(--r-pill); - font-weight: 600 !important; - font-size: 0.8rem !important; - transition: background var(--t), transform var(--t), box-shadow var(--t) !important; -} - -.nav-cta:hover { - background: var(--accent-h) !important; - transform: scale(1.04); - box-shadow: 0 6px 24px rgba(224, 122, 80, 0.35); -} - -.nav-hamburger { - display: none; - flex-direction: column; - gap: 5px; - background: none; - border: none; - padding: 4px; -} - -.nav-hamburger span { - display: block; - width: 22px; - height: 2px; - background: var(--cream); - border-radius: 2px; - transition: var(--t); -} - -/* ============================================= - HERO - ============================================= */ -.hero { - position: relative; - min-height: 100vh; - background: var(--dark); - overflow: hidden; - display: flex; - align-items: center; - padding: var(--s16) 0 var(--s12); -} - -.hero-bg-image { - position: absolute; - inset: 0; - background-size: cover; - background-position: center 20%; - opacity: 0.25; - transform: scale(1.05); - transition: transform 8s ease; -} - -.hero-bg-image.loaded { - transform: scale(1); -} - -.hero-bg-overlay { - position: absolute; - inset: 0; - background: linear-gradient(105deg, - rgba(13, 22, 15, 0.92) 0%, - rgba(19, 31, 22, 0.75) 45%, - rgba(19, 31, 22, 0.3) 100%); -} - -.hero .container { - display: grid; - grid-template-columns: 1fr 1fr; - gap: var(--s8); - align-items: center; - position: relative; - z-index: 2; -} - - -.hero-eyebrow { - display: flex; - align-items: center; - gap: var(--s2); - margin-bottom: var(--s3); -} - -.hero-eyebrow-dot { - width: 6px; - height: 6px; - border-radius: 50%; - background: var(--accent); -} - -.hero-eyebrow-text { - font-size: 0.72rem; - font-weight: 600; - letter-spacing: 0.2em; - text-transform: uppercase; - color: var(--accent); -} - -.hero h1 { - color: var(--cream); - margin-bottom: var(--s4); -} - -.hero h1 em { - display: block; - font-style: italic; - background: linear-gradient(135deg, var(--green-light), var(--green-mid)); - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - background-clip: text; -} - -.hero-desc { - font-size: 1.08rem; - color: var(--text-light); - max-width: 400px; - line-height: 1.75; - margin-bottom: var(--s4); -} - -.hero-actions { - display: flex; - gap: var(--s2); - align-items: center; - flex-wrap: wrap; -} - -.btn-primary { - display: inline-flex; - align-items: center; - gap: 0.5rem; - background: var(--accent); - color: #fff; - padding: 1rem 2.2rem; - border-radius: var(--r-pill); - font-size: 0.9rem; - font-weight: 700; - border: none; - transition: background var(--t), transform var(--t), box-shadow var(--t); -} - -.btn-primary:hover { - background: var(--accent-h); - transform: translateY(-3px); - box-shadow: 0 12px 36px rgba(224, 122, 80, 0.4); -} - -.btn-outline { - display: inline-flex; - align-items: center; - gap: 0.5rem; - background: transparent; - color: var(--cream); - padding: 1rem 2rem; - border-radius: var(--r-pill); - font-size: 0.9rem; - font-weight: 500; - border: 1.5px solid rgba(244, 241, 232, 0.28); - transition: border-color var(--t), background var(--t); -} - -.btn-outline:hover { - border-color: rgba(244, 241, 232, 0.6); - background: rgba(244, 241, 232, 0.07); -} - - -/* Hero visual */ -.hero-visual { - position: relative; - display: flex; - justify-content: center; -} - -.hero-video-card { - position: relative; - border-radius: var(--r-xl); - overflow: hidden; - width: 100%; - max-width: 560px; - aspect-ratio: 9/11; - box-shadow: - 0 40px 100px rgba(0, 0, 0, 0.5), - 0 0 0 1px rgba(244, 241, 232, 0.06); -} - -.hero-video-16-9 { - aspect-ratio: 16/9; - max-width: 800px; -} - -.hero-video-card video { - width: 100%; - height: 100%; - object-fit: cover; -} - -.hero-video-card-overlay { - position: absolute; - inset: 0; - background: linear-gradient(to bottom, transparent 50%, rgba(13, 22, 15, 0.6) 100%); -} - -.hero-video-badge { - position: absolute; - bottom: var(--s3); - left: var(--s3); - background: rgba(19, 31, 22, 0.8); - backdrop-filter: blur(12px); - border: 1px solid rgba(244, 241, 232, 0.12); - border-radius: var(--r-md); - padding: var(--s2) var(--s3); - color: var(--cream); - font-size: 0.78rem; - font-weight: 600; - display: flex; - align-items: center; - gap: var(--s1); -} - -.hero-video-badge-dot { - width: 8px; - height: 8px; - border-radius: 50%; - background: #4ebb6c; - animation: pulse-dot 2s ease-in-out infinite; -} - -@keyframes pulse-dot { - - 0%, - 100% { - opacity: 1; - transform: scale(1); - } - - 50% { - opacity: 0.6; - transform: scale(1.4); - } -} - - -/* ============================================= - TICKER / MARQUEE - ============================================= */ -.ticker-wrap { - background: var(--dark-alt); - border-top: 1px solid rgba(244, 241, 232, 0.07); - border-bottom: 1px solid rgba(244, 241, 232, 0.07); - overflow: hidden; - padding: var(--s2) 0; - position: relative; -} - -.ticker-track { - display: flex; - gap: 0; - white-space: nowrap; - animation: ticker 22s linear infinite; - will-change: transform; -} - -.ticker-item { - display: inline-flex; - align-items: center; - gap: var(--s3); - font-family: var(--display); - font-size: clamp(1.3rem, 2.5vw, 1.8rem); - font-weight: 700; - font-style: italic; - color: rgba(244, 241, 232, 0.85); - padding-right: var(--s6); -} - -.ticker-dot { - width: 8px; - height: 8px; - border-radius: 50%; - background: var(--accent); - flex-shrink: 0; -} - -@keyframes ticker { - from { - transform: translateX(0); - } - - to { - transform: translateX(-50%); - } -} - -/* ============================================= - FEATURES - ============================================= */ -.features { - padding: var(--s16) 0; - background: var(--cream); -} - -.features-header { - text-align: center; - max-width: 620px; - margin: 0 auto var(--s12); -} - -.features-header h2 { - color: var(--dark); - margin-bottom: var(--s2); -} - -.features-header p { - color: var(--muted); - font-size: 1.05rem; - line-height: 1.75; -} - -/* Bento grid */ -.bento-grid { - display: grid; - grid-template-columns: 1fr 1fr; - grid-template-rows: auto auto; - gap: var(--s3); -} - -.bento-grid-right { - display: grid; - grid-template-rows: 1fr 1fr; - gap: var(--s3); -} - -.bento-card { - position: relative; - border-radius: var(--r-xl); - overflow: hidden; - display: flex; - flex-direction: column; - justify-content: flex-end; - transition: transform var(--t-slow), box-shadow var(--t-slow); -} - -.bento-card:hover { - transform: translateY(-6px); - box-shadow: 0 20px 60px rgba(0, 0, 0, 0.18); -} - -.bento-card-img { - position: absolute; - inset: 0; - width: 100%; - height: 100%; - object-fit: cover; - transition: transform var(--t-slow); -} - -.bento-card:hover .bento-card-img { - transform: scale(1.04); -} - -.bento-card-overlay { - position: absolute; - inset: 0; - background: linear-gradient(to top, rgba(13, 22, 15, 0.92) 0%, rgba(13, 22, 15, 0.25) 55%, transparent 100%); -} - -.bento-card-content { - position: relative; - z-index: 2; - padding: var(--s4); -} - -.bento-card h3 { - color: var(--cream); - margin-bottom: var(--s1); -} - -.bento-card p { - color: var(--text-light); - font-size: 0.88rem; - line-height: 1.65; - max-width: 320px; -} - -.bento-large { - min-height: 560px; -} - -.bento-small { - min-height: 260px; -} - -/* feature-chip tag */ -.bento-chip { - display: inline-block; - background: var(--accent); - color: #fff; - font-size: 0.66rem; - font-weight: 800; - letter-spacing: 0.12em; - text-transform: uppercase; - padding: 0.28rem 0.7rem; - border-radius: var(--r-pill); - margin-bottom: var(--s2); -} - -/* small feature bullets below grid */ -.features-pills { - display: grid; - grid-template-columns: repeat(3, 1fr); - gap: var(--s3); - margin-top: var(--s3); -} - -.feature-pill { - background: var(--white); - border-radius: var(--r-lg); - padding: var(--s4); - display: flex; - gap: var(--s3); - align-items: flex-start; - border: 1px solid rgba(42, 92, 63, 0.08); - transition: transform var(--t), box-shadow var(--t); -} - -.feature-pill:hover { - transform: translateY(-4px); - box-shadow: 0 10px 40px rgba(42, 92, 63, 0.1); -} - -.feature-pill-icon { - width: 44px; - height: 44px; - min-width: 44px; - border-radius: var(--r-sm); - background: var(--dark); - display: flex; - align-items: center; - justify-content: center; - font-size: 1.2rem; -} - -.feature-pill-text h4 { - font-family: var(--body); - font-size: 0.92rem; - font-weight: 700; - color: var(--dark); - margin-bottom: 2px; -} - -.feature-pill-text p { - font-size: 0.8rem; - color: var(--muted); - line-height: 1.55; -} - -/* ============================================= - BOTANICAL INTELLIGENCE - ============================================= */ -.intelligence { - padding: var(--s16) 0; - background: var(--white); - overflow: hidden; -} - -.intelligence .container { - display: grid; - grid-template-columns: 1fr 1fr; - gap: var(--s12); - align-items: center; -} - -.intelligence-text h2 { - color: var(--dark); - margin-bottom: var(--s4); -} - -.intelligence-text h2 em { - display: block; - font-style: italic; - color: var(--green); -} - -.intelligence-text>p { - font-size: 1.05rem; - color: var(--muted); - line-height: 1.8; - margin-bottom: var(--s6); -} - -.intelligence-list { - display: flex; - flex-direction: column; - gap: var(--s2); -} - -.intelligence-item { - display: grid; - grid-template-columns: 44px 1fr; - gap: var(--s2); - align-items: center; - padding: var(--s2) var(--s3); - border-radius: var(--r-md); - transition: background var(--t); -} - -.intelligence-item:hover { - background: var(--cream); -} - -.intelligence-item-icon { - width: 44px; - height: 44px; - background: var(--dark); - border-radius: var(--r-sm); - display: flex; - align-items: center; - justify-content: center; - font-size: 1.1rem; -} - -.intelligence-item h4 { - font-family: var(--body); - font-size: 0.9rem; - font-weight: 700; - color: var(--dark); -} - -.intelligence-item p { - font-size: 0.8rem; - color: var(--muted); - margin-top: 1px; -} - -/* Visual side */ -.intelligence-visual { - position: relative; -} - -.intelligence-img-frame { - border-radius: var(--r-xl); - overflow: hidden; - aspect-ratio: 4/5; - position: relative; - box-shadow: 0 30px 80px rgba(13, 22, 15, 0.2); -} - -.intelligence-img-frame img { - width: 100%; - height: 100%; - object-fit: cover; -} - -.intelligence-img-overlay { - position: absolute; - inset: 0; - background: linear-gradient(160deg, rgba(13, 22, 15, 0.3) 0%, transparent 60%); -} - -.intelligence-overlay-text { - position: absolute; - top: var(--s4); - left: var(--s4); - right: var(--s4); -} - -.intelligence-overlay-text h3 { - color: var(--cream); - font-size: clamp(1.8rem, 3vw, 2.8rem); - text-shadow: 0 2px 20px rgba(0, 0, 0, 0.4); -} - -.intelligence-overlay-text h3 em { - color: var(--green-light); - font-style: italic; -} - - -/* ============================================= - HOW IT WORKS (steps) - ============================================= */ -.how { - padding: var(--s16) 0; - background: var(--cream-alt); -} - -.how .container { - display: grid; - grid-template-columns: 1fr 1.3fr; - gap: var(--s12); - align-items: center; -} - -.how-text h2 { - color: var(--dark); - margin-bottom: var(--s4); -} - -.how-text h2 em { - font-style: italic; - color: var(--green); -} - -.how-steps { - display: flex; - flex-direction: column; - gap: var(--s4); - margin-top: var(--s6); -} - -.how-step { - display: grid; - grid-template-columns: 52px 1fr; - gap: var(--s3); - align-items: flex-start; -} - -.how-step-num { - font-family: var(--display); - font-size: 2.5rem; - font-weight: 900; - color: rgba(42, 92, 63, 0.15); - line-height: 1; - user-select: none; -} - -.how-step h4 { - font-family: var(--body); - font-size: 0.95rem; - font-weight: 700; - color: var(--dark); - margin-bottom: 4px; -} - -.how-step p { - font-size: 0.85rem; - color: var(--muted); - line-height: 1.65; -} - -.how-visual { - position: relative; -} - -.how-img-wrap { - border-radius: var(--r-xl); - overflow: hidden; - aspect-ratio: 3/4; - box-shadow: 0 30px 80px rgba(0, 0, 0, 0.18); -} - -.how-img-wrap img { - width: 100%; - height: 100%; - object-fit: cover; -} - - -/* ============================================= - CTA – "Join the Jungle" - ============================================= */ -.cta-section { - padding: var(--s8) 0 0; - background: var(--dark); -} - -.cta-card { - background: var(--dark); - border-radius: var(--r-xl); - overflow: hidden; - display: grid; - grid-template-columns: 1fr 1fr; - min-height: 480px; - position: relative; - box-shadow: 0 30px 80px rgba(13, 22, 15, 0.2); -} - -.cta-card-glow { - position: absolute; - width: 500px; - height: 500px; - border-radius: 50%; - background: radial-gradient(circle, rgba(86, 160, 116, 0.2) 0%, transparent 70%); - top: -120px; - right: -100px; - pointer-events: none; - filter: blur(60px); -} - -.cta-content { - padding: var(--s12) var(--s8); - position: relative; - z-index: 2; - display: flex; - flex-direction: column; - justify-content: center; -} - -.cta-content h2 { - color: var(--cream); - margin-bottom: var(--s3); -} - -.cta-content h2 em { - font-style: italic; - color: var(--green-light); -} - -.cta-content p { - color: var(--text-light); - font-size: 1.05rem; - line-height: 1.75; - margin-bottom: var(--s6); - max-width: 400px; -} - - -.store-row { - display: flex; - gap: var(--s2); - flex-wrap: wrap; -} - -.cta-footnote { - margin-top: var(--s3); - color: var(--text-light); - font-size: 0.82rem; -} - -.cta-footnote a { - text-decoration: underline; - text-underline-offset: 3px; -} - -.store-btn { - display: inline-flex; - align-items: center; - gap: 0.65rem; - background: rgba(244, 241, 232, 0.08); - border: 1.5px solid rgba(244, 241, 232, 0.18); - color: var(--cream); - padding: 0.85rem 1.5rem; - border-radius: var(--r-md); - font-size: 0.82rem; - font-weight: 600; - transition: background var(--t), border-color var(--t), transform var(--t); -} - -.store-btn:hover { - background: rgba(244, 241, 232, 0.14); - border-color: rgba(244, 241, 232, 0.35); - transform: translateY(-2px); -} - -.store-btn-icon { - font-size: 1.5rem; -} - -.store-btn-small { - display: block; - font-size: 0.62rem; - opacity: 0.65; - font-weight: 400; -} - -.store-btn-big { - font-size: 0.92rem; -} - -.cta-visual { - position: relative; - overflow: hidden; -} - -.cta-visual img { - width: 100%; - height: 100%; - object-fit: cover; - opacity: 0.5; - filter: saturate(1.3); -} - -.cta-visual-overlay { - position: absolute; - inset: 0; - background: linear-gradient(to right, var(--dark) 0%, transparent 40%); -} - -/* ============================================= - FOOTER - ============================================= */ -.footer { - background: var(--dark); - padding: var(--s12) 0 var(--s4); - color: var(--cream); -} - -.footer-inner { - display: grid; - grid-template-columns: 1.4fr repeat(3, 1fr); - gap: var(--s8); - padding-bottom: var(--s8); - border-bottom: 1px solid rgba(244, 241, 232, 0.08); -} - -.footer-brand-desc { - color: var(--text-light); - font-size: 0.85rem; - line-height: 1.75; - margin-top: var(--s2); - max-width: 260px; -} - -.footer-col-title { - font-family: var(--body); - font-size: 0.7rem; - font-weight: 700; - letter-spacing: 0.12em; - text-transform: uppercase; - color: var(--cream); - margin-bottom: var(--s3); -} - -.footer-col a { - display: block; - color: var(--text-light); - font-size: 0.84rem; - padding: 0.2rem 0; - transition: color var(--t); -} - -.footer-col a:hover { - color: var(--cream); -} - -.footer-brand-xl { - font-family: var(--display); - font-size: clamp(5rem, 12vw, 11rem); - font-weight: 900; - color: rgba(244, 241, 232, 0.045); - text-align: center; - line-height: 1; - padding: var(--s8) 0 var(--s4); - user-select: none; - letter-spacing: -0.02em; - overflow: hidden; -} - -.footer-bottom { - display: flex; - justify-content: space-between; - align-items: center; - border-top: 1px solid rgba(244, 241, 232, 0.05); - padding-top: var(--s3); -} - -.footer-bottom p { - font-size: 0.72rem; - color: var(--text-light); -} - -.footer-contact { - color: var(--cream); - font-size: 0.8rem; - font-weight: 600; -} - -.support-page { - background: - radial-gradient(circle at top left, rgba(86, 160, 116, 0.12), transparent 28%), - linear-gradient(180deg, var(--cream) 0%, var(--white) 100%); - min-height: 100vh; -} - -.support-hero { - padding: 11rem 0 4rem; -} - -.support-hero-inner { - max-width: 880px; -} - -.support-hero-inner h1 { - max-width: 900px; - margin-bottom: var(--s3); -} - -.support-lead { - max-width: 680px; - color: var(--muted); - font-size: 1.05rem; -} - -.support-actions { - display: flex; - gap: var(--s2); - flex-wrap: wrap; - margin-top: var(--s4); -} - -.support-outline { - color: var(--dark); - border-color: rgba(19, 31, 22, 0.16); -} - -.support-outline:hover { - background: rgba(19, 31, 22, 0.04); -} - -.support-grid-wrap { - padding: 0 0 var(--s8); -} - -.support-grid { - display: grid; - grid-template-columns: repeat(3, 1fr); - gap: var(--s3); -} - -.support-card, -.support-faq-item { - background: rgba(255, 255, 255, 0.75); - border: 1px solid rgba(19, 31, 22, 0.08); - border-radius: var(--r-lg); - box-shadow: 0 24px 60px rgba(19, 31, 22, 0.05); -} - -.support-card { - padding: var(--s4); -} - -.support-card h2 { - font-size: clamp(1.45rem, 2vw, 1.9rem); - margin-bottom: var(--s2); -} - -.support-card p, -.support-card li { - color: var(--muted); -} - -.support-list { - list-style: disc; - padding-left: 1.2rem; -} - -.support-faq { - padding: 0 0 var(--s16); -} - -.support-section-head { - max-width: 760px; - margin-bottom: var(--s4); -} - -.support-faq-list { - display: grid; - grid-template-columns: 1fr 1fr; - gap: var(--s3); -} - -.support-faq-item { - padding: var(--s4); -} - -.support-faq-item h3 { - font-size: 1.25rem; - margin-bottom: var(--s2); -} - -.support-faq-item p { - color: var(--muted); -} - -/* ============================================= - RESPONSIVE - ============================================= */ -@media (max-width: 1024px) { - .hero .container { - grid-template-columns: 1fr; - } - - .hero-visual { - display: none; - } - - .hero h1 { - text-align: center; - } - - .hero-desc { - text-align: center; - max-width: 100%; - } - - .hero-actions { - justify-content: center; - } - - - .hero-eyebrow { - justify-content: center; - } - - .intelligence .container { - grid-template-columns: 1fr; - } - - .intelligence-visual { - display: none; - } - - .how .container { - grid-template-columns: 1fr; - } - - .how-visual { - display: none; - } - - .cta-card { - grid-template-columns: 1fr; - } - - .cta-visual { - display: none; - } - - .footer-inner { - grid-template-columns: 1fr 1fr; - gap: var(--s6); - } -} - -@media (max-width: 768px) { - .nav-links { - display: none; - } - - .nav-hamburger { - display: flex; - } - - .bento-grid { - grid-template-columns: 1fr; - } - - .bento-grid-right { - grid-template-columns: 1fr 1fr; - grid-template-rows: auto; - } - - .bento-large { - min-height: 400px; - } - - .bento-small { - min-height: 200px; - } - - .features-pills { - grid-template-columns: 1fr; - } - - - - .footer-inner { - grid-template-columns: 1fr; - gap: var(--s4); - } - - .footer-bottom { - flex-direction: column; - gap: var(--s2); - text-align: center; - } - - .support-grid, - .support-faq-list { - grid-template-columns: 1fr; - } -} +@import url('https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400;0,700;0,900;1,400;1,700;1,900&family=Inter:wght@300;400;500;600;700;800&display=swap'); + +/* ============================================ + GreenLens Design System — Premium Landing + ============================================ */ + +:root { + /* Palette */ + --dark: #131f16; + --dark-alt: #1c2e21; + --green: #2a5c3f; + --green-mid: #3d7a56; + --green-light: #56a074; + --accent: #e07a50; + --accent-h: #c96840; + --cream: #f4f1e8; + --cream-alt: #eae6d8; + --white: #ffffff; + --muted: #7a8c7d; + --text-light: rgba(244, 241, 232, 0.72); + + /* Typography */ + --display: 'Playfair Display', Georgia, serif; + --body: 'Inter', -apple-system, sans-serif; + + /* Spacing */ + --s1: 0.5rem; + --s2: 1rem; + --s3: 1.5rem; + --s4: 2rem; + --s6: 3rem; + --s8: 4rem; + --s12: 6rem; + --s16: 8rem; + + /* Radii */ + --r-sm: 8px; + --r-md: 14px; + --r-lg: 24px; + --r-xl: 36px; + --r-pill: 999px; + + /* Easing */ + --ease: cubic-bezier(0.4, 0, 0.2, 1); + --ease-out: cubic-bezier(0, 0, 0.2, 1); + --t: 0.3s var(--ease); + --t-slow: 0.7s var(--ease); +} + +/* ===== RESET ===== */ +*, +*::before, +*::after { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +html { + scroll-behavior: smooth; + font-size: 16px; +} + +body { + font-family: var(--body); + color: var(--dark); + background: var(--cream); + -webkit-font-smoothing: antialiased; + overflow-x: hidden; + line-height: 1.6; +} + +a { + text-decoration: none; + color: inherit; +} + +img, +video { + display: block; + max-width: 100%; +} + +ul { + list-style: none; +} + +button { + cursor: pointer; + font-family: inherit; +} + +/* ===== TYPOGRAPHY ===== */ +h1, +h2, +h3, +h4 { + font-family: var(--display); + line-height: 1.04; + font-weight: 900; +} + +h1 { + font-size: clamp(2.8rem, 6vw, 5.5rem); +} + +h2 { + font-size: clamp(2.2rem, 4.5vw, 4.2rem); +} + +h3 { + font-size: clamp(1.5rem, 2.5vw, 2.2rem); +} + +/* ===== UTILITY ===== */ +.container { + width: 100%; + max-width: 1320px; + margin: 0 auto; + padding: 0 var(--s4); +} + +.tag { + display: inline-block; + font-family: var(--body); + font-size: 0.7rem; + font-weight: 700; + letter-spacing: 0.18em; + text-transform: uppercase; + color: var(--accent); + margin-bottom: var(--s2); +} + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} + +/* ===== REVEAL ANIMATIONS ===== */ +.reveal { + opacity: 0; + transform: translateY(36px); + transition: opacity 0.9s var(--ease-out), transform 0.9s var(--ease-out); +} + +.reveal.active { + opacity: 1; + transform: translateY(0); +} + +.reveal-fade { + opacity: 0; + transition: opacity 1s var(--ease-out); +} + +.reveal-fade.active { + opacity: 1; +} + +.delay-1 { + transition-delay: 0.12s; +} + +.delay-2 { + transition-delay: 0.24s; +} + +.delay-3 { + transition-delay: 0.36s; +} + +.delay-4 { + transition-delay: 0.48s; +} + +.delay-5 { + transition-delay: 0.60s; +} + +/* ============================================= + NAVBAR + ============================================= */ +.navbar { + position: fixed; + inset: 0 0 auto 0; + z-index: 999; + padding: var(--s2) 0; + transition: background var(--t), padding var(--t), box-shadow var(--t); +} + +.navbar.scrolled { + background: rgba(19, 31, 22, 0.93); + backdrop-filter: blur(18px) saturate(160%); + -webkit-backdrop-filter: blur(18px) saturate(160%); + padding: 0.65rem 0; + box-shadow: 0 2px 40px rgba(0, 0, 0, 0.25); +} + +.navbar .container { + display: flex; + align-items: center; + justify-content: space-between; +} + +.nav-logo { + font-family: var(--display); + font-size: 1.3rem; + font-weight: 900; + color: var(--cream); + letter-spacing: 0.08em; +} + +.nav-links { + display: flex; + align-items: center; + gap: var(--s4); +} + +.nav-links a { + font-size: 0.8rem; + font-weight: 500; + color: var(--text-light); + letter-spacing: 0.04em; + transition: color var(--t); +} + +.nav-links a:hover { + color: var(--cream); +} + +.nav-cta { + background: var(--accent) !important; + color: #fff !important; + padding: 0.6rem 1.4rem; + border-radius: var(--r-pill); + font-weight: 600 !important; + font-size: 0.8rem !important; + transition: background var(--t), transform var(--t), box-shadow var(--t) !important; +} + +.nav-cta:hover { + background: var(--accent-h) !important; + transform: scale(1.04); + box-shadow: 0 6px 24px rgba(224, 122, 80, 0.35); +} + +.nav-hamburger { + display: none; + flex-direction: column; + gap: 5px; + background: none; + border: none; + padding: 4px; +} + +.nav-hamburger span { + display: block; + width: 22px; + height: 2px; + background: var(--cream); + border-radius: 2px; + transition: var(--t); +} + +/* ============================================= + HERO + ============================================= */ +.hero { + position: relative; + min-height: 100vh; + background: var(--dark); + overflow: hidden; + display: flex; + align-items: center; + padding: var(--s16) 0 var(--s12); +} + +.hero-bg-image { + position: absolute; + inset: 0; + background-size: cover; + background-position: center 20%; + opacity: 0.25; + transform: scale(1.05); + transition: transform 8s ease; +} + +.hero-bg-image.loaded { + transform: scale(1); +} + +.hero-bg-overlay { + position: absolute; + inset: 0; + background: linear-gradient(105deg, + rgba(13, 22, 15, 0.92) 0%, + rgba(19, 31, 22, 0.75) 45%, + rgba(19, 31, 22, 0.3) 100%); +} + +.hero .container { + display: grid; + grid-template-columns: 1fr 1fr; + gap: var(--s8); + align-items: center; + position: relative; + z-index: 2; +} + + +.hero-eyebrow { + display: flex; + align-items: center; + gap: var(--s2); + margin-bottom: var(--s3); +} + +.hero-eyebrow-dot { + width: 6px; + height: 6px; + border-radius: 50%; + background: var(--accent); +} + +.hero-eyebrow-text { + font-size: 0.72rem; + font-weight: 600; + letter-spacing: 0.2em; + text-transform: uppercase; + color: var(--accent); +} + +.hero h1 { + color: var(--cream); + margin-bottom: var(--s4); +} + +.hero h1 em { + display: block; + font-style: italic; + background: linear-gradient(135deg, var(--green-light), var(--green-mid)); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; +} + +.hero-desc { + font-size: 1.08rem; + color: var(--text-light); + max-width: 400px; + line-height: 1.75; + margin-bottom: var(--s4); +} + +.hero-actions { + display: flex; + gap: var(--s2); + align-items: center; + flex-wrap: wrap; +} + +.btn-primary { + display: inline-flex; + align-items: center; + gap: 0.5rem; + background: var(--accent); + color: #fff; + padding: 1rem 2.2rem; + border-radius: var(--r-pill); + font-size: 0.9rem; + font-weight: 700; + border: none; + transition: background var(--t), transform var(--t), box-shadow var(--t); +} + +.btn-primary:hover { + background: var(--accent-h); + transform: translateY(-3px); + box-shadow: 0 12px 36px rgba(224, 122, 80, 0.4); +} + +.btn-outline { + display: inline-flex; + align-items: center; + gap: 0.5rem; + background: transparent; + color: var(--cream); + padding: 1rem 2rem; + border-radius: var(--r-pill); + font-size: 0.9rem; + font-weight: 500; + border: 1.5px solid rgba(244, 241, 232, 0.28); + transition: border-color var(--t), background var(--t); +} + +.btn-outline:hover { + border-color: rgba(244, 241, 232, 0.6); + background: rgba(244, 241, 232, 0.07); +} + + +/* Hero visual */ +.hero-visual { + position: relative; + display: flex; + justify-content: center; +} + +.hero-video-card { + position: relative; + border-radius: var(--r-xl); + overflow: hidden; + width: 100%; + max-width: 560px; + aspect-ratio: 9/11; + box-shadow: + 0 40px 100px rgba(0, 0, 0, 0.5), + 0 0 0 1px rgba(244, 241, 232, 0.06); +} + +.hero-video-16-9 { + aspect-ratio: 16/9; + max-width: 800px; +} + +.hero-video-card video { + width: 100%; + height: 100%; + object-fit: cover; +} + +.hero-video-card-overlay { + position: absolute; + inset: 0; + background: linear-gradient(to bottom, transparent 50%, rgba(13, 22, 15, 0.6) 100%); +} + +.hero-video-badge { + position: absolute; + bottom: var(--s3); + left: var(--s3); + background: rgba(19, 31, 22, 0.8); + backdrop-filter: blur(12px); + border: 1px solid rgba(244, 241, 232, 0.12); + border-radius: var(--r-md); + padding: var(--s2) var(--s3); + color: var(--cream); + font-size: 0.78rem; + font-weight: 600; + display: flex; + align-items: center; + gap: var(--s1); +} + +.hero-video-badge-dot { + width: 8px; + height: 8px; + border-radius: 50%; + background: #4ebb6c; + animation: pulse-dot 2s ease-in-out infinite; +} + +@keyframes pulse-dot { + + 0%, + 100% { + opacity: 1; + transform: scale(1); + } + + 50% { + opacity: 0.6; + transform: scale(1.4); + } +} + + +/* ============================================= + TICKER / MARQUEE + ============================================= */ +.ticker-wrap { + background: var(--dark-alt); + border-top: 1px solid rgba(244, 241, 232, 0.07); + border-bottom: 1px solid rgba(244, 241, 232, 0.07); + overflow: hidden; + padding: var(--s2) 0; + position: relative; +} + +.ticker-track { + display: flex; + gap: 0; + white-space: nowrap; + animation: ticker 22s linear infinite; + will-change: transform; +} + +.ticker-item { + display: inline-flex; + align-items: center; + gap: var(--s3); + font-family: var(--display); + font-size: clamp(1.3rem, 2.5vw, 1.8rem); + font-weight: 700; + font-style: italic; + color: rgba(244, 241, 232, 0.85); + padding-right: var(--s6); +} + +.ticker-dot { + width: 8px; + height: 8px; + border-radius: 50%; + background: var(--accent); + flex-shrink: 0; +} + +@keyframes ticker { + from { + transform: translateX(0); + } + + to { + transform: translateX(-50%); + } +} + +/* ============================================= + FEATURES + ============================================= */ +.features { + padding: var(--s16) 0; + background: var(--cream); +} + +.features-header { + text-align: center; + max-width: 620px; + margin: 0 auto var(--s12); +} + +.features-header h2 { + color: var(--dark); + margin-bottom: var(--s2); +} + +.features-header p { + color: var(--muted); + font-size: 1.05rem; + line-height: 1.75; +} + +/* Bento grid */ +.bento-grid { + display: grid; + grid-template-columns: 1fr 1fr; + grid-template-rows: auto auto; + gap: var(--s3); +} + +.bento-grid-right { + display: grid; + grid-template-rows: 1fr 1fr; + gap: var(--s3); +} + +.bento-card { + position: relative; + border-radius: var(--r-xl); + overflow: hidden; + display: flex; + flex-direction: column; + justify-content: flex-end; + transition: transform var(--t-slow), box-shadow var(--t-slow); +} + +.bento-card:hover { + transform: translateY(-6px); + box-shadow: 0 20px 60px rgba(0, 0, 0, 0.18); +} + +.bento-card-img { + position: absolute; + inset: 0; + width: 100%; + height: 100%; + object-fit: cover; + transition: transform var(--t-slow); +} + +.bento-card:hover .bento-card-img { + transform: scale(1.04); +} + +.bento-card-overlay { + position: absolute; + inset: 0; + background: linear-gradient(to top, rgba(13, 22, 15, 0.92) 0%, rgba(13, 22, 15, 0.25) 55%, transparent 100%); +} + +.bento-card-content { + position: relative; + z-index: 2; + padding: var(--s4); +} + +.bento-card h3 { + color: var(--cream); + margin-bottom: var(--s1); +} + +.bento-card p { + color: var(--text-light); + font-size: 0.88rem; + line-height: 1.65; + max-width: 320px; +} + +.bento-large { + min-height: 560px; +} + +.bento-small { + min-height: 260px; +} + +/* feature-chip tag */ +.bento-chip { + display: inline-block; + background: var(--accent); + color: #fff; + font-size: 0.66rem; + font-weight: 800; + letter-spacing: 0.12em; + text-transform: uppercase; + padding: 0.28rem 0.7rem; + border-radius: var(--r-pill); + margin-bottom: var(--s2); +} + +/* small feature bullets below grid */ +.features-pills { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: var(--s3); + margin-top: var(--s3); +} + +.feature-pill { + background: var(--white); + border-radius: var(--r-lg); + padding: var(--s4); + display: flex; + gap: var(--s3); + align-items: flex-start; + border: 1px solid rgba(42, 92, 63, 0.08); + transition: transform var(--t), box-shadow var(--t); +} + +.feature-pill:hover { + transform: translateY(-4px); + box-shadow: 0 10px 40px rgba(42, 92, 63, 0.1); +} + +.feature-pill-icon { + width: 44px; + height: 44px; + min-width: 44px; + border-radius: var(--r-sm); + background: var(--dark); + display: flex; + align-items: center; + justify-content: center; + font-size: 1.2rem; +} + +.feature-pill-text h4 { + font-family: var(--body); + font-size: 0.92rem; + font-weight: 700; + color: var(--dark); + margin-bottom: 2px; +} + +.feature-pill-text p { + font-size: 0.8rem; + color: var(--muted); + line-height: 1.55; +} + +/* ============================================= + BOTANICAL INTELLIGENCE + ============================================= */ +.intelligence { + padding: var(--s16) 0; + background: var(--white); + overflow: hidden; +} + +.intelligence .container { + display: grid; + grid-template-columns: 1fr 1fr; + gap: var(--s12); + align-items: center; +} + +.intelligence-text h2 { + color: var(--dark); + margin-bottom: var(--s4); +} + +.intelligence-text h2 em { + display: block; + font-style: italic; + color: var(--green); +} + +.intelligence-text>p { + font-size: 1.05rem; + color: var(--muted); + line-height: 1.8; + margin-bottom: var(--s6); +} + +.intelligence-list { + display: flex; + flex-direction: column; + gap: var(--s2); +} + +.intelligence-item { + display: grid; + grid-template-columns: 44px 1fr; + gap: var(--s2); + align-items: center; + padding: var(--s2) var(--s3); + border-radius: var(--r-md); + transition: background var(--t); +} + +.intelligence-item:hover { + background: var(--cream); +} + +.intelligence-item-icon { + width: 44px; + height: 44px; + background: var(--dark); + border-radius: var(--r-sm); + display: flex; + align-items: center; + justify-content: center; + font-size: 1.1rem; +} + +.intelligence-item h4 { + font-family: var(--body); + font-size: 0.9rem; + font-weight: 700; + color: var(--dark); +} + +.intelligence-item p { + font-size: 0.8rem; + color: var(--muted); + margin-top: 1px; +} + +/* Visual side */ +.intelligence-visual { + position: relative; +} + +.intelligence-img-frame { + border-radius: var(--r-xl); + overflow: hidden; + aspect-ratio: 4/5; + position: relative; + box-shadow: 0 30px 80px rgba(13, 22, 15, 0.2); +} + +.intelligence-img-frame img { + width: 100%; + height: 100%; + object-fit: cover; +} + +.intelligence-img-overlay { + position: absolute; + inset: 0; + background: linear-gradient(160deg, rgba(13, 22, 15, 0.3) 0%, transparent 60%); +} + +.intelligence-overlay-text { + position: absolute; + top: var(--s4); + left: var(--s4); + right: var(--s4); +} + +.intelligence-overlay-text h3 { + color: var(--cream); + font-size: clamp(1.8rem, 3vw, 2.8rem); + text-shadow: 0 2px 20px rgba(0, 0, 0, 0.4); +} + +.intelligence-overlay-text h3 em { + color: var(--green-light); + font-style: italic; +} + + +/* ============================================= + HOW IT WORKS (steps) + ============================================= */ +.how { + padding: var(--s16) 0; + background: var(--cream-alt); +} + +.how .container { + display: grid; + grid-template-columns: 1fr 1.3fr; + gap: var(--s12); + align-items: center; +} + +.how-text h2 { + color: var(--dark); + margin-bottom: var(--s4); +} + +.how-text h2 em { + font-style: italic; + color: var(--green); +} + +.how-steps { + display: flex; + flex-direction: column; + gap: var(--s4); + margin-top: var(--s6); +} + +.how-step { + display: grid; + grid-template-columns: 52px 1fr; + gap: var(--s3); + align-items: flex-start; +} + +.how-step-num { + font-family: var(--display); + font-size: 2.5rem; + font-weight: 900; + color: rgba(42, 92, 63, 0.15); + line-height: 1; + user-select: none; +} + +.how-step h4 { + font-family: var(--body); + font-size: 0.95rem; + font-weight: 700; + color: var(--dark); + margin-bottom: 4px; +} + +.how-step p { + font-size: 0.85rem; + color: var(--muted); + line-height: 1.65; +} + +.how-visual { + position: relative; +} + +.how-img-wrap { + border-radius: var(--r-xl); + overflow: hidden; + aspect-ratio: 3/4; + box-shadow: 0 30px 80px rgba(0, 0, 0, 0.18); +} + +.how-img-wrap img { + width: 100%; + height: 100%; + object-fit: cover; +} + + +/* ============================================= + CTA – "Join the Jungle" + ============================================= */ +.cta-section { + padding: var(--s8) 0 0; + background: var(--dark); +} + +.cta-card { + background: var(--dark); + border-radius: var(--r-xl); + overflow: hidden; + display: grid; + grid-template-columns: 1fr 1fr; + min-height: 480px; + position: relative; + box-shadow: 0 30px 80px rgba(13, 22, 15, 0.2); +} + +.cta-card-glow { + position: absolute; + width: 500px; + height: 500px; + border-radius: 50%; + background: radial-gradient(circle, rgba(86, 160, 116, 0.2) 0%, transparent 70%); + top: -120px; + right: -100px; + pointer-events: none; + filter: blur(60px); +} + +.cta-content { + padding: var(--s12) var(--s8); + position: relative; + z-index: 2; + display: flex; + flex-direction: column; + justify-content: center; +} + +.cta-content h2 { + color: var(--cream); + margin-bottom: var(--s3); +} + +.cta-content h2 em { + font-style: italic; + color: var(--green-light); +} + +.cta-content p { + color: var(--text-light); + font-size: 1.05rem; + line-height: 1.75; + margin-bottom: var(--s6); + max-width: 400px; +} + + +.store-row { + display: flex; + gap: var(--s2); + flex-wrap: wrap; +} + +.cta-footnote { + margin-top: var(--s3); + color: var(--text-light); + font-size: 0.82rem; +} + +.cta-footnote a { + text-decoration: underline; + text-underline-offset: 3px; +} + +.store-btn { + display: inline-flex; + align-items: center; + gap: 0.65rem; + background: rgba(244, 241, 232, 0.08); + border: 1.5px solid rgba(244, 241, 232, 0.18); + color: var(--cream); + padding: 0.85rem 1.5rem; + border-radius: var(--r-md); + font-size: 0.82rem; + font-weight: 600; + transition: background var(--t), border-color var(--t), transform var(--t); +} + +.store-btn:hover { + background: rgba(244, 241, 232, 0.14); + border-color: rgba(244, 241, 232, 0.35); + transform: translateY(-2px); +} + +.store-btn-icon { + font-size: 1.5rem; +} + +.store-btn-small { + display: block; + font-size: 0.62rem; + opacity: 0.65; + font-weight: 400; +} + +.store-btn-big { + font-size: 0.92rem; +} + +.cta-visual { + position: relative; + overflow: hidden; +} + +.cta-visual img { + width: 100%; + height: 100%; + object-fit: cover; + opacity: 0.5; + filter: saturate(1.3); +} + +.cta-visual-overlay { + position: absolute; + inset: 0; + background: linear-gradient(to right, var(--dark) 0%, transparent 40%); +} + +/* ============================================= + FOOTER + ============================================= */ +.footer { + background: var(--dark); + padding: var(--s12) 0 var(--s4); + color: var(--cream); +} + +.footer-inner { + display: grid; + grid-template-columns: 1.4fr repeat(3, 1fr); + gap: var(--s8); + padding-bottom: var(--s8); + border-bottom: 1px solid rgba(244, 241, 232, 0.08); +} + +.footer-brand-desc { + color: var(--text-light); + font-size: 0.85rem; + line-height: 1.75; + margin-top: var(--s2); + max-width: 260px; +} + +.footer-col-title { + font-family: var(--body); + font-size: 0.7rem; + font-weight: 700; + letter-spacing: 0.12em; + text-transform: uppercase; + color: var(--cream); + margin-bottom: var(--s3); +} + +.footer-col a { + display: block; + color: var(--text-light); + font-size: 0.84rem; + padding: 0.2rem 0; + transition: color var(--t); +} + +.footer-col a:hover { + color: var(--cream); +} + +.footer-brand-xl { + font-family: var(--display); + font-size: clamp(5rem, 12vw, 11rem); + font-weight: 900; + color: rgba(244, 241, 232, 0.045); + text-align: center; + line-height: 1; + padding: var(--s8) 0 var(--s4); + user-select: none; + letter-spacing: -0.02em; + overflow: hidden; +} + +.footer-bottom { + display: flex; + justify-content: space-between; + align-items: center; + border-top: 1px solid rgba(244, 241, 232, 0.05); + padding-top: var(--s3); +} + +.footer-bottom p { + font-size: 0.72rem; + color: var(--text-light); +} + +.footer-contact { + color: var(--cream); + font-size: 0.8rem; + font-weight: 600; +} + +.support-page { + background: + radial-gradient(circle at top left, rgba(86, 160, 116, 0.12), transparent 28%), + linear-gradient(180deg, var(--cream) 0%, var(--white) 100%); + min-height: 100vh; +} + +.support-hero { + padding: 11rem 0 4rem; +} + +.support-hero-inner { + max-width: 880px; +} + +.support-hero-inner h1 { + max-width: 900px; + margin-bottom: var(--s3); +} + +.support-lead { + max-width: 680px; + color: var(--muted); + font-size: 1.05rem; +} + +.support-actions { + display: flex; + gap: var(--s2); + flex-wrap: wrap; + margin-top: var(--s4); +} + +.support-outline { + color: var(--dark); + border-color: rgba(19, 31, 22, 0.16); +} + +.support-outline:hover { + background: rgba(19, 31, 22, 0.04); +} + +.support-grid-wrap { + padding: 0 0 var(--s8); +} + +.support-grid { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: var(--s3); +} + +.support-card, +.support-faq-item { + background: rgba(255, 255, 255, 0.75); + border: 1px solid rgba(19, 31, 22, 0.08); + border-radius: var(--r-lg); + box-shadow: 0 24px 60px rgba(19, 31, 22, 0.05); +} + +.support-card { + padding: var(--s4); +} + +.support-card h2 { + font-size: clamp(1.45rem, 2vw, 1.9rem); + margin-bottom: var(--s2); +} + +.support-card p, +.support-card li { + color: var(--muted); +} + +.support-list { + list-style: disc; + padding-left: 1.2rem; +} + +.support-faq { + padding: 0 0 var(--s16); +} + +.support-section-head { + max-width: 760px; + margin-bottom: var(--s4); +} + +.support-faq-list { + display: grid; + grid-template-columns: 1fr 1fr; + gap: var(--s3); +} + +.support-faq-item { + padding: var(--s4); +} + +.support-faq-item h3 { + font-size: 1.25rem; + margin-bottom: var(--s2); +} + +.support-faq-item p { + color: var(--muted); +} + +/* ============================================= + RESPONSIVE + ============================================= */ +@media (max-width: 1024px) { + .hero .container { + grid-template-columns: 1fr; + } + + .hero-visual { + display: none; + } + + .hero h1 { + text-align: center; + } + + .hero-desc { + text-align: center; + max-width: 100%; + } + + .hero-actions { + justify-content: center; + } + + + .hero-eyebrow { + justify-content: center; + } + + .intelligence .container { + grid-template-columns: 1fr; + } + + .intelligence-visual { + display: none; + } + + .how .container { + grid-template-columns: 1fr; + } + + .how-visual { + display: none; + } + + .cta-card { + grid-template-columns: 1fr; + } + + .cta-visual { + display: none; + } + + .footer-inner { + grid-template-columns: 1fr 1fr; + gap: var(--s6); + } +} + +@media (max-width: 768px) { + .nav-links { + display: none; + } + + .nav-hamburger { + display: flex; + } + + .bento-grid { + grid-template-columns: 1fr; + } + + .bento-grid-right { + grid-template-columns: 1fr 1fr; + grid-template-rows: auto; + } + + .bento-large { + min-height: 400px; + } + + .bento-small { + min-height: 200px; + } + + .features-pills { + grid-template-columns: 1fr; + } + + + + .footer-inner { + grid-template-columns: 1fr; + gap: var(--s4); + } + + .footer-bottom { + flex-direction: column; + gap: var(--s2); + text-align: center; + } + + .support-grid, + .support-faq-list { + grid-template-columns: 1fr; + } +} diff --git a/greenlns-landing/app/imprint/page.tsx b/greenlns-landing/app/imprint/page.tsx index 0c408c9..b978eac 100644 --- a/greenlns-landing/app/imprint/page.tsx +++ b/greenlns-landing/app/imprint/page.tsx @@ -1,71 +1,71 @@ -'use client' - -import { useLang } from '@/context/LangContext' -import { siteConfig } from '@/lib/site' - -const CONTENT = { - de: { - title: 'Impressum', - companyLabel: 'Unternehmen', - addressLabel: 'Adresse', - representativeLabel: 'Vertretungsberechtigt', - contactLabel: 'Kontakt', - registryLabel: 'Register', - vatLabel: 'USt-ID', - note: 'Vor der Veroeffentlichung muessen alle rechtlichen Angaben mit den echten Firmendaten ersetzt werden.', - }, - en: { - title: 'Imprint', - companyLabel: 'Company', - addressLabel: 'Address', - representativeLabel: 'Represented by', - contactLabel: 'Contact', - registryLabel: 'Registry', - vatLabel: 'VAT ID', - note: 'Replace all legal placeholders with your real company details before publishing the site.', - }, - es: { - title: 'Aviso Legal', - companyLabel: 'Empresa', - addressLabel: 'Direccion', - representativeLabel: 'Representante', - contactLabel: 'Contacto', - registryLabel: 'Registro', - vatLabel: 'IVA', - note: 'Sustituye todos los marcadores legales por tus datos reales antes de publicar el sitio.', - }, -} - -export default function ImprintPage() { - const { lang } = useLang() - const c = CONTENT[lang] - - return ( -
-

{c.title}

-
-

- {c.companyLabel}: {siteConfig.company.legalName} -

-

- {c.addressLabel}: {siteConfig.company.addressLine1} -

- {siteConfig.company.addressLine2 ?

{siteConfig.company.addressLine2}

: null} -

{siteConfig.company.country}

-

- {c.representativeLabel}: {siteConfig.company.representative} -

-

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

-

- {c.registryLabel}: {siteConfig.company.registry} -

-

- {c.vatLabel}: {siteConfig.company.vatId} -

-

{c.note}

-
-
- ) -} +'use client' + +import { useLang } from '@/context/LangContext' +import { siteConfig } from '@/lib/site' + +const CONTENT = { + de: { + title: 'Impressum', + companyLabel: 'Unternehmen', + addressLabel: 'Adresse', + representativeLabel: 'Vertretungsberechtigt', + contactLabel: 'Kontakt', + registryLabel: 'Register', + vatLabel: 'USt-ID', + note: 'Vor der Veroeffentlichung muessen alle rechtlichen Angaben mit den echten Firmendaten ersetzt werden.', + }, + en: { + title: 'Imprint', + companyLabel: 'Company', + addressLabel: 'Address', + representativeLabel: 'Represented by', + contactLabel: 'Contact', + registryLabel: 'Registry', + vatLabel: 'VAT ID', + note: 'Replace all legal placeholders with your real company details before publishing the site.', + }, + es: { + title: 'Aviso Legal', + companyLabel: 'Empresa', + addressLabel: 'Direccion', + representativeLabel: 'Representante', + contactLabel: 'Contacto', + registryLabel: 'Registro', + vatLabel: 'IVA', + note: 'Sustituye todos los marcadores legales por tus datos reales antes de publicar el sitio.', + }, +} + +export default function ImprintPage() { + const { lang } = useLang() + const c = CONTENT[lang] + + return ( +
+

{c.title}

+
+

+ {c.companyLabel}: {siteConfig.company.legalName} +

+

+ {c.addressLabel}: {siteConfig.company.addressLine1} +

+ {siteConfig.company.addressLine2 ?

{siteConfig.company.addressLine2}

: null} +

{siteConfig.company.country}

+

+ {c.representativeLabel}: {siteConfig.company.representative} +

+

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

+

+ {c.registryLabel}: {siteConfig.company.registry} +

+

+ {c.vatLabel}: {siteConfig.company.vatId} +

+

{c.note}

+
+
+ ) +} diff --git a/greenlns-landing/app/layout.tsx b/greenlns-landing/app/layout.tsx index ae424fc..c88ee1d 100644 --- a/greenlns-landing/app/layout.tsx +++ b/greenlns-landing/app/layout.tsx @@ -1,76 +1,72 @@ -import type { Metadata } from 'next' -import './globals.css' -import { LangProvider } from '@/context/LangContext' -import { siteConfig } from '@/lib/site' - -export const metadata: Metadata = { - metadataBase: new URL(siteConfig.domain), - title: { - default: 'GreenLens - Plant Identifier and Care Planner', - template: '%s | GreenLens', - }, - description: - 'GreenLens helps you identify plants, organize your collection, and keep up with care routines in one app.', - keywords: [ - 'plant identifier by picture', - 'plant care app', - 'watering reminders', - 'houseplant tracker', - 'plant identification', - 'plant health check', - 'Pflanzen App', - 'GreenLens', - ], - authors: [{ name: siteConfig.name }], - openGraph: { - title: 'GreenLens - Plant Identifier and Care Planner', - description: 'Identify plants, get care guidance, and manage your collection with GreenLens.', - type: 'website', - url: siteConfig.domain, - }, - alternates: { - canonical: '/', - languages: { - de: '/', - en: '/', - es: '/', - 'x-default': '/', - }, - }, -} - -export default function RootLayout({ children }: { children: React.ReactNode }) { - return ( - - - - - - - - - - - - - - - - -
- + + + + + + GreenLens + + + + + + + +
+ \ No newline at end of file diff --git a/jest.setup.js b/jest.setup.js index 15e2e61..6d79764 100644 --- a/jest.setup.js +++ b/jest.setup.js @@ -1,6 +1,6 @@ -// Provide the __ExpoImportMetaRegistry global that expo's runtime expects -if (typeof globalThis.__ExpoImportMetaRegistry === 'undefined') { - globalThis.__ExpoImportMetaRegistry = { - register: () => {}, - }; -} +// Provide the __ExpoImportMetaRegistry global that expo's runtime expects +if (typeof globalThis.__ExpoImportMetaRegistry === 'undefined') { + globalThis.__ExpoImportMetaRegistry = { + register: () => {}, + }; +} diff --git a/landing/index.html b/landing/index.html index e44a74e..edc6539 100644 --- a/landing/index.html +++ b/landing/index.html @@ -1,286 +1,286 @@ - - - - - - GreenLens – Dein Urban Jungle, perfekt gepflegt - - - - - - - - - -
-
-
- -

Dein Urban
Jungle,
perfekt gepflegt.

-

- Scanne deine Pflanzen, erfahre alles über sie und erhalte personalisierte Pflegetipps – powered by Botanical Intelligence. -

- -
- -
- -
-
-
-
- - -
-
-
- -

So funktioniert
GreenLens.

-

Alles was du brauchst, um deine Pflanzen zu verstehen, zu pflegen und wachsen zu lassen.

-
- -
- -
-
-
-
- Scan -

Scan it.

-

Richte die Kamera auf eine Pflanze und erfahre sofort ihren Namen, ihre Art und alle wichtigen Infos.

-
-
- - -
-
-
-
- Track -

Track it.

-

Behalte den Überblick: Gießplan, Lichtbedarf, Wachstum – alles in einer Timeline.

-
-
-
- -
- -
-
- - -
-

Smarte Erinnerungen

-

Vergiss nie mehr das Gießen. Personalisierte Erinnerungen für jede deiner Pflanzen.

-
- - -
-
- - -
-

Diagnose & Hilfe

-

Erkennt Krankheiten und Schädlinge und gibt dir sofort Pflegetipps.

-
- - -
-
- - -
-

Pflanzen-Profil

-

Speichere deine Sammlung mit Fotos, Notizen und Pflegehistorie.

-
-
-
-
- - -
-
-
- -

Botanical
Intelligence.

-

- Unsere KI erkennt über 20.000 Pflanzenarten, analysiert Gesundheit und gibt dir personalisierte Tipps basierend auf Standort, Licht und Jahreszeit. -

- -
-
-
- - -
-
-

KI-gestützte Erkennung

-

Hochpräzise Identifikation in Sekundenbruchteilen.

-
-
-
-
- - -
-
-

Gesundheits-Analyse

-

Erkennt Mangelerscheinungen, Schädlinge und Krankheiten.

-
-
-
-
- - -
-
-

Standort-basiert

-

Tipps angepasst an dein Klima und deine Lichtverhältnisse.

-
-
-
-
- -
-
-
- Botanical
Intelligence. -
-
-
-
-
- - -
-
-
-
- -

Join the
Jungle.

-

- Starte jetzt mit GreenLens und verwandle dein Zuhause in einen üppigen Urban Jungle. Kostenlos im App Store & Google Play. -

-
- - -
-
-
- - - - - - - + + + + + + GreenLens – Dein Urban Jungle, perfekt gepflegt + + + + + + + + + +
+
+
+ +

Dein Urban
Jungle,
perfekt gepflegt.

+

+ Scanne deine Pflanzen, erfahre alles über sie und erhalte personalisierte Pflegetipps – powered by Botanical Intelligence. +

+ +
+ +
+ +
+
+
+
+ + +
+
+
+ +

So funktioniert
GreenLens.

+

Alles was du brauchst, um deine Pflanzen zu verstehen, zu pflegen und wachsen zu lassen.

+
+ +
+ +
+
+
+
+ Scan +

Scan it.

+

Richte die Kamera auf eine Pflanze und erfahre sofort ihren Namen, ihre Art und alle wichtigen Infos.

+
+
+ + +
+
+
+
+ Track +

Track it.

+

Behalte den Überblick: Gießplan, Lichtbedarf, Wachstum – alles in einer Timeline.

+
+
+
+ +
+ +
+
+ + +
+

Smarte Erinnerungen

+

Vergiss nie mehr das Gießen. Personalisierte Erinnerungen für jede deiner Pflanzen.

+
+ + +
+
+ + +
+

Diagnose & Hilfe

+

Erkennt Krankheiten und Schädlinge und gibt dir sofort Pflegetipps.

+
+ + +
+
+ + +
+

Pflanzen-Profil

+

Speichere deine Sammlung mit Fotos, Notizen und Pflegehistorie.

+
+
+
+
+ + +
+
+
+ +

Botanical
Intelligence.

+

+ Unsere KI erkennt über 20.000 Pflanzenarten, analysiert Gesundheit und gibt dir personalisierte Tipps basierend auf Standort, Licht und Jahreszeit. +

+ +
+
+
+ + +
+
+

KI-gestützte Erkennung

+

Hochpräzise Identifikation in Sekundenbruchteilen.

+
+
+
+
+ + +
+
+

Gesundheits-Analyse

+

Erkennt Mangelerscheinungen, Schädlinge und Krankheiten.

+
+
+
+
+ + +
+
+

Standort-basiert

+

Tipps angepasst an dein Klima und deine Lichtverhältnisse.

+
+
+
+
+ +
+
+
+ Botanical
Intelligence. +
+
+
+
+
+ + +
+
+
+
+ +

Join the
Jungle.

+

+ Starte jetzt mit GreenLens und verwandle dein Zuhause in einen üppigen Urban Jungle. Kostenlos im App Store & Google Play. +

+
+ + +
+
+
+ + + + + + + diff --git a/landing/script.js b/landing/script.js index 9e5510e..554f60c 100644 --- a/landing/script.js +++ b/landing/script.js @@ -1,88 +1,88 @@ -/* ======================================== - GreenLens Landing Page – Interactions - ======================================== */ - -document.addEventListener('DOMContentLoaded', () => { - - // --- Navbar scroll effect --- - const navbar = document.querySelector('.navbar'); - const handleScroll = () => { - navbar.classList.toggle('scrolled', window.scrollY > 60); - }; - window.addEventListener('scroll', handleScroll, { passive: true }); - handleScroll(); - - // --- Mobile hamburger --- - const hamburger = document.querySelector('.nav-hamburger'); - const navLinks = document.querySelector('.nav-links'); - - if (hamburger) { - hamburger.addEventListener('click', () => { - navLinks.classList.toggle('active'); - }); - - // close on link click - navLinks.querySelectorAll('a').forEach(link => { - link.addEventListener('click', () => { - navLinks.classList.remove('active'); - }); - }); - } - - // --- Scroll reveal --- - const revealElements = document.querySelectorAll('.reveal'); - - const revealObserver = new IntersectionObserver((entries) => { - entries.forEach(entry => { - if (entry.isIntersecting) { - entry.target.classList.add('active'); - revealObserver.unobserve(entry.target); - } - }); - }, { - threshold: 0.15, - rootMargin: '0px 0px -50px 0px' - }); - - revealElements.forEach(el => revealObserver.observe(el)); - - // --- Counter animation --- - const counters = document.querySelectorAll('[data-count]'); - const counterObserver = new IntersectionObserver((entries) => { - entries.forEach(entry => { - if (entry.isIntersecting) { - const el = entry.target; - const target = parseFloat(el.dataset.count); - const suffix = el.dataset.suffix || ''; - const isDecimal = target % 1 !== 0; - const duration = 1500; - const start = performance.now(); - - const step = (now) => { - const progress = Math.min((now - start) / duration, 1); - const eased = 1 - Math.pow(1 - progress, 3); // ease-out cubic - const current = eased * target; - el.textContent = (isDecimal ? current.toFixed(1) : Math.floor(current)) + suffix; - if (progress < 1) requestAnimationFrame(step); - }; - - requestAnimationFrame(step); - counterObserver.unobserve(el); - } - }); - }, { threshold: 0.5 }); - - counters.forEach(el => counterObserver.observe(el)); - - // --- Smooth scroll for anchor links --- - document.querySelectorAll('a[href^="#"]').forEach(link => { - link.addEventListener('click', (e) => { - const target = document.querySelector(link.getAttribute('href')); - if (target) { - e.preventDefault(); - target.scrollIntoView({ behavior: 'smooth', block: 'start' }); - } - }); - }); - -}); +/* ======================================== + GreenLens Landing Page – Interactions + ======================================== */ + +document.addEventListener('DOMContentLoaded', () => { + + // --- Navbar scroll effect --- + const navbar = document.querySelector('.navbar'); + const handleScroll = () => { + navbar.classList.toggle('scrolled', window.scrollY > 60); + }; + window.addEventListener('scroll', handleScroll, { passive: true }); + handleScroll(); + + // --- Mobile hamburger --- + const hamburger = document.querySelector('.nav-hamburger'); + const navLinks = document.querySelector('.nav-links'); + + if (hamburger) { + hamburger.addEventListener('click', () => { + navLinks.classList.toggle('active'); + }); + + // close on link click + navLinks.querySelectorAll('a').forEach(link => { + link.addEventListener('click', () => { + navLinks.classList.remove('active'); + }); + }); + } + + // --- Scroll reveal --- + const revealElements = document.querySelectorAll('.reveal'); + + const revealObserver = new IntersectionObserver((entries) => { + entries.forEach(entry => { + if (entry.isIntersecting) { + entry.target.classList.add('active'); + revealObserver.unobserve(entry.target); + } + }); + }, { + threshold: 0.15, + rootMargin: '0px 0px -50px 0px' + }); + + revealElements.forEach(el => revealObserver.observe(el)); + + // --- Counter animation --- + const counters = document.querySelectorAll('[data-count]'); + const counterObserver = new IntersectionObserver((entries) => { + entries.forEach(entry => { + if (entry.isIntersecting) { + const el = entry.target; + const target = parseFloat(el.dataset.count); + const suffix = el.dataset.suffix || ''; + const isDecimal = target % 1 !== 0; + const duration = 1500; + const start = performance.now(); + + const step = (now) => { + const progress = Math.min((now - start) / duration, 1); + const eased = 1 - Math.pow(1 - progress, 3); // ease-out cubic + const current = eased * target; + el.textContent = (isDecimal ? current.toFixed(1) : Math.floor(current)) + suffix; + if (progress < 1) requestAnimationFrame(step); + }; + + requestAnimationFrame(step); + counterObserver.unobserve(el); + } + }); + }, { threshold: 0.5 }); + + counters.forEach(el => counterObserver.observe(el)); + + // --- Smooth scroll for anchor links --- + document.querySelectorAll('a[href^="#"]').forEach(link => { + link.addEventListener('click', (e) => { + const target = document.querySelector(link.getAttribute('href')); + if (target) { + e.preventDefault(); + target.scrollIntoView({ behavior: 'smooth', block: 'start' }); + } + }); + }); + +}); diff --git a/landing/styles.css b/landing/styles.css index 1c09ec6..2be743d 100644 --- a/landing/styles.css +++ b/landing/styles.css @@ -1,968 +1,968 @@ -/* ======================================== - GreenLens Landing Page – Design System - ======================================== */ - -@import url('https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400;0,700;0,900;1,400;1,700;1,900&family=Inter:wght@300;400;500;600;700&display=swap'); - -/* --- CSS Variables --- */ -:root { - --color-dark: #1a2e1f; - --color-dark-alt: #243828; - --color-green: #2d5a3d; - --color-green-light: #4a8c5e; - --color-accent: #e8734a; - --color-accent-hover: #d4623b; - --color-cream: #f5f2eb; - --color-white: #ffffff; - --color-text: #1a2e1f; - --color-text-light: rgba(245, 242, 235, 0.7); - --color-text-muted: #6b7c6f; - - --font-display: 'Playfair Display', Georgia, serif; - --font-body: 'Inter', -apple-system, sans-serif; - - --space-xs: 0.5rem; - --space-sm: 1rem; - --space-md: 2rem; - --space-lg: 4rem; - --space-xl: 6rem; - --space-2xl: 8rem; - - --radius-sm: 8px; - --radius-md: 12px; - --radius-lg: 20px; - --radius-xl: 32px; - - --transition: 0.3s cubic-bezier(0.4, 0, 0.2, 1); - --transition-slow: 0.6s cubic-bezier(0.4, 0, 0.2, 1); -} - -/* --- Reset & Base --- */ -*, -*::before, -*::after { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -html { - scroll-behavior: smooth; - font-size: 16px; -} - -body { - font-family: var(--font-body); - color: var(--color-text); - background: var(--color-cream); - line-height: 1.6; - overflow-x: hidden; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -a { - text-decoration: none; - color: inherit; - transition: color var(--transition); -} - -img, -video { - max-width: 100%; - display: block; -} - -ul { - list-style: none; -} - -/* --- Typography --- */ -h1, -h2, -h3 { - font-family: var(--font-display); - font-weight: 900; - line-height: 1.05; -} - -h1 { - font-size: clamp(3rem, 6vw, 5.5rem); -} - -h2 { - font-size: clamp(2.2rem, 4vw, 4rem); -} - -h3 { - font-size: clamp(1.5rem, 2.5vw, 2rem); -} - -/* --- Utility --- */ -.container { - width: 100%; - max-width: 1280px; - margin: 0 auto; - padding: 0 var(--space-md); -} - -.section-label { - font-family: var(--font-body); - font-size: 0.75rem; - font-weight: 600; - letter-spacing: 3px; - text-transform: uppercase; - color: var(--color-accent); - margin-bottom: var(--space-sm); -} - -/* --- Animations --- */ -.reveal { - opacity: 0; - transform: translateY(40px); - transition: opacity 0.8s ease, transform 0.8s ease; -} - -.reveal.active { - opacity: 1; - transform: translateY(0); -} - -.reveal-delay-1 { - transition-delay: 0.1s; -} - -.reveal-delay-2 { - transition-delay: 0.2s; -} - -.reveal-delay-3 { - transition-delay: 0.3s; -} - -.reveal-delay-4 { - transition-delay: 0.4s; -} - -/* ======================================== - NAVBAR - ======================================== */ -.navbar { - position: fixed; - top: 0; - left: 0; - width: 100%; - z-index: 1000; - padding: var(--space-sm) 0; - transition: background var(--transition), box-shadow var(--transition), padding var(--transition); -} - -.navbar.scrolled { - background: rgba(26, 46, 31, 0.95); - backdrop-filter: blur(20px); - box-shadow: 0 4px 30px rgba(0, 0, 0, 0.15); - padding: 0.6rem 0; -} - -.navbar .container { - display: flex; - justify-content: space-between; - align-items: center; -} - -.nav-logo { - font-family: var(--font-display); - font-size: 1.4rem; - font-weight: 900; - color: var(--color-cream); - letter-spacing: 2px; -} - -.nav-links { - display: flex; - gap: var(--space-md); - align-items: center; -} - -.nav-links a { - font-size: 0.85rem; - font-weight: 500; - color: var(--color-text-light); - letter-spacing: 0.5px; - transition: color var(--transition); -} - -.nav-links a:hover { - color: var(--color-cream); -} - -.nav-cta { - background: var(--color-accent) !important; - color: var(--color-white) !important; - padding: 0.6rem 1.4rem; - border-radius: 100px; - font-weight: 600 !important; - transition: background var(--transition), transform var(--transition) !important; -} - -.nav-cta:hover { - background: var(--color-accent-hover) !important; - transform: scale(1.05); -} - -.nav-hamburger { - display: none; - flex-direction: column; - gap: 5px; - cursor: pointer; - background: none; - border: none; - padding: 4px; -} - -.nav-hamburger span { - width: 24px; - height: 2px; - background: var(--color-cream); - transition: var(--transition); -} - -/* ======================================== - HERO SECTION - ======================================== */ -.hero { - min-height: 100vh; - background: var(--color-dark); - display: flex; - align-items: center; - position: relative; - overflow: hidden; - padding: var(--space-2xl) 0 var(--space-xl); -} - -.hero .container { - display: grid; - grid-template-columns: 1fr 1fr; - gap: var(--space-lg); - align-items: center; -} - -.hero-content { - z-index: 2; -} - -.hero h1 { - color: var(--color-cream); - margin-bottom: var(--space-md); -} - -.hero h1 em { - font-style: italic; - color: var(--color-green-light); -} - -.hero-description { - font-size: 1.1rem; - color: var(--color-text-light); - max-width: 420px; - margin-bottom: var(--space-md); - line-height: 1.7; -} - -.hero-buttons { - display: flex; - gap: var(--space-sm); - align-items: center; -} - -.btn-primary { - display: inline-flex; - align-items: center; - gap: 0.5rem; - background: var(--color-accent); - color: var(--color-white); - padding: 1rem 2rem; - border-radius: 100px; - font-family: var(--font-body); - font-size: 0.95rem; - font-weight: 600; - border: none; - cursor: pointer; - transition: background var(--transition), transform var(--transition), box-shadow var(--transition); -} - -.btn-primary:hover { - background: var(--color-accent-hover); - transform: translateY(-2px); - box-shadow: 0 8px 30px rgba(232, 115, 74, 0.3); -} - -.btn-secondary { - display: inline-flex; - align-items: center; - gap: 0.5rem; - background: transparent; - color: var(--color-cream); - padding: 1rem 2rem; - border-radius: 100px; - font-family: var(--font-body); - font-size: 0.95rem; - font-weight: 500; - border: 1px solid rgba(245, 242, 235, 0.3); - cursor: pointer; - transition: border-color var(--transition), background var(--transition); -} - -.btn-secondary:hover { - border-color: var(--color-cream); - background: rgba(245, 242, 235, 0.08); -} - -.hero-video-wrapper { - position: relative; - border-radius: var(--radius-lg); - overflow: hidden; - box-shadow: 0 30px 80px rgba(0, 0, 0, 0.4); -} - -.hero-video-wrapper video { - width: 100%; - height: 100%; - object-fit: cover; - border-radius: var(--radius-lg); -} - -.hero-video-overlay { - position: absolute; - inset: 0; - background: linear-gradient(135deg, rgba(26, 46, 31, 0.15), transparent); - border-radius: var(--radius-lg); - pointer-events: none; -} - -.hero-stats { - display: flex; - gap: var(--space-lg); - margin-top: var(--space-lg); -} - -.stat { - text-align: left; -} - -.stat-number { - font-family: var(--font-display); - font-size: 2rem; - font-weight: 900; - color: var(--color-cream); -} - -.stat-label { - font-size: 0.8rem; - color: var(--color-text-light); - margin-top: 2px; -} - -/* ======================================== - FEATURES GRID – "Scan it. / Track it." - ======================================== */ -.features { - padding: var(--space-2xl) 0; - background: var(--color-cream); -} - -.features-header { - text-align: center; - max-width: 600px; - margin: 0 auto var(--space-xl); -} - -.features-header h2 { - color: var(--color-dark); -} - -.features-header p { - color: var(--color-text-muted); - font-size: 1.05rem; - margin-top: var(--space-sm); -} - -.features-grid { - display: grid; - grid-template-columns: repeat(2, 1fr); - gap: var(--space-md); -} - -.feature-card { - position: relative; - border-radius: var(--radius-lg); - overflow: hidden; - background: var(--color-dark); - min-height: 400px; - display: flex; - flex-direction: column; - justify-content: flex-end; - padding: var(--space-md); - transition: transform var(--transition), box-shadow var(--transition); -} - -.feature-card:hover { - transform: translateY(-8px); - box-shadow: 0 20px 60px rgba(26, 46, 31, 0.2); -} - -.feature-card-bg { - position: absolute; - inset: 0; - background-size: cover; - background-position: center; - transition: transform var(--transition-slow); -} - -.feature-card:hover .feature-card-bg { - transform: scale(1.05); -} - -.feature-card-overlay { - position: absolute; - inset: 0; - background: linear-gradient(to top, rgba(26, 46, 31, 0.9) 0%, rgba(26, 46, 31, 0.2) 60%); -} - -.feature-card-content { - position: relative; - z-index: 2; -} - -.feature-card h3 { - color: var(--color-cream); - margin-bottom: var(--space-xs); -} - -.feature-card p { - color: var(--color-text-light); - font-size: 0.9rem; - line-height: 1.6; -} - -.feature-tag { - display: inline-block; - background: var(--color-accent); - color: var(--color-white); - font-size: 0.7rem; - font-weight: 700; - letter-spacing: 1px; - text-transform: uppercase; - padding: 0.3rem 0.8rem; - border-radius: 100px; - margin-bottom: var(--space-sm); -} - -/* Small feature cards row */ -.features-small { - display: grid; - grid-template-columns: repeat(3, 1fr); - gap: var(--space-md); - margin-top: var(--space-md); -} - -.feature-small-card { - background: var(--color-white); - border-radius: var(--radius-md); - padding: var(--space-md); - transition: transform var(--transition), box-shadow var(--transition); -} - -.feature-small-card:hover { - transform: translateY(-4px); - box-shadow: 0 12px 40px rgba(26, 46, 31, 0.1); -} - -.feature-icon { - width: 48px; - height: 48px; - background: var(--color-dark); - border-radius: var(--radius-sm); - display: flex; - align-items: center; - justify-content: center; - margin-bottom: var(--space-sm); - font-size: 1.3rem; -} - -.feature-small-card h3 { - font-family: var(--font-body); - font-size: 1.1rem; - font-weight: 700; - margin-bottom: var(--space-xs); - color: var(--color-dark); -} - -.feature-small-card p { - font-size: 0.85rem; - color: var(--color-text-muted); - line-height: 1.6; -} - -/* ======================================== - BOTANICAL INTELLIGENCE - ======================================== */ -.intelligence { - padding: var(--space-2xl) 0; - background: var(--color-white); - overflow: hidden; -} - -.intelligence .container { - display: grid; - grid-template-columns: 1fr 1fr; - gap: var(--space-xl); - align-items: center; -} - -.intelligence-content h2 em { - font-style: italic; - color: var(--color-green); -} - -.intelligence-content h2 { - margin-bottom: var(--space-md); -} - -.intelligence-content p { - font-size: 1.05rem; - color: var(--color-text-muted); - margin-bottom: var(--space-md); - line-height: 1.8; -} - -.intelligence-features { - display: flex; - flex-direction: column; - gap: var(--space-sm); -} - -.intelligence-feature { - display: flex; - align-items: flex-start; - gap: var(--space-sm); - padding: var(--space-sm); - border-radius: var(--radius-md); - transition: background var(--transition); -} - -.intelligence-feature:hover { - background: var(--color-cream); -} - -.intelligence-feature-icon { - width: 40px; - height: 40px; - min-width: 40px; - background: var(--color-dark); - border-radius: var(--radius-sm); - display: flex; - align-items: center; - justify-content: center; - font-size: 1.1rem; -} - -.intelligence-feature h4 { - font-family: var(--font-body); - font-weight: 700; - font-size: 0.95rem; - color: var(--color-dark); -} - -.intelligence-feature p { - font-size: 0.85rem; - margin-bottom: 0; - margin-top: 2px; -} - -.intelligence-visual { - position: relative; -} - -.intelligence-mockup { - width: 100%; - max-width: 500px; - margin: 0 auto; - background: var(--color-dark); - border-radius: var(--radius-xl); - padding: var(--space-lg); - min-height: 500px; - display: flex; - align-items: center; - justify-content: center; - position: relative; - overflow: hidden; -} - -.intelligence-mockup::before { - content: ''; - position: absolute; - width: 300px; - height: 300px; - background: radial-gradient(circle, var(--color-green) 0%, transparent 70%); - opacity: 0.3; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - filter: blur(60px); -} - -.mockup-text { - font-family: var(--font-display); - font-size: 2rem; - color: var(--color-cream); - text-align: center; - z-index: 1; - position: relative; -} - -.mockup-text em { - color: var(--color-green-light); - font-style: italic; -} - -/* ======================================== - CTA – "Join the Jungle" - ======================================== */ -.cta-section { - padding: var(--space-2xl) 0; - background: var(--color-cream); -} - -.cta-card { - background: var(--color-dark); - border-radius: var(--radius-xl); - padding: var(--space-xl); - display: grid; - grid-template-columns: 1fr 1fr; - gap: var(--space-lg); - align-items: center; - overflow: hidden; - position: relative; -} - -.cta-card::before { - content: ''; - position: absolute; - width: 400px; - height: 400px; - background: radial-gradient(circle, var(--color-green) 0%, transparent 70%); - opacity: 0.15; - top: -100px; - right: -100px; - filter: blur(80px); -} - -.cta-content { - position: relative; - z-index: 2; -} - -.cta-content h2 { - color: var(--color-cream); - margin-bottom: var(--space-sm); -} - -.cta-content h2 em { - font-style: italic; - color: var(--color-green-light); -} - -.cta-content p { - color: var(--color-text-light); - font-size: 1.05rem; - margin-bottom: var(--space-md); - line-height: 1.7; - max-width: 440px; -} - -.cta-metrics { - display: flex; - gap: var(--space-md); - margin-top: var(--space-md); -} - -.cta-metric { - text-align: left; -} - -.cta-metric-number { - font-family: var(--font-display); - font-size: 1.6rem; - font-weight: 900; - color: var(--color-accent); -} - -.cta-metric-label { - font-size: 0.75rem; - color: var(--color-text-light); -} - -.cta-actions { - position: relative; - z-index: 2; - display: flex; - flex-direction: column; - align-items: flex-start; - gap: var(--space-md); -} - -.store-buttons { - display: flex; - gap: var(--space-sm); -} - -.store-btn { - display: inline-flex; - align-items: center; - gap: 0.6rem; - background: rgba(245, 242, 235, 0.1); - border: 1px solid rgba(245, 242, 235, 0.2); - color: var(--color-cream); - padding: 0.8rem 1.4rem; - border-radius: var(--radius-md); - font-size: 0.85rem; - font-weight: 500; - transition: background var(--transition), border-color var(--transition); -} - -.store-btn:hover { - background: rgba(245, 242, 235, 0.15); - border-color: rgba(245, 242, 235, 0.4); -} - -.store-btn-icon { - font-size: 1.4rem; -} - -.store-btn-text small { - display: block; - font-size: 0.65rem; - opacity: 0.7; -} - -.store-btn-text strong { - font-size: 0.9rem; -} - -/* ======================================== - FOOTER - ======================================== */ -.footer { - background: var(--color-dark); - padding: var(--space-xl) 0 var(--space-md); - color: var(--color-cream); -} - -.footer-top { - display: grid; - grid-template-columns: 1fr repeat(3, auto); - gap: var(--space-xl); - padding-bottom: var(--space-lg); - border-bottom: 1px solid rgba(245, 242, 235, 0.1); -} - -.footer-brand p { - color: var(--color-text-light); - font-size: 0.9rem; - margin-top: var(--space-sm); - max-width: 280px; - line-height: 1.7; -} - -.footer-col h4 { - font-family: var(--font-body); - font-size: 0.8rem; - font-weight: 700; - letter-spacing: 1px; - text-transform: uppercase; - color: var(--color-cream); - margin-bottom: var(--space-sm); -} - -.footer-col a { - display: block; - color: var(--color-text-light); - font-size: 0.85rem; - padding: 0.25rem 0; - transition: color var(--transition); -} - -.footer-col a:hover { - color: var(--color-cream); -} - -.footer-brand-large { - font-family: var(--font-display); - font-size: clamp(4rem, 10vw, 10rem); - font-weight: 900; - color: rgba(245, 242, 235, 0.06); - text-align: center; - line-height: 1; - padding: var(--space-lg) 0 var(--space-md); - user-select: none; - letter-spacing: -2px; -} - -.footer-bottom { - display: flex; - justify-content: space-between; - align-items: center; - padding-top: var(--space-sm); - border-top: 1px solid rgba(245, 242, 235, 0.06); -} - -.footer-bottom p { - font-size: 0.75rem; - color: var(--color-text-light); -} - -.footer-socials { - display: flex; - gap: var(--space-sm); -} - -.footer-social-link { - width: 36px; - height: 36px; - border-radius: 50%; - background: rgba(245, 242, 235, 0.08); - display: flex; - align-items: center; - justify-content: center; - font-size: 0.85rem; - color: var(--color-text-light); - transition: background var(--transition), color var(--transition); -} - -.footer-social-link:hover { - background: var(--color-accent); - color: var(--color-white); -} - -/* ======================================== - RESPONSIVE - ======================================== */ -@media (max-width: 1024px) { - .hero .container { - grid-template-columns: 1fr; - text-align: center; - } - - .hero-description { - margin: 0 auto var(--space-md); - } - - .hero-buttons { - justify-content: center; - } - - .hero-stats { - justify-content: center; - } - - .hero-video-wrapper { - max-width: 500px; - margin: var(--space-md) auto 0; - } - - .features-grid { - grid-template-columns: 1fr; - } - - .features-small { - grid-template-columns: 1fr; - } - - .intelligence .container { - grid-template-columns: 1fr; - } - - .intelligence-visual { - order: -1; - } - - .intelligence-mockup { - max-width: 350px; - min-height: 350px; - } - - .cta-card { - grid-template-columns: 1fr; - text-align: center; - } - - .cta-content p { - margin: 0 auto var(--space-md); - } - - .cta-metrics { - justify-content: center; - } - - .cta-actions { - align-items: center; - } - - .footer-top { - grid-template-columns: 1fr 1fr; - gap: var(--space-md); - } -} - -@media (max-width: 640px) { - .nav-links { - display: none; - } - - .nav-hamburger { - display: flex; - } - - .nav-links.active { - display: flex; - flex-direction: column; - position: absolute; - top: 100%; - left: 0; - right: 0; - background: rgba(26, 46, 31, 0.98); - backdrop-filter: blur(20px); - padding: var(--space-md); - gap: var(--space-sm); - } - - h1 { - font-size: 2.5rem; - } - - h2 { - font-size: 2rem; - } - - .hero { - padding: var(--space-xl) 0 var(--space-lg); - } - - .hero-stats { - flex-direction: column; - gap: var(--space-sm); - } - - .store-buttons { - flex-direction: column; - } - - .footer-top { - grid-template-columns: 1fr; - } - - .feature-card { - min-height: 300px; - } +/* ======================================== + GreenLens Landing Page – Design System + ======================================== */ + +@import url('https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400;0,700;0,900;1,400;1,700;1,900&family=Inter:wght@300;400;500;600;700&display=swap'); + +/* --- CSS Variables --- */ +:root { + --color-dark: #1a2e1f; + --color-dark-alt: #243828; + --color-green: #2d5a3d; + --color-green-light: #4a8c5e; + --color-accent: #e8734a; + --color-accent-hover: #d4623b; + --color-cream: #f5f2eb; + --color-white: #ffffff; + --color-text: #1a2e1f; + --color-text-light: rgba(245, 242, 235, 0.7); + --color-text-muted: #6b7c6f; + + --font-display: 'Playfair Display', Georgia, serif; + --font-body: 'Inter', -apple-system, sans-serif; + + --space-xs: 0.5rem; + --space-sm: 1rem; + --space-md: 2rem; + --space-lg: 4rem; + --space-xl: 6rem; + --space-2xl: 8rem; + + --radius-sm: 8px; + --radius-md: 12px; + --radius-lg: 20px; + --radius-xl: 32px; + + --transition: 0.3s cubic-bezier(0.4, 0, 0.2, 1); + --transition-slow: 0.6s cubic-bezier(0.4, 0, 0.2, 1); +} + +/* --- Reset & Base --- */ +*, +*::before, +*::after { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +html { + scroll-behavior: smooth; + font-size: 16px; +} + +body { + font-family: var(--font-body); + color: var(--color-text); + background: var(--color-cream); + line-height: 1.6; + overflow-x: hidden; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +a { + text-decoration: none; + color: inherit; + transition: color var(--transition); +} + +img, +video { + max-width: 100%; + display: block; +} + +ul { + list-style: none; +} + +/* --- Typography --- */ +h1, +h2, +h3 { + font-family: var(--font-display); + font-weight: 900; + line-height: 1.05; +} + +h1 { + font-size: clamp(3rem, 6vw, 5.5rem); +} + +h2 { + font-size: clamp(2.2rem, 4vw, 4rem); +} + +h3 { + font-size: clamp(1.5rem, 2.5vw, 2rem); +} + +/* --- Utility --- */ +.container { + width: 100%; + max-width: 1280px; + margin: 0 auto; + padding: 0 var(--space-md); +} + +.section-label { + font-family: var(--font-body); + font-size: 0.75rem; + font-weight: 600; + letter-spacing: 3px; + text-transform: uppercase; + color: var(--color-accent); + margin-bottom: var(--space-sm); +} + +/* --- Animations --- */ +.reveal { + opacity: 0; + transform: translateY(40px); + transition: opacity 0.8s ease, transform 0.8s ease; +} + +.reveal.active { + opacity: 1; + transform: translateY(0); +} + +.reveal-delay-1 { + transition-delay: 0.1s; +} + +.reveal-delay-2 { + transition-delay: 0.2s; +} + +.reveal-delay-3 { + transition-delay: 0.3s; +} + +.reveal-delay-4 { + transition-delay: 0.4s; +} + +/* ======================================== + NAVBAR + ======================================== */ +.navbar { + position: fixed; + top: 0; + left: 0; + width: 100%; + z-index: 1000; + padding: var(--space-sm) 0; + transition: background var(--transition), box-shadow var(--transition), padding var(--transition); +} + +.navbar.scrolled { + background: rgba(26, 46, 31, 0.95); + backdrop-filter: blur(20px); + box-shadow: 0 4px 30px rgba(0, 0, 0, 0.15); + padding: 0.6rem 0; +} + +.navbar .container { + display: flex; + justify-content: space-between; + align-items: center; +} + +.nav-logo { + font-family: var(--font-display); + font-size: 1.4rem; + font-weight: 900; + color: var(--color-cream); + letter-spacing: 2px; +} + +.nav-links { + display: flex; + gap: var(--space-md); + align-items: center; +} + +.nav-links a { + font-size: 0.85rem; + font-weight: 500; + color: var(--color-text-light); + letter-spacing: 0.5px; + transition: color var(--transition); +} + +.nav-links a:hover { + color: var(--color-cream); +} + +.nav-cta { + background: var(--color-accent) !important; + color: var(--color-white) !important; + padding: 0.6rem 1.4rem; + border-radius: 100px; + font-weight: 600 !important; + transition: background var(--transition), transform var(--transition) !important; +} + +.nav-cta:hover { + background: var(--color-accent-hover) !important; + transform: scale(1.05); +} + +.nav-hamburger { + display: none; + flex-direction: column; + gap: 5px; + cursor: pointer; + background: none; + border: none; + padding: 4px; +} + +.nav-hamburger span { + width: 24px; + height: 2px; + background: var(--color-cream); + transition: var(--transition); +} + +/* ======================================== + HERO SECTION + ======================================== */ +.hero { + min-height: 100vh; + background: var(--color-dark); + display: flex; + align-items: center; + position: relative; + overflow: hidden; + padding: var(--space-2xl) 0 var(--space-xl); +} + +.hero .container { + display: grid; + grid-template-columns: 1fr 1fr; + gap: var(--space-lg); + align-items: center; +} + +.hero-content { + z-index: 2; +} + +.hero h1 { + color: var(--color-cream); + margin-bottom: var(--space-md); +} + +.hero h1 em { + font-style: italic; + color: var(--color-green-light); +} + +.hero-description { + font-size: 1.1rem; + color: var(--color-text-light); + max-width: 420px; + margin-bottom: var(--space-md); + line-height: 1.7; +} + +.hero-buttons { + display: flex; + gap: var(--space-sm); + align-items: center; +} + +.btn-primary { + display: inline-flex; + align-items: center; + gap: 0.5rem; + background: var(--color-accent); + color: var(--color-white); + padding: 1rem 2rem; + border-radius: 100px; + font-family: var(--font-body); + font-size: 0.95rem; + font-weight: 600; + border: none; + cursor: pointer; + transition: background var(--transition), transform var(--transition), box-shadow var(--transition); +} + +.btn-primary:hover { + background: var(--color-accent-hover); + transform: translateY(-2px); + box-shadow: 0 8px 30px rgba(232, 115, 74, 0.3); +} + +.btn-secondary { + display: inline-flex; + align-items: center; + gap: 0.5rem; + background: transparent; + color: var(--color-cream); + padding: 1rem 2rem; + border-radius: 100px; + font-family: var(--font-body); + font-size: 0.95rem; + font-weight: 500; + border: 1px solid rgba(245, 242, 235, 0.3); + cursor: pointer; + transition: border-color var(--transition), background var(--transition); +} + +.btn-secondary:hover { + border-color: var(--color-cream); + background: rgba(245, 242, 235, 0.08); +} + +.hero-video-wrapper { + position: relative; + border-radius: var(--radius-lg); + overflow: hidden; + box-shadow: 0 30px 80px rgba(0, 0, 0, 0.4); +} + +.hero-video-wrapper video { + width: 100%; + height: 100%; + object-fit: cover; + border-radius: var(--radius-lg); +} + +.hero-video-overlay { + position: absolute; + inset: 0; + background: linear-gradient(135deg, rgba(26, 46, 31, 0.15), transparent); + border-radius: var(--radius-lg); + pointer-events: none; +} + +.hero-stats { + display: flex; + gap: var(--space-lg); + margin-top: var(--space-lg); +} + +.stat { + text-align: left; +} + +.stat-number { + font-family: var(--font-display); + font-size: 2rem; + font-weight: 900; + color: var(--color-cream); +} + +.stat-label { + font-size: 0.8rem; + color: var(--color-text-light); + margin-top: 2px; +} + +/* ======================================== + FEATURES GRID – "Scan it. / Track it." + ======================================== */ +.features { + padding: var(--space-2xl) 0; + background: var(--color-cream); +} + +.features-header { + text-align: center; + max-width: 600px; + margin: 0 auto var(--space-xl); +} + +.features-header h2 { + color: var(--color-dark); +} + +.features-header p { + color: var(--color-text-muted); + font-size: 1.05rem; + margin-top: var(--space-sm); +} + +.features-grid { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: var(--space-md); +} + +.feature-card { + position: relative; + border-radius: var(--radius-lg); + overflow: hidden; + background: var(--color-dark); + min-height: 400px; + display: flex; + flex-direction: column; + justify-content: flex-end; + padding: var(--space-md); + transition: transform var(--transition), box-shadow var(--transition); +} + +.feature-card:hover { + transform: translateY(-8px); + box-shadow: 0 20px 60px rgba(26, 46, 31, 0.2); +} + +.feature-card-bg { + position: absolute; + inset: 0; + background-size: cover; + background-position: center; + transition: transform var(--transition-slow); +} + +.feature-card:hover .feature-card-bg { + transform: scale(1.05); +} + +.feature-card-overlay { + position: absolute; + inset: 0; + background: linear-gradient(to top, rgba(26, 46, 31, 0.9) 0%, rgba(26, 46, 31, 0.2) 60%); +} + +.feature-card-content { + position: relative; + z-index: 2; +} + +.feature-card h3 { + color: var(--color-cream); + margin-bottom: var(--space-xs); +} + +.feature-card p { + color: var(--color-text-light); + font-size: 0.9rem; + line-height: 1.6; +} + +.feature-tag { + display: inline-block; + background: var(--color-accent); + color: var(--color-white); + font-size: 0.7rem; + font-weight: 700; + letter-spacing: 1px; + text-transform: uppercase; + padding: 0.3rem 0.8rem; + border-radius: 100px; + margin-bottom: var(--space-sm); +} + +/* Small feature cards row */ +.features-small { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: var(--space-md); + margin-top: var(--space-md); +} + +.feature-small-card { + background: var(--color-white); + border-radius: var(--radius-md); + padding: var(--space-md); + transition: transform var(--transition), box-shadow var(--transition); +} + +.feature-small-card:hover { + transform: translateY(-4px); + box-shadow: 0 12px 40px rgba(26, 46, 31, 0.1); +} + +.feature-icon { + width: 48px; + height: 48px; + background: var(--color-dark); + border-radius: var(--radius-sm); + display: flex; + align-items: center; + justify-content: center; + margin-bottom: var(--space-sm); + font-size: 1.3rem; +} + +.feature-small-card h3 { + font-family: var(--font-body); + font-size: 1.1rem; + font-weight: 700; + margin-bottom: var(--space-xs); + color: var(--color-dark); +} + +.feature-small-card p { + font-size: 0.85rem; + color: var(--color-text-muted); + line-height: 1.6; +} + +/* ======================================== + BOTANICAL INTELLIGENCE + ======================================== */ +.intelligence { + padding: var(--space-2xl) 0; + background: var(--color-white); + overflow: hidden; +} + +.intelligence .container { + display: grid; + grid-template-columns: 1fr 1fr; + gap: var(--space-xl); + align-items: center; +} + +.intelligence-content h2 em { + font-style: italic; + color: var(--color-green); +} + +.intelligence-content h2 { + margin-bottom: var(--space-md); +} + +.intelligence-content p { + font-size: 1.05rem; + color: var(--color-text-muted); + margin-bottom: var(--space-md); + line-height: 1.8; +} + +.intelligence-features { + display: flex; + flex-direction: column; + gap: var(--space-sm); +} + +.intelligence-feature { + display: flex; + align-items: flex-start; + gap: var(--space-sm); + padding: var(--space-sm); + border-radius: var(--radius-md); + transition: background var(--transition); +} + +.intelligence-feature:hover { + background: var(--color-cream); +} + +.intelligence-feature-icon { + width: 40px; + height: 40px; + min-width: 40px; + background: var(--color-dark); + border-radius: var(--radius-sm); + display: flex; + align-items: center; + justify-content: center; + font-size: 1.1rem; +} + +.intelligence-feature h4 { + font-family: var(--font-body); + font-weight: 700; + font-size: 0.95rem; + color: var(--color-dark); +} + +.intelligence-feature p { + font-size: 0.85rem; + margin-bottom: 0; + margin-top: 2px; +} + +.intelligence-visual { + position: relative; +} + +.intelligence-mockup { + width: 100%; + max-width: 500px; + margin: 0 auto; + background: var(--color-dark); + border-radius: var(--radius-xl); + padding: var(--space-lg); + min-height: 500px; + display: flex; + align-items: center; + justify-content: center; + position: relative; + overflow: hidden; +} + +.intelligence-mockup::before { + content: ''; + position: absolute; + width: 300px; + height: 300px; + background: radial-gradient(circle, var(--color-green) 0%, transparent 70%); + opacity: 0.3; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + filter: blur(60px); +} + +.mockup-text { + font-family: var(--font-display); + font-size: 2rem; + color: var(--color-cream); + text-align: center; + z-index: 1; + position: relative; +} + +.mockup-text em { + color: var(--color-green-light); + font-style: italic; +} + +/* ======================================== + CTA – "Join the Jungle" + ======================================== */ +.cta-section { + padding: var(--space-2xl) 0; + background: var(--color-cream); +} + +.cta-card { + background: var(--color-dark); + border-radius: var(--radius-xl); + padding: var(--space-xl); + display: grid; + grid-template-columns: 1fr 1fr; + gap: var(--space-lg); + align-items: center; + overflow: hidden; + position: relative; +} + +.cta-card::before { + content: ''; + position: absolute; + width: 400px; + height: 400px; + background: radial-gradient(circle, var(--color-green) 0%, transparent 70%); + opacity: 0.15; + top: -100px; + right: -100px; + filter: blur(80px); +} + +.cta-content { + position: relative; + z-index: 2; +} + +.cta-content h2 { + color: var(--color-cream); + margin-bottom: var(--space-sm); +} + +.cta-content h2 em { + font-style: italic; + color: var(--color-green-light); +} + +.cta-content p { + color: var(--color-text-light); + font-size: 1.05rem; + margin-bottom: var(--space-md); + line-height: 1.7; + max-width: 440px; +} + +.cta-metrics { + display: flex; + gap: var(--space-md); + margin-top: var(--space-md); +} + +.cta-metric { + text-align: left; +} + +.cta-metric-number { + font-family: var(--font-display); + font-size: 1.6rem; + font-weight: 900; + color: var(--color-accent); +} + +.cta-metric-label { + font-size: 0.75rem; + color: var(--color-text-light); +} + +.cta-actions { + position: relative; + z-index: 2; + display: flex; + flex-direction: column; + align-items: flex-start; + gap: var(--space-md); +} + +.store-buttons { + display: flex; + gap: var(--space-sm); +} + +.store-btn { + display: inline-flex; + align-items: center; + gap: 0.6rem; + background: rgba(245, 242, 235, 0.1); + border: 1px solid rgba(245, 242, 235, 0.2); + color: var(--color-cream); + padding: 0.8rem 1.4rem; + border-radius: var(--radius-md); + font-size: 0.85rem; + font-weight: 500; + transition: background var(--transition), border-color var(--transition); +} + +.store-btn:hover { + background: rgba(245, 242, 235, 0.15); + border-color: rgba(245, 242, 235, 0.4); +} + +.store-btn-icon { + font-size: 1.4rem; +} + +.store-btn-text small { + display: block; + font-size: 0.65rem; + opacity: 0.7; +} + +.store-btn-text strong { + font-size: 0.9rem; +} + +/* ======================================== + FOOTER + ======================================== */ +.footer { + background: var(--color-dark); + padding: var(--space-xl) 0 var(--space-md); + color: var(--color-cream); +} + +.footer-top { + display: grid; + grid-template-columns: 1fr repeat(3, auto); + gap: var(--space-xl); + padding-bottom: var(--space-lg); + border-bottom: 1px solid rgba(245, 242, 235, 0.1); +} + +.footer-brand p { + color: var(--color-text-light); + font-size: 0.9rem; + margin-top: var(--space-sm); + max-width: 280px; + line-height: 1.7; +} + +.footer-col h4 { + font-family: var(--font-body); + font-size: 0.8rem; + font-weight: 700; + letter-spacing: 1px; + text-transform: uppercase; + color: var(--color-cream); + margin-bottom: var(--space-sm); +} + +.footer-col a { + display: block; + color: var(--color-text-light); + font-size: 0.85rem; + padding: 0.25rem 0; + transition: color var(--transition); +} + +.footer-col a:hover { + color: var(--color-cream); +} + +.footer-brand-large { + font-family: var(--font-display); + font-size: clamp(4rem, 10vw, 10rem); + font-weight: 900; + color: rgba(245, 242, 235, 0.06); + text-align: center; + line-height: 1; + padding: var(--space-lg) 0 var(--space-md); + user-select: none; + letter-spacing: -2px; +} + +.footer-bottom { + display: flex; + justify-content: space-between; + align-items: center; + padding-top: var(--space-sm); + border-top: 1px solid rgba(245, 242, 235, 0.06); +} + +.footer-bottom p { + font-size: 0.75rem; + color: var(--color-text-light); +} + +.footer-socials { + display: flex; + gap: var(--space-sm); +} + +.footer-social-link { + width: 36px; + height: 36px; + border-radius: 50%; + background: rgba(245, 242, 235, 0.08); + display: flex; + align-items: center; + justify-content: center; + font-size: 0.85rem; + color: var(--color-text-light); + transition: background var(--transition), color var(--transition); +} + +.footer-social-link:hover { + background: var(--color-accent); + color: var(--color-white); +} + +/* ======================================== + RESPONSIVE + ======================================== */ +@media (max-width: 1024px) { + .hero .container { + grid-template-columns: 1fr; + text-align: center; + } + + .hero-description { + margin: 0 auto var(--space-md); + } + + .hero-buttons { + justify-content: center; + } + + .hero-stats { + justify-content: center; + } + + .hero-video-wrapper { + max-width: 500px; + margin: var(--space-md) auto 0; + } + + .features-grid { + grid-template-columns: 1fr; + } + + .features-small { + grid-template-columns: 1fr; + } + + .intelligence .container { + grid-template-columns: 1fr; + } + + .intelligence-visual { + order: -1; + } + + .intelligence-mockup { + max-width: 350px; + min-height: 350px; + } + + .cta-card { + grid-template-columns: 1fr; + text-align: center; + } + + .cta-content p { + margin: 0 auto var(--space-md); + } + + .cta-metrics { + justify-content: center; + } + + .cta-actions { + align-items: center; + } + + .footer-top { + grid-template-columns: 1fr 1fr; + gap: var(--space-md); + } +} + +@media (max-width: 640px) { + .nav-links { + display: none; + } + + .nav-hamburger { + display: flex; + } + + .nav-links.active { + display: flex; + flex-direction: column; + position: absolute; + top: 100%; + left: 0; + right: 0; + background: rgba(26, 46, 31, 0.98); + backdrop-filter: blur(20px); + padding: var(--space-md); + gap: var(--space-sm); + } + + h1 { + font-size: 2.5rem; + } + + h2 { + font-size: 2rem; + } + + .hero { + padding: var(--space-xl) 0 var(--space-lg); + } + + .hero-stats { + flex-direction: column; + gap: var(--space-sm); + } + + .store-buttons { + flex-direction: column; + } + + .footer-top { + grid-template-columns: 1fr; + } + + .feature-card { + min-height: 300px; + } } \ No newline at end of file diff --git a/metro.config.js b/metro.config.js index 25f43aa..f72b240 100644 --- a/metro.config.js +++ b/metro.config.js @@ -1,13 +1,13 @@ -const { getDefaultConfig } = require('expo/metro-config'); -const path = require('path'); - -const config = getDefaultConfig(__dirname); - -// Exclude server and landing page from the Metro bundle -config.resolver.blockList = [ - /server\/.*/, - /greenlns-landing\/.*/, - /landing\/.*/, -]; - -module.exports = config; +const { getDefaultConfig } = require('expo/metro-config'); +const path = require('path'); + +const config = getDefaultConfig(__dirname); + +// Exclude server and landing page from the Metro bundle +config.resolver.blockList = [ + /server\/.*/, + /greenlns-landing\/.*/, + /landing\/.*/, +]; + +module.exports = config; diff --git a/package-lock.json b/package-lock.json index 009750b..16ad452 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,13558 +1,13558 @@ -{ - "name": "greenlens", - "version": "2.1.4", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "greenlens", - "version": "2.1.4", - "dependencies": { - "@expo/vector-icons": "^15.0.3", - "@google/genai": "^1.38.0", - "@react-native-async-storage/async-storage": "2.2.0", - "expo": "^54.0.33", - "expo-application": "~7.0.8", - "expo-asset": "~12.0.12", - "expo-av": "^16.0.8", - "expo-blur": "~15.0.8", - "expo-build-properties": "^55.0.9", - "expo-camera": "~17.0.10", - "expo-constants": "~18.0.13", - "expo-dev-client": "~6.0.20", - "expo-device": "~8.0.10", - "expo-file-system": "~19.0.21", - "expo-font": "~14.0.11", - "expo-haptics": "~15.0.8", - "expo-image-manipulator": "~14.0.8", - "expo-image-picker": "~17.0.10", - "expo-linking": "~8.0.11", - "expo-localization": "~17.0.8", - "expo-notifications": "~0.32.16", - "expo-router": "~6.0.23", - "expo-secure-store": "~15.0.8", - "expo-splash-screen": "~31.0.13", - "expo-sqlite": "~16.0.10", - "expo-status-bar": "~3.0.9", - "expo-updates": "~29.0.16", - "expo-video": "~3.0.16", - "posthog-react-native": "^4.37.1", - "react": "19.1.0", - "react-dom": "19.1.0", - "react-native": "0.81.5", - "react-native-gesture-handler": "~2.28.0", - "react-native-purchases": "^9.10.5", - "react-native-purchases-ui": "^9.10.5", - "react-native-reanimated": "~4.1.1", - "react-native-safe-area-context": "~5.6.0", - "react-native-screens": "~4.16.0", - "react-native-svg": "^15.12.1", - "react-native-web": "^0.21.2", - "react-native-worklets": "0.5.1" - }, - "devDependencies": { - "@babel/core": "^7.25.0", - "@testing-library/jest-native": "^5.4.3", - "@testing-library/react-native": "^13.3.3", - "@types/jest": "^29.5.14", - "@types/react": "~19.1.0", - "jest": "^29.7.0", - "jest-expo": "^54.0.17", - "typescript": "^5.3.0" - } - }, - "node_modules/@0no-co/graphql.web": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@0no-co/graphql.web/-/graphql.web-1.2.0.tgz", - "integrity": "sha512-/1iHy9TTr63gE1YcR5idjx8UREz1s0kFhydf3bBLCXyqjhkIc6igAzTOx3zPifCwFR87tsh/4Pa9cNts6d2otw==", - "license": "MIT", - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" - }, - "peerDependenciesMeta": { - "graphql": { - "optional": true - } - } - }, - "node_modules/@babel/code-frame": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", - "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.28.5", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", - "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", - "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helpers": "^7.28.6", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/traverse": "^7.29.0", - "@babel/types": "^7.29.0", - "@jridgewell/remapping": "^2.3.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.29.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", - "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.29.0", - "@babel/types": "^7.29.0", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", - "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.27.3" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", - "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.28.6", - "@babel/helper-validator-option": "^7.27.1", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.6.tgz", - "integrity": "sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-member-expression-to-functions": "^7.28.5", - "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/helper-replace-supers": "^7.28.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/traverse": "^7.28.6", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz", - "integrity": "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "regexpu-core": "^6.3.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.6.tgz", - "integrity": "sha512-mOAsxeeKkUKayvZR3HeTYD/fICpCPLJrU5ZjelT/PA6WHtNDBOE436YiaEUvHN454bRM3CebhDsIpieCc4texA==", - "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "debug": "^4.4.3", - "lodash.debounce": "^4.0.8", - "resolve": "^1.22.11" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", - "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.28.5", - "@babel/types": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", - "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", - "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", - "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", - "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", - "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-wrap-function": "^7.27.1", - "@babel/traverse": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz", - "integrity": "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==", - "license": "MIT", - "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.28.5", - "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/traverse": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", - "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.6.tgz", - "integrity": "sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==", - "license": "MIT", - "dependencies": { - "@babel/template": "^7.28.6", - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", - "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", - "license": "MIT", - "dependencies": { - "@babel/template": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.9.tgz", - "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==", - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "license": "MIT" - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", - "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.29.0" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.29.0.tgz", - "integrity": "sha512-CVBVv3VY/XRMxRYq5dwr2DS7/MvqPm23cOCjbwNnVrfOqcWlnefua1uUs0sjdKOGjvPUG633o07uWzJq4oI6dA==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/plugin-syntax-decorators": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-export-default-from": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.27.1.tgz", - "integrity": "sha512-hjlsMBl1aJc5lp8MoCDEZCiYzlgdRAShOjAfRw6X+GlpLpUPU7c3XNLsKFZbQk/1cRzBlJ7CXg3xJAJMrFa1Uw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.28.6.tgz", - "integrity": "sha512-71EYI0ONURHJBL4rSFXnITXqXrrY8q4P0q006DPfN+Rk+ASM+++IBXem/ruokgBZR8YNEWZ8R6B+rCb8VcUTqA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-export-default-from": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.28.6.tgz", - "integrity": "sha512-Svlx1fjJFnNz0LZeUaybRukSxZI3KkpApUmIRzEdXC5k8ErTOz0OD0kNrICi5Vc3GlpP5ZCeRyRO+mfWTSz+iQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-flow": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.28.6.tgz", - "integrity": "sha512-D+OrJumc9McXNEBI/JmFnc/0uCM2/Y3PEBG3gfV3QIYkKv5pvnpzFrl1kYCrcHJP8nOeFB/SHi1IHz29pNGuew==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", - "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", - "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz", - "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", - "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.0.tgz", - "integrity": "sha512-va0VdWro4zlBr2JsXC+ofCPB2iG12wPtVGTWFx2WLDOM3nYQZZIGP82qku2eW/JR83sD+k2k+CsNtyEbUqhU6w==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-remap-async-to-generator": "^7.27.1", - "@babel/traverse": "^7.29.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.28.6.tgz", - "integrity": "sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-remap-async-to-generator": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.6.tgz", - "integrity": "sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.28.6.tgz", - "integrity": "sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.6.tgz", - "integrity": "sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.6.tgz", - "integrity": "sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-globals": "^7.28.0", - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-replace-supers": "^7.28.6", - "@babel/traverse": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.28.6.tgz", - "integrity": "sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/template": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz", - "integrity": "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", - "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-flow-strip-types": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.27.1.tgz", - "integrity": "sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-syntax-flow": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", - "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", - "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", - "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.6.tgz", - "integrity": "sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.28.6.tgz", - "integrity": "sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.0.tgz", - "integrity": "sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.28.6.tgz", - "integrity": "sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.28.6.tgz", - "integrity": "sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.6.tgz", - "integrity": "sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==", - "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/plugin-transform-destructuring": "^7.28.5", - "@babel/plugin-transform-parameters": "^7.27.7", - "@babel/traverse": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.28.6.tgz", - "integrity": "sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.6.tgz", - "integrity": "sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", - "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.28.6.tgz", - "integrity": "sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.28.6.tgz", - "integrity": "sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-create-class-features-plugin": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz", - "integrity": "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.28.6.tgz", - "integrity": "sha512-61bxqhiRfAACulXSLd/GxqmAedUSrRZIu/cbaT18T1CetkTmtDN15it7i80ru4DVqRK1WMxQhXs+Lf9kajm5Ow==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/plugin-syntax-jsx": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz", - "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==", - "license": "MIT", - "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", - "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", - "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz", - "integrity": "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.0.tgz", - "integrity": "sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.29.0.tgz", - "integrity": "sha512-jlaRT5dJtMaMCV6fAuLbsQMSwz/QkvaHOHOSXRitGGwSpR1blCY4KUKoyP2tYO8vJcqYe8cEj96cqSztv3uF9w==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "babel-plugin-polyfill-corejs2": "^0.4.14", - "babel-plugin-polyfill-corejs3": "^0.13.0", - "babel-plugin-polyfill-regenerator": "^0.6.5", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", - "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.28.6.tgz", - "integrity": "sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", - "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", - "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typescript": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.6.tgz", - "integrity": "sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-create-class-features-plugin": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/plugin-syntax-typescript": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", - "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-react": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.28.5.tgz", - "integrity": "sha512-Z3J8vhRq7CeLjdC58jLv4lnZ5RKFUJWqH5emvxmv9Hv3BD1T9R/Im713R4MTKwvFaV74ejZ3sM01LyEKk4ugNQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-option": "^7.27.1", - "@babel/plugin-transform-react-display-name": "^7.28.0", - "@babel/plugin-transform-react-jsx": "^7.27.1", - "@babel/plugin-transform-react-jsx-development": "^7.27.1", - "@babel/plugin-transform-react-pure-annotations": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-typescript": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.28.5.tgz", - "integrity": "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-option": "^7.27.1", - "@babel/plugin-syntax-jsx": "^7.27.1", - "@babel/plugin-transform-modules-commonjs": "^7.27.1", - "@babel/plugin-transform-typescript": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz", - "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", - "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", - "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/types": "^7.29.0", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse--for-generate-function-map": { - "name": "@babel/traverse", - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", - "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/types": "^7.29.0", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", - "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/@egjs/hammerjs": { - "version": "2.0.17", - "resolved": "https://registry.npmjs.org/@egjs/hammerjs/-/hammerjs-2.0.17.tgz", - "integrity": "sha512-XQsZgjm2EcVUiZQf11UBJQfmZeEmOW8DpI1gsFeln6w0ae0ii4dMQEQ0kjl6DspdWX1aGY1/loyXnP0JS06e/A==", - "license": "MIT", - "dependencies": { - "@types/hammerjs": "^2.0.36" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@expo/cli": { - "version": "54.0.23", - "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-54.0.23.tgz", - "integrity": "sha512-km0h72SFfQCmVycH/JtPFTVy69w6Lx1cHNDmfLfQqgKFYeeHTjx7LVDP4POHCtNxFP2UeRazrygJhlh4zz498g==", - "license": "MIT", - "dependencies": { - "@0no-co/graphql.web": "^1.0.8", - "@expo/code-signing-certificates": "^0.0.6", - "@expo/config": "~12.0.13", - "@expo/config-plugins": "~54.0.4", - "@expo/devcert": "^1.2.1", - "@expo/env": "~2.0.8", - "@expo/image-utils": "^0.8.8", - "@expo/json-file": "^10.0.8", - "@expo/metro": "~54.2.0", - "@expo/metro-config": "~54.0.14", - "@expo/osascript": "^2.3.8", - "@expo/package-manager": "^1.9.10", - "@expo/plist": "^0.4.8", - "@expo/prebuild-config": "^54.0.8", - "@expo/schema-utils": "^0.1.8", - "@expo/spawn-async": "^1.7.2", - "@expo/ws-tunnel": "^1.0.1", - "@expo/xcpretty": "^4.3.0", - "@react-native/dev-middleware": "0.81.5", - "@urql/core": "^5.0.6", - "@urql/exchange-retry": "^1.3.0", - "accepts": "^1.3.8", - "arg": "^5.0.2", - "better-opn": "~3.0.2", - "bplist-creator": "0.1.0", - "bplist-parser": "^0.3.1", - "chalk": "^4.0.0", - "ci-info": "^3.3.0", - "compression": "^1.7.4", - "connect": "^3.7.0", - "debug": "^4.3.4", - "env-editor": "^0.4.1", - "expo-server": "^1.0.5", - "freeport-async": "^2.0.0", - "getenv": "^2.0.0", - "glob": "^13.0.0", - "lan-network": "^0.1.6", - "minimatch": "^9.0.0", - "node-forge": "^1.3.3", - "npm-package-arg": "^11.0.0", - "ora": "^3.4.0", - "picomatch": "^3.0.1", - "pretty-bytes": "^5.6.0", - "pretty-format": "^29.7.0", - "progress": "^2.0.3", - "prompts": "^2.3.2", - "qrcode-terminal": "0.11.0", - "require-from-string": "^2.0.2", - "requireg": "^0.2.2", - "resolve": "^1.22.2", - "resolve-from": "^5.0.0", - "resolve.exports": "^2.0.3", - "semver": "^7.6.0", - "send": "^0.19.0", - "slugify": "^1.3.4", - "source-map-support": "~0.5.21", - "stacktrace-parser": "^0.1.10", - "structured-headers": "^0.4.1", - "tar": "^7.5.2", - "terminal-link": "^2.1.1", - "undici": "^6.18.2", - "wrap-ansi": "^7.0.0", - "ws": "^8.12.1" - }, - "bin": { - "expo-internal": "build/bin/cli" - }, - "peerDependencies": { - "expo": "*", - "expo-router": "*", - "react-native": "*" - }, - "peerDependenciesMeta": { - "expo-router": { - "optional": true - }, - "react-native": { - "optional": true - } - } - }, - "node_modules/@expo/cli/node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@expo/code-signing-certificates": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/@expo/code-signing-certificates/-/code-signing-certificates-0.0.6.tgz", - "integrity": "sha512-iNe0puxwBNEcuua9gmTGzq+SuMDa0iATai1FlFTMHJ/vUmKvN/V//drXoLJkVb5i5H3iE/n/qIJxyoBnXouD0w==", - "license": "MIT", - "dependencies": { - "node-forge": "^1.3.3" - } - }, - "node_modules/@expo/config": { - "version": "12.0.13", - "resolved": "https://registry.npmjs.org/@expo/config/-/config-12.0.13.tgz", - "integrity": "sha512-Cu52arBa4vSaupIWsF0h7F/Cg//N374nYb7HAxV0I4KceKA7x2UXpYaHOL7EEYYvp7tZdThBjvGpVmr8ScIvaQ==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "~7.10.4", - "@expo/config-plugins": "~54.0.4", - "@expo/config-types": "^54.0.10", - "@expo/json-file": "^10.0.8", - "deepmerge": "^4.3.1", - "getenv": "^2.0.0", - "glob": "^13.0.0", - "require-from-string": "^2.0.2", - "resolve-from": "^5.0.0", - "resolve-workspace-root": "^2.0.0", - "semver": "^7.6.0", - "slugify": "^1.3.4", - "sucrase": "~3.35.1" - } - }, - "node_modules/@expo/config-plugins": { - "version": "54.0.4", - "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-54.0.4.tgz", - "integrity": "sha512-g2yXGICdoOw5i3LkQSDxl2Q5AlQCrG7oniu0pCPPO+UxGb7He4AFqSvPSy8HpRUj55io17hT62FTjYRD+d6j3Q==", - "license": "MIT", - "dependencies": { - "@expo/config-types": "^54.0.10", - "@expo/json-file": "~10.0.8", - "@expo/plist": "^0.4.8", - "@expo/sdk-runtime-versions": "^1.0.0", - "chalk": "^4.1.2", - "debug": "^4.3.5", - "getenv": "^2.0.0", - "glob": "^13.0.0", - "resolve-from": "^5.0.0", - "semver": "^7.5.4", - "slash": "^3.0.0", - "slugify": "^1.6.6", - "xcode": "^3.0.1", - "xml2js": "0.6.0" - } - }, - "node_modules/@expo/config-plugins/node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@expo/config-types": { - "version": "54.0.10", - "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-54.0.10.tgz", - "integrity": "sha512-/J16SC2an1LdtCZ67xhSkGXpALYUVUNyZws7v+PVsFZxClYehDSoKLqyRaGkpHlYrCc08bS0RF5E0JV6g50psA==", - "license": "MIT" - }, - "node_modules/@expo/config/node_modules/@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.10.4" - } - }, - "node_modules/@expo/config/node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@expo/devcert": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@expo/devcert/-/devcert-1.2.1.tgz", - "integrity": "sha512-qC4eaxmKMTmJC2ahwyui6ud8f3W60Ss7pMkpBq40Hu3zyiAaugPXnZ24145U7K36qO9UHdZUVxsCvIpz2RYYCA==", - "license": "MIT", - "dependencies": { - "@expo/sudo-prompt": "^9.3.1", - "debug": "^3.1.0" - } - }, - "node_modules/@expo/devcert/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/@expo/devtools": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/@expo/devtools/-/devtools-0.1.8.tgz", - "integrity": "sha512-SVLxbuanDjJPgc0sy3EfXUMLb/tXzp6XIHkhtPVmTWJAp+FOr6+5SeiCfJrCzZFet0Ifyke2vX3sFcKwEvCXwQ==", - "license": "MIT", - "dependencies": { - "chalk": "^4.1.2" - }, - "peerDependencies": { - "react": "*", - "react-native": "*" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-native": { - "optional": true - } - } - }, - "node_modules/@expo/env": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@expo/env/-/env-2.0.8.tgz", - "integrity": "sha512-5VQD6GT8HIMRaSaB5JFtOXuvfDVU80YtZIuUT/GDhUF782usIXY13Tn3IdDz1Tm/lqA9qnRZQ1BF4t7LlvdJPA==", - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "debug": "^4.3.4", - "dotenv": "~16.4.5", - "dotenv-expand": "~11.0.6", - "getenv": "^2.0.0" - } - }, - "node_modules/@expo/fingerprint": { - "version": "0.15.4", - "resolved": "https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.15.4.tgz", - "integrity": "sha512-eYlxcrGdR2/j2M6pEDXo9zU9KXXF1vhP+V+Tl+lyY+bU8lnzrN6c637mz6Ye3em2ANy8hhUR03Raf8VsT9Ogng==", - "license": "MIT", - "dependencies": { - "@expo/spawn-async": "^1.7.2", - "arg": "^5.0.2", - "chalk": "^4.1.2", - "debug": "^4.3.4", - "getenv": "^2.0.0", - "glob": "^13.0.0", - "ignore": "^5.3.1", - "minimatch": "^9.0.0", - "p-limit": "^3.1.0", - "resolve-from": "^5.0.0", - "semver": "^7.6.0" - }, - "bin": { - "fingerprint": "bin/cli.js" - } - }, - "node_modules/@expo/fingerprint/node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@expo/image-utils": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/@expo/image-utils/-/image-utils-0.8.8.tgz", - "integrity": "sha512-HHHaG4J4nKjTtVa1GG9PCh763xlETScfEyNxxOvfTRr8IKPJckjTyqSLEtdJoFNJ1vqiABEjW7tqGhqGibZLeA==", - "license": "MIT", - "dependencies": { - "@expo/spawn-async": "^1.7.2", - "chalk": "^4.0.0", - "getenv": "^2.0.0", - "jimp-compact": "0.16.1", - "parse-png": "^2.1.0", - "resolve-from": "^5.0.0", - "resolve-global": "^1.0.0", - "semver": "^7.6.0", - "temp-dir": "~2.0.0", - "unique-string": "~2.0.0" - } - }, - "node_modules/@expo/image-utils/node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@expo/json-file": { - "version": "10.0.8", - "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-10.0.8.tgz", - "integrity": "sha512-9LOTh1PgKizD1VXfGQ88LtDH0lRwq9lsTb4aichWTWSWqy3Ugfkhfm3BhzBIkJJfQQ5iJu3m/BoRlEIjoCGcnQ==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "~7.10.4", - "json5": "^2.2.3" - } - }, - "node_modules/@expo/json-file/node_modules/@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.10.4" - } - }, - "node_modules/@expo/metro": { - "version": "54.2.0", - "resolved": "https://registry.npmjs.org/@expo/metro/-/metro-54.2.0.tgz", - "integrity": "sha512-h68TNZPGsk6swMmLm9nRSnE2UXm48rWwgcbtAHVMikXvbxdS41NDHHeqg1rcQ9AbznDRp6SQVC2MVpDnsRKU1w==", - "license": "MIT", - "dependencies": { - "metro": "0.83.3", - "metro-babel-transformer": "0.83.3", - "metro-cache": "0.83.3", - "metro-cache-key": "0.83.3", - "metro-config": "0.83.3", - "metro-core": "0.83.3", - "metro-file-map": "0.83.3", - "metro-minify-terser": "0.83.3", - "metro-resolver": "0.83.3", - "metro-runtime": "0.83.3", - "metro-source-map": "0.83.3", - "metro-symbolicate": "0.83.3", - "metro-transform-plugins": "0.83.3", - "metro-transform-worker": "0.83.3" - } - }, - "node_modules/@expo/metro-config": { - "version": "54.0.14", - "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-54.0.14.tgz", - "integrity": "sha512-hxpLyDfOR4L23tJ9W1IbJJsG7k4lv2sotohBm/kTYyiG+pe1SYCAWsRmgk+H42o/wWf/HQjE5k45S5TomGLxNA==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.20.0", - "@babel/core": "^7.20.0", - "@babel/generator": "^7.20.5", - "@expo/config": "~12.0.13", - "@expo/env": "~2.0.8", - "@expo/json-file": "~10.0.8", - "@expo/metro": "~54.2.0", - "@expo/spawn-async": "^1.7.2", - "browserslist": "^4.25.0", - "chalk": "^4.1.0", - "debug": "^4.3.2", - "dotenv": "~16.4.5", - "dotenv-expand": "~11.0.6", - "getenv": "^2.0.0", - "glob": "^13.0.0", - "hermes-parser": "^0.29.1", - "jsc-safe-url": "^0.2.4", - "lightningcss": "^1.30.1", - "minimatch": "^9.0.0", - "postcss": "~8.4.32", - "resolve-from": "^5.0.0" - }, - "peerDependencies": { - "expo": "*" - }, - "peerDependenciesMeta": { - "expo": { - "optional": true - } - } - }, - "node_modules/@expo/metro-runtime": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@expo/metro-runtime/-/metro-runtime-6.1.2.tgz", - "integrity": "sha512-nvM+Qv45QH7pmYvP8JB1G8JpScrWND3KrMA6ZKe62cwwNiX/BjHU28Ear0v/4bQWXlOY0mv6B8CDIm8JxXde9g==", - "license": "MIT", - "dependencies": { - "anser": "^1.4.9", - "pretty-format": "^29.7.0", - "stacktrace-parser": "^0.1.10", - "whatwg-fetch": "^3.0.0" - }, - "peerDependencies": { - "expo": "*", - "react": "*", - "react-dom": "*", - "react-native": "*" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - } - } - }, - "node_modules/@expo/osascript": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/@expo/osascript/-/osascript-2.3.8.tgz", - "integrity": "sha512-/TuOZvSG7Nn0I8c+FcEaoHeBO07yu6vwDgk7rZVvAXoeAK5rkA09jRyjYsZo+0tMEFaToBeywA6pj50Mb3ny9w==", - "license": "MIT", - "dependencies": { - "@expo/spawn-async": "^1.7.2", - "exec-async": "^2.2.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@expo/package-manager": { - "version": "1.9.10", - "resolved": "https://registry.npmjs.org/@expo/package-manager/-/package-manager-1.9.10.tgz", - "integrity": "sha512-axJm+NOj3jVxep49va/+L3KkF3YW/dkV+RwzqUJedZrv4LeTqOG4rhrCaCPXHTvLqCTDKu6j0Xyd28N7mnxsGA==", - "license": "MIT", - "dependencies": { - "@expo/json-file": "^10.0.8", - "@expo/spawn-async": "^1.7.2", - "chalk": "^4.0.0", - "npm-package-arg": "^11.0.0", - "ora": "^3.4.0", - "resolve-workspace-root": "^2.0.0" - } - }, - "node_modules/@expo/plist": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.4.8.tgz", - "integrity": "sha512-pfNtErGGzzRwHP+5+RqswzPDKkZrx+Cli0mzjQaus1ZWFsog5ibL+nVT3NcporW51o8ggnt7x813vtRbPiyOrQ==", - "license": "MIT", - "dependencies": { - "@xmldom/xmldom": "^0.8.8", - "base64-js": "^1.2.3", - "xmlbuilder": "^15.1.1" - } - }, - "node_modules/@expo/prebuild-config": { - "version": "54.0.8", - "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-54.0.8.tgz", - "integrity": "sha512-EA7N4dloty2t5Rde+HP0IEE+nkAQiu4A/+QGZGT9mFnZ5KKjPPkqSyYcRvP5bhQE10D+tvz6X0ngZpulbMdbsg==", - "license": "MIT", - "dependencies": { - "@expo/config": "~12.0.13", - "@expo/config-plugins": "~54.0.4", - "@expo/config-types": "^54.0.10", - "@expo/image-utils": "^0.8.8", - "@expo/json-file": "^10.0.8", - "@react-native/normalize-colors": "0.81.5", - "debug": "^4.3.1", - "resolve-from": "^5.0.0", - "semver": "^7.6.0", - "xml2js": "0.6.0" - }, - "peerDependencies": { - "expo": "*" - } - }, - "node_modules/@expo/prebuild-config/node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@expo/schema-utils": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/@expo/schema-utils/-/schema-utils-0.1.8.tgz", - "integrity": "sha512-9I6ZqvnAvKKDiO+ZF8BpQQFYWXOJvTAL5L/227RUbWG1OVZDInFifzCBiqAZ3b67NRfeAgpgvbA7rejsqhY62A==", - "license": "MIT" - }, - "node_modules/@expo/sdk-runtime-versions": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@expo/sdk-runtime-versions/-/sdk-runtime-versions-1.0.0.tgz", - "integrity": "sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ==", - "license": "MIT" - }, - "node_modules/@expo/spawn-async": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@expo/spawn-async/-/spawn-async-1.7.2.tgz", - "integrity": "sha512-QdWi16+CHB9JYP7gma19OVVg0BFkvU8zNj9GjWorYI8Iv8FUxjOCcYRuAmX4s/h91e4e7BPsskc8cSrZYho9Ew==", - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@expo/sudo-prompt": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/@expo/sudo-prompt/-/sudo-prompt-9.3.2.tgz", - "integrity": "sha512-HHQigo3rQWKMDzYDLkubN5WQOYXJJE2eNqIQC2axC2iO3mHdwnIR7FgZVvHWtBwAdzBgAP0ECp8KqS8TiMKvgw==", - "license": "MIT" - }, - "node_modules/@expo/vector-icons": { - "version": "15.0.3", - "resolved": "https://registry.npmjs.org/@expo/vector-icons/-/vector-icons-15.0.3.tgz", - "integrity": "sha512-SBUyYKphmlfUBqxSfDdJ3jAdEVSALS2VUPOUyqn48oZmb2TL/O7t7/PQm5v4NQujYEPLPMTLn9KVw6H7twwbTA==", - "license": "MIT", - "peerDependencies": { - "expo-font": ">=14.0.4", - "react": "*", - "react-native": "*" - } - }, - "node_modules/@expo/ws-tunnel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@expo/ws-tunnel/-/ws-tunnel-1.0.6.tgz", - "integrity": "sha512-nDRbLmSrJar7abvUjp3smDwH8HcbZcoOEa5jVPUv9/9CajgmWw20JNRwTuBRzWIWIkEJDkz20GoNA+tSwUqk0Q==", - "license": "MIT" - }, - "node_modules/@expo/xcpretty": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@expo/xcpretty/-/xcpretty-4.4.0.tgz", - "integrity": "sha512-o2qDlTqJ606h4xR36H2zWTywmZ3v3842K6TU8Ik2n1mfW0S580VHlt3eItVYdLYz+klaPp7CXqanja8eASZjRw==", - "license": "BSD-3-Clause", - "dependencies": { - "@babel/code-frame": "^7.20.0", - "chalk": "^4.1.0", - "js-yaml": "^4.1.0" - }, - "bin": { - "excpretty": "build/cli.js" - } - }, - "node_modules/@google/genai": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/@google/genai/-/genai-1.40.0.tgz", - "integrity": "sha512-fhIww8smT0QYRX78qWOiz/nIQhHMF5wXOrlXvj33HBrz3vKDBb+wibLcEmTA+L9dmPD4KmfNr7UF3LDQVTXNjA==", - "license": "Apache-2.0", - "dependencies": { - "google-auth-library": "^10.3.0", - "protobufjs": "^7.5.4", - "ws": "^8.18.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "@modelcontextprotocol/sdk": "^1.25.2" - }, - "peerDependenciesMeta": { - "@modelcontextprotocol/sdk": { - "optional": true - } - } - }, - "node_modules/@ide/backoff": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@ide/backoff/-/backoff-1.0.0.tgz", - "integrity": "sha512-F0YfUDjvT+Mtt/R4xdl2X0EYCHMMiJqNLdxHD++jDT5ydEFIyqbCHh51Qx2E211dgZprPKhV7sHmnXKpLuvc5g==", - "license": "MIT" - }, - "node_modules/@isaacs/balanced-match": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", - "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", - "license": "MIT", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@isaacs/brace-expansion": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.1.tgz", - "integrity": "sha512-WMz71T1JS624nWj2n2fnYAuPovhv7EUhk69R6i9dsVyzxt5eM3bjwvgk9L+APE1TRscGysAVMANkB0jh0LQZrQ==", - "license": "MIT", - "dependencies": { - "@isaacs/balanced-match": "^4.0.1" - }, - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "license": "MIT" - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/fs-minipass": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", - "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", - "license": "ISC", - "dependencies": { - "minipass": "^7.0.4" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@isaacs/ttlcache": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz", - "integrity": "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "license": "ISC", - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/core/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==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/create-cache-key-function": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-29.7.0.tgz", - "integrity": "sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==", - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/diff-sequences": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.0.1.tgz", - "integrity": "sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", - "license": "MIT", - "dependencies": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "jest-get-type": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/get-type": { - "version": "30.1.0", - "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.1.0.tgz", - "integrity": "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/reporters/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==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@jest/reporters/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", - "devOptional": true, - "license": "ISC", - "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/@jest/reporters/node_modules/istanbul-lib-instrument": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", - "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", - "devOptional": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.23.9", - "@babel/parser": "^7.23.9", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@jest/reporters/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "devOptional": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@jest/reporters/node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", - "devOptional": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@jest/reporters/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==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "license": "MIT", - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/source-map": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@jest/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.11", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", - "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@posthog/core": { - "version": "1.23.2", - "resolved": "https://registry.npmjs.org/@posthog/core/-/core-1.23.2.tgz", - "integrity": "sha512-zTDdda9NuSHrnwSOfFMxX/pyXiycF4jtU1kTr8DL61dHhV+7LF6XF1ndRZZTuaGGbfbb/GJYkEsjEX9SXfNZeQ==", - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.6" - } - }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", - "license": "BSD-3-Clause" - }, - "node_modules/@radix-ui/primitive": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", - "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", - "license": "MIT" - }, - "node_modules/@radix-ui/react-collection": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", - "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", - "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-context": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", - "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dialog": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz", - "integrity": "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.11", - "@radix-ui/react-focus-guards": "1.1.3", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "aria-hidden": "^1.2.4", - "react-remove-scroll": "^2.6.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-direction": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", - "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz", - "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-escape-keydown": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-focus-guards": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz", - "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-focus-scope": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", - "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-id": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", - "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-portal": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", - "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-presence": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz", - "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-primitive": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", - "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-primitive/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-roving-focus": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.11.tgz", - "integrity": "sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-slot": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.0.tgz", - "integrity": "sha512-ujc+V6r0HNDviYqIK3rW4ffgYiZ8g5DEHrGJVk4x7kTlLXRDILnKX9vAUYeIsLOoDpDJ0ujpqMkjH4w2ofuo6w==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-tabs": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.13.tgz", - "integrity": "sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.11", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-callback-ref": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", - "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", - "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-effect-event": "0.0.2", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-effect-event": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", - "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-escape-keydown": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", - "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-callback-ref": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", - "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@react-native-async-storage/async-storage": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@react-native-async-storage/async-storage/-/async-storage-2.2.0.tgz", - "integrity": "sha512-gvRvjR5JAaUZF8tv2Kcq/Gbt3JHwbKFYfmb445rhOj6NUMx3qPLixmDx5pZAyb9at1bYvJ4/eTUipU5aki45xw==", - "license": "MIT", - "dependencies": { - "merge-options": "^3.0.4" - }, - "peerDependencies": { - "react-native": "^0.0.0-0 || >=0.65 <1.0" - } - }, - "node_modules/@react-native/assets-registry": { - "version": "0.81.5", - "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.81.5.tgz", - "integrity": "sha512-705B6x/5Kxm1RKRvSv0ADYWm5JOnoiQ1ufW7h8uu2E6G9Of/eE6hP/Ivw3U5jI16ERqZxiKQwk34VJbB0niX9w==", - "license": "MIT", - "engines": { - "node": ">= 20.19.4" - } - }, - "node_modules/@react-native/babel-plugin-codegen": { - "version": "0.81.5", - "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.81.5.tgz", - "integrity": "sha512-oF71cIH6je3fSLi6VPjjC3Sgyyn57JLHXs+mHWc9MoCiJJcM4nqsS5J38zv1XQ8d3zOW2JtHro+LF0tagj2bfQ==", - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.25.3", - "@react-native/codegen": "0.81.5" - }, - "engines": { - "node": ">= 20.19.4" - } - }, - "node_modules/@react-native/babel-preset": { - "version": "0.81.5", - "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.81.5.tgz", - "integrity": "sha512-UoI/x/5tCmi+pZ3c1+Ypr1DaRMDLI3y+Q70pVLLVgrnC3DHsHRIbHcCHIeG/IJvoeFqFM2sTdhSOLJrf8lOPrA==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.25.2", - "@babel/plugin-proposal-export-default-from": "^7.24.7", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-default-from": "^7.24.7", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-transform-arrow-functions": "^7.24.7", - "@babel/plugin-transform-async-generator-functions": "^7.25.4", - "@babel/plugin-transform-async-to-generator": "^7.24.7", - "@babel/plugin-transform-block-scoping": "^7.25.0", - "@babel/plugin-transform-class-properties": "^7.25.4", - "@babel/plugin-transform-classes": "^7.25.4", - "@babel/plugin-transform-computed-properties": "^7.24.7", - "@babel/plugin-transform-destructuring": "^7.24.8", - "@babel/plugin-transform-flow-strip-types": "^7.25.2", - "@babel/plugin-transform-for-of": "^7.24.7", - "@babel/plugin-transform-function-name": "^7.25.1", - "@babel/plugin-transform-literals": "^7.25.2", - "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", - "@babel/plugin-transform-modules-commonjs": "^7.24.8", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", - "@babel/plugin-transform-numeric-separator": "^7.24.7", - "@babel/plugin-transform-object-rest-spread": "^7.24.7", - "@babel/plugin-transform-optional-catch-binding": "^7.24.7", - "@babel/plugin-transform-optional-chaining": "^7.24.8", - "@babel/plugin-transform-parameters": "^7.24.7", - "@babel/plugin-transform-private-methods": "^7.24.7", - "@babel/plugin-transform-private-property-in-object": "^7.24.7", - "@babel/plugin-transform-react-display-name": "^7.24.7", - "@babel/plugin-transform-react-jsx": "^7.25.2", - "@babel/plugin-transform-react-jsx-self": "^7.24.7", - "@babel/plugin-transform-react-jsx-source": "^7.24.7", - "@babel/plugin-transform-regenerator": "^7.24.7", - "@babel/plugin-transform-runtime": "^7.24.7", - "@babel/plugin-transform-shorthand-properties": "^7.24.7", - "@babel/plugin-transform-spread": "^7.24.7", - "@babel/plugin-transform-sticky-regex": "^7.24.7", - "@babel/plugin-transform-typescript": "^7.25.2", - "@babel/plugin-transform-unicode-regex": "^7.24.7", - "@babel/template": "^7.25.0", - "@react-native/babel-plugin-codegen": "0.81.5", - "babel-plugin-syntax-hermes-parser": "0.29.1", - "babel-plugin-transform-flow-enums": "^0.0.2", - "react-refresh": "^0.14.0" - }, - "engines": { - "node": ">= 20.19.4" - }, - "peerDependencies": { - "@babel/core": "*" - } - }, - "node_modules/@react-native/codegen": { - "version": "0.81.5", - "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.81.5.tgz", - "integrity": "sha512-a2TDA03Up8lpSa9sh5VRGCQDXgCTOyDOFH+aqyinxp1HChG8uk89/G+nkJ9FPd0rqgi25eCTR16TWdS3b+fA6g==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.25.2", - "@babel/parser": "^7.25.3", - "glob": "^7.1.1", - "hermes-parser": "0.29.1", - "invariant": "^2.2.4", - "nullthrows": "^1.1.1", - "yargs": "^17.6.2" - }, - "engines": { - "node": ">= 20.19.4" - }, - "peerDependencies": { - "@babel/core": "*" - } - }, - "node_modules/@react-native/codegen/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", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@react-native/codegen/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", - "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/@react-native/codegen/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@react-native/community-cli-plugin": { - "version": "0.81.5", - "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.81.5.tgz", - "integrity": "sha512-yWRlmEOtcyvSZ4+OvqPabt+NS36vg0K/WADTQLhrYrm9qdZSuXmq8PmdJWz/68wAqKQ+4KTILiq2kjRQwnyhQw==", - "license": "MIT", - "dependencies": { - "@react-native/dev-middleware": "0.81.5", - "debug": "^4.4.0", - "invariant": "^2.2.4", - "metro": "^0.83.1", - "metro-config": "^0.83.1", - "metro-core": "^0.83.1", - "semver": "^7.1.3" - }, - "engines": { - "node": ">= 20.19.4" - }, - "peerDependencies": { - "@react-native-community/cli": "*", - "@react-native/metro-config": "*" - }, - "peerDependenciesMeta": { - "@react-native-community/cli": { - "optional": true - }, - "@react-native/metro-config": { - "optional": true - } - } - }, - "node_modules/@react-native/community-cli-plugin/node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@react-native/debugger-frontend": { - "version": "0.81.5", - "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.81.5.tgz", - "integrity": "sha512-bnd9FSdWKx2ncklOetCgrlwqSGhMHP2zOxObJbOWXoj7GHEmih4MKarBo5/a8gX8EfA1EwRATdfNBQ81DY+h+w==", - "license": "BSD-3-Clause", - "engines": { - "node": ">= 20.19.4" - } - }, - "node_modules/@react-native/dev-middleware": { - "version": "0.81.5", - "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.81.5.tgz", - "integrity": "sha512-WfPfZzboYgo/TUtysuD5xyANzzfka8Ebni6RIb2wDxhb56ERi7qDrE4xGhtPsjCL4pQBXSVxyIlCy0d8I6EgGA==", - "license": "MIT", - "dependencies": { - "@isaacs/ttlcache": "^1.4.1", - "@react-native/debugger-frontend": "0.81.5", - "chrome-launcher": "^0.15.2", - "chromium-edge-launcher": "^0.2.0", - "connect": "^3.6.5", - "debug": "^4.4.0", - "invariant": "^2.2.4", - "nullthrows": "^1.1.1", - "open": "^7.0.3", - "serve-static": "^1.16.2", - "ws": "^6.2.3" - }, - "engines": { - "node": ">= 20.19.4" - } - }, - "node_modules/@react-native/dev-middleware/node_modules/ws": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", - "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", - "license": "MIT", - "dependencies": { - "async-limiter": "~1.0.0" - } - }, - "node_modules/@react-native/gradle-plugin": { - "version": "0.81.5", - "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.81.5.tgz", - "integrity": "sha512-hORRlNBj+ReNMLo9jme3yQ6JQf4GZpVEBLxmTXGGlIL78MAezDZr5/uq9dwElSbcGmLEgeiax6e174Fie6qPLg==", - "license": "MIT", - "engines": { - "node": ">= 20.19.4" - } - }, - "node_modules/@react-native/js-polyfills": { - "version": "0.81.5", - "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.81.5.tgz", - "integrity": "sha512-fB7M1CMOCIUudTRuj7kzxIBTVw2KXnsgbQ6+4cbqSxo8NmRRhA0Ul4ZUzZj3rFd3VznTL4Brmocv1oiN0bWZ8w==", - "license": "MIT", - "engines": { - "node": ">= 20.19.4" - } - }, - "node_modules/@react-native/normalize-colors": { - "version": "0.81.5", - "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.81.5.tgz", - "integrity": "sha512-0HuJ8YtqlTVRXGZuGeBejLE04wSQsibpTI+RGOyVqxZvgtlLLC/Ssw0UmbHhT4lYMp2fhdtvKZSs5emWB1zR/g==", - "license": "MIT" - }, - "node_modules/@react-native/virtualized-lists": { - "version": "0.81.5", - "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.81.5.tgz", - "integrity": "sha512-UVXgV/db25OPIvwZySeToXD/9sKKhOdkcWmmf4Jh8iBZuyfML+/5CasaZ1E7Lqg6g3uqVQq75NqIwkYmORJMPw==", - "license": "MIT", - "dependencies": { - "invariant": "^2.2.4", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">= 20.19.4" - }, - "peerDependencies": { - "@types/react": "^19.1.0", - "react": "*", - "react-native": "*" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@react-navigation/bottom-tabs": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/@react-navigation/bottom-tabs/-/bottom-tabs-7.12.0.tgz", - "integrity": "sha512-/GtOfVWRligHG0mvX39I1FGdUWeWl0GVF2okEziQSQj0bOTrLIt7y44C3r/aCLkEpTVltCPGM3swqGTH3UfRCw==", - "license": "MIT", - "dependencies": { - "@react-navigation/elements": "^2.9.5", - "color": "^4.2.3", - "sf-symbols-typescript": "^2.1.0" - }, - "peerDependencies": { - "@react-navigation/native": "^7.1.28", - "react": ">= 18.2.0", - "react-native": "*", - "react-native-safe-area-context": ">= 4.0.0", - "react-native-screens": ">= 4.0.0" - } - }, - "node_modules/@react-navigation/core": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@react-navigation/core/-/core-7.14.0.tgz", - "integrity": "sha512-tMpzskBzVp0E7CRNdNtJIdXjk54Kwe/TF9ViXAef+YFM1kSfGv4e/B2ozfXE+YyYgmh4WavTv8fkdJz1CNyu+g==", - "license": "MIT", - "dependencies": { - "@react-navigation/routers": "^7.5.3", - "escape-string-regexp": "^4.0.0", - "fast-deep-equal": "^3.1.3", - "nanoid": "^3.3.11", - "query-string": "^7.1.3", - "react-is": "^19.1.0", - "use-latest-callback": "^0.2.4", - "use-sync-external-store": "^1.5.0" - }, - "peerDependencies": { - "react": ">= 18.2.0" - } - }, - "node_modules/@react-navigation/elements": { - "version": "2.9.5", - "resolved": "https://registry.npmjs.org/@react-navigation/elements/-/elements-2.9.5.tgz", - "integrity": "sha512-iHZU8rRN1014Upz73AqNVXDvSMZDh5/ktQ1CMe21rdgnOY79RWtHHBp9qOS3VtqlUVYGkuX5GEw5mDt4tKdl0g==", - "license": "MIT", - "dependencies": { - "color": "^4.2.3", - "use-latest-callback": "^0.2.4", - "use-sync-external-store": "^1.5.0" - }, - "peerDependencies": { - "@react-native-masked-view/masked-view": ">= 0.2.0", - "@react-navigation/native": "^7.1.28", - "react": ">= 18.2.0", - "react-native": "*", - "react-native-safe-area-context": ">= 4.0.0" - }, - "peerDependenciesMeta": { - "@react-native-masked-view/masked-view": { - "optional": true - } - } - }, - "node_modules/@react-navigation/native": { - "version": "7.1.28", - "resolved": "https://registry.npmjs.org/@react-navigation/native/-/native-7.1.28.tgz", - "integrity": "sha512-d1QDn+KNHfHGt3UIwOZvupvdsDdiHYZBEj7+wL2yDVo3tMezamYy60H9s3EnNVE1Ae1ty0trc7F2OKqo/RmsdQ==", - "license": "MIT", - "dependencies": { - "@react-navigation/core": "^7.14.0", - "escape-string-regexp": "^4.0.0", - "fast-deep-equal": "^3.1.3", - "nanoid": "^3.3.11", - "use-latest-callback": "^0.2.4" - }, - "peerDependencies": { - "react": ">= 18.2.0", - "react-native": "*" - } - }, - "node_modules/@react-navigation/native-stack": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/@react-navigation/native-stack/-/native-stack-7.12.0.tgz", - "integrity": "sha512-XmNJsPshjkNsahgbxNgGWQUq4s1l6HqH/Fei4QsjBNn/0mTvVrRVZwJ1XrY9YhWYvyiYkAN6/OmarWQaQJ0otQ==", - "license": "MIT", - "dependencies": { - "@react-navigation/elements": "^2.9.5", - "color": "^4.2.3", - "sf-symbols-typescript": "^2.1.0", - "warn-once": "^0.1.1" - }, - "peerDependencies": { - "@react-navigation/native": "^7.1.28", - "react": ">= 18.2.0", - "react-native": "*", - "react-native-safe-area-context": ">= 4.0.0", - "react-native-screens": ">= 4.0.0" - } - }, - "node_modules/@react-navigation/routers": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/@react-navigation/routers/-/routers-7.5.3.tgz", - "integrity": "sha512-1tJHg4KKRJuQ1/EvJxatrMef3NZXEPzwUIUZ3n1yJ2t7Q97siwRtbynRpQG9/69ebbtiZ8W3ScOZF/OmhvM4Rg==", - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.11" - } - }, - "node_modules/@revenuecat/purchases-js": { - "version": "1.26.2", - "resolved": "https://registry.npmjs.org/@revenuecat/purchases-js/-/purchases-js-1.26.2.tgz", - "integrity": "sha512-10k0LL3cmlxe9gN2GfXBLmLR3ZtnQN7wKpDxzJn/JtRSC0Sq12+/msCIuAiBYRP1CKJv8JAVVEyvYufMDqVf9A==", - "license": "MIT" - }, - "node_modules/@revenuecat/purchases-js-hybrid-mappings": { - "version": "17.41.1", - "resolved": "https://registry.npmjs.org/@revenuecat/purchases-js-hybrid-mappings/-/purchases-js-hybrid-mappings-17.41.1.tgz", - "integrity": "sha512-00T+PXH/2S3T8VmdOH1XZeC2OhIYWxw7YCOAssVHxxorU8JExowE7mlDcMOIb6lFCjAXQBj6t65TxmlHlkW3PA==", - "license": "MIT", - "dependencies": { - "@revenuecat/purchases-js": "1.26.2" - } - }, - "node_modules/@revenuecat/purchases-typescript-internal": { - "version": "17.41.1", - "resolved": "https://registry.npmjs.org/@revenuecat/purchases-typescript-internal/-/purchases-typescript-internal-17.41.1.tgz", - "integrity": "sha512-npyMpQPTcGjXpP8n5NQ4W6N0nc+zTXpb0HSQo6HL+3jNj2eH00EgS/Bzm0wOBtvQAjqINjl0q+Dl6ru/PCZxpw==", - "license": "MIT" - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.10", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", - "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", - "license": "MIT" - }, - "node_modules/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "license": "BSD-3-Clause", - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^3.0.0" - } - }, - "node_modules/@testing-library/jest-native": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/@testing-library/jest-native/-/jest-native-5.4.3.tgz", - "integrity": "sha512-/sSDGaOuE+PJ1Z9Kp4u7PQScSVVXGud59I/qsBFFJvIbcn4P6yYw6cBnBmbPF+X9aRIsTJRDl6gzw5ZkJNm66w==", - "deprecated": "DEPRECATED: This package is no longer maintained.\nPlease use the built-in Jest matchers available in @testing-library/react-native v12.4+.\n\nSee migration guide: https://callstack.github.io/react-native-testing-library/docs/migration/jest-matchers", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.2", - "jest-diff": "^29.0.1", - "jest-matcher-utils": "^29.0.1", - "pretty-format": "^29.0.3", - "redent": "^3.0.0" - }, - "peerDependencies": { - "react": ">=16.0.0", - "react-native": ">=0.59", - "react-test-renderer": ">=16.0.0" - } - }, - "node_modules/@testing-library/react-native": { - "version": "13.3.3", - "resolved": "https://registry.npmjs.org/@testing-library/react-native/-/react-native-13.3.3.tgz", - "integrity": "sha512-k6Mjsd9dbZgvY4Bl7P1NIpePQNi+dfYtlJ5voi9KQlynxSyQkfOgJmYGCYmw/aSgH/rUcFvG8u5gd4npzgRDyg==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "jest-matcher-utils": "^30.0.5", - "picocolors": "^1.1.1", - "pretty-format": "^30.0.5", - "redent": "^3.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "jest": ">=29.0.0", - "react": ">=18.2.0", - "react-native": ">=0.71", - "react-test-renderer": ">=18.2.0" - }, - "peerDependenciesMeta": { - "jest": { - "optional": true - } - } - }, - "node_modules/@testing-library/react-native/node_modules/@jest/schemas": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", - "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@sinclair/typebox": "^0.34.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@testing-library/react-native/node_modules/@sinclair/typebox": { - "version": "0.34.48", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.48.tgz", - "integrity": "sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/@testing-library/react-native/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@testing-library/react-native/node_modules/jest-diff": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.2.0.tgz", - "integrity": "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@jest/diff-sequences": "30.0.1", - "@jest/get-type": "30.1.0", - "chalk": "^4.1.2", - "pretty-format": "30.2.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@testing-library/react-native/node_modules/jest-matcher-utils": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.2.0.tgz", - "integrity": "sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@jest/get-type": "30.1.0", - "chalk": "^4.1.2", - "jest-diff": "30.2.0", - "pretty-format": "30.2.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@testing-library/react-native/node_modules/pretty-format": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", - "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "30.0.5", - "ansi-styles": "^5.2.0", - "react-is": "^18.3.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@testing-library/react-native/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", - "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.2" - } - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/hammerjs": { - "version": "2.0.46", - "resolved": "https://registry.npmjs.org/@types/hammerjs/-/hammerjs-2.0.46.tgz", - "integrity": "sha512-ynRvcq6wvqexJ9brDMS4BnBLzmr0e14d6ZJTEShTBWKymQiHwlAyGu0ZPEFI2Fh1U53F7tN9ufClWM5KvqkKOw==", - "license": "MIT" - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "license": "MIT" - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/jest": { - "version": "29.5.14", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", - "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - } - }, - "node_modules/@types/jsdom": { - "version": "20.0.1", - "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-20.0.1.tgz", - "integrity": "sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/tough-cookie": "*", - "parse5": "^7.0.0" - } - }, - "node_modules/@types/node": { - "version": "25.2.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.2.2.tgz", - "integrity": "sha512-BkmoP5/FhRYek5izySdkOneRyXYN35I860MFAGupTdebyE66uZaR+bXLHq8k4DirE5DwQi3NuhvRU1jqTVwUrQ==", - "license": "MIT", - "dependencies": { - "undici-types": "~7.16.0" - } - }, - "node_modules/@types/react": { - "version": "19.1.17", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.17.tgz", - "integrity": "sha512-Qec1E3mhALmaspIrhWt9jkQMNdw6bReVu64mjvhbhq2NFPftLPVr+l1SZgmw/66WwBNpDh7ao5AT6gF5v41PFA==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "csstype": "^3.0.2" - } - }, - "node_modules/@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "license": "MIT" - }, - "node_modules/@types/tough-cookie": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", - "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/yargs": { - "version": "17.0.35", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", - "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "license": "MIT" - }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", - "license": "ISC" - }, - "node_modules/@urql/core": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@urql/core/-/core-5.2.0.tgz", - "integrity": "sha512-/n0ieD0mvvDnVAXEQgX/7qJiVcvYvNkOHeBvkwtylfjydar123caCXcl58PXFY11oU1oquJocVXHxLAbtv4x1A==", - "license": "MIT", - "dependencies": { - "@0no-co/graphql.web": "^1.0.13", - "wonka": "^6.3.2" - } - }, - "node_modules/@urql/exchange-retry": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@urql/exchange-retry/-/exchange-retry-1.3.2.tgz", - "integrity": "sha512-TQMCz2pFJMfpNxmSfX1VSfTjwUIFx/mL+p1bnfM1xjjdla7Z+KnGMW/EhFbpckp3LyWAH4PgOsMwOMnIN+MBFg==", - "license": "MIT", - "dependencies": { - "@urql/core": "^5.1.2", - "wonka": "^6.3.2" - }, - "peerDependencies": { - "@urql/core": "^5.0.0" - } - }, - "node_modules/@xmldom/xmldom": { - "version": "0.8.11", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz", - "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "deprecated": "Use your platform's native atob() and btoa() methods instead", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "license": "MIT", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-globals": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", - "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.1.0", - "acorn-walk": "^8.0.2" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/agent-base": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/ajv": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", - "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/anser": { - "version": "1.4.10", - "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", - "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==", - "license": "MIT" - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "license": "MIT", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "license": "MIT" - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/anymatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "license": "MIT" - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" - }, - "node_modules/aria-hidden": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", - "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "license": "MIT" - }, - "node_modules/assert": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", - "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "is-nan": "^1.3.2", - "object-is": "^1.1.5", - "object.assign": "^4.1.4", - "util": "^0.12.5" - } - }, - "node_modules/async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "license": "MIT" - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "license": "MIT", - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/await-lock": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/await-lock/-/await-lock-2.2.2.tgz", - "integrity": "sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw==", - "license": "MIT" - }, - "node_modules/babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", - "license": "MIT", - "dependencies": { - "@jest/transform": "^29.7.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "license": "BSD-3-Clause", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", - "license": "MIT", - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.15", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.15.tgz", - "integrity": "sha512-hR3GwrRwHUfYwGfrisXPIDP3JcYfBrW7wKE7+Au6wDYl7fm/ka1NEII6kORzxNU556JjfidZeBsO10kYvtV1aw==", - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.28.6", - "@babel/helper-define-polyfill-provider": "^0.6.6", - "semver": "^6.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", - "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", - "license": "MIT", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.5", - "core-js-compat": "^3.43.0" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.6.tgz", - "integrity": "sha512-hYm+XLYRMvupxiQzrvXUj7YyvFFVfv5gI0R71AJzudg1g2AI2vyCPPIFEBjk162/wFzti3inBHo7isWFuEVS/A==", - "license": "MIT", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.6" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-react-compiler": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-react-compiler/-/babel-plugin-react-compiler-1.0.0.tgz", - "integrity": "sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.26.0" - } - }, - "node_modules/babel-plugin-react-native-web": { - "version": "0.21.2", - "resolved": "https://registry.npmjs.org/babel-plugin-react-native-web/-/babel-plugin-react-native-web-0.21.2.tgz", - "integrity": "sha512-SPD0J6qjJn8231i0HZhlAGH6NORe+QvRSQM2mwQEzJ2Fb3E4ruWTiiicPlHjmeWShDXLcvoorOCXjeR7k/lyWA==", - "license": "MIT" - }, - "node_modules/babel-plugin-syntax-hermes-parser": { - "version": "0.29.1", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.29.1.tgz", - "integrity": "sha512-2WFYnoWGdmih1I1J5eIqxATOeycOqRwYxAQBu3cUu/rhwInwHUg7k60AFNbuGjSDL8tje5GDrAnxzRLcu2pYcA==", - "license": "MIT", - "dependencies": { - "hermes-parser": "0.29.1" - } - }, - "node_modules/babel-plugin-transform-flow-enums": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-enums/-/babel-plugin-transform-flow-enums-0.0.2.tgz", - "integrity": "sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==", - "license": "MIT", - "dependencies": { - "@babel/plugin-syntax-flow": "^7.12.1" - } - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", - "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", - "license": "MIT", - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-import-attributes": "^7.24.7", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5" - }, - "peerDependencies": { - "@babel/core": "^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/babel-preset-expo": { - "version": "54.0.10", - "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-54.0.10.tgz", - "integrity": "sha512-wTt7POavLFypLcPW/uC5v8y+mtQKDJiyGLzYCjqr9tx0Qc3vCXcDKk1iCFIj/++Iy5CWhhTflEa7VvVPNWeCfw==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/plugin-proposal-decorators": "^7.12.9", - "@babel/plugin-proposal-export-default-from": "^7.24.7", - "@babel/plugin-syntax-export-default-from": "^7.24.7", - "@babel/plugin-transform-class-static-block": "^7.27.1", - "@babel/plugin-transform-export-namespace-from": "^7.25.9", - "@babel/plugin-transform-flow-strip-types": "^7.25.2", - "@babel/plugin-transform-modules-commonjs": "^7.24.8", - "@babel/plugin-transform-object-rest-spread": "^7.24.7", - "@babel/plugin-transform-parameters": "^7.24.7", - "@babel/plugin-transform-private-methods": "^7.24.7", - "@babel/plugin-transform-private-property-in-object": "^7.24.7", - "@babel/plugin-transform-runtime": "^7.24.7", - "@babel/preset-react": "^7.22.15", - "@babel/preset-typescript": "^7.23.0", - "@react-native/babel-preset": "0.81.5", - "babel-plugin-react-compiler": "^1.0.0", - "babel-plugin-react-native-web": "~0.21.0", - "babel-plugin-syntax-hermes-parser": "^0.29.1", - "babel-plugin-transform-flow-enums": "^0.0.2", - "debug": "^4.3.4", - "resolve-from": "^5.0.0" - }, - "peerDependencies": { - "@babel/runtime": "^7.20.0", - "expo": "*", - "react-refresh": ">=0.14.0 <1.0.0" - }, - "peerDependenciesMeta": { - "@babel/runtime": { - "optional": true - }, - "expo": { - "optional": true - } - } - }, - "node_modules/babel-preset-jest": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", - "license": "MIT", - "dependencies": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/badgin": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/badgin/-/badgin-1.2.3.tgz", - "integrity": "sha512-NQGA7LcfCpSzIbGRbkgjgdWkjy7HI+Th5VLxTJfW5EeaAf3fnS+xWQaQOCYiny+q6QSvxqoSO04vCx+4u++EJw==", - "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" - }, - "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/baseline-browser-mapping": { - "version": "2.9.19", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz", - "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==", - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.js" - } - }, - "node_modules/better-opn": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz", - "integrity": "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==", - "license": "MIT", - "dependencies": { - "open": "^8.0.4" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/better-opn/node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "license": "MIT", - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/big-integer": { - "version": "1.6.52", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", - "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", - "license": "Unlicense", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/bignumber.js": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", - "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "license": "ISC" - }, - "node_modules/bplist-creator": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.0.tgz", - "integrity": "sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==", - "license": "MIT", - "dependencies": { - "stream-buffers": "2.2.x" - } - }, - "node_modules/bplist-parser": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz", - "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==", - "license": "MIT", - "dependencies": { - "big-integer": "1.6.x" - }, - "engines": { - "node": ">= 5.10.0" - } - }, - "node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", - "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "baseline-browser-mapping": "^2.9.0", - "caniuse-lite": "^1.0.30001759", - "electron-to-chromium": "^1.5.263", - "node-releases": "^2.0.27", - "update-browserslist-db": "^1.2.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "license": "Apache-2.0", - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "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-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", - "license": "BSD-3-Clause" - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "license": "MIT" - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001769", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001769.tgz", - "integrity": "sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/chownr": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", - "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/chrome-launcher": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.2.tgz", - "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==", - "license": "Apache-2.0", - "dependencies": { - "@types/node": "*", - "escape-string-regexp": "^4.0.0", - "is-wsl": "^2.2.0", - "lighthouse-logger": "^1.0.0" - }, - "bin": { - "print-chrome-path": "bin/print-chrome-path.js" - }, - "engines": { - "node": ">=12.13.0" - } - }, - "node_modules/chromium-edge-launcher": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/chromium-edge-launcher/-/chromium-edge-launcher-0.2.0.tgz", - "integrity": "sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg==", - "license": "Apache-2.0", - "dependencies": { - "@types/node": "*", - "escape-string-regexp": "^4.0.0", - "is-wsl": "^2.2.0", - "lighthouse-logger": "^1.0.0", - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - } - }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cjs-module-lexer": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", - "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", - "license": "MIT", - "dependencies": { - "restore-cursor": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/client-only": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", - "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", - "license": "MIT" - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/cliui/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", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "devOptional": true, - "license": "MIT", - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", - "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/color": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", - "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" - }, - "engines": { - "node": ">=12.5.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, - "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "license": "MIT", - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "license": "MIT", - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compression": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", - "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "compressible": "~2.0.18", - "debug": "2.6.9", - "negotiator": "~0.6.4", - "on-headers": "~1.1.0", - "safe-buffer": "5.2.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/compression/node_modules/negotiator": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", - "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "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" - }, - "node_modules/connect": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/connect/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/connect/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "license": "MIT" - }, - "node_modules/core-js-compat": { - "version": "3.48.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.48.0.tgz", - "integrity": "sha512-OM4cAF3D6VtH/WkLtWvyNC56EZVXsZdU3iqaMG2B4WvYrlqU831pc4UtG5yp0sE9z8Y02wVN7PjW5Zf9Gt0f1Q==", - "license": "MIT", - "dependencies": { - "browserslist": "^4.28.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/create-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - }, - "bin": { - "create-jest": "bin/create-jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/cross-fetch": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.2.0.tgz", - "integrity": "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==", - "license": "MIT", - "dependencies": { - "node-fetch": "^2.7.0" - } - }, - "node_modules/cross-fetch/node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/cross-fetch/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT" - }, - "node_modules/cross-fetch/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "license": "BSD-2-Clause" - }, - "node_modules/cross-fetch/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/css-in-js-utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/css-in-js-utils/-/css-in-js-utils-3.1.0.tgz", - "integrity": "sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==", - "license": "MIT", - "dependencies": { - "hyphenate-style-name": "^1.0.3" - } - }, - "node_modules/css-select": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", - "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "license": "MIT", - "dependencies": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/css-tree/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/css-what": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", - "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", - "license": "BSD-2-Clause", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cssom": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", - "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", - "dev": true, - "license": "MIT" - }, - "node_modules/cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssom": "~0.3.6" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cssstyle/node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true, - "license": "MIT" - }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/data-uri-to-buffer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", - "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, - "node_modules/data-urls": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", - "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "abab": "^2.0.6", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decimal.js": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", - "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", - "dev": true, - "license": "MIT" - }, - "node_modules/decode-uri-component": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", - "license": "MIT", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/dedent": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.1.tgz", - "integrity": "sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg==", - "devOptional": true, - "license": "MIT", - "peerDependencies": { - "babel-plugin-macros": "^3.1.0" - }, - "peerDependenciesMeta": { - "babel-plugin-macros": { - "optional": true - } - } - }, - "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/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "license": "MIT", - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-node-es": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", - "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", - "license": "MIT" - }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/dom-serializer/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" - }, - "node_modules/domexception": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", - "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", - "deprecated": "Use your platform's native DOMException instead", - "dev": true, - "license": "MIT", - "dependencies": { - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/domexception/node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - } - }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", - "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/dotenv": { - "version": "16.4.7", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", - "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/dotenv-expand": { - "version": "11.0.7", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", - "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", - "license": "BSD-2-Clause", - "dependencies": { - "dotenv": "^16.4.5" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "license": "MIT" - }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT" - }, - "node_modules/electron-to-chromium": { - "version": "1.5.286", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.286.tgz", - "integrity": "sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==", - "license": "ISC" - }, - "node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "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" - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/entities": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/env-editor": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/env-editor/-/env-editor-0.4.2.tgz", - "integrity": "sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/error-ex": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", - "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/error-ex/node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/error-stack-parser": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", - "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", - "license": "MIT", - "dependencies": { - "stackframe": "^1.3.4" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT" - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/escodegen/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/exec-async": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/exec-async/-/exec-async-2.2.0.tgz", - "integrity": "sha512-87OpwcEiMia/DeiKFzaQNBNFeN3XkkpYIh9FyOqq5mS2oKv3CBE67PXoEKcr6nodWdXNogTiQ0jE2NGuoffXPw==", - "license": "MIT" - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/execa/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/execa/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "devOptional": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@jest/expect-utils": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/expo": { - "version": "54.0.33", - "resolved": "https://registry.npmjs.org/expo/-/expo-54.0.33.tgz", - "integrity": "sha512-3yOEfAKqo+gqHcV8vKcnq0uA5zxlohnhA3fu4G43likN8ct5ZZ3LjAh9wDdKteEkoad3tFPvwxmXW711S5OHUw==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.20.0", - "@expo/cli": "54.0.23", - "@expo/config": "~12.0.13", - "@expo/config-plugins": "~54.0.4", - "@expo/devtools": "0.1.8", - "@expo/fingerprint": "0.15.4", - "@expo/metro": "~54.2.0", - "@expo/metro-config": "54.0.14", - "@expo/vector-icons": "^15.0.3", - "@ungap/structured-clone": "^1.3.0", - "babel-preset-expo": "~54.0.10", - "expo-asset": "~12.0.12", - "expo-constants": "~18.0.13", - "expo-file-system": "~19.0.21", - "expo-font": "~14.0.11", - "expo-keep-awake": "~15.0.8", - "expo-modules-autolinking": "3.0.24", - "expo-modules-core": "3.0.29", - "pretty-format": "^29.7.0", - "react-refresh": "^0.14.2", - "whatwg-url-without-unicode": "8.0.0-3" - }, - "bin": { - "expo": "bin/cli", - "expo-modules-autolinking": "bin/autolinking", - "fingerprint": "bin/fingerprint" - }, - "peerDependencies": { - "@expo/dom-webview": "*", - "@expo/metro-runtime": "*", - "react": "*", - "react-native": "*", - "react-native-webview": "*" - }, - "peerDependenciesMeta": { - "@expo/dom-webview": { - "optional": true - }, - "@expo/metro-runtime": { - "optional": true - }, - "react-native-webview": { - "optional": true - } - } - }, - "node_modules/expo-application": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/expo-application/-/expo-application-7.0.8.tgz", - "integrity": "sha512-qFGyxk7VJbrNOQWBbE09XUuGuvkOgFS9QfToaK2FdagM2aQ+x3CvGV2DuVgl/l4ZxPgIf3b/MNh9xHpwSwn74Q==", - "license": "MIT", - "peerDependencies": { - "expo": "*" - } - }, - "node_modules/expo-asset": { - "version": "12.0.12", - "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-12.0.12.tgz", - "integrity": "sha512-CsXFCQbx2fElSMn0lyTdRIyKlSXOal6ilLJd+yeZ6xaC7I9AICQgscY5nj0QcwgA+KYYCCEQEBndMsmj7drOWQ==", - "license": "MIT", - "dependencies": { - "@expo/image-utils": "^0.8.8", - "expo-constants": "~18.0.12" - }, - "peerDependencies": { - "expo": "*", - "react": "*", - "react-native": "*" - } - }, - "node_modules/expo-av": { - "version": "16.0.8", - "resolved": "https://registry.npmjs.org/expo-av/-/expo-av-16.0.8.tgz", - "integrity": "sha512-cmVPftGR/ca7XBgs7R6ky36lF3OC0/MM/lpgX/yXqfv0jASTsh7AYX9JxHCwFmF+Z6JEB1vne9FDx4GiLcGreQ==", - "license": "MIT", - "peerDependencies": { - "expo": "*", - "react": "*", - "react-native": "*", - "react-native-web": "*" - }, - "peerDependenciesMeta": { - "react-native-web": { - "optional": true - } - } - }, - "node_modules/expo-blur": { - "version": "15.0.8", - "resolved": "https://registry.npmjs.org/expo-blur/-/expo-blur-15.0.8.tgz", - "integrity": "sha512-rWyE1NBRZEu9WD+X+5l7gyPRszw7n12cW3IRNAb5i6KFzaBp8cxqT5oeaphJapqURvcqhkOZn2k5EtBSbsuU7w==", - "license": "MIT", - "peerDependencies": { - "expo": "*", - "react": "*", - "react-native": "*" - } - }, - "node_modules/expo-build-properties": { - "version": "55.0.9", - "resolved": "https://registry.npmjs.org/expo-build-properties/-/expo-build-properties-55.0.9.tgz", - "integrity": "sha512-p0rNHW/6ghKsvjlUn2DQfbLYuTB6ba+15SeTPOz5BYbyU1F/0F/YyxBtHdmWitqgDPn6VgXQeKhiNC1fMwYDpg==", - "license": "MIT", - "dependencies": { - "@expo/schema-utils": "^55.0.2", - "resolve-from": "^5.0.0", - "semver": "^7.6.0" - }, - "peerDependencies": { - "expo": "*" - } - }, - "node_modules/expo-build-properties/node_modules/@expo/schema-utils": { - "version": "55.0.2", - "resolved": "https://registry.npmjs.org/@expo/schema-utils/-/schema-utils-55.0.2.tgz", - "integrity": "sha512-QZ5WKbJOWkCrMq0/kfhV9ry8te/OaS34YgLVpG8u9y2gix96TlpRTbxM/YATjNcUR2s4fiQmPCOxkGtog4i37g==", - "license": "MIT" - }, - "node_modules/expo-build-properties/node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/expo-camera": { - "version": "17.0.10", - "resolved": "https://registry.npmjs.org/expo-camera/-/expo-camera-17.0.10.tgz", - "integrity": "sha512-w1RBw83mAGVk4BPPwNrCZyFop0VLiVSRE3c2V9onWbdFwonpRhzmB4drygG8YOUTl1H3wQvALJHyMPTbgsK1Jg==", - "license": "MIT", - "dependencies": { - "invariant": "^2.2.4" - }, - "peerDependencies": { - "expo": "*", - "react": "*", - "react-native": "*", - "react-native-web": "*" - }, - "peerDependenciesMeta": { - "react-native-web": { - "optional": true - } - } - }, - "node_modules/expo-constants": { - "version": "18.0.13", - "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-18.0.13.tgz", - "integrity": "sha512-FnZn12E1dRYKDHlAdIyNFhBurKTS3F9CrfrBDJI5m3D7U17KBHMQ6JEfYlSj7LG7t+Ulr+IKaj58L1k5gBwTcQ==", - "license": "MIT", - "dependencies": { - "@expo/config": "~12.0.13", - "@expo/env": "~2.0.8" - }, - "peerDependencies": { - "expo": "*", - "react-native": "*" - } - }, - "node_modules/expo-dev-client": { - "version": "6.0.20", - "resolved": "https://registry.npmjs.org/expo-dev-client/-/expo-dev-client-6.0.20.tgz", - "integrity": "sha512-5XjoVlj1OxakNxy55j/AUaGPrDOlQlB6XdHLLWAw61w5ffSpUDHDnuZzKzs9xY1eIaogOqTOQaAzZ2ddBkdXLA==", - "license": "MIT", - "dependencies": { - "expo-dev-launcher": "6.0.20", - "expo-dev-menu": "7.0.18", - "expo-dev-menu-interface": "2.0.0", - "expo-manifests": "~1.0.10", - "expo-updates-interface": "~2.0.0" - }, - "peerDependencies": { - "expo": "*" - } - }, - "node_modules/expo-dev-launcher": { - "version": "6.0.20", - "resolved": "https://registry.npmjs.org/expo-dev-launcher/-/expo-dev-launcher-6.0.20.tgz", - "integrity": "sha512-a04zHEeT9sB0L5EB38fz7sNnUKJ2Ar1pXpcyl60Ki8bXPNCs9rjY7NuYrDkP/irM8+1DklMBqHpyHiLyJ/R+EA==", - "license": "MIT", - "dependencies": { - "ajv": "^8.11.0", - "expo-dev-menu": "7.0.18", - "expo-manifests": "~1.0.10" - }, - "peerDependencies": { - "expo": "*" - } - }, - "node_modules/expo-dev-menu": { - "version": "7.0.18", - "resolved": "https://registry.npmjs.org/expo-dev-menu/-/expo-dev-menu-7.0.18.tgz", - "integrity": "sha512-4kTdlHrnZCAWCT6tZRQHSSjZ7vECFisL4T+nsG/GJDo/jcHNaOVGV5qPV9wzlTxyMk3YOPggRw4+g7Ownrg5eA==", - "license": "MIT", - "dependencies": { - "expo-dev-menu-interface": "2.0.0" - }, - "peerDependencies": { - "expo": "*" - } - }, - "node_modules/expo-dev-menu-interface": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/expo-dev-menu-interface/-/expo-dev-menu-interface-2.0.0.tgz", - "integrity": "sha512-BvAMPt6x+vyXpThsyjjOYyjwfjREV4OOpQkZ0tNl+nGpsPfcY9mc6DRACoWnH9KpLzyIt3BOgh3cuy/h/OxQjw==", - "license": "MIT", - "peerDependencies": { - "expo": "*" - } - }, - "node_modules/expo-device": { - "version": "8.0.10", - "resolved": "https://registry.npmjs.org/expo-device/-/expo-device-8.0.10.tgz", - "integrity": "sha512-jd5BxjaF7382JkDMaC+P04aXXknB2UhWaVx5WiQKA05ugm/8GH5uaz9P9ckWdMKZGQVVEOC8MHaUADoT26KmFA==", - "license": "MIT", - "dependencies": { - "ua-parser-js": "^0.7.33" - }, - "peerDependencies": { - "expo": "*" - } - }, - "node_modules/expo-device/node_modules/ua-parser-js": { - "version": "0.7.41", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.41.tgz", - "integrity": "sha512-O3oYyCMPYgNNHuO7Jjk3uacJWZF8loBgwrfd/5LE/HyZ3lUIOdniQ7DNXJcIgZbwioZxk0fLfI4EVnetdiX5jg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/ua-parser-js" - }, - { - "type": "paypal", - "url": "https://paypal.me/faisalman" - }, - { - "type": "github", - "url": "https://github.com/sponsors/faisalman" - } - ], - "license": "MIT", - "bin": { - "ua-parser-js": "script/cli.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/expo-eas-client": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/expo-eas-client/-/expo-eas-client-1.0.8.tgz", - "integrity": "sha512-5or11NJhSeDoHHI6zyvQDW2cz/yFyE+1Cz8NTs5NK8JzC7J0JrkUgptWtxyfB6Xs/21YRNifd3qgbBN3hfKVgA==", - "license": "MIT" - }, - "node_modules/expo-file-system": { - "version": "19.0.21", - "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-19.0.21.tgz", - "integrity": "sha512-s3DlrDdiscBHtab/6W1osrjGL+C2bvoInPJD7sOwmxfJ5Woynv2oc+Fz1/xVXaE/V7HE/+xrHC/H45tu6lZzzg==", - "license": "MIT", - "peerDependencies": { - "expo": "*", - "react-native": "*" - } - }, - "node_modules/expo-font": { - "version": "14.0.11", - "resolved": "https://registry.npmjs.org/expo-font/-/expo-font-14.0.11.tgz", - "integrity": "sha512-ga0q61ny4s/kr4k8JX9hVH69exVSIfcIc19+qZ7gt71Mqtm7xy2c6kwsPTCyhBW2Ro5yXTT8EaZOpuRi35rHbg==", - "license": "MIT", - "dependencies": { - "fontfaceobserver": "^2.1.0" - }, - "peerDependencies": { - "expo": "*", - "react": "*", - "react-native": "*" - } - }, - "node_modules/expo-haptics": { - "version": "15.0.8", - "resolved": "https://registry.npmjs.org/expo-haptics/-/expo-haptics-15.0.8.tgz", - "integrity": "sha512-lftutojy8Qs8zaDzzjwM3gKHFZ8bOOEZDCkmh2Ddpe95Ra6kt2izeOfOfKuP/QEh0MZ1j9TfqippyHdRd1ZM9g==", - "license": "MIT", - "peerDependencies": { - "expo": "*" - } - }, - "node_modules/expo-image-loader": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/expo-image-loader/-/expo-image-loader-6.0.0.tgz", - "integrity": "sha512-nKs/xnOGw6ACb4g26xceBD57FKLFkSwEUTDXEDF3Gtcu3MqF3ZIYd3YM+sSb1/z9AKV1dYT7rMSGVNgsveXLIQ==", - "license": "MIT", - "peerDependencies": { - "expo": "*" - } - }, - "node_modules/expo-image-manipulator": { - "version": "14.0.8", - "resolved": "https://registry.npmjs.org/expo-image-manipulator/-/expo-image-manipulator-14.0.8.tgz", - "integrity": "sha512-sXsXjm7rIxLWZe0j2A41J/Ph53PpFJRdyzJ3EQ/qetxLUvS2m3K1sP5xy37px43qCf0l79N/i6XgFgenFV36/Q==", - "license": "MIT", - "dependencies": { - "expo-image-loader": "~6.0.0" - }, - "peerDependencies": { - "expo": "*" - } - }, - "node_modules/expo-image-picker": { - "version": "17.0.10", - "resolved": "https://registry.npmjs.org/expo-image-picker/-/expo-image-picker-17.0.10.tgz", - "integrity": "sha512-a2xrowp2trmvXyUWgX3O6Q2rZaa2C59AqivKI7+bm+wLvMfTEbZgldLX4rEJJhM8xtmEDTNU+lzjtObwzBRGaw==", - "license": "MIT", - "dependencies": { - "expo-image-loader": "~6.0.0" - }, - "peerDependencies": { - "expo": "*" - } - }, - "node_modules/expo-json-utils": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/expo-json-utils/-/expo-json-utils-0.15.0.tgz", - "integrity": "sha512-duRT6oGl80IDzH2LD2yEFWNwGIC2WkozsB6HF3cDYNoNNdUvFk6uN3YiwsTsqVM/D0z6LEAQ01/SlYvN+Fw0JQ==", - "license": "MIT" - }, - "node_modules/expo-keep-awake": { - "version": "15.0.8", - "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-15.0.8.tgz", - "integrity": "sha512-YK9M1VrnoH1vLJiQzChZgzDvVimVoriibiDIFLbQMpjYBnvyfUeHJcin/Gx1a+XgupNXy92EQJLgI/9ZuXajYQ==", - "license": "MIT", - "peerDependencies": { - "expo": "*", - "react": "*" - } - }, - "node_modules/expo-linking": { - "version": "8.0.11", - "resolved": "https://registry.npmjs.org/expo-linking/-/expo-linking-8.0.11.tgz", - "integrity": "sha512-+VSaNL5om3kOp/SSKO5qe6cFgfSIWnnQDSbA7XLs3ECkYzXRquk5unxNS3pg7eK5kNUmQ4kgLI7MhTggAEUBLA==", - "license": "MIT", - "dependencies": { - "expo-constants": "~18.0.12", - "invariant": "^2.2.4" - }, - "peerDependencies": { - "react": "*", - "react-native": "*" - } - }, - "node_modules/expo-localization": { - "version": "17.0.8", - "resolved": "https://registry.npmjs.org/expo-localization/-/expo-localization-17.0.8.tgz", - "integrity": "sha512-UrdwklZBDJ+t+ZszMMiE0SXZ2eJxcquCuQcl6EvGHM9K+e6YqKVRQ+w8qE+iIB3H75v2RJy6MHAaLK+Mqeo04g==", - "license": "MIT", - "dependencies": { - "rtl-detect": "^1.0.2" - }, - "peerDependencies": { - "expo": "*", - "react": "*" - } - }, - "node_modules/expo-manifests": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/expo-manifests/-/expo-manifests-1.0.10.tgz", - "integrity": "sha512-oxDUnURPcL4ZsOBY6X1DGWGuoZgVAFzp6PISWV7lPP2J0r8u1/ucuChBgpK7u1eLGFp6sDIPwXyEUCkI386XSQ==", - "license": "MIT", - "dependencies": { - "@expo/config": "~12.0.11", - "expo-json-utils": "~0.15.0" - }, - "peerDependencies": { - "expo": "*" - } - }, - "node_modules/expo-modules-autolinking": { - "version": "3.0.24", - "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-3.0.24.tgz", - "integrity": "sha512-TP+6HTwhL7orDvsz2VzauyQlXJcAWyU3ANsZ7JGL4DQu8XaZv/A41ZchbtAYLfozNA2Ya1Hzmhx65hXryBMjaQ==", - "license": "MIT", - "dependencies": { - "@expo/spawn-async": "^1.7.2", - "chalk": "^4.1.0", - "commander": "^7.2.0", - "require-from-string": "^2.0.2", - "resolve-from": "^5.0.0" - }, - "bin": { - "expo-modules-autolinking": "bin/expo-modules-autolinking.js" - } - }, - "node_modules/expo-modules-core": { - "version": "3.0.29", - "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-3.0.29.tgz", - "integrity": "sha512-LzipcjGqk8gvkrOUf7O2mejNWugPkf3lmd9GkqL9WuNyeN2fRwU0Dn77e3ZUKI3k6sI+DNwjkq4Nu9fNN9WS7Q==", - "license": "MIT", - "dependencies": { - "invariant": "^2.2.4" - }, - "peerDependencies": { - "react": "*", - "react-native": "*" - } - }, - "node_modules/expo-notifications": { - "version": "0.32.16", - "resolved": "https://registry.npmjs.org/expo-notifications/-/expo-notifications-0.32.16.tgz", - "integrity": "sha512-QQD/UA6v7LgvwIJ+tS7tSvqJZkdp0nCSj9MxsDk/jU1GttYdK49/5L2LvE/4U0H7sNBz1NZAyhDZozg8xgBLXw==", - "license": "MIT", - "dependencies": { - "@expo/image-utils": "^0.8.8", - "@ide/backoff": "^1.0.0", - "abort-controller": "^3.0.0", - "assert": "^2.0.0", - "badgin": "^1.1.5", - "expo-application": "~7.0.8", - "expo-constants": "~18.0.13" - }, - "peerDependencies": { - "expo": "*", - "react": "*", - "react-native": "*" - } - }, - "node_modules/expo-router": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/expo-router/-/expo-router-6.0.23.tgz", - "integrity": "sha512-qCxVAiCrCyu0npky6azEZ6dJDMt77OmCzEbpF6RbUTlfkaCA417LvY14SBkk0xyGruSxy/7pvJOI6tuThaUVCA==", - "license": "MIT", - "dependencies": { - "@expo/metro-runtime": "^6.1.2", - "@expo/schema-utils": "^0.1.8", - "@radix-ui/react-slot": "1.2.0", - "@radix-ui/react-tabs": "^1.1.12", - "@react-navigation/bottom-tabs": "^7.4.0", - "@react-navigation/native": "^7.1.8", - "@react-navigation/native-stack": "^7.3.16", - "client-only": "^0.0.1", - "debug": "^4.3.4", - "escape-string-regexp": "^4.0.0", - "expo-server": "^1.0.5", - "fast-deep-equal": "^3.1.3", - "invariant": "^2.2.4", - "nanoid": "^3.3.8", - "query-string": "^7.1.3", - "react-fast-compare": "^3.2.2", - "react-native-is-edge-to-edge": "^1.1.6", - "semver": "~7.6.3", - "server-only": "^0.0.1", - "sf-symbols-typescript": "^2.1.0", - "shallowequal": "^1.1.0", - "use-latest-callback": "^0.2.1", - "vaul": "^1.1.2" - }, - "peerDependencies": { - "@expo/metro-runtime": "^6.1.2", - "@react-navigation/drawer": "^7.5.0", - "@testing-library/react-native": ">= 12.0.0", - "expo": "*", - "expo-constants": "^18.0.13", - "expo-linking": "^8.0.11", - "react": "*", - "react-dom": "*", - "react-native": "*", - "react-native-gesture-handler": "*", - "react-native-reanimated": "*", - "react-native-safe-area-context": ">= 5.4.0", - "react-native-screens": "*", - "react-native-web": "*", - "react-server-dom-webpack": "~19.0.4 || ~19.1.5 || ~19.2.4" - }, - "peerDependenciesMeta": { - "@react-navigation/drawer": { - "optional": true - }, - "@testing-library/react-native": { - "optional": true - }, - "react-dom": { - "optional": true - }, - "react-native-gesture-handler": { - "optional": true - }, - "react-native-reanimated": { - "optional": true - }, - "react-native-web": { - "optional": true - }, - "react-server-dom-webpack": { - "optional": true - } - } - }, - "node_modules/expo-router/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/expo-secure-store": { - "version": "15.0.8", - "resolved": "https://registry.npmjs.org/expo-secure-store/-/expo-secure-store-15.0.8.tgz", - "integrity": "sha512-lHnzvRajBu4u+P99+0GEMijQMFCOYpWRO4dWsXSuMt77+THPIGjzNvVKrGSl6mMrLsfVaKL8BpwYZLGlgA+zAw==", - "license": "MIT", - "peerDependencies": { - "expo": "*" - } - }, - "node_modules/expo-server": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/expo-server/-/expo-server-1.0.5.tgz", - "integrity": "sha512-IGR++flYH70rhLyeXF0Phle56/k4cee87WeQ4mamS+MkVAVP+dDlOHf2nN06Z9Y2KhU0Gp1k+y61KkghF7HdhA==", - "license": "MIT", - "engines": { - "node": ">=20.16.0" - } - }, - "node_modules/expo-splash-screen": { - "version": "31.0.13", - "resolved": "https://registry.npmjs.org/expo-splash-screen/-/expo-splash-screen-31.0.13.tgz", - "integrity": "sha512-1epJLC1cDlwwj089R2h8cxaU5uk4ONVAC+vzGiTZH4YARQhL4Stlz1MbR6yAS173GMosvkE6CAeihR7oIbCkDA==", - "license": "MIT", - "dependencies": { - "@expo/prebuild-config": "^54.0.8" - }, - "peerDependencies": { - "expo": "*" - } - }, - "node_modules/expo-sqlite": { - "version": "16.0.10", - "resolved": "https://registry.npmjs.org/expo-sqlite/-/expo-sqlite-16.0.10.tgz", - "integrity": "sha512-tUOKxE9TpfneRG3eOfbNfhN9236SJ7IiUnP8gCqU7umd9DtgDGB/5PhYVVfl+U7KskgolgNoB9v9OZ9iwXN8Eg==", - "license": "MIT", - "dependencies": { - "await-lock": "^2.2.2" - }, - "peerDependencies": { - "expo": "*", - "react": "*", - "react-native": "*" - } - }, - "node_modules/expo-status-bar": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/expo-status-bar/-/expo-status-bar-3.0.9.tgz", - "integrity": "sha512-xyYyVg6V1/SSOZWh4Ni3U129XHCnFHBTcUo0dhWtFDrZbNp/duw5AGsQfb2sVeU0gxWHXSY1+5F0jnKYC7WuOw==", - "license": "MIT", - "dependencies": { - "react-native-is-edge-to-edge": "^1.2.1" - }, - "peerDependencies": { - "react": "*", - "react-native": "*" - } - }, - "node_modules/expo-structured-headers": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/expo-structured-headers/-/expo-structured-headers-5.0.0.tgz", - "integrity": "sha512-RmrBtnSphk5REmZGV+lcdgdpxyzio5rJw8CXviHE6qH5pKQQ83fhMEcigvrkBdsn2Efw2EODp4Yxl1/fqMvOZw==", - "license": "MIT" - }, - "node_modules/expo-updates": { - "version": "29.0.16", - "resolved": "https://registry.npmjs.org/expo-updates/-/expo-updates-29.0.16.tgz", - "integrity": "sha512-E9/fxRz/Eurtc7hxeI/6ZPyHH3To9Xoccm1kXoICZTRojmuTo+dx0Xv53UHyHn4G5zGMezyaKF2Qtj3AKcT93w==", - "license": "MIT", - "dependencies": { - "@expo/code-signing-certificates": "^0.0.6", - "@expo/plist": "^0.4.8", - "@expo/spawn-async": "^1.7.2", - "arg": "4.1.0", - "chalk": "^4.1.2", - "debug": "^4.3.4", - "expo-eas-client": "~1.0.8", - "expo-manifests": "~1.0.10", - "expo-structured-headers": "~5.0.0", - "expo-updates-interface": "~2.0.0", - "getenv": "^2.0.0", - "glob": "^13.0.0", - "ignore": "^5.3.1", - "resolve-from": "^5.0.0" - }, - "bin": { - "expo-updates": "bin/cli.js" - }, - "peerDependencies": { - "expo": "*", - "react": "*", - "react-native": "*" - } - }, - "node_modules/expo-updates-interface": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/expo-updates-interface/-/expo-updates-interface-2.0.0.tgz", - "integrity": "sha512-pTzAIufEZdVPKql6iMi5ylVSPqV1qbEopz9G6TSECQmnNde2nwq42PxdFBaUEd8IZJ/fdJLQnOT3m6+XJ5s7jg==", - "license": "MIT", - "peerDependencies": { - "expo": "*" - } - }, - "node_modules/expo-updates/node_modules/arg": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.0.tgz", - "integrity": "sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg==", - "license": "MIT" - }, - "node_modules/expo-video": { - "version": "3.0.16", - "resolved": "https://registry.npmjs.org/expo-video/-/expo-video-3.0.16.tgz", - "integrity": "sha512-H1HlxcHGomZItqisGfW3YL/G9BHtNBfVSimDJcLuyxyU87wFnV8loO9tCjuhufkfh/aTa2sW5BYAjLjg9DvnBQ==", - "license": "MIT", - "peerDependencies": { - "expo": "*", - "react": "*", - "react-native": "*" - } - }, - "node_modules/exponential-backoff": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", - "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", - "license": "Apache-2.0" - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "license": "MIT" - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "license": "MIT" - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "license": "MIT" - }, - "node_modules/fast-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", - "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "license": "Apache-2.0", - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/fbjs": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.5.tgz", - "integrity": "sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==", - "license": "MIT", - "dependencies": { - "cross-fetch": "^3.1.5", - "fbjs-css-vars": "^1.0.0", - "loose-envify": "^1.0.0", - "object-assign": "^4.1.0", - "promise": "^7.1.1", - "setimmediate": "^1.0.5", - "ua-parser-js": "^1.0.35" - } - }, - "node_modules/fbjs-css-vars": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", - "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==", - "license": "MIT" - }, - "node_modules/fbjs/node_modules/promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "license": "MIT", - "dependencies": { - "asap": "~2.0.3" - } - }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/fetch-blob": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", - "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "paypal", - "url": "https://paypal.me/jimmywarting" - } - ], - "license": "MIT", - "dependencies": { - "node-domexception": "^1.0.0", - "web-streams-polyfill": "^3.0.3" - }, - "engines": { - "node": "^12.20 || >= 14.13" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/filter-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", - "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/flow-enums-runtime": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz", - "integrity": "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==", - "license": "MIT" - }, - "node_modules/fontfaceobserver": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/fontfaceobserver/-/fontfaceobserver-2.3.0.tgz", - "integrity": "sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg==", - "license": "BSD-2-Clause" - }, - "node_modules/for-each": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", - "license": "MIT", - "dependencies": { - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/form-data": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", - "dev": true, - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/formdata-polyfill": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", - "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", - "license": "MIT", - "dependencies": { - "fetch-blob": "^3.1.2" - }, - "engines": { - "node": ">=12.20.0" - } - }, - "node_modules/freeport-async": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/freeport-async/-/freeport-async-2.0.0.tgz", - "integrity": "sha512-K7od3Uw45AJg00XUmy15+Hae2hOcgKcmN3/EF6Y7i01O0gaqiRx8sUSpsb9+BRNL8RPBrhzPsVfy8q9ADlJuWQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "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" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gaxios": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.3.tgz", - "integrity": "sha512-YGGyuEdVIjqxkxVH1pUTMY/XtmmsApXrCVv5EU25iX6inEPbV+VakJfLealkBtJN69AQmh1eGOdCl9Sm1UP6XQ==", - "license": "Apache-2.0", - "dependencies": { - "extend": "^3.0.2", - "https-proxy-agent": "^7.0.1", - "node-fetch": "^3.3.2", - "rimraf": "^5.0.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/gaxios/node_modules/glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "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", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/gaxios/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" - }, - "node_modules/gaxios/node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/gaxios/node_modules/rimraf": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", - "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", - "license": "ISC", - "dependencies": { - "glob": "^10.3.7" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/gcp-metadata": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-8.1.2.tgz", - "integrity": "sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==", - "license": "Apache-2.0", - "dependencies": { - "gaxios": "^7.0.0", - "google-logging-utils": "^1.0.0", - "json-bigint": "^1.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/generator-function": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", - "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-nonce": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", - "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/getenv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/getenv/-/getenv-2.0.0.tgz", - "integrity": "sha512-VilgtJj/ALgGY77fiLam5iD336eSWi96Q15JSAG1zi8NRBysm3LXKdGnHb4m5cuyxvOLQQKWpBZAT6ni4FI2iQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/glob": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.1.tgz", - "integrity": "sha512-B7U/vJpE3DkJ5WXTgTpTRN63uV42DseiXXKMwG14LQBXmsdeIoHAPbU/MEo6II0k5ED74uc2ZGTC6MwHFQhF6w==", - "license": "BlueOak-1.0.0", - "dependencies": { - "minimatch": "^10.1.2", - "minipass": "^7.1.2", - "path-scurry": "^2.0.0" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.2.tgz", - "integrity": "sha512-fu656aJ0n2kcXwsnwnv9g24tkU5uSmOlTjd6WyyaKm2Z+h1qmY6bAjrcaIxF/BslFqbZ8UBtbJi7KgQOZD2PTw==", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/brace-expansion": "^5.0.1" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/global-dirs": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", - "license": "MIT", - "dependencies": { - "ini": "^1.3.4" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/google-auth-library": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.5.0.tgz", - "integrity": "sha512-7ABviyMOlX5hIVD60YOfHw4/CxOfBhyduaYB+wbFWCWoni4N7SLcV46hrVRktuBbZjFC9ONyqamZITN7q3n32w==", - "license": "Apache-2.0", - "dependencies": { - "base64-js": "^1.3.0", - "ecdsa-sig-formatter": "^1.0.11", - "gaxios": "^7.0.0", - "gcp-metadata": "^8.0.0", - "google-logging-utils": "^1.0.0", - "gtoken": "^8.0.0", - "jws": "^4.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/google-logging-utils": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-1.1.3.tgz", - "integrity": "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==", - "license": "Apache-2.0", - "engines": { - "node": ">=14" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "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" - }, - "node_modules/gtoken": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-8.0.0.tgz", - "integrity": "sha512-+CqsMbHPiSTdtSO14O51eMNlrp9N79gmeqmXeouJOhfucAedHw9noVe/n5uJk3tbKE6a+6ZCQg3RPhVhHByAIw==", - "license": "MIT", - "dependencies": { - "gaxios": "^7.0.0", - "jws": "^4.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hermes-estree": { - "version": "0.29.1", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.29.1.tgz", - "integrity": "sha512-jl+x31n4/w+wEqm0I2r4CMimukLbLQEYpisys5oCre611CI5fc9TxhqkBBCJ1edDG4Kza0f7CgNz8xVMLZQOmQ==", - "license": "MIT" - }, - "node_modules/hermes-parser": { - "version": "0.29.1", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.29.1.tgz", - "integrity": "sha512-xBHWmUtRC5e/UL0tI7Ivt2riA/YBq9+SiYFU7C1oBa/j2jYGlIF9043oak1F47ihuDIxQ5nbsKueYJDRY02UgA==", - "license": "MIT", - "dependencies": { - "hermes-estree": "0.29.1" - } - }, - "node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "license": "BSD-3-Clause", - "dependencies": { - "react-is": "^16.7.0" - } - }, - "node_modules/hoist-non-react-statics/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "license": "MIT" - }, - "node_modules/hosted-git-info": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", - "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", - "license": "ISC", - "dependencies": { - "lru-cache": "^10.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" - }, - "node_modules/html-encoding-sniffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", - "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", - "dev": true, - "license": "MIT", - "dependencies": { - "whatwg-encoding": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", - "license": "MIT", - "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/http-errors/node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/http-proxy-agent/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==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "devOptional": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/hyphenate-style-name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.1.0.tgz", - "integrity": "sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==", - "license": "BSD-3-Clause" - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/image-size": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.2.1.tgz", - "integrity": "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==", - "license": "MIT", - "dependencies": { - "queue": "6.0.2" - }, - "bin": { - "image-size": "bin/image-size.js" - }, - "engines": { - "node": ">=16.x" - } - }, - "node_modules/import-local": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", - "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "license": "MIT", - "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==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "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", - "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/inline-style-prefixer": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-7.0.1.tgz", - "integrity": "sha512-lhYo5qNTQp3EvSSp3sRvXMbVQTLrvGV6DycRMJ5dm2BLMiJ30wpXKdDdgX+GmJZ5uQMucwRKHamXSst3Sj/Giw==", - "license": "MIT", - "dependencies": { - "css-in-js-utils": "^3.1.0" - } - }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/is-arguments": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", - "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz", - "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==", - "license": "MIT" - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/is-generator-function": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", - "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.4", - "generator-function": "^2.0.0", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-nan": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", - "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-regex": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", - "license": "MIT", - "dependencies": { - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC" - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "devOptional": true, - "license": "BSD-3-Clause", - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "devOptional": true, - "license": "BSD-3-Clause", - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-source-maps/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "devOptional": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/istanbul-reports": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", - "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", - "devOptional": true, - "license": "BSD-3-Clause", - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", - "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/types": "^29.6.3", - "import-local": "^3.0.2", - "jest-cli": "^29.7.0" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-changed-files": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "execa": "^5.0.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-circus": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^1.0.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", - "pure-rand": "^6.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "create-jest": "^29.7.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "yargs": "^17.3.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-config": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@types/node": "*", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/jest-config/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==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/jest-config/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", - "devOptional": true, - "license": "ISC", - "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/jest-config/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "devOptional": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/jest-config/node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-each": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-environment-jsdom": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz", - "integrity": "sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/jsdom": "^20.0.0", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0", - "jsdom": "^20.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-expo": { - "version": "54.0.17", - "resolved": "https://registry.npmjs.org/jest-expo/-/jest-expo-54.0.17.tgz", - "integrity": "sha512-LyIhrsP4xvHEEcR1R024u/LBj3uPpAgB+UljgV+YXWkEHjprnr0KpE4tROsMNYCVTM1pPlAnPuoBmn5gnAN9KA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@expo/config": "~12.0.13", - "@expo/json-file": "^10.0.8", - "@jest/create-cache-key-function": "^29.2.1", - "@jest/globals": "^29.2.1", - "babel-jest": "^29.2.1", - "jest-environment-jsdom": "^29.2.1", - "jest-snapshot": "^29.2.1", - "jest-watch-select-projects": "^2.0.0", - "jest-watch-typeahead": "2.2.1", - "json5": "^2.2.3", - "lodash": "^4.17.19", - "react-test-renderer": "19.1.0", - "server-only": "^0.0.1", - "stacktrace-js": "^2.0.2" - }, - "bin": { - "jest": "bin/jest.js" - }, - "peerDependencies": { - "expo": "*", - "react-native": "*", - "react-server-dom-webpack": "~19.0.4 || ~19.1.5 || ~19.2.4" - }, - "peerDependenciesMeta": { - "react-server-dom-webpack": { - "optional": true - } - } - }, - "node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-leak-detector": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve-dependencies": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runner": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runner/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "devOptional": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jest-runner/node_modules/source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/jest-runtime": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", - "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime/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==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/jest-runtime/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", - "devOptional": true, - "license": "ISC", - "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/jest-runtime/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "devOptional": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/jest-snapshot": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", - "semver": "^7.5.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", - "devOptional": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-util/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-watch-select-projects": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jest-watch-select-projects/-/jest-watch-select-projects-2.0.0.tgz", - "integrity": "sha512-j00nW4dXc2NiCW6znXgFLF9g8PJ0zP25cpQ1xRro/HU2GBfZQFZD0SoXnAlaoKkIY4MlfTMkKGbNXFpvCdjl1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-escapes": "^4.3.0", - "chalk": "^3.0.0", - "prompts": "^2.2.1" - } - }, - "node_modules/jest-watch-select-projects/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-watch-typeahead": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-2.2.1.tgz", - "integrity": "sha512-jYpYmUnTzysmVnwq49TAxlmtOAwp8QIqvZyoofQFn8fiWhEDZj33ZXzg3JA4nGnzWFm1hbWf3ADpteUokvXgFA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-escapes": "^6.0.0", - "chalk": "^4.0.0", - "jest-regex-util": "^29.0.0", - "jest-watcher": "^29.0.0", - "slash": "^5.0.0", - "string-length": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "jest": "^27.0.0 || ^28.0.0 || ^29.0.0" - } - }, - "node_modules/jest-watch-typeahead/node_modules/ansi-escapes": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.1.tgz", - "integrity": "sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-watch-typeahead/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/jest-watch-typeahead/node_modules/slash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-watch-typeahead/node_modules/string-length": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz", - "integrity": "sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==", - "dev": true, - "license": "MIT", - "dependencies": { - "char-regex": "^2.0.0", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-watch-typeahead/node_modules/string-length/node_modules/char-regex": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.2.tgz", - "integrity": "sha512-cbGOjAptfM2LVmWhwRFHEKTPkLwNddVmuqYZQt895yXwAsWsXObCG+YN4DGQ/JBtT4GP1a1lPPdio2z413LmTg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.20" - } - }, - "node_modules/jest-watch-typeahead/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/jest-watcher": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.7.0", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/jimp-compact": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/jimp-compact/-/jimp-compact-0.16.1.tgz", - "integrity": "sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww==", - "license": "MIT" - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsc-safe-url": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz", - "integrity": "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==", - "license": "0BSD" - }, - "node_modules/jsdom": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz", - "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "abab": "^2.0.6", - "acorn": "^8.8.1", - "acorn-globals": "^7.0.0", - "cssom": "^0.5.0", - "cssstyle": "^2.3.0", - "data-urls": "^3.0.2", - "decimal.js": "^10.4.2", - "domexception": "^4.0.0", - "escodegen": "^2.0.0", - "form-data": "^4.0.0", - "html-encoding-sniffer": "^3.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.1", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.2", - "parse5": "^7.1.1", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.1.2", - "w3c-xmlserializer": "^4.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^2.0.0", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0", - "ws": "^8.11.0", - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jsdom/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==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/jsdom/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==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/jsdom/node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - } - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json-bigint": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", - "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", - "license": "MIT", - "dependencies": { - "bignumber.js": "^9.0.0" - } - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jwa": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", - "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", - "license": "MIT", - "dependencies": { - "buffer-equal-constant-time": "^1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jws": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", - "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", - "license": "MIT", - "dependencies": { - "jwa": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/lan-network": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/lan-network/-/lan-network-0.1.7.tgz", - "integrity": "sha512-mnIlAEMu4OyEvUNdzco9xpuB9YVcPkQec+QsgycBCtPZvEqWPCDPfbAE4OJMdBBWpZWtpCn1xw9jJYlwjWI5zQ==", - "license": "MIT", - "bin": { - "lan-network": "dist/lan-network-cli.js" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/lighthouse-logger": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz", - "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", - "license": "Apache-2.0", - "dependencies": { - "debug": "^2.6.9", - "marky": "^1.2.2" - } - }, - "node_modules/lighthouse-logger/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/lighthouse-logger/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/lightningcss": { - "version": "1.31.1", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.31.1.tgz", - "integrity": "sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==", - "license": "MPL-2.0", - "dependencies": { - "detect-libc": "^2.0.3" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-android-arm64": "1.31.1", - "lightningcss-darwin-arm64": "1.31.1", - "lightningcss-darwin-x64": "1.31.1", - "lightningcss-freebsd-x64": "1.31.1", - "lightningcss-linux-arm-gnueabihf": "1.31.1", - "lightningcss-linux-arm64-gnu": "1.31.1", - "lightningcss-linux-arm64-musl": "1.31.1", - "lightningcss-linux-x64-gnu": "1.31.1", - "lightningcss-linux-x64-musl": "1.31.1", - "lightningcss-win32-arm64-msvc": "1.31.1", - "lightningcss-win32-x64-msvc": "1.31.1" - } - }, - "node_modules/lightningcss-android-arm64": { - "version": "1.31.1", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.31.1.tgz", - "integrity": "sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-arm64": { - "version": "1.31.1", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.31.1.tgz", - "integrity": "sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.31.1", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.31.1.tgz", - "integrity": "sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-freebsd-x64": { - "version": "1.31.1", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.31.1.tgz", - "integrity": "sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.31.1", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.31.1.tgz", - "integrity": "sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g==", - "cpu": [ - "arm" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.31.1", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.31.1.tgz", - "integrity": "sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.31.1", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.31.1.tgz", - "integrity": "sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.31.1", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.31.1.tgz", - "integrity": "sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.31.1", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.31.1.tgz", - "integrity": "sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.31.1", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.31.1.tgz", - "integrity": "sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.31.1", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.31.1.tgz", - "integrity": "sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "license": "MIT" - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash": { - "version": "4.17.23", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", - "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "license": "MIT" - }, - "node_modules/lodash.throttle": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", - "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", - "license": "MIT" - }, - "node_modules/log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", - "license": "MIT", - "dependencies": { - "chalk": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/log-symbols/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/log-symbols/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/log-symbols/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "license": "MIT" - }, - "node_modules/log-symbols/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/log-symbols/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/log-symbols/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/long": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", - "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", - "license": "Apache-2.0" - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", - "devOptional": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "license": "BSD-3-Clause", - "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/marky": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/marky/-/marky-1.3.0.tgz", - "integrity": "sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==", - "license": "Apache-2.0" - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "license": "CC0-1.0" - }, - "node_modules/memoize-one": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", - "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", - "license": "MIT" - }, - "node_modules/merge-options": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/merge-options/-/merge-options-3.0.4.tgz", - "integrity": "sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==", - "license": "MIT", - "dependencies": { - "is-plain-obj": "^2.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "license": "MIT" - }, - "node_modules/metro": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro/-/metro-0.83.3.tgz", - "integrity": "sha512-+rP+/GieOzkt97hSJ0MrPOuAH/jpaS21ZDvL9DJ35QYRDlQcwzcvUlGUf79AnQxq/2NPiS/AULhhM4TKutIt8Q==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/core": "^7.25.2", - "@babel/generator": "^7.25.0", - "@babel/parser": "^7.25.3", - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.3", - "@babel/types": "^7.25.2", - "accepts": "^1.3.7", - "chalk": "^4.0.0", - "ci-info": "^2.0.0", - "connect": "^3.6.5", - "debug": "^4.4.0", - "error-stack-parser": "^2.0.6", - "flow-enums-runtime": "^0.0.6", - "graceful-fs": "^4.2.4", - "hermes-parser": "0.32.0", - "image-size": "^1.0.2", - "invariant": "^2.2.4", - "jest-worker": "^29.7.0", - "jsc-safe-url": "^0.2.2", - "lodash.throttle": "^4.1.1", - "metro-babel-transformer": "0.83.3", - "metro-cache": "0.83.3", - "metro-cache-key": "0.83.3", - "metro-config": "0.83.3", - "metro-core": "0.83.3", - "metro-file-map": "0.83.3", - "metro-resolver": "0.83.3", - "metro-runtime": "0.83.3", - "metro-source-map": "0.83.3", - "metro-symbolicate": "0.83.3", - "metro-transform-plugins": "0.83.3", - "metro-transform-worker": "0.83.3", - "mime-types": "^2.1.27", - "nullthrows": "^1.1.1", - "serialize-error": "^2.1.0", - "source-map": "^0.5.6", - "throat": "^5.0.0", - "ws": "^7.5.10", - "yargs": "^17.6.2" - }, - "bin": { - "metro": "src/cli.js" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "node_modules/metro-babel-transformer": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.83.3.tgz", - "integrity": "sha512-1vxlvj2yY24ES1O5RsSIvg4a4WeL7PFXgKOHvXTXiW0deLvQr28ExXj6LjwCCDZ4YZLhq6HddLpZnX4dEdSq5g==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.25.2", - "flow-enums-runtime": "^0.0.6", - "hermes-parser": "0.32.0", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "node_modules/metro-babel-transformer/node_modules/hermes-estree": { - "version": "0.32.0", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", - "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", - "license": "MIT" - }, - "node_modules/metro-babel-transformer/node_modules/hermes-parser": { - "version": "0.32.0", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", - "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", - "license": "MIT", - "dependencies": { - "hermes-estree": "0.32.0" - } - }, - "node_modules/metro-cache": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.83.3.tgz", - "integrity": "sha512-3jo65X515mQJvKqK3vWRblxDEcgY55Sk3w4xa6LlfEXgQ9g1WgMh9m4qVZVwgcHoLy0a2HENTPCCX4Pk6s8c8Q==", - "license": "MIT", - "dependencies": { - "exponential-backoff": "^3.1.1", - "flow-enums-runtime": "^0.0.6", - "https-proxy-agent": "^7.0.5", - "metro-core": "0.83.3" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "node_modules/metro-cache-key": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.83.3.tgz", - "integrity": "sha512-59ZO049jKzSmvBmG/B5bZ6/dztP0ilp0o988nc6dpaDsU05Cl1c/lRf+yx8m9WW/JVgbmfO5MziBU559XjI5Zw==", - "license": "MIT", - "dependencies": { - "flow-enums-runtime": "^0.0.6" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "node_modules/metro-config": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.83.3.tgz", - "integrity": "sha512-mTel7ipT0yNjKILIan04bkJkuCzUUkm2SeEaTads8VfEecCh+ltXchdq6DovXJqzQAXuR2P9cxZB47Lg4klriA==", - "license": "MIT", - "dependencies": { - "connect": "^3.6.5", - "flow-enums-runtime": "^0.0.6", - "jest-validate": "^29.7.0", - "metro": "0.83.3", - "metro-cache": "0.83.3", - "metro-core": "0.83.3", - "metro-runtime": "0.83.3", - "yaml": "^2.6.1" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "node_modules/metro-core": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.83.3.tgz", - "integrity": "sha512-M+X59lm7oBmJZamc96usuF1kusd5YimqG/q97g4Ac7slnJ3YiGglW5CsOlicTR5EWf8MQFxxjDoB6ytTqRe8Hw==", - "license": "MIT", - "dependencies": { - "flow-enums-runtime": "^0.0.6", - "lodash.throttle": "^4.1.1", - "metro-resolver": "0.83.3" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "node_modules/metro-file-map": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.83.3.tgz", - "integrity": "sha512-jg5AcyE0Q9Xbbu/4NAwwZkmQn7doJCKGW0SLeSJmzNB9Z24jBe0AL2PHNMy4eu0JiKtNWHz9IiONGZWq7hjVTA==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "fb-watchman": "^2.0.0", - "flow-enums-runtime": "^0.0.6", - "graceful-fs": "^4.2.4", - "invariant": "^2.2.4", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "nullthrows": "^1.1.1", - "walker": "^1.0.7" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "node_modules/metro-minify-terser": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.83.3.tgz", - "integrity": "sha512-O2BmfWj6FSfzBLrNCXt/rr2VYZdX5i6444QJU0fFoc7Ljg+Q+iqebwE3K0eTvkI6TRjELsXk1cjU+fXwAR4OjQ==", - "license": "MIT", - "dependencies": { - "flow-enums-runtime": "^0.0.6", - "terser": "^5.15.0" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "node_modules/metro-resolver": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.83.3.tgz", - "integrity": "sha512-0js+zwI5flFxb1ktmR///bxHYg7OLpRpWZlBBruYG8OKYxeMP7SV0xQ/o/hUelrEMdK4LJzqVtHAhBm25LVfAQ==", - "license": "MIT", - "dependencies": { - "flow-enums-runtime": "^0.0.6" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "node_modules/metro-runtime": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.83.3.tgz", - "integrity": "sha512-JHCJb9ebr9rfJ+LcssFYA2x1qPYuSD/bbePupIGhpMrsla7RCwC/VL3yJ9cSU+nUhU4c9Ixxy8tBta+JbDeZWw==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.25.0", - "flow-enums-runtime": "^0.0.6" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "node_modules/metro-source-map": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.83.3.tgz", - "integrity": "sha512-xkC3qwUBh2psVZgVavo8+r2C9Igkk3DibiOXSAht1aYRRcztEZNFtAMtfSB7sdO2iFMx2Mlyu++cBxz/fhdzQg==", - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.25.3", - "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", - "@babel/types": "^7.25.2", - "flow-enums-runtime": "^0.0.6", - "invariant": "^2.2.4", - "metro-symbolicate": "0.83.3", - "nullthrows": "^1.1.1", - "ob1": "0.83.3", - "source-map": "^0.5.6", - "vlq": "^1.0.0" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "node_modules/metro-symbolicate": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.83.3.tgz", - "integrity": "sha512-F/YChgKd6KbFK3eUR5HdUsfBqVsanf5lNTwFd4Ca7uuxnHgBC3kR/Hba/RGkenR3pZaGNp5Bu9ZqqP52Wyhomw==", - "license": "MIT", - "dependencies": { - "flow-enums-runtime": "^0.0.6", - "invariant": "^2.2.4", - "metro-source-map": "0.83.3", - "nullthrows": "^1.1.1", - "source-map": "^0.5.6", - "vlq": "^1.0.0" - }, - "bin": { - "metro-symbolicate": "src/index.js" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "node_modules/metro-transform-plugins": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.83.3.tgz", - "integrity": "sha512-eRGoKJU6jmqOakBMH5kUB7VitEWiNrDzBHpYbkBXW7C5fUGeOd2CyqrosEzbMK5VMiZYyOcNFEphvxk3OXey2A==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.25.2", - "@babel/generator": "^7.25.0", - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.3", - "flow-enums-runtime": "^0.0.6", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "node_modules/metro-transform-worker": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.83.3.tgz", - "integrity": "sha512-Ztekew9t/gOIMZX1tvJOgX7KlSLL5kWykl0Iwu2cL2vKMKVALRl1hysyhUw0vjpAvLFx+Kfq9VLjnHIkW32fPA==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.25.2", - "@babel/generator": "^7.25.0", - "@babel/parser": "^7.25.3", - "@babel/types": "^7.25.2", - "flow-enums-runtime": "^0.0.6", - "metro": "0.83.3", - "metro-babel-transformer": "0.83.3", - "metro-cache": "0.83.3", - "metro-cache-key": "0.83.3", - "metro-minify-terser": "0.83.3", - "metro-source-map": "0.83.3", - "metro-transform-plugins": "0.83.3", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "node_modules/metro/node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "license": "MIT" - }, - "node_modules/metro/node_modules/hermes-estree": { - "version": "0.32.0", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", - "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", - "license": "MIT" - }, - "node_modules/metro/node_modules/hermes-parser": { - "version": "0.32.0", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", - "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", - "license": "MIT", - "dependencies": { - "hermes-estree": "0.32.0" - } - }, - "node_modules/metro/node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "license": "MIT", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "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/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/minizlib": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", - "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", - "license": "MIT", - "dependencies": { - "minipass": "^7.1.2" - }, - "engines": { - "node": ">= 18" - } - }, - "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/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/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/nested-error-stacks": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.0.1.tgz", - "integrity": "sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A==", - "license": "MIT" - }, - "node_modules/node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "deprecated": "Use your platform's native DOMException instead", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "github", - "url": "https://paypal.me/jimmywarting" - } - ], - "license": "MIT", - "engines": { - "node": ">=10.5.0" - } - }, - "node_modules/node-fetch": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", - "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", - "license": "MIT", - "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" - } - }, - "node_modules/node-forge": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.3.tgz", - "integrity": "sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg==", - "license": "(BSD-3-Clause OR GPL-2.0)", - "engines": { - "node": ">= 6.13.0" - } - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "license": "MIT" - }, - "node_modules/node-releases": { - "version": "2.0.27", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", - "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", - "license": "MIT" - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-package-arg": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz", - "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", - "license": "ISC", - "dependencies": { - "hosted-git-info": "^7.0.0", - "proc-log": "^4.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm-package-arg/node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/nullthrows": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", - "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", - "license": "MIT" - }, - "node_modules/nwsapi": { - "version": "2.2.23", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.23.tgz", - "integrity": "sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/ob1": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.83.3.tgz", - "integrity": "sha512-egUxXCDwoWG06NGCS5s5AdcpnumHKJlfd3HH06P3m9TEMwwScfcY35wpQxbm9oHof+dM/lVH9Rfyu1elTVelSA==", - "license": "MIT", - "dependencies": { - "flow-enums-runtime": "^0.0.6" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-is": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", - "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", - "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0", - "has-symbols": "^1.1.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", - "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", - "license": "MIT", - "dependencies": { - "mimic-fn": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz", - "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", - "license": "MIT", - "dependencies": { - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-spinners": "^2.0.0", - "log-symbols": "^2.2.0", - "strip-ansi": "^5.2.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/ora/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ora/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ora/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/ora/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "license": "MIT" - }, - "node_modules/ora/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/ora/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/ora/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-locate/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "license": "BlueOak-1.0.0" - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse-png": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/parse-png/-/parse-png-2.1.0.tgz", - "integrity": "sha512-Nt/a5SfCLiTnQAjx3fHlqp8hRgTL3z7kTQZzvIMS9uCAepnCyjpdEc6M/sz69WqMBdaDBw9sF1F1UaHROYzGkQ==", - "license": "MIT", - "dependencies": { - "pngjs": "^3.3.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/parse5": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", - "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "entities": "^6.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "license": "MIT" - }, - "node_modules/path-scurry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", - "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "11.2.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.5.tgz", - "integrity": "sha512-vFrFJkWtJvJnD5hg+hJvVE8Lh/TcMzKnTgCWmtBipwI5yLX/iX+5UB2tfuyODF5E7k9xEzMdYgGqaSb1c0c5Yw==", - "license": "BlueOak-1.0.0", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-3.0.1.tgz", - "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pirates": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/plist": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", - "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", - "license": "MIT", - "dependencies": { - "@xmldom/xmldom": "^0.8.8", - "base64-js": "^1.5.1", - "xmlbuilder": "^15.1.1" - }, - "engines": { - "node": ">=10.4.0" - } - }, - "node_modules/pngjs": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", - "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", - "license": "MIT", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", - "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/postcss": { - "version": "8.4.49", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", - "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "license": "MIT" - }, - "node_modules/posthog-react-native": { - "version": "4.37.1", - "resolved": "https://registry.npmjs.org/posthog-react-native/-/posthog-react-native-4.37.1.tgz", - "integrity": "sha512-EHgAC6XkYPKGSOYJUgv5WSoNNAiU+dZdwZSiREKy04qqBr/a3o5ByMvkb8TeJcCE6A/ZFD4YPsXf+01VGmWfvA==", - "license": "MIT", - "dependencies": { - "@posthog/core": "1.23.2" - }, - "peerDependencies": { - "@react-native-async-storage/async-storage": ">=1.0.0", - "@react-navigation/native": ">= 5.0.0", - "expo-application": ">= 4.0.0", - "expo-device": ">= 4.0.0", - "expo-file-system": ">= 13.0.0", - "expo-localization": ">= 11.0.0", - "posthog-react-native-session-replay": ">= 1.5.0", - "react-native-device-info": ">= 10.0.0", - "react-native-localize": ">= 3.0.0", - "react-native-navigation": ">= 6.0.0", - "react-native-safe-area-context": ">= 4.0.0", - "react-native-svg": ">= 15.0.0" - }, - "peerDependenciesMeta": { - "@react-native-async-storage/async-storage": { - "optional": true - }, - "@react-navigation/native": { - "optional": true - }, - "expo-application": { - "optional": true - }, - "expo-device": { - "optional": true - }, - "expo-file-system": { - "optional": true - }, - "expo-localization": { - "optional": true - }, - "posthog-react-native-session-replay": { - "optional": true - }, - "react-native-device-info": { - "optional": true - }, - "react-native-localize": { - "optional": true - }, - "react-native-navigation": { - "optional": true - }, - "react-native-safe-area-context": { - "optional": true - } - } - }, - "node_modules/pretty-bytes": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", - "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/pretty-format/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "license": "MIT" - }, - "node_modules/proc-log": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", - "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/promise": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", - "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", - "license": "MIT", - "dependencies": { - "asap": "~2.0.6" - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "license": "MIT", - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/protobufjs": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.4.tgz", - "integrity": "sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==", - "hasInstallScript": true, - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/psl": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", - "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "^2.3.1" - }, - "funding": { - "url": "https://github.com/sponsors/lupomontero" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/pure-rand": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", - "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", - "devOptional": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ], - "license": "MIT" - }, - "node_modules/qrcode-terminal": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.11.0.tgz", - "integrity": "sha512-Uu7ii+FQy4Qf82G4xu7ShHhjhGahEpCWc3x8UavY3CTcWV+ufmmCtwkr7ZKsX42jdL0kr1B5FKUeqJvAn51jzQ==", - "bin": { - "qrcode-terminal": "bin/qrcode-terminal.js" - } - }, - "node_modules/query-string": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.1.3.tgz", - "integrity": "sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==", - "license": "MIT", - "dependencies": { - "decode-uri-component": "^0.2.2", - "filter-obj": "^1.1.0", - "split-on-first": "^1.0.0", - "strict-uri-encode": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/queue": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", - "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", - "license": "MIT", - "dependencies": { - "inherits": "~2.0.3" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "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/react": { - "version": "19.1.0", - "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", - "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-devtools-core": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-6.1.5.tgz", - "integrity": "sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA==", - "license": "MIT", - "dependencies": { - "shell-quote": "^1.6.1", - "ws": "^7" - } - }, - "node_modules/react-devtools-core/node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "license": "MIT", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/react-dom": { - "version": "19.1.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", - "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", - "license": "MIT", - "dependencies": { - "scheduler": "^0.26.0" - }, - "peerDependencies": { - "react": "^19.1.0" - } - }, - "node_modules/react-fast-compare": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", - "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==", - "license": "MIT" - }, - "node_modules/react-freeze": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/react-freeze/-/react-freeze-1.0.4.tgz", - "integrity": "sha512-r4F0Sec0BLxWicc7HEyo2x3/2icUTrRmDjaaRyzzn+7aDyFZliszMDOgLVwSnQnYENOlL1o569Ze2HZefk8clA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "react": ">=17.0.0" - } - }, - "node_modules/react-is": { - "version": "19.2.4", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.4.tgz", - "integrity": "sha512-W+EWGn2v0ApPKgKKCy/7s7WHXkboGcsrXE+2joLyVxkbyVQfO3MUEaUQDHoSmb8TFFrSKYa9mw64WZHNHSDzYA==", - "license": "MIT" - }, - "node_modules/react-native": { - "version": "0.81.5", - "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.81.5.tgz", - "integrity": "sha512-1w+/oSjEXZjMqsIvmkCRsOc8UBYv163bTWKTI8+1mxztvQPhCRYGTvZ/PL1w16xXHneIj/SLGfxWg2GWN2uexw==", - "license": "MIT", - "dependencies": { - "@jest/create-cache-key-function": "^29.7.0", - "@react-native/assets-registry": "0.81.5", - "@react-native/codegen": "0.81.5", - "@react-native/community-cli-plugin": "0.81.5", - "@react-native/gradle-plugin": "0.81.5", - "@react-native/js-polyfills": "0.81.5", - "@react-native/normalize-colors": "0.81.5", - "@react-native/virtualized-lists": "0.81.5", - "abort-controller": "^3.0.0", - "anser": "^1.4.9", - "ansi-regex": "^5.0.0", - "babel-jest": "^29.7.0", - "babel-plugin-syntax-hermes-parser": "0.29.1", - "base64-js": "^1.5.1", - "commander": "^12.0.0", - "flow-enums-runtime": "^0.0.6", - "glob": "^7.1.1", - "invariant": "^2.2.4", - "jest-environment-node": "^29.7.0", - "memoize-one": "^5.0.0", - "metro-runtime": "^0.83.1", - "metro-source-map": "^0.83.1", - "nullthrows": "^1.1.1", - "pretty-format": "^29.7.0", - "promise": "^8.3.0", - "react-devtools-core": "^6.1.5", - "react-refresh": "^0.14.0", - "regenerator-runtime": "^0.13.2", - "scheduler": "0.26.0", - "semver": "^7.1.3", - "stacktrace-parser": "^0.1.10", - "whatwg-fetch": "^3.0.0", - "ws": "^6.2.3", - "yargs": "^17.6.2" - }, - "bin": { - "react-native": "cli.js" - }, - "engines": { - "node": ">= 20.19.4" - }, - "peerDependencies": { - "@types/react": "^19.1.0", - "react": "^19.1.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-native-gesture-handler": { - "version": "2.28.0", - "resolved": "https://registry.npmjs.org/react-native-gesture-handler/-/react-native-gesture-handler-2.28.0.tgz", - "integrity": "sha512-0msfJ1vRxXKVgTgvL+1ZOoYw3/0z1R+Ked0+udoJhyplC2jbVKIJ8Z1bzWdpQRCV3QcQ87Op0zJVE5DhKK2A0A==", - "license": "MIT", - "dependencies": { - "@egjs/hammerjs": "^2.0.17", - "hoist-non-react-statics": "^3.3.0", - "invariant": "^2.2.4" - }, - "peerDependencies": { - "react": "*", - "react-native": "*" - } - }, - "node_modules/react-native-is-edge-to-edge": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/react-native-is-edge-to-edge/-/react-native-is-edge-to-edge-1.2.1.tgz", - "integrity": "sha512-FLbPWl/MyYQWz+KwqOZsSyj2JmLKglHatd3xLZWskXOpRaio4LfEDEz8E/A6uD8QoTHW6Aobw1jbEwK7KMgR7Q==", - "license": "MIT", - "peerDependencies": { - "react": "*", - "react-native": "*" - } - }, - "node_modules/react-native-purchases": { - "version": "9.10.5", - "resolved": "https://registry.npmjs.org/react-native-purchases/-/react-native-purchases-9.10.5.tgz", - "integrity": "sha512-ofs33aTgdjyjUDZgCtCKYfvl4gBtJrOV77/SXyDzSxTttNjg+8BWGckF3ALfBg69uU65xrXsqfyU3U+Cl86IdQ==", - "license": "MIT", - "workspaces": [ - "examples/purchaseTesterTypescript", - "react-native-purchases-ui" - ], - "dependencies": { - "@revenuecat/purchases-js-hybrid-mappings": "17.41.1", - "@revenuecat/purchases-typescript-internal": "17.41.1" - }, - "peerDependencies": { - "react": ">= 16.6.3", - "react-native": ">= 0.73.0", - "react-native-web": "*" - }, - "peerDependenciesMeta": { - "react-native-web": { - "optional": true - } - } - }, - "node_modules/react-native-purchases-ui": { - "version": "9.10.5", - "resolved": "https://registry.npmjs.org/react-native-purchases-ui/-/react-native-purchases-ui-9.10.5.tgz", - "integrity": "sha512-vull2ssjJSfCNQ0zM/KanZXm4RIJB4KfzbAvE2O93dRK/T6yK8ggi403NQcTyM9B6oLI9NPEKBR+sMk5koT/ew==", - "license": "MIT", - "dependencies": { - "@revenuecat/purchases-typescript-internal": "17.41.1" - }, - "peerDependencies": { - "react": "*", - "react-native": ">= 0.73.0", - "react-native-purchases": "9.10.5", - "react-native-web": "*" - }, - "peerDependenciesMeta": { - "react-native-web": { - "optional": true - } - } - }, - "node_modules/react-native-reanimated": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-4.1.6.tgz", - "integrity": "sha512-F+ZJBYiok/6Jzp1re75F/9aLzkgoQCOh4yxrnwATa8392RvM3kx+fiXXFvwcgE59v48lMwd9q0nzF1oJLXpfxQ==", - "license": "MIT", - "dependencies": { - "react-native-is-edge-to-edge": "^1.2.1", - "semver": "7.7.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0", - "react": "*", - "react-native": "*", - "react-native-worklets": ">=0.5.0" - } - }, - "node_modules/react-native-reanimated/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/react-native-safe-area-context": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-5.6.2.tgz", - "integrity": "sha512-4XGqMNj5qjUTYywJqpdWZ9IG8jgkS3h06sfVjfw5yZQZfWnRFXczi0GnYyFyCc2EBps/qFmoCH8fez//WumdVg==", - "license": "MIT", - "peerDependencies": { - "react": "*", - "react-native": "*" - } - }, - "node_modules/react-native-screens": { - "version": "4.16.0", - "resolved": "https://registry.npmjs.org/react-native-screens/-/react-native-screens-4.16.0.tgz", - "integrity": "sha512-yIAyh7F/9uWkOzCi1/2FqvNvK6Wb9Y1+Kzn16SuGfN9YFJDTbwlzGRvePCNTOX0recpLQF3kc2FmvMUhyTCH1Q==", - "license": "MIT", - "dependencies": { - "react-freeze": "^1.0.0", - "react-native-is-edge-to-edge": "^1.2.1", - "warn-once": "^0.1.0" - }, - "peerDependencies": { - "react": "*", - "react-native": "*" - } - }, - "node_modules/react-native-svg": { - "version": "15.12.1", - "resolved": "https://registry.npmjs.org/react-native-svg/-/react-native-svg-15.12.1.tgz", - "integrity": "sha512-vCuZJDf8a5aNC2dlMovEv4Z0jjEUET53lm/iILFnFewa15b4atjVxU6Wirm6O9y6dEsdjDZVD7Q3QM4T1wlI8g==", - "license": "MIT", - "dependencies": { - "css-select": "^5.1.0", - "css-tree": "^1.1.3", - "warn-once": "0.1.1" - }, - "peerDependencies": { - "react": "*", - "react-native": "*" - } - }, - "node_modules/react-native-web": { - "version": "0.21.2", - "resolved": "https://registry.npmjs.org/react-native-web/-/react-native-web-0.21.2.tgz", - "integrity": "sha512-SO2t9/17zM4iEnFvlu2DA9jqNbzNhoUP+AItkoCOyFmDMOhUnBBznBDCYN92fGdfAkfQlWzPoez6+zLxFNsZEg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.18.6", - "@react-native/normalize-colors": "^0.74.1", - "fbjs": "^3.0.4", - "inline-style-prefixer": "^7.0.1", - "memoize-one": "^6.0.0", - "nullthrows": "^1.1.1", - "postcss-value-parser": "^4.2.0", - "styleq": "^0.1.3" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/react-native-web/node_modules/@react-native/normalize-colors": { - "version": "0.74.89", - "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.74.89.tgz", - "integrity": "sha512-qoMMXddVKVhZ8PA1AbUCk83trpd6N+1nF2A6k1i6LsQObyS92fELuk8kU/lQs6M7BsMHwqyLCpQJ1uFgNvIQXg==", - "license": "MIT" - }, - "node_modules/react-native-web/node_modules/memoize-one": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", - "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", - "license": "MIT" - }, - "node_modules/react-native-worklets": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/react-native-worklets/-/react-native-worklets-0.5.1.tgz", - "integrity": "sha512-lJG6Uk9YuojjEX/tQrCbcbmpdLCSFxDK1rJlkDhgqkVi1KZzG7cdcBFQRqyNOOzR9Y0CXNuldmtWTGOyM0k0+w==", - "license": "MIT", - "dependencies": { - "@babel/plugin-transform-arrow-functions": "^7.0.0-0", - "@babel/plugin-transform-class-properties": "^7.0.0-0", - "@babel/plugin-transform-classes": "^7.0.0-0", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.0.0-0", - "@babel/plugin-transform-optional-chaining": "^7.0.0-0", - "@babel/plugin-transform-shorthand-properties": "^7.0.0-0", - "@babel/plugin-transform-template-literals": "^7.0.0-0", - "@babel/plugin-transform-unicode-regex": "^7.0.0-0", - "@babel/preset-typescript": "^7.16.7", - "convert-source-map": "^2.0.0", - "semver": "7.7.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0", - "react": "*", - "react-native": "*" - } - }, - "node_modules/react-native-worklets/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/react-native/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", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/react-native/node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/react-native/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", - "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/react-native/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/react-native/node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/react-native/node_modules/ws": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", - "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", - "license": "MIT", - "dependencies": { - "async-limiter": "~1.0.0" - } - }, - "node_modules/react-refresh": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", - "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-remove-scroll": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz", - "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==", - "license": "MIT", - "dependencies": { - "react-remove-scroll-bar": "^2.3.7", - "react-style-singleton": "^2.2.3", - "tslib": "^2.1.0", - "use-callback-ref": "^1.3.3", - "use-sidecar": "^1.1.3" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-remove-scroll-bar": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", - "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", - "license": "MIT", - "dependencies": { - "react-style-singleton": "^2.2.2", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-style-singleton": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", - "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", - "license": "MIT", - "dependencies": { - "get-nonce": "^1.0.0", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-test-renderer": { - "version": "19.1.0", - "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-19.1.0.tgz", - "integrity": "sha512-jXkSl3CpvPYEF+p/eGDLB4sPoDX8pKkYvRl9+rR8HxLY0X04vW7hCm1/0zHoUSjPZ3bDa+wXWNTDVIw/R8aDVw==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "react-is": "^19.1.0", - "scheduler": "^0.26.0" - }, - "peerDependencies": { - "react": "^19.1.0" - } - }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "license": "MIT" - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", - "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", - "license": "MIT", - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "license": "MIT" - }, - "node_modules/regexpu-core": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", - "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", - "license": "MIT", - "dependencies": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.2.2", - "regjsgen": "^0.8.0", - "regjsparser": "^0.13.0", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.2.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", - "license": "MIT" - }, - "node_modules/regjsparser": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz", - "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", - "license": "BSD-2-Clause", - "dependencies": { - "jsesc": "~3.1.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/requireg": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/requireg/-/requireg-0.2.2.tgz", - "integrity": "sha512-nYzyjnFcPNGR3lx9lwPPPnuQxv6JWEZd2Ci0u9opN7N5zUEPIhY/GbL3vMGOr2UXwEg9WwSyV9X9Y/kLFgPsOg==", - "dependencies": { - "nested-error-stacks": "~2.0.1", - "rc": "~1.2.7", - "resolve": "~1.7.1" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/requireg/node_modules/resolve": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", - "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", - "license": "MIT", - "dependencies": { - "path-parse": "^1.0.5" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/resolve": { - "version": "1.22.11", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", - "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", - "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-global": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", - "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", - "license": "MIT", - "dependencies": { - "global-dirs": "^0.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-workspace-root": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/resolve-workspace-root/-/resolve-workspace-root-2.0.1.tgz", - "integrity": "sha512-nR23LHAvaI6aHtMg6RWoaHpdR4D881Nydkzi2CixINyg9T00KgaJdJI6Vwty+Ps8WLxZHuxsS0BseWjxSA4C+w==", - "license": "MIT" - }, - "node_modules/resolve.exports": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", - "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", - "license": "MIT", - "dependencies": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - }, - "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", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/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", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/rimraf/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", - "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/rimraf/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/rtl-detect": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/rtl-detect/-/rtl-detect-1.1.2.tgz", - "integrity": "sha512-PGMBq03+TTG/p/cRB7HCLKJ1MgDIi07+QU1faSjiYRfmY5UsAttV9Hs08jDAHVwcOwmVLcSJkpwyfXszVjWfIQ==", - "license": "BSD-3-Clause" - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "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/safe-regex-test": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", - "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-regex": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "license": "MIT" - }, - "node_modules/sax": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.4.tgz", - "integrity": "sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==", - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=11.0.0" - } - }, - "node_modules/saxes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", - "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", - "dev": true, - "license": "ISC", - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=v12.22.7" - } - }, - "node_modules/scheduler": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", - "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", - "license": "MIT" - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/send": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", - "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "~0.5.2", - "http-errors": "~2.0.1", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "~2.4.1", - "range-parser": "~1.2.1", - "statuses": "~2.0.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/send/node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/send/node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/send/node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/serialize-error": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", - "integrity": "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/serve-static": { - "version": "1.16.3", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", - "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", - "license": "MIT", - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "~0.19.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve-static/node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/server-only": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/server-only/-/server-only-0.0.1.tgz", - "integrity": "sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==", - "license": "MIT" - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "license": "MIT" - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" - }, - "node_modules/sf-symbols-typescript": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/sf-symbols-typescript/-/sf-symbols-typescript-2.2.0.tgz", - "integrity": "sha512-TPbeg0b7ylrswdGCji8FRGFAKuqbpQlLbL8SOle3j1iHSs5Ob5mhvMAxWN2UItOjgALAB5Zp3fmMfj8mbWvXKw==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/shallowequal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", - "license": "MIT" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/shell-quote": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", - "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "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" - }, - "node_modules/simple-plist": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.3.1.tgz", - "integrity": "sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==", - "license": "MIT", - "dependencies": { - "bplist-creator": "0.1.0", - "bplist-parser": "0.3.1", - "plist": "^3.0.5" - } - }, - "node_modules/simple-plist/node_modules/bplist-parser": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.1.tgz", - "integrity": "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==", - "license": "MIT", - "dependencies": { - "big-integer": "1.6.x" - }, - "engines": { - "node": ">= 5.10.0" - } - }, - "node_modules/simple-swizzle": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.4.tgz", - "integrity": "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "license": "MIT" - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/slugify": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz", - "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==", - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/split-on-first": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", - "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "license": "BSD-3-Clause" - }, - "node_modules/stack-generator": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/stack-generator/-/stack-generator-2.0.10.tgz", - "integrity": "sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "stackframe": "^1.3.4" - } - }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/stackframe": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", - "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", - "license": "MIT" - }, - "node_modules/stacktrace-gps": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/stacktrace-gps/-/stacktrace-gps-3.1.2.tgz", - "integrity": "sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "source-map": "0.5.6", - "stackframe": "^1.3.4" - } - }, - "node_modules/stacktrace-gps/node_modules/source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stacktrace-js": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stacktrace-js/-/stacktrace-js-2.0.2.tgz", - "integrity": "sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==", - "dev": true, - "license": "MIT", - "dependencies": { - "error-stack-parser": "^2.0.6", - "stack-generator": "^2.0.5", - "stacktrace-gps": "^3.0.4" - } - }, - "node_modules/stacktrace-parser": { - "version": "0.1.11", - "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.11.tgz", - "integrity": "sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==", - "license": "MIT", - "dependencies": { - "type-fest": "^0.7.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/stream-buffers": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", - "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==", - "license": "Unlicense", - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/strict-uri-encode": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", - "integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-length/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==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "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", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs": { - "name": "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", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/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", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/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", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "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", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "min-indent": "^1.0.0" - }, - "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/structured-headers": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/structured-headers/-/structured-headers-0.4.1.tgz", - "integrity": "sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg==", - "license": "MIT" - }, - "node_modules/styleq": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/styleq/-/styleq-0.1.3.tgz", - "integrity": "sha512-3ZUifmCDCQanjeej1f6kyl/BeP/Vae5EYkQ9iJfUm/QwZvlgnZzyflqAsAWYURdtea8Vkvswu2GrC57h3qffcA==", - "license": "MIT" - }, - "node_modules/sucrase": { - "version": "3.35.1", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", - "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "tinyglobby": "^0.2.11", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/sucrase/node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true, - "license": "MIT" - }, - "node_modules/tar": { - "version": "7.5.7", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.7.tgz", - "integrity": "sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ==", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/fs-minipass": "^4.0.0", - "chownr": "^3.0.0", - "minipass": "^7.1.2", - "minizlib": "^3.1.0", - "yallist": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/tar/node_modules/yallist": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/temp-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", - "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "license": "MIT", - "dependencies": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/terser": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.0.tgz", - "integrity": "sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg==", - "license": "BSD-2-Clause", - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.15.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "license": "MIT" - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "license": "ISC", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/test-exclude/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", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/test-exclude/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", - "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/test-exclude/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "license": "MIT", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/throat": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", - "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", - "license": "MIT" - }, - "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.3" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "license": "BSD-3-Clause" - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tough-cookie": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", - "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tr46": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", - "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "license": "Apache-2.0" - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", - "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=8" - } - }, - "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/ua-parser-js": { - "version": "1.0.41", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.41.tgz", - "integrity": "sha512-LbBDqdIC5s8iROCUjMbW1f5dJQTEFB1+KO9ogbvlb3nm9n4YHa5p4KTvFPWvh2Hs8gZMBuiB1/8+pdfe/tDPug==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/ua-parser-js" - }, - { - "type": "paypal", - "url": "https://paypal.me/faisalman" - }, - { - "type": "github", - "url": "https://github.com/sponsors/faisalman" - } - ], - "license": "MIT", - "bin": { - "ua-parser-js": "script/cli.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/undici": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.23.0.tgz", - "integrity": "sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g==", - "license": "MIT", - "engines": { - "node": ">=18.17" - } - }, - "node_modules/undici-types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", - "license": "MIT" - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", - "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "license": "MIT", - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", - "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", - "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "license": "MIT", - "dependencies": { - "crypto-random-string": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", - "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "node_modules/use-callback-ref": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", - "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-latest-callback": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/use-latest-callback/-/use-latest-callback-0.2.6.tgz", - "integrity": "sha512-FvRG9i1HSo0wagmX63Vrm8SnlUU3LMM3WyZkQ76RnslpBrX694AdG4A0zQBx2B3ZifFA0yv/BaEHGBnEax5rZg==", - "license": "MIT", - "peerDependencies": { - "react": ">=16.8" - } - }, - "node_modules/use-sidecar": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", - "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", - "license": "MIT", - "dependencies": { - "detect-node-es": "^1.1.0", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-sync-external-store": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", - "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/util": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", - "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" - } - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", - "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8-to-istanbul": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", - "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", - "devOptional": true, - "license": "ISC", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/validate-npm-package-name": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", - "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/vaul": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vaul/-/vaul-1.1.2.tgz", - "integrity": "sha512-ZFkClGpWyI2WUQjdLJ/BaGuV6AVQiJ3uELGk3OYtP+B6yCO7Cmn9vPFXVJkRaGkOJu3m8bQMgtyzNHixULceQA==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-dialog": "^1.1.1" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc" - } - }, - "node_modules/vlq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", - "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==", - "license": "MIT" - }, - "node_modules/w3c-xmlserializer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", - "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", - "dev": true, - "license": "MIT", - "dependencies": { - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "license": "Apache-2.0", - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/warn-once": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/warn-once/-/warn-once-0.1.1.tgz", - "integrity": "sha512-VkQZJbO8zVImzYFteBXvBOZEl1qL175WH8VmZcxF2fZAoudNhNDvHi+doCaAEdU2l2vtcIwa2zn0QK5+I1HQ3Q==", - "license": "MIT" - }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "license": "MIT", - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/web-streams-polyfill": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", - "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=8" - } - }, - "node_modules/whatwg-encoding": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", - "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", - "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", - "dev": true, - "license": "MIT", - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-fetch": { - "version": "3.6.20", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", - "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", - "license": "MIT" - }, - "node_modules/whatwg-mimetype": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-url": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", - "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-url-without-unicode": { - "version": "8.0.0-3", - "resolved": "https://registry.npmjs.org/whatwg-url-without-unicode/-/whatwg-url-without-unicode-8.0.0-3.tgz", - "integrity": "sha512-HoKuzZrUlgpz35YO27XgD28uh/WJH4B0+3ttFqRo//lmq+9T/mIOJ6kqmINI9HpUpz1imRC/nR/lxKpJiv0uig==", - "license": "MIT", - "dependencies": { - "buffer": "^5.4.3", - "punycode": "^2.1.1", - "webidl-conversions": "^5.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/whatwg-url/node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - } - }, - "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", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.20", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", - "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "for-each": "^0.3.5", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/wonka": { - "version": "6.3.5", - "resolved": "https://registry.npmjs.org/wonka/-/wonka-6.3.5.tgz", - "integrity": "sha512-SSil+ecw6B4/Dm7Pf2sAshKQ5hWFvfyGlfPbEd6A14dOH6VDjrmbY86u6nZvy9omGwwIPFR8V41+of1EezgoUw==", - "license": "MIT" - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/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", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/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", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" - }, - "node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/ws": { - "version": "8.19.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", - "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xcode": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/xcode/-/xcode-3.0.1.tgz", - "integrity": "sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA==", - "license": "Apache-2.0", - "dependencies": { - "simple-plist": "^1.1.0", - "uuid": "^7.0.3" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/xml-name-validator": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", - "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12" - } - }, - "node_modules/xml2js": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.0.tgz", - "integrity": "sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==", - "license": "MIT", - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/xml2js/node_modules/xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "license": "MIT", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/xmlbuilder": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", - "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", - "license": "MIT", - "engines": { - "node": ">=8.0" - } - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true, - "license": "MIT" - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "license": "ISC" - }, - "node_modules/yaml": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", - "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", - "license": "ISC", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14.6" - }, - "funding": { - "url": "https://github.com/sponsors/eemeli" - } - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} +{ + "name": "greenlens", + "version": "2.1.4", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "greenlens", + "version": "2.1.4", + "dependencies": { + "@expo/vector-icons": "^15.0.3", + "@google/genai": "^1.38.0", + "@react-native-async-storage/async-storage": "2.2.0", + "expo": "^54.0.33", + "expo-application": "~7.0.8", + "expo-asset": "~12.0.12", + "expo-av": "^16.0.8", + "expo-blur": "~15.0.8", + "expo-build-properties": "^55.0.9", + "expo-camera": "~17.0.10", + "expo-constants": "~18.0.13", + "expo-dev-client": "~6.0.20", + "expo-device": "~8.0.10", + "expo-file-system": "~19.0.21", + "expo-font": "~14.0.11", + "expo-haptics": "~15.0.8", + "expo-image-manipulator": "~14.0.8", + "expo-image-picker": "~17.0.10", + "expo-linking": "~8.0.11", + "expo-localization": "~17.0.8", + "expo-notifications": "~0.32.16", + "expo-router": "~6.0.23", + "expo-secure-store": "~15.0.8", + "expo-splash-screen": "~31.0.13", + "expo-sqlite": "~16.0.10", + "expo-status-bar": "~3.0.9", + "expo-updates": "~29.0.16", + "expo-video": "~3.0.16", + "posthog-react-native": "^4.37.1", + "react": "19.1.0", + "react-dom": "19.1.0", + "react-native": "0.81.5", + "react-native-gesture-handler": "~2.28.0", + "react-native-purchases": "^9.10.5", + "react-native-purchases-ui": "^9.10.5", + "react-native-reanimated": "~4.1.1", + "react-native-safe-area-context": "~5.6.0", + "react-native-screens": "~4.16.0", + "react-native-svg": "^15.12.1", + "react-native-web": "^0.21.2", + "react-native-worklets": "0.5.1" + }, + "devDependencies": { + "@babel/core": "^7.25.0", + "@testing-library/jest-native": "^5.4.3", + "@testing-library/react-native": "^13.3.3", + "@types/jest": "^29.5.14", + "@types/react": "~19.1.0", + "jest": "^29.7.0", + "jest-expo": "^54.0.17", + "typescript": "^5.3.0" + } + }, + "node_modules/@0no-co/graphql.web": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@0no-co/graphql.web/-/graphql.web-1.2.0.tgz", + "integrity": "sha512-/1iHy9TTr63gE1YcR5idjx8UREz1s0kFhydf3bBLCXyqjhkIc6igAzTOx3zPifCwFR87tsh/4Pa9cNts6d2otw==", + "license": "MIT", + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" + }, + "peerDependenciesMeta": { + "graphql": { + "optional": true + } + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.6.tgz", + "integrity": "sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.28.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz", + "integrity": "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "regexpu-core": "^6.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.6.tgz", + "integrity": "sha512-mOAsxeeKkUKayvZR3HeTYD/fICpCPLJrU5ZjelT/PA6WHtNDBOE436YiaEUvHN454bRM3CebhDsIpieCc4texA==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "debug": "^4.4.3", + "lodash.debounce": "^4.0.8", + "resolve": "^1.22.11" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", + "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", + "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-wrap-function": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz", + "integrity": "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==", + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.6.tgz", + "integrity": "sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", + "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.9.tgz", + "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", + "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.29.0.tgz", + "integrity": "sha512-CVBVv3VY/XRMxRYq5dwr2DS7/MvqPm23cOCjbwNnVrfOqcWlnefua1uUs0sjdKOGjvPUG633o07uWzJq4oI6dA==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-syntax-decorators": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-export-default-from": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.27.1.tgz", + "integrity": "sha512-hjlsMBl1aJc5lp8MoCDEZCiYzlgdRAShOjAfRw6X+GlpLpUPU7c3XNLsKFZbQk/1cRzBlJ7CXg3xJAJMrFa1Uw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.28.6.tgz", + "integrity": "sha512-71EYI0ONURHJBL4rSFXnITXqXrrY8q4P0q006DPfN+Rk+ASM+++IBXem/ruokgBZR8YNEWZ8R6B+rCb8VcUTqA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-default-from": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.28.6.tgz", + "integrity": "sha512-Svlx1fjJFnNz0LZeUaybRukSxZI3KkpApUmIRzEdXC5k8ErTOz0OD0kNrICi5Vc3GlpP5ZCeRyRO+mfWTSz+iQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-flow": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.28.6.tgz", + "integrity": "sha512-D+OrJumc9McXNEBI/JmFnc/0uCM2/Y3PEBG3gfV3QIYkKv5pvnpzFrl1kYCrcHJP8nOeFB/SHi1IHz29pNGuew==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", + "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", + "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz", + "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", + "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.0.tgz", + "integrity": "sha512-va0VdWro4zlBr2JsXC+ofCPB2iG12wPtVGTWFx2WLDOM3nYQZZIGP82qku2eW/JR83sD+k2k+CsNtyEbUqhU6w==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.28.6.tgz", + "integrity": "sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-remap-async-to-generator": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.6.tgz", + "integrity": "sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.28.6.tgz", + "integrity": "sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.6.tgz", + "integrity": "sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.6.tgz", + "integrity": "sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-globals": "^7.28.0", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-replace-supers": "^7.28.6", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.28.6.tgz", + "integrity": "sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/template": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz", + "integrity": "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", + "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-flow-strip-types": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.27.1.tgz", + "integrity": "sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-flow": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", + "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", + "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", + "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.6.tgz", + "integrity": "sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.28.6.tgz", + "integrity": "sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.0.tgz", + "integrity": "sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.28.6.tgz", + "integrity": "sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.28.6.tgz", + "integrity": "sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.6.tgz", + "integrity": "sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.28.6.tgz", + "integrity": "sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.6.tgz", + "integrity": "sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", + "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.28.6.tgz", + "integrity": "sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.28.6.tgz", + "integrity": "sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz", + "integrity": "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.28.6.tgz", + "integrity": "sha512-61bxqhiRfAACulXSLd/GxqmAedUSrRZIu/cbaT18T1CetkTmtDN15it7i80ru4DVqRK1WMxQhXs+Lf9kajm5Ow==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-syntax-jsx": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz", + "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==", + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz", + "integrity": "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.0.tgz", + "integrity": "sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.29.0.tgz", + "integrity": "sha512-jlaRT5dJtMaMCV6fAuLbsQMSwz/QkvaHOHOSXRitGGwSpR1blCY4KUKoyP2tYO8vJcqYe8cEj96cqSztv3uF9w==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", + "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.28.6.tgz", + "integrity": "sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", + "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", + "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.6.tgz", + "integrity": "sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", + "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.28.5.tgz", + "integrity": "sha512-Z3J8vhRq7CeLjdC58jLv4lnZ5RKFUJWqH5emvxmv9Hv3BD1T9R/Im713R4MTKwvFaV74ejZ3sM01LyEKk4ugNQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-transform-react-display-name": "^7.28.0", + "@babel/plugin-transform-react-jsx": "^7.27.1", + "@babel/plugin-transform-react-jsx-development": "^7.27.1", + "@babel/plugin-transform-react-pure-annotations": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.28.5.tgz", + "integrity": "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-typescript": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz", + "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse--for-generate-function-map": { + "name": "@babel/traverse", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@egjs/hammerjs": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@egjs/hammerjs/-/hammerjs-2.0.17.tgz", + "integrity": "sha512-XQsZgjm2EcVUiZQf11UBJQfmZeEmOW8DpI1gsFeln6w0ae0ii4dMQEQ0kjl6DspdWX1aGY1/loyXnP0JS06e/A==", + "license": "MIT", + "dependencies": { + "@types/hammerjs": "^2.0.36" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@expo/cli": { + "version": "54.0.23", + "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-54.0.23.tgz", + "integrity": "sha512-km0h72SFfQCmVycH/JtPFTVy69w6Lx1cHNDmfLfQqgKFYeeHTjx7LVDP4POHCtNxFP2UeRazrygJhlh4zz498g==", + "license": "MIT", + "dependencies": { + "@0no-co/graphql.web": "^1.0.8", + "@expo/code-signing-certificates": "^0.0.6", + "@expo/config": "~12.0.13", + "@expo/config-plugins": "~54.0.4", + "@expo/devcert": "^1.2.1", + "@expo/env": "~2.0.8", + "@expo/image-utils": "^0.8.8", + "@expo/json-file": "^10.0.8", + "@expo/metro": "~54.2.0", + "@expo/metro-config": "~54.0.14", + "@expo/osascript": "^2.3.8", + "@expo/package-manager": "^1.9.10", + "@expo/plist": "^0.4.8", + "@expo/prebuild-config": "^54.0.8", + "@expo/schema-utils": "^0.1.8", + "@expo/spawn-async": "^1.7.2", + "@expo/ws-tunnel": "^1.0.1", + "@expo/xcpretty": "^4.3.0", + "@react-native/dev-middleware": "0.81.5", + "@urql/core": "^5.0.6", + "@urql/exchange-retry": "^1.3.0", + "accepts": "^1.3.8", + "arg": "^5.0.2", + "better-opn": "~3.0.2", + "bplist-creator": "0.1.0", + "bplist-parser": "^0.3.1", + "chalk": "^4.0.0", + "ci-info": "^3.3.0", + "compression": "^1.7.4", + "connect": "^3.7.0", + "debug": "^4.3.4", + "env-editor": "^0.4.1", + "expo-server": "^1.0.5", + "freeport-async": "^2.0.0", + "getenv": "^2.0.0", + "glob": "^13.0.0", + "lan-network": "^0.1.6", + "minimatch": "^9.0.0", + "node-forge": "^1.3.3", + "npm-package-arg": "^11.0.0", + "ora": "^3.4.0", + "picomatch": "^3.0.1", + "pretty-bytes": "^5.6.0", + "pretty-format": "^29.7.0", + "progress": "^2.0.3", + "prompts": "^2.3.2", + "qrcode-terminal": "0.11.0", + "require-from-string": "^2.0.2", + "requireg": "^0.2.2", + "resolve": "^1.22.2", + "resolve-from": "^5.0.0", + "resolve.exports": "^2.0.3", + "semver": "^7.6.0", + "send": "^0.19.0", + "slugify": "^1.3.4", + "source-map-support": "~0.5.21", + "stacktrace-parser": "^0.1.10", + "structured-headers": "^0.4.1", + "tar": "^7.5.2", + "terminal-link": "^2.1.1", + "undici": "^6.18.2", + "wrap-ansi": "^7.0.0", + "ws": "^8.12.1" + }, + "bin": { + "expo-internal": "build/bin/cli" + }, + "peerDependencies": { + "expo": "*", + "expo-router": "*", + "react-native": "*" + }, + "peerDependenciesMeta": { + "expo-router": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/@expo/cli/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/code-signing-certificates": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@expo/code-signing-certificates/-/code-signing-certificates-0.0.6.tgz", + "integrity": "sha512-iNe0puxwBNEcuua9gmTGzq+SuMDa0iATai1FlFTMHJ/vUmKvN/V//drXoLJkVb5i5H3iE/n/qIJxyoBnXouD0w==", + "license": "MIT", + "dependencies": { + "node-forge": "^1.3.3" + } + }, + "node_modules/@expo/config": { + "version": "12.0.13", + "resolved": "https://registry.npmjs.org/@expo/config/-/config-12.0.13.tgz", + "integrity": "sha512-Cu52arBa4vSaupIWsF0h7F/Cg//N374nYb7HAxV0I4KceKA7x2UXpYaHOL7EEYYvp7tZdThBjvGpVmr8ScIvaQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "~7.10.4", + "@expo/config-plugins": "~54.0.4", + "@expo/config-types": "^54.0.10", + "@expo/json-file": "^10.0.8", + "deepmerge": "^4.3.1", + "getenv": "^2.0.0", + "glob": "^13.0.0", + "require-from-string": "^2.0.2", + "resolve-from": "^5.0.0", + "resolve-workspace-root": "^2.0.0", + "semver": "^7.6.0", + "slugify": "^1.3.4", + "sucrase": "~3.35.1" + } + }, + "node_modules/@expo/config-plugins": { + "version": "54.0.4", + "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-54.0.4.tgz", + "integrity": "sha512-g2yXGICdoOw5i3LkQSDxl2Q5AlQCrG7oniu0pCPPO+UxGb7He4AFqSvPSy8HpRUj55io17hT62FTjYRD+d6j3Q==", + "license": "MIT", + "dependencies": { + "@expo/config-types": "^54.0.10", + "@expo/json-file": "~10.0.8", + "@expo/plist": "^0.4.8", + "@expo/sdk-runtime-versions": "^1.0.0", + "chalk": "^4.1.2", + "debug": "^4.3.5", + "getenv": "^2.0.0", + "glob": "^13.0.0", + "resolve-from": "^5.0.0", + "semver": "^7.5.4", + "slash": "^3.0.0", + "slugify": "^1.6.6", + "xcode": "^3.0.1", + "xml2js": "0.6.0" + } + }, + "node_modules/@expo/config-plugins/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/config-types": { + "version": "54.0.10", + "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-54.0.10.tgz", + "integrity": "sha512-/J16SC2an1LdtCZ67xhSkGXpALYUVUNyZws7v+PVsFZxClYehDSoKLqyRaGkpHlYrCc08bS0RF5E0JV6g50psA==", + "license": "MIT" + }, + "node_modules/@expo/config/node_modules/@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/@expo/config/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/devcert": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@expo/devcert/-/devcert-1.2.1.tgz", + "integrity": "sha512-qC4eaxmKMTmJC2ahwyui6ud8f3W60Ss7pMkpBq40Hu3zyiAaugPXnZ24145U7K36qO9UHdZUVxsCvIpz2RYYCA==", + "license": "MIT", + "dependencies": { + "@expo/sudo-prompt": "^9.3.1", + "debug": "^3.1.0" + } + }, + "node_modules/@expo/devcert/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/@expo/devtools": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@expo/devtools/-/devtools-0.1.8.tgz", + "integrity": "sha512-SVLxbuanDjJPgc0sy3EfXUMLb/tXzp6XIHkhtPVmTWJAp+FOr6+5SeiCfJrCzZFet0Ifyke2vX3sFcKwEvCXwQ==", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/@expo/env": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@expo/env/-/env-2.0.8.tgz", + "integrity": "sha512-5VQD6GT8HIMRaSaB5JFtOXuvfDVU80YtZIuUT/GDhUF782usIXY13Tn3IdDz1Tm/lqA9qnRZQ1BF4t7LlvdJPA==", + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "debug": "^4.3.4", + "dotenv": "~16.4.5", + "dotenv-expand": "~11.0.6", + "getenv": "^2.0.0" + } + }, + "node_modules/@expo/fingerprint": { + "version": "0.15.4", + "resolved": "https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.15.4.tgz", + "integrity": "sha512-eYlxcrGdR2/j2M6pEDXo9zU9KXXF1vhP+V+Tl+lyY+bU8lnzrN6c637mz6Ye3em2ANy8hhUR03Raf8VsT9Ogng==", + "license": "MIT", + "dependencies": { + "@expo/spawn-async": "^1.7.2", + "arg": "^5.0.2", + "chalk": "^4.1.2", + "debug": "^4.3.4", + "getenv": "^2.0.0", + "glob": "^13.0.0", + "ignore": "^5.3.1", + "minimatch": "^9.0.0", + "p-limit": "^3.1.0", + "resolve-from": "^5.0.0", + "semver": "^7.6.0" + }, + "bin": { + "fingerprint": "bin/cli.js" + } + }, + "node_modules/@expo/fingerprint/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/image-utils": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/@expo/image-utils/-/image-utils-0.8.8.tgz", + "integrity": "sha512-HHHaG4J4nKjTtVa1GG9PCh763xlETScfEyNxxOvfTRr8IKPJckjTyqSLEtdJoFNJ1vqiABEjW7tqGhqGibZLeA==", + "license": "MIT", + "dependencies": { + "@expo/spawn-async": "^1.7.2", + "chalk": "^4.0.0", + "getenv": "^2.0.0", + "jimp-compact": "0.16.1", + "parse-png": "^2.1.0", + "resolve-from": "^5.0.0", + "resolve-global": "^1.0.0", + "semver": "^7.6.0", + "temp-dir": "~2.0.0", + "unique-string": "~2.0.0" + } + }, + "node_modules/@expo/image-utils/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/json-file": { + "version": "10.0.8", + "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-10.0.8.tgz", + "integrity": "sha512-9LOTh1PgKizD1VXfGQ88LtDH0lRwq9lsTb4aichWTWSWqy3Ugfkhfm3BhzBIkJJfQQ5iJu3m/BoRlEIjoCGcnQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "~7.10.4", + "json5": "^2.2.3" + } + }, + "node_modules/@expo/json-file/node_modules/@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/@expo/metro": { + "version": "54.2.0", + "resolved": "https://registry.npmjs.org/@expo/metro/-/metro-54.2.0.tgz", + "integrity": "sha512-h68TNZPGsk6swMmLm9nRSnE2UXm48rWwgcbtAHVMikXvbxdS41NDHHeqg1rcQ9AbznDRp6SQVC2MVpDnsRKU1w==", + "license": "MIT", + "dependencies": { + "metro": "0.83.3", + "metro-babel-transformer": "0.83.3", + "metro-cache": "0.83.3", + "metro-cache-key": "0.83.3", + "metro-config": "0.83.3", + "metro-core": "0.83.3", + "metro-file-map": "0.83.3", + "metro-minify-terser": "0.83.3", + "metro-resolver": "0.83.3", + "metro-runtime": "0.83.3", + "metro-source-map": "0.83.3", + "metro-symbolicate": "0.83.3", + "metro-transform-plugins": "0.83.3", + "metro-transform-worker": "0.83.3" + } + }, + "node_modules/@expo/metro-config": { + "version": "54.0.14", + "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-54.0.14.tgz", + "integrity": "sha512-hxpLyDfOR4L23tJ9W1IbJJsG7k4lv2sotohBm/kTYyiG+pe1SYCAWsRmgk+H42o/wWf/HQjE5k45S5TomGLxNA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.20.0", + "@babel/core": "^7.20.0", + "@babel/generator": "^7.20.5", + "@expo/config": "~12.0.13", + "@expo/env": "~2.0.8", + "@expo/json-file": "~10.0.8", + "@expo/metro": "~54.2.0", + "@expo/spawn-async": "^1.7.2", + "browserslist": "^4.25.0", + "chalk": "^4.1.0", + "debug": "^4.3.2", + "dotenv": "~16.4.5", + "dotenv-expand": "~11.0.6", + "getenv": "^2.0.0", + "glob": "^13.0.0", + "hermes-parser": "^0.29.1", + "jsc-safe-url": "^0.2.4", + "lightningcss": "^1.30.1", + "minimatch": "^9.0.0", + "postcss": "~8.4.32", + "resolve-from": "^5.0.0" + }, + "peerDependencies": { + "expo": "*" + }, + "peerDependenciesMeta": { + "expo": { + "optional": true + } + } + }, + "node_modules/@expo/metro-runtime": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@expo/metro-runtime/-/metro-runtime-6.1.2.tgz", + "integrity": "sha512-nvM+Qv45QH7pmYvP8JB1G8JpScrWND3KrMA6ZKe62cwwNiX/BjHU28Ear0v/4bQWXlOY0mv6B8CDIm8JxXde9g==", + "license": "MIT", + "dependencies": { + "anser": "^1.4.9", + "pretty-format": "^29.7.0", + "stacktrace-parser": "^0.1.10", + "whatwg-fetch": "^3.0.0" + }, + "peerDependencies": { + "expo": "*", + "react": "*", + "react-dom": "*", + "react-native": "*" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/@expo/osascript": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/@expo/osascript/-/osascript-2.3.8.tgz", + "integrity": "sha512-/TuOZvSG7Nn0I8c+FcEaoHeBO07yu6vwDgk7rZVvAXoeAK5rkA09jRyjYsZo+0tMEFaToBeywA6pj50Mb3ny9w==", + "license": "MIT", + "dependencies": { + "@expo/spawn-async": "^1.7.2", + "exec-async": "^2.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@expo/package-manager": { + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@expo/package-manager/-/package-manager-1.9.10.tgz", + "integrity": "sha512-axJm+NOj3jVxep49va/+L3KkF3YW/dkV+RwzqUJedZrv4LeTqOG4rhrCaCPXHTvLqCTDKu6j0Xyd28N7mnxsGA==", + "license": "MIT", + "dependencies": { + "@expo/json-file": "^10.0.8", + "@expo/spawn-async": "^1.7.2", + "chalk": "^4.0.0", + "npm-package-arg": "^11.0.0", + "ora": "^3.4.0", + "resolve-workspace-root": "^2.0.0" + } + }, + "node_modules/@expo/plist": { + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.4.8.tgz", + "integrity": "sha512-pfNtErGGzzRwHP+5+RqswzPDKkZrx+Cli0mzjQaus1ZWFsog5ibL+nVT3NcporW51o8ggnt7x813vtRbPiyOrQ==", + "license": "MIT", + "dependencies": { + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.2.3", + "xmlbuilder": "^15.1.1" + } + }, + "node_modules/@expo/prebuild-config": { + "version": "54.0.8", + "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-54.0.8.tgz", + "integrity": "sha512-EA7N4dloty2t5Rde+HP0IEE+nkAQiu4A/+QGZGT9mFnZ5KKjPPkqSyYcRvP5bhQE10D+tvz6X0ngZpulbMdbsg==", + "license": "MIT", + "dependencies": { + "@expo/config": "~12.0.13", + "@expo/config-plugins": "~54.0.4", + "@expo/config-types": "^54.0.10", + "@expo/image-utils": "^0.8.8", + "@expo/json-file": "^10.0.8", + "@react-native/normalize-colors": "0.81.5", + "debug": "^4.3.1", + "resolve-from": "^5.0.0", + "semver": "^7.6.0", + "xml2js": "0.6.0" + }, + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/@expo/prebuild-config/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/schema-utils": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@expo/schema-utils/-/schema-utils-0.1.8.tgz", + "integrity": "sha512-9I6ZqvnAvKKDiO+ZF8BpQQFYWXOJvTAL5L/227RUbWG1OVZDInFifzCBiqAZ3b67NRfeAgpgvbA7rejsqhY62A==", + "license": "MIT" + }, + "node_modules/@expo/sdk-runtime-versions": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@expo/sdk-runtime-versions/-/sdk-runtime-versions-1.0.0.tgz", + "integrity": "sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ==", + "license": "MIT" + }, + "node_modules/@expo/spawn-async": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@expo/spawn-async/-/spawn-async-1.7.2.tgz", + "integrity": "sha512-QdWi16+CHB9JYP7gma19OVVg0BFkvU8zNj9GjWorYI8Iv8FUxjOCcYRuAmX4s/h91e4e7BPsskc8cSrZYho9Ew==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@expo/sudo-prompt": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@expo/sudo-prompt/-/sudo-prompt-9.3.2.tgz", + "integrity": "sha512-HHQigo3rQWKMDzYDLkubN5WQOYXJJE2eNqIQC2axC2iO3mHdwnIR7FgZVvHWtBwAdzBgAP0ECp8KqS8TiMKvgw==", + "license": "MIT" + }, + "node_modules/@expo/vector-icons": { + "version": "15.0.3", + "resolved": "https://registry.npmjs.org/@expo/vector-icons/-/vector-icons-15.0.3.tgz", + "integrity": "sha512-SBUyYKphmlfUBqxSfDdJ3jAdEVSALS2VUPOUyqn48oZmb2TL/O7t7/PQm5v4NQujYEPLPMTLn9KVw6H7twwbTA==", + "license": "MIT", + "peerDependencies": { + "expo-font": ">=14.0.4", + "react": "*", + "react-native": "*" + } + }, + "node_modules/@expo/ws-tunnel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@expo/ws-tunnel/-/ws-tunnel-1.0.6.tgz", + "integrity": "sha512-nDRbLmSrJar7abvUjp3smDwH8HcbZcoOEa5jVPUv9/9CajgmWw20JNRwTuBRzWIWIkEJDkz20GoNA+tSwUqk0Q==", + "license": "MIT" + }, + "node_modules/@expo/xcpretty": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@expo/xcpretty/-/xcpretty-4.4.0.tgz", + "integrity": "sha512-o2qDlTqJ606h4xR36H2zWTywmZ3v3842K6TU8Ik2n1mfW0S580VHlt3eItVYdLYz+klaPp7CXqanja8eASZjRw==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/code-frame": "^7.20.0", + "chalk": "^4.1.0", + "js-yaml": "^4.1.0" + }, + "bin": { + "excpretty": "build/cli.js" + } + }, + "node_modules/@google/genai": { + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/@google/genai/-/genai-1.40.0.tgz", + "integrity": "sha512-fhIww8smT0QYRX78qWOiz/nIQhHMF5wXOrlXvj33HBrz3vKDBb+wibLcEmTA+L9dmPD4KmfNr7UF3LDQVTXNjA==", + "license": "Apache-2.0", + "dependencies": { + "google-auth-library": "^10.3.0", + "protobufjs": "^7.5.4", + "ws": "^8.18.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "@modelcontextprotocol/sdk": "^1.25.2" + }, + "peerDependenciesMeta": { + "@modelcontextprotocol/sdk": { + "optional": true + } + } + }, + "node_modules/@ide/backoff": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@ide/backoff/-/backoff-1.0.0.tgz", + "integrity": "sha512-F0YfUDjvT+Mtt/R4xdl2X0EYCHMMiJqNLdxHD++jDT5ydEFIyqbCHh51Qx2E211dgZprPKhV7sHmnXKpLuvc5g==", + "license": "MIT" + }, + "node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", + "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", + "license": "MIT", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/brace-expansion": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.1.tgz", + "integrity": "sha512-WMz71T1JS624nWj2n2fnYAuPovhv7EUhk69R6i9dsVyzxt5eM3bjwvgk9L+APE1TRscGysAVMANkB0jh0LQZrQ==", + "license": "MIT", + "dependencies": { + "@isaacs/balanced-match": "^4.0.1" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@isaacs/ttlcache": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz", + "integrity": "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/core/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==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/create-cache-key-function": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-29.7.0.tgz", + "integrity": "sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/diff-sequences": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.0.1.tgz", + "integrity": "sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/get-type": { + "version": "30.1.0", + "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.1.0.tgz", + "integrity": "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/reporters/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==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@jest/reporters/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", + "devOptional": true, + "license": "ISC", + "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/@jest/reporters/node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "devOptional": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@jest/reporters/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "devOptional": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@jest/reporters/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "devOptional": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@jest/reporters/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==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@posthog/core": { + "version": "1.23.2", + "resolved": "https://registry.npmjs.org/@posthog/core/-/core-1.23.2.tgz", + "integrity": "sha512-zTDdda9NuSHrnwSOfFMxX/pyXiycF4jtU1kTr8DL61dHhV+7LF6XF1ndRZZTuaGGbfbb/GJYkEsjEX9SXfNZeQ==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.6" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", + "license": "BSD-3-Clause" + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", + "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-collection": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", + "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", + "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", + "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz", + "integrity": "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-direction": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", + "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz", + "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-escape-keydown": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz", + "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", + "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", + "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-portal": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", + "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-presence": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz", + "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-roving-focus": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.11.tgz", + "integrity": "sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.0.tgz", + "integrity": "sha512-ujc+V6r0HNDviYqIK3rW4ffgYiZ8g5DEHrGJVk4x7kTlLXRDILnKX9vAUYeIsLOoDpDJ0ujpqMkjH4w2ofuo6w==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tabs": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.13.tgz", + "integrity": "sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", + "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", + "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-effect-event": "0.0.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-effect-event": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", + "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", + "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", + "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@react-native-async-storage/async-storage": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@react-native-async-storage/async-storage/-/async-storage-2.2.0.tgz", + "integrity": "sha512-gvRvjR5JAaUZF8tv2Kcq/Gbt3JHwbKFYfmb445rhOj6NUMx3qPLixmDx5pZAyb9at1bYvJ4/eTUipU5aki45xw==", + "license": "MIT", + "dependencies": { + "merge-options": "^3.0.4" + }, + "peerDependencies": { + "react-native": "^0.0.0-0 || >=0.65 <1.0" + } + }, + "node_modules/@react-native/assets-registry": { + "version": "0.81.5", + "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.81.5.tgz", + "integrity": "sha512-705B6x/5Kxm1RKRvSv0ADYWm5JOnoiQ1ufW7h8uu2E6G9Of/eE6hP/Ivw3U5jI16ERqZxiKQwk34VJbB0niX9w==", + "license": "MIT", + "engines": { + "node": ">= 20.19.4" + } + }, + "node_modules/@react-native/babel-plugin-codegen": { + "version": "0.81.5", + "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.81.5.tgz", + "integrity": "sha512-oF71cIH6je3fSLi6VPjjC3Sgyyn57JLHXs+mHWc9MoCiJJcM4nqsS5J38zv1XQ8d3zOW2JtHro+LF0tagj2bfQ==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.3", + "@react-native/codegen": "0.81.5" + }, + "engines": { + "node": ">= 20.19.4" + } + }, + "node_modules/@react-native/babel-preset": { + "version": "0.81.5", + "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.81.5.tgz", + "integrity": "sha512-UoI/x/5tCmi+pZ3c1+Ypr1DaRMDLI3y+Q70pVLLVgrnC3DHsHRIbHcCHIeG/IJvoeFqFM2sTdhSOLJrf8lOPrA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.25.2", + "@babel/plugin-proposal-export-default-from": "^7.24.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-default-from": "^7.24.7", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-transform-arrow-functions": "^7.24.7", + "@babel/plugin-transform-async-generator-functions": "^7.25.4", + "@babel/plugin-transform-async-to-generator": "^7.24.7", + "@babel/plugin-transform-block-scoping": "^7.25.0", + "@babel/plugin-transform-class-properties": "^7.25.4", + "@babel/plugin-transform-classes": "^7.25.4", + "@babel/plugin-transform-computed-properties": "^7.24.7", + "@babel/plugin-transform-destructuring": "^7.24.8", + "@babel/plugin-transform-flow-strip-types": "^7.25.2", + "@babel/plugin-transform-for-of": "^7.24.7", + "@babel/plugin-transform-function-name": "^7.25.1", + "@babel/plugin-transform-literals": "^7.25.2", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.8", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", + "@babel/plugin-transform-numeric-separator": "^7.24.7", + "@babel/plugin-transform-object-rest-spread": "^7.24.7", + "@babel/plugin-transform-optional-catch-binding": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.8", + "@babel/plugin-transform-parameters": "^7.24.7", + "@babel/plugin-transform-private-methods": "^7.24.7", + "@babel/plugin-transform-private-property-in-object": "^7.24.7", + "@babel/plugin-transform-react-display-name": "^7.24.7", + "@babel/plugin-transform-react-jsx": "^7.25.2", + "@babel/plugin-transform-react-jsx-self": "^7.24.7", + "@babel/plugin-transform-react-jsx-source": "^7.24.7", + "@babel/plugin-transform-regenerator": "^7.24.7", + "@babel/plugin-transform-runtime": "^7.24.7", + "@babel/plugin-transform-shorthand-properties": "^7.24.7", + "@babel/plugin-transform-spread": "^7.24.7", + "@babel/plugin-transform-sticky-regex": "^7.24.7", + "@babel/plugin-transform-typescript": "^7.25.2", + "@babel/plugin-transform-unicode-regex": "^7.24.7", + "@babel/template": "^7.25.0", + "@react-native/babel-plugin-codegen": "0.81.5", + "babel-plugin-syntax-hermes-parser": "0.29.1", + "babel-plugin-transform-flow-enums": "^0.0.2", + "react-refresh": "^0.14.0" + }, + "engines": { + "node": ">= 20.19.4" + }, + "peerDependencies": { + "@babel/core": "*" + } + }, + "node_modules/@react-native/codegen": { + "version": "0.81.5", + "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.81.5.tgz", + "integrity": "sha512-a2TDA03Up8lpSa9sh5VRGCQDXgCTOyDOFH+aqyinxp1HChG8uk89/G+nkJ9FPd0rqgi25eCTR16TWdS3b+fA6g==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.25.2", + "@babel/parser": "^7.25.3", + "glob": "^7.1.1", + "hermes-parser": "0.29.1", + "invariant": "^2.2.4", + "nullthrows": "^1.1.1", + "yargs": "^17.6.2" + }, + "engines": { + "node": ">= 20.19.4" + }, + "peerDependencies": { + "@babel/core": "*" + } + }, + "node_modules/@react-native/codegen/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", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@react-native/codegen/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", + "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/@react-native/codegen/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@react-native/community-cli-plugin": { + "version": "0.81.5", + "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.81.5.tgz", + "integrity": "sha512-yWRlmEOtcyvSZ4+OvqPabt+NS36vg0K/WADTQLhrYrm9qdZSuXmq8PmdJWz/68wAqKQ+4KTILiq2kjRQwnyhQw==", + "license": "MIT", + "dependencies": { + "@react-native/dev-middleware": "0.81.5", + "debug": "^4.4.0", + "invariant": "^2.2.4", + "metro": "^0.83.1", + "metro-config": "^0.83.1", + "metro-core": "^0.83.1", + "semver": "^7.1.3" + }, + "engines": { + "node": ">= 20.19.4" + }, + "peerDependencies": { + "@react-native-community/cli": "*", + "@react-native/metro-config": "*" + }, + "peerDependenciesMeta": { + "@react-native-community/cli": { + "optional": true + }, + "@react-native/metro-config": { + "optional": true + } + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@react-native/debugger-frontend": { + "version": "0.81.5", + "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.81.5.tgz", + "integrity": "sha512-bnd9FSdWKx2ncklOetCgrlwqSGhMHP2zOxObJbOWXoj7GHEmih4MKarBo5/a8gX8EfA1EwRATdfNBQ81DY+h+w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 20.19.4" + } + }, + "node_modules/@react-native/dev-middleware": { + "version": "0.81.5", + "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.81.5.tgz", + "integrity": "sha512-WfPfZzboYgo/TUtysuD5xyANzzfka8Ebni6RIb2wDxhb56ERi7qDrE4xGhtPsjCL4pQBXSVxyIlCy0d8I6EgGA==", + "license": "MIT", + "dependencies": { + "@isaacs/ttlcache": "^1.4.1", + "@react-native/debugger-frontend": "0.81.5", + "chrome-launcher": "^0.15.2", + "chromium-edge-launcher": "^0.2.0", + "connect": "^3.6.5", + "debug": "^4.4.0", + "invariant": "^2.2.4", + "nullthrows": "^1.1.1", + "open": "^7.0.3", + "serve-static": "^1.16.2", + "ws": "^6.2.3" + }, + "engines": { + "node": ">= 20.19.4" + } + }, + "node_modules/@react-native/dev-middleware/node_modules/ws": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", + "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", + "license": "MIT", + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "node_modules/@react-native/gradle-plugin": { + "version": "0.81.5", + "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.81.5.tgz", + "integrity": "sha512-hORRlNBj+ReNMLo9jme3yQ6JQf4GZpVEBLxmTXGGlIL78MAezDZr5/uq9dwElSbcGmLEgeiax6e174Fie6qPLg==", + "license": "MIT", + "engines": { + "node": ">= 20.19.4" + } + }, + "node_modules/@react-native/js-polyfills": { + "version": "0.81.5", + "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.81.5.tgz", + "integrity": "sha512-fB7M1CMOCIUudTRuj7kzxIBTVw2KXnsgbQ6+4cbqSxo8NmRRhA0Ul4ZUzZj3rFd3VznTL4Brmocv1oiN0bWZ8w==", + "license": "MIT", + "engines": { + "node": ">= 20.19.4" + } + }, + "node_modules/@react-native/normalize-colors": { + "version": "0.81.5", + "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.81.5.tgz", + "integrity": "sha512-0HuJ8YtqlTVRXGZuGeBejLE04wSQsibpTI+RGOyVqxZvgtlLLC/Ssw0UmbHhT4lYMp2fhdtvKZSs5emWB1zR/g==", + "license": "MIT" + }, + "node_modules/@react-native/virtualized-lists": { + "version": "0.81.5", + "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.81.5.tgz", + "integrity": "sha512-UVXgV/db25OPIvwZySeToXD/9sKKhOdkcWmmf4Jh8iBZuyfML+/5CasaZ1E7Lqg6g3uqVQq75NqIwkYmORJMPw==", + "license": "MIT", + "dependencies": { + "invariant": "^2.2.4", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 20.19.4" + }, + "peerDependencies": { + "@types/react": "^19.1.0", + "react": "*", + "react-native": "*" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@react-navigation/bottom-tabs": { + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/@react-navigation/bottom-tabs/-/bottom-tabs-7.12.0.tgz", + "integrity": "sha512-/GtOfVWRligHG0mvX39I1FGdUWeWl0GVF2okEziQSQj0bOTrLIt7y44C3r/aCLkEpTVltCPGM3swqGTH3UfRCw==", + "license": "MIT", + "dependencies": { + "@react-navigation/elements": "^2.9.5", + "color": "^4.2.3", + "sf-symbols-typescript": "^2.1.0" + }, + "peerDependencies": { + "@react-navigation/native": "^7.1.28", + "react": ">= 18.2.0", + "react-native": "*", + "react-native-safe-area-context": ">= 4.0.0", + "react-native-screens": ">= 4.0.0" + } + }, + "node_modules/@react-navigation/core": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@react-navigation/core/-/core-7.14.0.tgz", + "integrity": "sha512-tMpzskBzVp0E7CRNdNtJIdXjk54Kwe/TF9ViXAef+YFM1kSfGv4e/B2ozfXE+YyYgmh4WavTv8fkdJz1CNyu+g==", + "license": "MIT", + "dependencies": { + "@react-navigation/routers": "^7.5.3", + "escape-string-regexp": "^4.0.0", + "fast-deep-equal": "^3.1.3", + "nanoid": "^3.3.11", + "query-string": "^7.1.3", + "react-is": "^19.1.0", + "use-latest-callback": "^0.2.4", + "use-sync-external-store": "^1.5.0" + }, + "peerDependencies": { + "react": ">= 18.2.0" + } + }, + "node_modules/@react-navigation/elements": { + "version": "2.9.5", + "resolved": "https://registry.npmjs.org/@react-navigation/elements/-/elements-2.9.5.tgz", + "integrity": "sha512-iHZU8rRN1014Upz73AqNVXDvSMZDh5/ktQ1CMe21rdgnOY79RWtHHBp9qOS3VtqlUVYGkuX5GEw5mDt4tKdl0g==", + "license": "MIT", + "dependencies": { + "color": "^4.2.3", + "use-latest-callback": "^0.2.4", + "use-sync-external-store": "^1.5.0" + }, + "peerDependencies": { + "@react-native-masked-view/masked-view": ">= 0.2.0", + "@react-navigation/native": "^7.1.28", + "react": ">= 18.2.0", + "react-native": "*", + "react-native-safe-area-context": ">= 4.0.0" + }, + "peerDependenciesMeta": { + "@react-native-masked-view/masked-view": { + "optional": true + } + } + }, + "node_modules/@react-navigation/native": { + "version": "7.1.28", + "resolved": "https://registry.npmjs.org/@react-navigation/native/-/native-7.1.28.tgz", + "integrity": "sha512-d1QDn+KNHfHGt3UIwOZvupvdsDdiHYZBEj7+wL2yDVo3tMezamYy60H9s3EnNVE1Ae1ty0trc7F2OKqo/RmsdQ==", + "license": "MIT", + "dependencies": { + "@react-navigation/core": "^7.14.0", + "escape-string-regexp": "^4.0.0", + "fast-deep-equal": "^3.1.3", + "nanoid": "^3.3.11", + "use-latest-callback": "^0.2.4" + }, + "peerDependencies": { + "react": ">= 18.2.0", + "react-native": "*" + } + }, + "node_modules/@react-navigation/native-stack": { + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/@react-navigation/native-stack/-/native-stack-7.12.0.tgz", + "integrity": "sha512-XmNJsPshjkNsahgbxNgGWQUq4s1l6HqH/Fei4QsjBNn/0mTvVrRVZwJ1XrY9YhWYvyiYkAN6/OmarWQaQJ0otQ==", + "license": "MIT", + "dependencies": { + "@react-navigation/elements": "^2.9.5", + "color": "^4.2.3", + "sf-symbols-typescript": "^2.1.0", + "warn-once": "^0.1.1" + }, + "peerDependencies": { + "@react-navigation/native": "^7.1.28", + "react": ">= 18.2.0", + "react-native": "*", + "react-native-safe-area-context": ">= 4.0.0", + "react-native-screens": ">= 4.0.0" + } + }, + "node_modules/@react-navigation/routers": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/@react-navigation/routers/-/routers-7.5.3.tgz", + "integrity": "sha512-1tJHg4KKRJuQ1/EvJxatrMef3NZXEPzwUIUZ3n1yJ2t7Q97siwRtbynRpQG9/69ebbtiZ8W3ScOZF/OmhvM4Rg==", + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11" + } + }, + "node_modules/@revenuecat/purchases-js": { + "version": "1.26.2", + "resolved": "https://registry.npmjs.org/@revenuecat/purchases-js/-/purchases-js-1.26.2.tgz", + "integrity": "sha512-10k0LL3cmlxe9gN2GfXBLmLR3ZtnQN7wKpDxzJn/JtRSC0Sq12+/msCIuAiBYRP1CKJv8JAVVEyvYufMDqVf9A==", + "license": "MIT" + }, + "node_modules/@revenuecat/purchases-js-hybrid-mappings": { + "version": "17.41.1", + "resolved": "https://registry.npmjs.org/@revenuecat/purchases-js-hybrid-mappings/-/purchases-js-hybrid-mappings-17.41.1.tgz", + "integrity": "sha512-00T+PXH/2S3T8VmdOH1XZeC2OhIYWxw7YCOAssVHxxorU8JExowE7mlDcMOIb6lFCjAXQBj6t65TxmlHlkW3PA==", + "license": "MIT", + "dependencies": { + "@revenuecat/purchases-js": "1.26.2" + } + }, + "node_modules/@revenuecat/purchases-typescript-internal": { + "version": "17.41.1", + "resolved": "https://registry.npmjs.org/@revenuecat/purchases-typescript-internal/-/purchases-typescript-internal-17.41.1.tgz", + "integrity": "sha512-npyMpQPTcGjXpP8n5NQ4W6N0nc+zTXpb0HSQo6HL+3jNj2eH00EgS/Bzm0wOBtvQAjqINjl0q+Dl6ru/PCZxpw==", + "license": "MIT" + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.10", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", + "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", + "license": "MIT" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@testing-library/jest-native": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/@testing-library/jest-native/-/jest-native-5.4.3.tgz", + "integrity": "sha512-/sSDGaOuE+PJ1Z9Kp4u7PQScSVVXGud59I/qsBFFJvIbcn4P6yYw6cBnBmbPF+X9aRIsTJRDl6gzw5ZkJNm66w==", + "deprecated": "DEPRECATED: This package is no longer maintained.\nPlease use the built-in Jest matchers available in @testing-library/react-native v12.4+.\n\nSee migration guide: https://callstack.github.io/react-native-testing-library/docs/migration/jest-matchers", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "jest-diff": "^29.0.1", + "jest-matcher-utils": "^29.0.1", + "pretty-format": "^29.0.3", + "redent": "^3.0.0" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-native": ">=0.59", + "react-test-renderer": ">=16.0.0" + } + }, + "node_modules/@testing-library/react-native": { + "version": "13.3.3", + "resolved": "https://registry.npmjs.org/@testing-library/react-native/-/react-native-13.3.3.tgz", + "integrity": "sha512-k6Mjsd9dbZgvY4Bl7P1NIpePQNi+dfYtlJ5voi9KQlynxSyQkfOgJmYGCYmw/aSgH/rUcFvG8u5gd4npzgRDyg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "jest-matcher-utils": "^30.0.5", + "picocolors": "^1.1.1", + "pretty-format": "^30.0.5", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "jest": ">=29.0.0", + "react": ">=18.2.0", + "react-native": ">=0.71", + "react-test-renderer": ">=18.2.0" + }, + "peerDependenciesMeta": { + "jest": { + "optional": true + } + } + }, + "node_modules/@testing-library/react-native/node_modules/@jest/schemas": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", + "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@testing-library/react-native/node_modules/@sinclair/typebox": { + "version": "0.34.48", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.48.tgz", + "integrity": "sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@testing-library/react-native/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@testing-library/react-native/node_modules/jest-diff": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.2.0.tgz", + "integrity": "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@jest/diff-sequences": "30.0.1", + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "pretty-format": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@testing-library/react-native/node_modules/jest-matcher-utils": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.2.0.tgz", + "integrity": "sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "jest-diff": "30.2.0", + "pretty-format": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@testing-library/react-native/node_modules/pretty-format": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", + "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@testing-library/react-native/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/hammerjs": { + "version": "2.0.46", + "resolved": "https://registry.npmjs.org/@types/hammerjs/-/hammerjs-2.0.46.tgz", + "integrity": "sha512-ynRvcq6wvqexJ9brDMS4BnBLzmr0e14d6ZJTEShTBWKymQiHwlAyGu0ZPEFI2Fh1U53F7tN9ufClWM5KvqkKOw==", + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.14", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", + "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/jsdom": { + "version": "20.0.1", + "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-20.0.1.tgz", + "integrity": "sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/tough-cookie": "*", + "parse5": "^7.0.0" + } + }, + "node_modules/@types/node": { + "version": "25.2.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.2.2.tgz", + "integrity": "sha512-BkmoP5/FhRYek5izySdkOneRyXYN35I860MFAGupTdebyE66uZaR+bXLHq8k4DirE5DwQi3NuhvRU1jqTVwUrQ==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/react": { + "version": "19.1.17", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.17.tgz", + "integrity": "sha512-Qec1E3mhALmaspIrhWt9jkQMNdw6bReVu64mjvhbhq2NFPftLPVr+l1SZgmw/66WwBNpDh7ao5AT6gF5v41PFA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.0.2" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "license": "MIT" + }, + "node_modules/@types/tough-cookie": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", + "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/yargs": { + "version": "17.0.35", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", + "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "license": "MIT" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "license": "ISC" + }, + "node_modules/@urql/core": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@urql/core/-/core-5.2.0.tgz", + "integrity": "sha512-/n0ieD0mvvDnVAXEQgX/7qJiVcvYvNkOHeBvkwtylfjydar123caCXcl58PXFY11oU1oquJocVXHxLAbtv4x1A==", + "license": "MIT", + "dependencies": { + "@0no-co/graphql.web": "^1.0.13", + "wonka": "^6.3.2" + } + }, + "node_modules/@urql/exchange-retry": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@urql/exchange-retry/-/exchange-retry-1.3.2.tgz", + "integrity": "sha512-TQMCz2pFJMfpNxmSfX1VSfTjwUIFx/mL+p1bnfM1xjjdla7Z+KnGMW/EhFbpckp3LyWAH4PgOsMwOMnIN+MBFg==", + "license": "MIT", + "dependencies": { + "@urql/core": "^5.1.2", + "wonka": "^6.3.2" + }, + "peerDependencies": { + "@urql/core": "^5.0.0" + } + }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz", + "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "deprecated": "Use your platform's native atob() and btoa() methods instead", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", + "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.1.0", + "acorn-walk": "^8.0.2" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/anser": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", + "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==", + "license": "MIT" + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/aria-hidden": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", + "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "license": "MIT" + }, + "node_modules/assert": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", + "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "is-nan": "^1.3.2", + "object-is": "^1.1.5", + "object.assign": "^4.1.4", + "util": "^0.12.5" + } + }, + "node_modules/async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/await-lock": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/await-lock/-/await-lock-2.2.2.tgz", + "integrity": "sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw==", + "license": "MIT" + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "license": "MIT", + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.15.tgz", + "integrity": "sha512-hR3GwrRwHUfYwGfrisXPIDP3JcYfBrW7wKE7+Au6wDYl7fm/ka1NEII6kORzxNU556JjfidZeBsO10kYvtV1aw==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-define-polyfill-provider": "^0.6.6", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", + "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.5", + "core-js-compat": "^3.43.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.6.tgz", + "integrity": "sha512-hYm+XLYRMvupxiQzrvXUj7YyvFFVfv5gI0R71AJzudg1g2AI2vyCPPIFEBjk162/wFzti3inBHo7isWFuEVS/A==", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.6" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-react-compiler": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-react-compiler/-/babel-plugin-react-compiler-1.0.0.tgz", + "integrity": "sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.26.0" + } + }, + "node_modules/babel-plugin-react-native-web": { + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/babel-plugin-react-native-web/-/babel-plugin-react-native-web-0.21.2.tgz", + "integrity": "sha512-SPD0J6qjJn8231i0HZhlAGH6NORe+QvRSQM2mwQEzJ2Fb3E4ruWTiiicPlHjmeWShDXLcvoorOCXjeR7k/lyWA==", + "license": "MIT" + }, + "node_modules/babel-plugin-syntax-hermes-parser": { + "version": "0.29.1", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.29.1.tgz", + "integrity": "sha512-2WFYnoWGdmih1I1J5eIqxATOeycOqRwYxAQBu3cUu/rhwInwHUg7k60AFNbuGjSDL8tje5GDrAnxzRLcu2pYcA==", + "license": "MIT", + "dependencies": { + "hermes-parser": "0.29.1" + } + }, + "node_modules/babel-plugin-transform-flow-enums": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-enums/-/babel-plugin-transform-flow-enums-0.0.2.tgz", + "integrity": "sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==", + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-flow": "^7.12.1" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", + "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/babel-preset-expo": { + "version": "54.0.10", + "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-54.0.10.tgz", + "integrity": "sha512-wTt7POavLFypLcPW/uC5v8y+mtQKDJiyGLzYCjqr9tx0Qc3vCXcDKk1iCFIj/++Iy5CWhhTflEa7VvVPNWeCfw==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/plugin-proposal-decorators": "^7.12.9", + "@babel/plugin-proposal-export-default-from": "^7.24.7", + "@babel/plugin-syntax-export-default-from": "^7.24.7", + "@babel/plugin-transform-class-static-block": "^7.27.1", + "@babel/plugin-transform-export-namespace-from": "^7.25.9", + "@babel/plugin-transform-flow-strip-types": "^7.25.2", + "@babel/plugin-transform-modules-commonjs": "^7.24.8", + "@babel/plugin-transform-object-rest-spread": "^7.24.7", + "@babel/plugin-transform-parameters": "^7.24.7", + "@babel/plugin-transform-private-methods": "^7.24.7", + "@babel/plugin-transform-private-property-in-object": "^7.24.7", + "@babel/plugin-transform-runtime": "^7.24.7", + "@babel/preset-react": "^7.22.15", + "@babel/preset-typescript": "^7.23.0", + "@react-native/babel-preset": "0.81.5", + "babel-plugin-react-compiler": "^1.0.0", + "babel-plugin-react-native-web": "~0.21.0", + "babel-plugin-syntax-hermes-parser": "^0.29.1", + "babel-plugin-transform-flow-enums": "^0.0.2", + "debug": "^4.3.4", + "resolve-from": "^5.0.0" + }, + "peerDependencies": { + "@babel/runtime": "^7.20.0", + "expo": "*", + "react-refresh": ">=0.14.0 <1.0.0" + }, + "peerDependenciesMeta": { + "@babel/runtime": { + "optional": true + }, + "expo": { + "optional": true + } + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/badgin": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/badgin/-/badgin-1.2.3.tgz", + "integrity": "sha512-NQGA7LcfCpSzIbGRbkgjgdWkjy7HI+Th5VLxTJfW5EeaAf3fnS+xWQaQOCYiny+q6QSvxqoSO04vCx+4u++EJw==", + "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" + }, + "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/baseline-browser-mapping": { + "version": "2.9.19", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz", + "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/better-opn": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz", + "integrity": "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==", + "license": "MIT", + "dependencies": { + "open": "^8.0.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/better-opn/node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/big-integer": { + "version": "1.6.52", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", + "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", + "license": "Unlicense", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/bignumber.js": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", + "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "license": "ISC" + }, + "node_modules/bplist-creator": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.0.tgz", + "integrity": "sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==", + "license": "MIT", + "dependencies": { + "stream-buffers": "2.2.x" + } + }, + "node_modules/bplist-parser": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz", + "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==", + "license": "MIT", + "dependencies": { + "big-integer": "1.6.x" + }, + "engines": { + "node": ">= 5.10.0" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "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-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "license": "BSD-3-Clause" + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001769", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001769.tgz", + "integrity": "sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/chrome-launcher": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.2.tgz", + "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==", + "license": "Apache-2.0", + "dependencies": { + "@types/node": "*", + "escape-string-regexp": "^4.0.0", + "is-wsl": "^2.2.0", + "lighthouse-logger": "^1.0.0" + }, + "bin": { + "print-chrome-path": "bin/print-chrome-path.js" + }, + "engines": { + "node": ">=12.13.0" + } + }, + "node_modules/chromium-edge-launcher": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/chromium-edge-launcher/-/chromium-edge-launcher-0.2.0.tgz", + "integrity": "sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg==", + "license": "Apache-2.0", + "dependencies": { + "@types/node": "*", + "escape-string-regexp": "^4.0.0", + "is-wsl": "^2.2.0", + "lighthouse-logger": "^1.0.0", + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", + "license": "MIT", + "dependencies": { + "restore-cursor": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", + "license": "MIT" + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/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", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "devOptional": true, + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", + "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "license": "MIT", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", + "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "compressible": "~2.0.18", + "debug": "2.6.9", + "negotiator": "~0.6.4", + "on-headers": "~1.1.0", + "safe-buffer": "5.2.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/compression/node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "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" + }, + "node_modules/connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/connect/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/connect/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "license": "MIT" + }, + "node_modules/core-js-compat": { + "version": "3.48.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.48.0.tgz", + "integrity": "sha512-OM4cAF3D6VtH/WkLtWvyNC56EZVXsZdU3iqaMG2B4WvYrlqU831pc4UtG5yp0sE9z8Y02wVN7PjW5Zf9Gt0f1Q==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/cross-fetch": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.2.0.tgz", + "integrity": "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==", + "license": "MIT", + "dependencies": { + "node-fetch": "^2.7.0" + } + }, + "node_modules/cross-fetch/node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/cross-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, + "node_modules/cross-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/cross-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/css-in-js-utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/css-in-js-utils/-/css-in-js-utils-3.1.0.tgz", + "integrity": "sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==", + "license": "MIT", + "dependencies": { + "hyphenate-style-name": "^1.0.3" + } + }, + "node_modules/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-tree/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssom": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", + "dev": true, + "license": "MIT" + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true, + "license": "MIT" + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/data-urls": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", + "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "dev": true, + "license": "MIT" + }, + "node_modules/decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/dedent": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.1.tgz", + "integrity": "sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg==", + "devOptional": true, + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "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/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "license": "MIT", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", + "license": "MIT" + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domexception": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", + "deprecated": "Use your platform's native DOMException instead", + "dev": true, + "license": "MIT", + "dependencies": { + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/domexception/node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dotenv": { + "version": "16.4.7", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", + "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dotenv-expand": { + "version": "11.0.7", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", + "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", + "license": "BSD-2-Clause", + "dependencies": { + "dotenv": "^16.4.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.286", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.286.tgz", + "integrity": "sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==", + "license": "ISC" + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "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" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-editor": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/env-editor/-/env-editor-0.4.2.tgz", + "integrity": "sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-ex/node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/error-stack-parser": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", + "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "license": "MIT", + "dependencies": { + "stackframe": "^1.3.4" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/exec-async": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/exec-async/-/exec-async-2.2.0.tgz", + "integrity": "sha512-87OpwcEiMia/DeiKFzaQNBNFeN3XkkpYIh9FyOqq5mS2oKv3CBE67PXoEKcr6nodWdXNogTiQ0jE2NGuoffXPw==", + "license": "MIT" + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/execa/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "devOptional": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/expo": { + "version": "54.0.33", + "resolved": "https://registry.npmjs.org/expo/-/expo-54.0.33.tgz", + "integrity": "sha512-3yOEfAKqo+gqHcV8vKcnq0uA5zxlohnhA3fu4G43likN8ct5ZZ3LjAh9wDdKteEkoad3tFPvwxmXW711S5OHUw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.0", + "@expo/cli": "54.0.23", + "@expo/config": "~12.0.13", + "@expo/config-plugins": "~54.0.4", + "@expo/devtools": "0.1.8", + "@expo/fingerprint": "0.15.4", + "@expo/metro": "~54.2.0", + "@expo/metro-config": "54.0.14", + "@expo/vector-icons": "^15.0.3", + "@ungap/structured-clone": "^1.3.0", + "babel-preset-expo": "~54.0.10", + "expo-asset": "~12.0.12", + "expo-constants": "~18.0.13", + "expo-file-system": "~19.0.21", + "expo-font": "~14.0.11", + "expo-keep-awake": "~15.0.8", + "expo-modules-autolinking": "3.0.24", + "expo-modules-core": "3.0.29", + "pretty-format": "^29.7.0", + "react-refresh": "^0.14.2", + "whatwg-url-without-unicode": "8.0.0-3" + }, + "bin": { + "expo": "bin/cli", + "expo-modules-autolinking": "bin/autolinking", + "fingerprint": "bin/fingerprint" + }, + "peerDependencies": { + "@expo/dom-webview": "*", + "@expo/metro-runtime": "*", + "react": "*", + "react-native": "*", + "react-native-webview": "*" + }, + "peerDependenciesMeta": { + "@expo/dom-webview": { + "optional": true + }, + "@expo/metro-runtime": { + "optional": true + }, + "react-native-webview": { + "optional": true + } + } + }, + "node_modules/expo-application": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/expo-application/-/expo-application-7.0.8.tgz", + "integrity": "sha512-qFGyxk7VJbrNOQWBbE09XUuGuvkOgFS9QfToaK2FdagM2aQ+x3CvGV2DuVgl/l4ZxPgIf3b/MNh9xHpwSwn74Q==", + "license": "MIT", + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-asset": { + "version": "12.0.12", + "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-12.0.12.tgz", + "integrity": "sha512-CsXFCQbx2fElSMn0lyTdRIyKlSXOal6ilLJd+yeZ6xaC7I9AICQgscY5nj0QcwgA+KYYCCEQEBndMsmj7drOWQ==", + "license": "MIT", + "dependencies": { + "@expo/image-utils": "^0.8.8", + "expo-constants": "~18.0.12" + }, + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*" + } + }, + "node_modules/expo-av": { + "version": "16.0.8", + "resolved": "https://registry.npmjs.org/expo-av/-/expo-av-16.0.8.tgz", + "integrity": "sha512-cmVPftGR/ca7XBgs7R6ky36lF3OC0/MM/lpgX/yXqfv0jASTsh7AYX9JxHCwFmF+Z6JEB1vne9FDx4GiLcGreQ==", + "license": "MIT", + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*", + "react-native-web": "*" + }, + "peerDependenciesMeta": { + "react-native-web": { + "optional": true + } + } + }, + "node_modules/expo-blur": { + "version": "15.0.8", + "resolved": "https://registry.npmjs.org/expo-blur/-/expo-blur-15.0.8.tgz", + "integrity": "sha512-rWyE1NBRZEu9WD+X+5l7gyPRszw7n12cW3IRNAb5i6KFzaBp8cxqT5oeaphJapqURvcqhkOZn2k5EtBSbsuU7w==", + "license": "MIT", + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*" + } + }, + "node_modules/expo-build-properties": { + "version": "55.0.9", + "resolved": "https://registry.npmjs.org/expo-build-properties/-/expo-build-properties-55.0.9.tgz", + "integrity": "sha512-p0rNHW/6ghKsvjlUn2DQfbLYuTB6ba+15SeTPOz5BYbyU1F/0F/YyxBtHdmWitqgDPn6VgXQeKhiNC1fMwYDpg==", + "license": "MIT", + "dependencies": { + "@expo/schema-utils": "^55.0.2", + "resolve-from": "^5.0.0", + "semver": "^7.6.0" + }, + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-build-properties/node_modules/@expo/schema-utils": { + "version": "55.0.2", + "resolved": "https://registry.npmjs.org/@expo/schema-utils/-/schema-utils-55.0.2.tgz", + "integrity": "sha512-QZ5WKbJOWkCrMq0/kfhV9ry8te/OaS34YgLVpG8u9y2gix96TlpRTbxM/YATjNcUR2s4fiQmPCOxkGtog4i37g==", + "license": "MIT" + }, + "node_modules/expo-build-properties/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/expo-camera": { + "version": "17.0.10", + "resolved": "https://registry.npmjs.org/expo-camera/-/expo-camera-17.0.10.tgz", + "integrity": "sha512-w1RBw83mAGVk4BPPwNrCZyFop0VLiVSRE3c2V9onWbdFwonpRhzmB4drygG8YOUTl1H3wQvALJHyMPTbgsK1Jg==", + "license": "MIT", + "dependencies": { + "invariant": "^2.2.4" + }, + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*", + "react-native-web": "*" + }, + "peerDependenciesMeta": { + "react-native-web": { + "optional": true + } + } + }, + "node_modules/expo-constants": { + "version": "18.0.13", + "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-18.0.13.tgz", + "integrity": "sha512-FnZn12E1dRYKDHlAdIyNFhBurKTS3F9CrfrBDJI5m3D7U17KBHMQ6JEfYlSj7LG7t+Ulr+IKaj58L1k5gBwTcQ==", + "license": "MIT", + "dependencies": { + "@expo/config": "~12.0.13", + "@expo/env": "~2.0.8" + }, + "peerDependencies": { + "expo": "*", + "react-native": "*" + } + }, + "node_modules/expo-dev-client": { + "version": "6.0.20", + "resolved": "https://registry.npmjs.org/expo-dev-client/-/expo-dev-client-6.0.20.tgz", + "integrity": "sha512-5XjoVlj1OxakNxy55j/AUaGPrDOlQlB6XdHLLWAw61w5ffSpUDHDnuZzKzs9xY1eIaogOqTOQaAzZ2ddBkdXLA==", + "license": "MIT", + "dependencies": { + "expo-dev-launcher": "6.0.20", + "expo-dev-menu": "7.0.18", + "expo-dev-menu-interface": "2.0.0", + "expo-manifests": "~1.0.10", + "expo-updates-interface": "~2.0.0" + }, + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-dev-launcher": { + "version": "6.0.20", + "resolved": "https://registry.npmjs.org/expo-dev-launcher/-/expo-dev-launcher-6.0.20.tgz", + "integrity": "sha512-a04zHEeT9sB0L5EB38fz7sNnUKJ2Ar1pXpcyl60Ki8bXPNCs9rjY7NuYrDkP/irM8+1DklMBqHpyHiLyJ/R+EA==", + "license": "MIT", + "dependencies": { + "ajv": "^8.11.0", + "expo-dev-menu": "7.0.18", + "expo-manifests": "~1.0.10" + }, + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-dev-menu": { + "version": "7.0.18", + "resolved": "https://registry.npmjs.org/expo-dev-menu/-/expo-dev-menu-7.0.18.tgz", + "integrity": "sha512-4kTdlHrnZCAWCT6tZRQHSSjZ7vECFisL4T+nsG/GJDo/jcHNaOVGV5qPV9wzlTxyMk3YOPggRw4+g7Ownrg5eA==", + "license": "MIT", + "dependencies": { + "expo-dev-menu-interface": "2.0.0" + }, + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-dev-menu-interface": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/expo-dev-menu-interface/-/expo-dev-menu-interface-2.0.0.tgz", + "integrity": "sha512-BvAMPt6x+vyXpThsyjjOYyjwfjREV4OOpQkZ0tNl+nGpsPfcY9mc6DRACoWnH9KpLzyIt3BOgh3cuy/h/OxQjw==", + "license": "MIT", + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-device": { + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/expo-device/-/expo-device-8.0.10.tgz", + "integrity": "sha512-jd5BxjaF7382JkDMaC+P04aXXknB2UhWaVx5WiQKA05ugm/8GH5uaz9P9ckWdMKZGQVVEOC8MHaUADoT26KmFA==", + "license": "MIT", + "dependencies": { + "ua-parser-js": "^0.7.33" + }, + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-device/node_modules/ua-parser-js": { + "version": "0.7.41", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.41.tgz", + "integrity": "sha512-O3oYyCMPYgNNHuO7Jjk3uacJWZF8loBgwrfd/5LE/HyZ3lUIOdniQ7DNXJcIgZbwioZxk0fLfI4EVnetdiX5jg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + } + ], + "license": "MIT", + "bin": { + "ua-parser-js": "script/cli.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/expo-eas-client": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/expo-eas-client/-/expo-eas-client-1.0.8.tgz", + "integrity": "sha512-5or11NJhSeDoHHI6zyvQDW2cz/yFyE+1Cz8NTs5NK8JzC7J0JrkUgptWtxyfB6Xs/21YRNifd3qgbBN3hfKVgA==", + "license": "MIT" + }, + "node_modules/expo-file-system": { + "version": "19.0.21", + "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-19.0.21.tgz", + "integrity": "sha512-s3DlrDdiscBHtab/6W1osrjGL+C2bvoInPJD7sOwmxfJ5Woynv2oc+Fz1/xVXaE/V7HE/+xrHC/H45tu6lZzzg==", + "license": "MIT", + "peerDependencies": { + "expo": "*", + "react-native": "*" + } + }, + "node_modules/expo-font": { + "version": "14.0.11", + "resolved": "https://registry.npmjs.org/expo-font/-/expo-font-14.0.11.tgz", + "integrity": "sha512-ga0q61ny4s/kr4k8JX9hVH69exVSIfcIc19+qZ7gt71Mqtm7xy2c6kwsPTCyhBW2Ro5yXTT8EaZOpuRi35rHbg==", + "license": "MIT", + "dependencies": { + "fontfaceobserver": "^2.1.0" + }, + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*" + } + }, + "node_modules/expo-haptics": { + "version": "15.0.8", + "resolved": "https://registry.npmjs.org/expo-haptics/-/expo-haptics-15.0.8.tgz", + "integrity": "sha512-lftutojy8Qs8zaDzzjwM3gKHFZ8bOOEZDCkmh2Ddpe95Ra6kt2izeOfOfKuP/QEh0MZ1j9TfqippyHdRd1ZM9g==", + "license": "MIT", + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-image-loader": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/expo-image-loader/-/expo-image-loader-6.0.0.tgz", + "integrity": "sha512-nKs/xnOGw6ACb4g26xceBD57FKLFkSwEUTDXEDF3Gtcu3MqF3ZIYd3YM+sSb1/z9AKV1dYT7rMSGVNgsveXLIQ==", + "license": "MIT", + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-image-manipulator": { + "version": "14.0.8", + "resolved": "https://registry.npmjs.org/expo-image-manipulator/-/expo-image-manipulator-14.0.8.tgz", + "integrity": "sha512-sXsXjm7rIxLWZe0j2A41J/Ph53PpFJRdyzJ3EQ/qetxLUvS2m3K1sP5xy37px43qCf0l79N/i6XgFgenFV36/Q==", + "license": "MIT", + "dependencies": { + "expo-image-loader": "~6.0.0" + }, + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-image-picker": { + "version": "17.0.10", + "resolved": "https://registry.npmjs.org/expo-image-picker/-/expo-image-picker-17.0.10.tgz", + "integrity": "sha512-a2xrowp2trmvXyUWgX3O6Q2rZaa2C59AqivKI7+bm+wLvMfTEbZgldLX4rEJJhM8xtmEDTNU+lzjtObwzBRGaw==", + "license": "MIT", + "dependencies": { + "expo-image-loader": "~6.0.0" + }, + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-json-utils": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/expo-json-utils/-/expo-json-utils-0.15.0.tgz", + "integrity": "sha512-duRT6oGl80IDzH2LD2yEFWNwGIC2WkozsB6HF3cDYNoNNdUvFk6uN3YiwsTsqVM/D0z6LEAQ01/SlYvN+Fw0JQ==", + "license": "MIT" + }, + "node_modules/expo-keep-awake": { + "version": "15.0.8", + "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-15.0.8.tgz", + "integrity": "sha512-YK9M1VrnoH1vLJiQzChZgzDvVimVoriibiDIFLbQMpjYBnvyfUeHJcin/Gx1a+XgupNXy92EQJLgI/9ZuXajYQ==", + "license": "MIT", + "peerDependencies": { + "expo": "*", + "react": "*" + } + }, + "node_modules/expo-linking": { + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/expo-linking/-/expo-linking-8.0.11.tgz", + "integrity": "sha512-+VSaNL5om3kOp/SSKO5qe6cFgfSIWnnQDSbA7XLs3ECkYzXRquk5unxNS3pg7eK5kNUmQ4kgLI7MhTggAEUBLA==", + "license": "MIT", + "dependencies": { + "expo-constants": "~18.0.12", + "invariant": "^2.2.4" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "node_modules/expo-localization": { + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/expo-localization/-/expo-localization-17.0.8.tgz", + "integrity": "sha512-UrdwklZBDJ+t+ZszMMiE0SXZ2eJxcquCuQcl6EvGHM9K+e6YqKVRQ+w8qE+iIB3H75v2RJy6MHAaLK+Mqeo04g==", + "license": "MIT", + "dependencies": { + "rtl-detect": "^1.0.2" + }, + "peerDependencies": { + "expo": "*", + "react": "*" + } + }, + "node_modules/expo-manifests": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/expo-manifests/-/expo-manifests-1.0.10.tgz", + "integrity": "sha512-oxDUnURPcL4ZsOBY6X1DGWGuoZgVAFzp6PISWV7lPP2J0r8u1/ucuChBgpK7u1eLGFp6sDIPwXyEUCkI386XSQ==", + "license": "MIT", + "dependencies": { + "@expo/config": "~12.0.11", + "expo-json-utils": "~0.15.0" + }, + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-modules-autolinking": { + "version": "3.0.24", + "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-3.0.24.tgz", + "integrity": "sha512-TP+6HTwhL7orDvsz2VzauyQlXJcAWyU3ANsZ7JGL4DQu8XaZv/A41ZchbtAYLfozNA2Ya1Hzmhx65hXryBMjaQ==", + "license": "MIT", + "dependencies": { + "@expo/spawn-async": "^1.7.2", + "chalk": "^4.1.0", + "commander": "^7.2.0", + "require-from-string": "^2.0.2", + "resolve-from": "^5.0.0" + }, + "bin": { + "expo-modules-autolinking": "bin/expo-modules-autolinking.js" + } + }, + "node_modules/expo-modules-core": { + "version": "3.0.29", + "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-3.0.29.tgz", + "integrity": "sha512-LzipcjGqk8gvkrOUf7O2mejNWugPkf3lmd9GkqL9WuNyeN2fRwU0Dn77e3ZUKI3k6sI+DNwjkq4Nu9fNN9WS7Q==", + "license": "MIT", + "dependencies": { + "invariant": "^2.2.4" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "node_modules/expo-notifications": { + "version": "0.32.16", + "resolved": "https://registry.npmjs.org/expo-notifications/-/expo-notifications-0.32.16.tgz", + "integrity": "sha512-QQD/UA6v7LgvwIJ+tS7tSvqJZkdp0nCSj9MxsDk/jU1GttYdK49/5L2LvE/4U0H7sNBz1NZAyhDZozg8xgBLXw==", + "license": "MIT", + "dependencies": { + "@expo/image-utils": "^0.8.8", + "@ide/backoff": "^1.0.0", + "abort-controller": "^3.0.0", + "assert": "^2.0.0", + "badgin": "^1.1.5", + "expo-application": "~7.0.8", + "expo-constants": "~18.0.13" + }, + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*" + } + }, + "node_modules/expo-router": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/expo-router/-/expo-router-6.0.23.tgz", + "integrity": "sha512-qCxVAiCrCyu0npky6azEZ6dJDMt77OmCzEbpF6RbUTlfkaCA417LvY14SBkk0xyGruSxy/7pvJOI6tuThaUVCA==", + "license": "MIT", + "dependencies": { + "@expo/metro-runtime": "^6.1.2", + "@expo/schema-utils": "^0.1.8", + "@radix-ui/react-slot": "1.2.0", + "@radix-ui/react-tabs": "^1.1.12", + "@react-navigation/bottom-tabs": "^7.4.0", + "@react-navigation/native": "^7.1.8", + "@react-navigation/native-stack": "^7.3.16", + "client-only": "^0.0.1", + "debug": "^4.3.4", + "escape-string-regexp": "^4.0.0", + "expo-server": "^1.0.5", + "fast-deep-equal": "^3.1.3", + "invariant": "^2.2.4", + "nanoid": "^3.3.8", + "query-string": "^7.1.3", + "react-fast-compare": "^3.2.2", + "react-native-is-edge-to-edge": "^1.1.6", + "semver": "~7.6.3", + "server-only": "^0.0.1", + "sf-symbols-typescript": "^2.1.0", + "shallowequal": "^1.1.0", + "use-latest-callback": "^0.2.1", + "vaul": "^1.1.2" + }, + "peerDependencies": { + "@expo/metro-runtime": "^6.1.2", + "@react-navigation/drawer": "^7.5.0", + "@testing-library/react-native": ">= 12.0.0", + "expo": "*", + "expo-constants": "^18.0.13", + "expo-linking": "^8.0.11", + "react": "*", + "react-dom": "*", + "react-native": "*", + "react-native-gesture-handler": "*", + "react-native-reanimated": "*", + "react-native-safe-area-context": ">= 5.4.0", + "react-native-screens": "*", + "react-native-web": "*", + "react-server-dom-webpack": "~19.0.4 || ~19.1.5 || ~19.2.4" + }, + "peerDependenciesMeta": { + "@react-navigation/drawer": { + "optional": true + }, + "@testing-library/react-native": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "react-native-gesture-handler": { + "optional": true + }, + "react-native-reanimated": { + "optional": true + }, + "react-native-web": { + "optional": true + }, + "react-server-dom-webpack": { + "optional": true + } + } + }, + "node_modules/expo-router/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/expo-secure-store": { + "version": "15.0.8", + "resolved": "https://registry.npmjs.org/expo-secure-store/-/expo-secure-store-15.0.8.tgz", + "integrity": "sha512-lHnzvRajBu4u+P99+0GEMijQMFCOYpWRO4dWsXSuMt77+THPIGjzNvVKrGSl6mMrLsfVaKL8BpwYZLGlgA+zAw==", + "license": "MIT", + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-server": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/expo-server/-/expo-server-1.0.5.tgz", + "integrity": "sha512-IGR++flYH70rhLyeXF0Phle56/k4cee87WeQ4mamS+MkVAVP+dDlOHf2nN06Z9Y2KhU0Gp1k+y61KkghF7HdhA==", + "license": "MIT", + "engines": { + "node": ">=20.16.0" + } + }, + "node_modules/expo-splash-screen": { + "version": "31.0.13", + "resolved": "https://registry.npmjs.org/expo-splash-screen/-/expo-splash-screen-31.0.13.tgz", + "integrity": "sha512-1epJLC1cDlwwj089R2h8cxaU5uk4ONVAC+vzGiTZH4YARQhL4Stlz1MbR6yAS173GMosvkE6CAeihR7oIbCkDA==", + "license": "MIT", + "dependencies": { + "@expo/prebuild-config": "^54.0.8" + }, + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-sqlite": { + "version": "16.0.10", + "resolved": "https://registry.npmjs.org/expo-sqlite/-/expo-sqlite-16.0.10.tgz", + "integrity": "sha512-tUOKxE9TpfneRG3eOfbNfhN9236SJ7IiUnP8gCqU7umd9DtgDGB/5PhYVVfl+U7KskgolgNoB9v9OZ9iwXN8Eg==", + "license": "MIT", + "dependencies": { + "await-lock": "^2.2.2" + }, + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*" + } + }, + "node_modules/expo-status-bar": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/expo-status-bar/-/expo-status-bar-3.0.9.tgz", + "integrity": "sha512-xyYyVg6V1/SSOZWh4Ni3U129XHCnFHBTcUo0dhWtFDrZbNp/duw5AGsQfb2sVeU0gxWHXSY1+5F0jnKYC7WuOw==", + "license": "MIT", + "dependencies": { + "react-native-is-edge-to-edge": "^1.2.1" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "node_modules/expo-structured-headers": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/expo-structured-headers/-/expo-structured-headers-5.0.0.tgz", + "integrity": "sha512-RmrBtnSphk5REmZGV+lcdgdpxyzio5rJw8CXviHE6qH5pKQQ83fhMEcigvrkBdsn2Efw2EODp4Yxl1/fqMvOZw==", + "license": "MIT" + }, + "node_modules/expo-updates": { + "version": "29.0.16", + "resolved": "https://registry.npmjs.org/expo-updates/-/expo-updates-29.0.16.tgz", + "integrity": "sha512-E9/fxRz/Eurtc7hxeI/6ZPyHH3To9Xoccm1kXoICZTRojmuTo+dx0Xv53UHyHn4G5zGMezyaKF2Qtj3AKcT93w==", + "license": "MIT", + "dependencies": { + "@expo/code-signing-certificates": "^0.0.6", + "@expo/plist": "^0.4.8", + "@expo/spawn-async": "^1.7.2", + "arg": "4.1.0", + "chalk": "^4.1.2", + "debug": "^4.3.4", + "expo-eas-client": "~1.0.8", + "expo-manifests": "~1.0.10", + "expo-structured-headers": "~5.0.0", + "expo-updates-interface": "~2.0.0", + "getenv": "^2.0.0", + "glob": "^13.0.0", + "ignore": "^5.3.1", + "resolve-from": "^5.0.0" + }, + "bin": { + "expo-updates": "bin/cli.js" + }, + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*" + } + }, + "node_modules/expo-updates-interface": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/expo-updates-interface/-/expo-updates-interface-2.0.0.tgz", + "integrity": "sha512-pTzAIufEZdVPKql6iMi5ylVSPqV1qbEopz9G6TSECQmnNde2nwq42PxdFBaUEd8IZJ/fdJLQnOT3m6+XJ5s7jg==", + "license": "MIT", + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-updates/node_modules/arg": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.0.tgz", + "integrity": "sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg==", + "license": "MIT" + }, + "node_modules/expo-video": { + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/expo-video/-/expo-video-3.0.16.tgz", + "integrity": "sha512-H1HlxcHGomZItqisGfW3YL/G9BHtNBfVSimDJcLuyxyU87wFnV8loO9tCjuhufkfh/aTa2sW5BYAjLjg9DvnBQ==", + "license": "MIT", + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*" + } + }, + "node_modules/exponential-backoff": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", + "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", + "license": "Apache-2.0" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fbjs": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.5.tgz", + "integrity": "sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==", + "license": "MIT", + "dependencies": { + "cross-fetch": "^3.1.5", + "fbjs-css-vars": "^1.0.0", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^1.0.35" + } + }, + "node_modules/fbjs-css-vars": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", + "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==", + "license": "MIT" + }, + "node_modules/fbjs/node_modules/promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "license": "MIT", + "dependencies": { + "asap": "~2.0.3" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/filter-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", + "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flow-enums-runtime": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz", + "integrity": "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==", + "license": "MIT" + }, + "node_modules/fontfaceobserver": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/fontfaceobserver/-/fontfaceobserver-2.3.0.tgz", + "integrity": "sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg==", + "license": "BSD-2-Clause" + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "license": "MIT", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/freeport-async": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/freeport-async/-/freeport-async-2.0.0.tgz", + "integrity": "sha512-K7od3Uw45AJg00XUmy15+Hae2hOcgKcmN3/EF6Y7i01O0gaqiRx8sUSpsb9+BRNL8RPBrhzPsVfy8q9ADlJuWQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "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" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gaxios": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.3.tgz", + "integrity": "sha512-YGGyuEdVIjqxkxVH1pUTMY/XtmmsApXrCVv5EU25iX6inEPbV+VakJfLealkBtJN69AQmh1eGOdCl9Sm1UP6XQ==", + "license": "Apache-2.0", + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^7.0.1", + "node-fetch": "^3.3.2", + "rimraf": "^5.0.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/gaxios/node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "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", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/gaxios/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/gaxios/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/gaxios/node_modules/rimraf": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", + "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", + "license": "ISC", + "dependencies": { + "glob": "^10.3.7" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/gcp-metadata": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-8.1.2.tgz", + "integrity": "sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==", + "license": "Apache-2.0", + "dependencies": { + "gaxios": "^7.0.0", + "google-logging-utils": "^1.0.0", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/getenv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/getenv/-/getenv-2.0.0.tgz", + "integrity": "sha512-VilgtJj/ALgGY77fiLam5iD336eSWi96Q15JSAG1zi8NRBysm3LXKdGnHb4m5cuyxvOLQQKWpBZAT6ni4FI2iQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/glob": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.1.tgz", + "integrity": "sha512-B7U/vJpE3DkJ5WXTgTpTRN63uV42DseiXXKMwG14LQBXmsdeIoHAPbU/MEo6II0k5ED74uc2ZGTC6MwHFQhF6w==", + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.1.2", + "minipass": "^7.1.2", + "path-scurry": "^2.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.2.tgz", + "integrity": "sha512-fu656aJ0n2kcXwsnwnv9g24tkU5uSmOlTjd6WyyaKm2Z+h1qmY6bAjrcaIxF/BslFqbZ8UBtbJi7KgQOZD2PTw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.1" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", + "license": "MIT", + "dependencies": { + "ini": "^1.3.4" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/google-auth-library": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.5.0.tgz", + "integrity": "sha512-7ABviyMOlX5hIVD60YOfHw4/CxOfBhyduaYB+wbFWCWoni4N7SLcV46hrVRktuBbZjFC9ONyqamZITN7q3n32w==", + "license": "Apache-2.0", + "dependencies": { + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "gaxios": "^7.0.0", + "gcp-metadata": "^8.0.0", + "google-logging-utils": "^1.0.0", + "gtoken": "^8.0.0", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/google-logging-utils": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-1.1.3.tgz", + "integrity": "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "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" + }, + "node_modules/gtoken": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-8.0.0.tgz", + "integrity": "sha512-+CqsMbHPiSTdtSO14O51eMNlrp9N79gmeqmXeouJOhfucAedHw9noVe/n5uJk3tbKE6a+6ZCQg3RPhVhHByAIw==", + "license": "MIT", + "dependencies": { + "gaxios": "^7.0.0", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hermes-estree": { + "version": "0.29.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.29.1.tgz", + "integrity": "sha512-jl+x31n4/w+wEqm0I2r4CMimukLbLQEYpisys5oCre611CI5fc9TxhqkBBCJ1edDG4Kza0f7CgNz8xVMLZQOmQ==", + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.29.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.29.1.tgz", + "integrity": "sha512-xBHWmUtRC5e/UL0tI7Ivt2riA/YBq9+SiYFU7C1oBa/j2jYGlIF9043oak1F47ihuDIxQ5nbsKueYJDRY02UgA==", + "license": "MIT", + "dependencies": { + "hermes-estree": "0.29.1" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/hosted-git-info": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", + "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", + "license": "ISC", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/http-errors/node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-agent/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "devOptional": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/hyphenate-style-name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.1.0.tgz", + "integrity": "sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==", + "license": "BSD-3-Clause" + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-size": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.2.1.tgz", + "integrity": "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==", + "license": "MIT", + "dependencies": { + "queue": "6.0.2" + }, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=16.x" + } + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "license": "MIT", + "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==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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", + "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/inline-style-prefixer": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-7.0.1.tgz", + "integrity": "sha512-lhYo5qNTQp3EvSSp3sRvXMbVQTLrvGV6DycRMJ5dm2BLMiJ30wpXKdDdgX+GmJZ5uQMucwRKHamXSst3Sj/Giw==", + "license": "MIT", + "dependencies": { + "css-in-js-utils": "^3.1.0" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/is-arguments": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz", + "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==", + "license": "MIT" + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "devOptional": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "devOptional": true, + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "devOptional": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "devOptional": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-config/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==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/jest-config/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", + "devOptional": true, + "license": "ISC", + "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/jest-config/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "devOptional": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/jest-config/node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-jsdom": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz", + "integrity": "sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/jsdom": "^20.0.0", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0", + "jsdom": "^20.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-expo": { + "version": "54.0.17", + "resolved": "https://registry.npmjs.org/jest-expo/-/jest-expo-54.0.17.tgz", + "integrity": "sha512-LyIhrsP4xvHEEcR1R024u/LBj3uPpAgB+UljgV+YXWkEHjprnr0KpE4tROsMNYCVTM1pPlAnPuoBmn5gnAN9KA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@expo/config": "~12.0.13", + "@expo/json-file": "^10.0.8", + "@jest/create-cache-key-function": "^29.2.1", + "@jest/globals": "^29.2.1", + "babel-jest": "^29.2.1", + "jest-environment-jsdom": "^29.2.1", + "jest-snapshot": "^29.2.1", + "jest-watch-select-projects": "^2.0.0", + "jest-watch-typeahead": "2.2.1", + "json5": "^2.2.3", + "lodash": "^4.17.19", + "react-test-renderer": "19.1.0", + "server-only": "^0.0.1", + "stacktrace-js": "^2.0.2" + }, + "bin": { + "jest": "bin/jest.js" + }, + "peerDependencies": { + "expo": "*", + "react-native": "*", + "react-server-dom-webpack": "~19.0.4 || ~19.1.5 || ~19.2.4" + }, + "peerDependenciesMeta": { + "react-server-dom-webpack": { + "optional": true + } + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "devOptional": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-runner/node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime/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==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/jest-runtime/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", + "devOptional": true, + "license": "ISC", + "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/jest-runtime/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "devOptional": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "devOptional": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-watch-select-projects": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jest-watch-select-projects/-/jest-watch-select-projects-2.0.0.tgz", + "integrity": "sha512-j00nW4dXc2NiCW6znXgFLF9g8PJ0zP25cpQ1xRro/HU2GBfZQFZD0SoXnAlaoKkIY4MlfTMkKGbNXFpvCdjl1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.3.0", + "chalk": "^3.0.0", + "prompts": "^2.2.1" + } + }, + "node_modules/jest-watch-select-projects/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watch-typeahead": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-2.2.1.tgz", + "integrity": "sha512-jYpYmUnTzysmVnwq49TAxlmtOAwp8QIqvZyoofQFn8fiWhEDZj33ZXzg3JA4nGnzWFm1hbWf3ADpteUokvXgFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^6.0.0", + "chalk": "^4.0.0", + "jest-regex-util": "^29.0.0", + "jest-watcher": "^29.0.0", + "slash": "^5.0.0", + "string-length": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "jest": "^27.0.0 || ^28.0.0 || ^29.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/ansi-escapes": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.1.tgz", + "integrity": "sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watch-typeahead/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/jest-watch-typeahead/node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watch-typeahead/node_modules/string-length": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz", + "integrity": "sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "char-regex": "^2.0.0", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watch-typeahead/node_modules/string-length/node_modules/char-regex": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.2.tgz", + "integrity": "sha512-cbGOjAptfM2LVmWhwRFHEKTPkLwNddVmuqYZQt895yXwAsWsXObCG+YN4DGQ/JBtT4GP1a1lPPdio2z413LmTg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/jest-watch-typeahead/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jimp-compact": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/jimp-compact/-/jimp-compact-0.16.1.tgz", + "integrity": "sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww==", + "license": "MIT" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsc-safe-url": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz", + "integrity": "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==", + "license": "0BSD" + }, + "node_modules/jsdom": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz", + "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "abab": "^2.0.6", + "acorn": "^8.8.1", + "acorn-globals": "^7.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.2", + "decimal.js": "^10.4.2", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.2", + "parse5": "^7.1.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^4.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0", + "ws": "^8.11.0", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/jsdom/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jsdom/node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "license": "MIT", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jwa": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", + "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", + "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", + "license": "MIT", + "dependencies": { + "jwa": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/lan-network": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/lan-network/-/lan-network-0.1.7.tgz", + "integrity": "sha512-mnIlAEMu4OyEvUNdzco9xpuB9YVcPkQec+QsgycBCtPZvEqWPCDPfbAE4OJMdBBWpZWtpCn1xw9jJYlwjWI5zQ==", + "license": "MIT", + "bin": { + "lan-network": "dist/lan-network-cli.js" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/lighthouse-logger": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz", + "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", + "license": "Apache-2.0", + "dependencies": { + "debug": "^2.6.9", + "marky": "^1.2.2" + } + }, + "node_modules/lighthouse-logger/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/lighthouse-logger/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/lightningcss": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.31.1.tgz", + "integrity": "sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.31.1", + "lightningcss-darwin-arm64": "1.31.1", + "lightningcss-darwin-x64": "1.31.1", + "lightningcss-freebsd-x64": "1.31.1", + "lightningcss-linux-arm-gnueabihf": "1.31.1", + "lightningcss-linux-arm64-gnu": "1.31.1", + "lightningcss-linux-arm64-musl": "1.31.1", + "lightningcss-linux-x64-gnu": "1.31.1", + "lightningcss-linux-x64-musl": "1.31.1", + "lightningcss-win32-arm64-msvc": "1.31.1", + "lightningcss-win32-x64-msvc": "1.31.1" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.31.1.tgz", + "integrity": "sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.31.1.tgz", + "integrity": "sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.31.1.tgz", + "integrity": "sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.31.1.tgz", + "integrity": "sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.31.1.tgz", + "integrity": "sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.31.1.tgz", + "integrity": "sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.31.1.tgz", + "integrity": "sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.31.1.tgz", + "integrity": "sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.31.1.tgz", + "integrity": "sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.31.1.tgz", + "integrity": "sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.31.1.tgz", + "integrity": "sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "license": "MIT" + }, + "node_modules/lodash.throttle": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", + "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "license": "MIT", + "dependencies": { + "chalk": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, + "node_modules/log-symbols/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/log-symbols/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/long": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", + "license": "Apache-2.0" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "devOptional": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/marky": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/marky/-/marky-1.3.0.tgz", + "integrity": "sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==", + "license": "Apache-2.0" + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "license": "CC0-1.0" + }, + "node_modules/memoize-one": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", + "license": "MIT" + }, + "node_modules/merge-options": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/merge-options/-/merge-options-3.0.4.tgz", + "integrity": "sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==", + "license": "MIT", + "dependencies": { + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "license": "MIT" + }, + "node_modules/metro": { + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro/-/metro-0.83.3.tgz", + "integrity": "sha512-+rP+/GieOzkt97hSJ0MrPOuAH/jpaS21ZDvL9DJ35QYRDlQcwzcvUlGUf79AnQxq/2NPiS/AULhhM4TKutIt8Q==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/core": "^7.25.2", + "@babel/generator": "^7.25.0", + "@babel/parser": "^7.25.3", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.3", + "@babel/types": "^7.25.2", + "accepts": "^1.3.7", + "chalk": "^4.0.0", + "ci-info": "^2.0.0", + "connect": "^3.6.5", + "debug": "^4.4.0", + "error-stack-parser": "^2.0.6", + "flow-enums-runtime": "^0.0.6", + "graceful-fs": "^4.2.4", + "hermes-parser": "0.32.0", + "image-size": "^1.0.2", + "invariant": "^2.2.4", + "jest-worker": "^29.7.0", + "jsc-safe-url": "^0.2.2", + "lodash.throttle": "^4.1.1", + "metro-babel-transformer": "0.83.3", + "metro-cache": "0.83.3", + "metro-cache-key": "0.83.3", + "metro-config": "0.83.3", + "metro-core": "0.83.3", + "metro-file-map": "0.83.3", + "metro-resolver": "0.83.3", + "metro-runtime": "0.83.3", + "metro-source-map": "0.83.3", + "metro-symbolicate": "0.83.3", + "metro-transform-plugins": "0.83.3", + "metro-transform-worker": "0.83.3", + "mime-types": "^2.1.27", + "nullthrows": "^1.1.1", + "serialize-error": "^2.1.0", + "source-map": "^0.5.6", + "throat": "^5.0.0", + "ws": "^7.5.10", + "yargs": "^17.6.2" + }, + "bin": { + "metro": "src/cli.js" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/metro-babel-transformer": { + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.83.3.tgz", + "integrity": "sha512-1vxlvj2yY24ES1O5RsSIvg4a4WeL7PFXgKOHvXTXiW0deLvQr28ExXj6LjwCCDZ4YZLhq6HddLpZnX4dEdSq5g==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.25.2", + "flow-enums-runtime": "^0.0.6", + "hermes-parser": "0.32.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/metro-babel-transformer/node_modules/hermes-estree": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", + "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", + "license": "MIT" + }, + "node_modules/metro-babel-transformer/node_modules/hermes-parser": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", + "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", + "license": "MIT", + "dependencies": { + "hermes-estree": "0.32.0" + } + }, + "node_modules/metro-cache": { + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.83.3.tgz", + "integrity": "sha512-3jo65X515mQJvKqK3vWRblxDEcgY55Sk3w4xa6LlfEXgQ9g1WgMh9m4qVZVwgcHoLy0a2HENTPCCX4Pk6s8c8Q==", + "license": "MIT", + "dependencies": { + "exponential-backoff": "^3.1.1", + "flow-enums-runtime": "^0.0.6", + "https-proxy-agent": "^7.0.5", + "metro-core": "0.83.3" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/metro-cache-key": { + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.83.3.tgz", + "integrity": "sha512-59ZO049jKzSmvBmG/B5bZ6/dztP0ilp0o988nc6dpaDsU05Cl1c/lRf+yx8m9WW/JVgbmfO5MziBU559XjI5Zw==", + "license": "MIT", + "dependencies": { + "flow-enums-runtime": "^0.0.6" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/metro-config": { + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.83.3.tgz", + "integrity": "sha512-mTel7ipT0yNjKILIan04bkJkuCzUUkm2SeEaTads8VfEecCh+ltXchdq6DovXJqzQAXuR2P9cxZB47Lg4klriA==", + "license": "MIT", + "dependencies": { + "connect": "^3.6.5", + "flow-enums-runtime": "^0.0.6", + "jest-validate": "^29.7.0", + "metro": "0.83.3", + "metro-cache": "0.83.3", + "metro-core": "0.83.3", + "metro-runtime": "0.83.3", + "yaml": "^2.6.1" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/metro-core": { + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.83.3.tgz", + "integrity": "sha512-M+X59lm7oBmJZamc96usuF1kusd5YimqG/q97g4Ac7slnJ3YiGglW5CsOlicTR5EWf8MQFxxjDoB6ytTqRe8Hw==", + "license": "MIT", + "dependencies": { + "flow-enums-runtime": "^0.0.6", + "lodash.throttle": "^4.1.1", + "metro-resolver": "0.83.3" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/metro-file-map": { + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.83.3.tgz", + "integrity": "sha512-jg5AcyE0Q9Xbbu/4NAwwZkmQn7doJCKGW0SLeSJmzNB9Z24jBe0AL2PHNMy4eu0JiKtNWHz9IiONGZWq7hjVTA==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "fb-watchman": "^2.0.0", + "flow-enums-runtime": "^0.0.6", + "graceful-fs": "^4.2.4", + "invariant": "^2.2.4", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "nullthrows": "^1.1.1", + "walker": "^1.0.7" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/metro-minify-terser": { + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.83.3.tgz", + "integrity": "sha512-O2BmfWj6FSfzBLrNCXt/rr2VYZdX5i6444QJU0fFoc7Ljg+Q+iqebwE3K0eTvkI6TRjELsXk1cjU+fXwAR4OjQ==", + "license": "MIT", + "dependencies": { + "flow-enums-runtime": "^0.0.6", + "terser": "^5.15.0" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/metro-resolver": { + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.83.3.tgz", + "integrity": "sha512-0js+zwI5flFxb1ktmR///bxHYg7OLpRpWZlBBruYG8OKYxeMP7SV0xQ/o/hUelrEMdK4LJzqVtHAhBm25LVfAQ==", + "license": "MIT", + "dependencies": { + "flow-enums-runtime": "^0.0.6" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/metro-runtime": { + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.83.3.tgz", + "integrity": "sha512-JHCJb9ebr9rfJ+LcssFYA2x1qPYuSD/bbePupIGhpMrsla7RCwC/VL3yJ9cSU+nUhU4c9Ixxy8tBta+JbDeZWw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.25.0", + "flow-enums-runtime": "^0.0.6" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/metro-source-map": { + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.83.3.tgz", + "integrity": "sha512-xkC3qwUBh2psVZgVavo8+r2C9Igkk3DibiOXSAht1aYRRcztEZNFtAMtfSB7sdO2iFMx2Mlyu++cBxz/fhdzQg==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.3", + "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", + "@babel/types": "^7.25.2", + "flow-enums-runtime": "^0.0.6", + "invariant": "^2.2.4", + "metro-symbolicate": "0.83.3", + "nullthrows": "^1.1.1", + "ob1": "0.83.3", + "source-map": "^0.5.6", + "vlq": "^1.0.0" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/metro-symbolicate": { + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.83.3.tgz", + "integrity": "sha512-F/YChgKd6KbFK3eUR5HdUsfBqVsanf5lNTwFd4Ca7uuxnHgBC3kR/Hba/RGkenR3pZaGNp5Bu9ZqqP52Wyhomw==", + "license": "MIT", + "dependencies": { + "flow-enums-runtime": "^0.0.6", + "invariant": "^2.2.4", + "metro-source-map": "0.83.3", + "nullthrows": "^1.1.1", + "source-map": "^0.5.6", + "vlq": "^1.0.0" + }, + "bin": { + "metro-symbolicate": "src/index.js" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/metro-transform-plugins": { + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.83.3.tgz", + "integrity": "sha512-eRGoKJU6jmqOakBMH5kUB7VitEWiNrDzBHpYbkBXW7C5fUGeOd2CyqrosEzbMK5VMiZYyOcNFEphvxk3OXey2A==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.25.2", + "@babel/generator": "^7.25.0", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.3", + "flow-enums-runtime": "^0.0.6", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/metro-transform-worker": { + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.83.3.tgz", + "integrity": "sha512-Ztekew9t/gOIMZX1tvJOgX7KlSLL5kWykl0Iwu2cL2vKMKVALRl1hysyhUw0vjpAvLFx+Kfq9VLjnHIkW32fPA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.25.2", + "@babel/generator": "^7.25.0", + "@babel/parser": "^7.25.3", + "@babel/types": "^7.25.2", + "flow-enums-runtime": "^0.0.6", + "metro": "0.83.3", + "metro-babel-transformer": "0.83.3", + "metro-cache": "0.83.3", + "metro-cache-key": "0.83.3", + "metro-minify-terser": "0.83.3", + "metro-source-map": "0.83.3", + "metro-transform-plugins": "0.83.3", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/metro/node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "license": "MIT" + }, + "node_modules/metro/node_modules/hermes-estree": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", + "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", + "license": "MIT" + }, + "node_modules/metro/node_modules/hermes-parser": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", + "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", + "license": "MIT", + "dependencies": { + "hermes-estree": "0.32.0" + } + }, + "node_modules/metro/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "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/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/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/nested-error-stacks": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.0.1.tgz", + "integrity": "sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A==", + "license": "MIT" + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "deprecated": "Use your platform's native DOMException instead", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "license": "MIT", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/node-forge": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.3.tgz", + "integrity": "sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg==", + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-package-arg": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz", + "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", + "license": "ISC", + "dependencies": { + "hosted-git-info": "^7.0.0", + "proc-log": "^4.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm-package-arg/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/nullthrows": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", + "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", + "license": "MIT" + }, + "node_modules/nwsapi": { + "version": "2.2.23", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.23.tgz", + "integrity": "sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/ob1": { + "version": "0.83.3", + "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.83.3.tgz", + "integrity": "sha512-egUxXCDwoWG06NGCS5s5AdcpnumHKJlfd3HH06P3m9TEMwwScfcY35wpQxbm9oHof+dM/lVH9Rfyu1elTVelSA==", + "license": "MIT", + "dependencies": { + "flow-enums-runtime": "^0.0.6" + }, + "engines": { + "node": ">=20.19.4" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz", + "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", + "license": "MIT", + "dependencies": { + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-spinners": "^2.0.0", + "log-symbols": "^2.2.0", + "strip-ansi": "^5.2.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ora/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ora/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/ora/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, + "node_modules/ora/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/ora/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/ora/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "license": "BlueOak-1.0.0" + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-png": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/parse-png/-/parse-png-2.1.0.tgz", + "integrity": "sha512-Nt/a5SfCLiTnQAjx3fHlqp8hRgTL3z7kTQZzvIMS9uCAepnCyjpdEc6M/sz69WqMBdaDBw9sF1F1UaHROYzGkQ==", + "license": "MIT", + "dependencies": { + "pngjs": "^3.3.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", + "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "11.2.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.5.tgz", + "integrity": "sha512-vFrFJkWtJvJnD5hg+hJvVE8Lh/TcMzKnTgCWmtBipwI5yLX/iX+5UB2tfuyODF5E7k9xEzMdYgGqaSb1c0c5Yw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-3.0.1.tgz", + "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/plist": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", + "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", + "license": "MIT", + "dependencies": { + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + }, + "engines": { + "node": ">=10.4.0" + } + }, + "node_modules/pngjs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", + "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" + }, + "node_modules/posthog-react-native": { + "version": "4.37.1", + "resolved": "https://registry.npmjs.org/posthog-react-native/-/posthog-react-native-4.37.1.tgz", + "integrity": "sha512-EHgAC6XkYPKGSOYJUgv5WSoNNAiU+dZdwZSiREKy04qqBr/a3o5ByMvkb8TeJcCE6A/ZFD4YPsXf+01VGmWfvA==", + "license": "MIT", + "dependencies": { + "@posthog/core": "1.23.2" + }, + "peerDependencies": { + "@react-native-async-storage/async-storage": ">=1.0.0", + "@react-navigation/native": ">= 5.0.0", + "expo-application": ">= 4.0.0", + "expo-device": ">= 4.0.0", + "expo-file-system": ">= 13.0.0", + "expo-localization": ">= 11.0.0", + "posthog-react-native-session-replay": ">= 1.5.0", + "react-native-device-info": ">= 10.0.0", + "react-native-localize": ">= 3.0.0", + "react-native-navigation": ">= 6.0.0", + "react-native-safe-area-context": ">= 4.0.0", + "react-native-svg": ">= 15.0.0" + }, + "peerDependenciesMeta": { + "@react-native-async-storage/async-storage": { + "optional": true + }, + "@react-navigation/native": { + "optional": true + }, + "expo-application": { + "optional": true + }, + "expo-device": { + "optional": true + }, + "expo-file-system": { + "optional": true + }, + "expo-localization": { + "optional": true + }, + "posthog-react-native-session-replay": { + "optional": true + }, + "react-native-device-info": { + "optional": true + }, + "react-native-localize": { + "optional": true + }, + "react-native-navigation": { + "optional": true + }, + "react-native-safe-area-context": { + "optional": true + } + } + }, + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/pretty-format/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" + }, + "node_modules/proc-log": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", + "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "license": "MIT", + "dependencies": { + "asap": "~2.0.6" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/protobufjs": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.4.tgz", + "integrity": "sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/psl": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", + "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "funding": { + "url": "https://github.com/sponsors/lupomontero" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "devOptional": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "node_modules/qrcode-terminal": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.11.0.tgz", + "integrity": "sha512-Uu7ii+FQy4Qf82G4xu7ShHhjhGahEpCWc3x8UavY3CTcWV+ufmmCtwkr7ZKsX42jdL0kr1B5FKUeqJvAn51jzQ==", + "bin": { + "qrcode-terminal": "bin/qrcode-terminal.js" + } + }, + "node_modules/query-string": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.1.3.tgz", + "integrity": "sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==", + "license": "MIT", + "dependencies": { + "decode-uri-component": "^0.2.2", + "filter-obj": "^1.1.0", + "split-on-first": "^1.0.0", + "strict-uri-encode": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/queue": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", + "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", + "license": "MIT", + "dependencies": { + "inherits": "~2.0.3" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "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/react": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", + "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-devtools-core": { + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-6.1.5.tgz", + "integrity": "sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA==", + "license": "MIT", + "dependencies": { + "shell-quote": "^1.6.1", + "ws": "^7" + } + }, + "node_modules/react-devtools-core/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/react-dom": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", + "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.26.0" + }, + "peerDependencies": { + "react": "^19.1.0" + } + }, + "node_modules/react-fast-compare": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", + "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==", + "license": "MIT" + }, + "node_modules/react-freeze": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/react-freeze/-/react-freeze-1.0.4.tgz", + "integrity": "sha512-r4F0Sec0BLxWicc7HEyo2x3/2icUTrRmDjaaRyzzn+7aDyFZliszMDOgLVwSnQnYENOlL1o569Ze2HZefk8clA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": ">=17.0.0" + } + }, + "node_modules/react-is": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.4.tgz", + "integrity": "sha512-W+EWGn2v0ApPKgKKCy/7s7WHXkboGcsrXE+2joLyVxkbyVQfO3MUEaUQDHoSmb8TFFrSKYa9mw64WZHNHSDzYA==", + "license": "MIT" + }, + "node_modules/react-native": { + "version": "0.81.5", + "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.81.5.tgz", + "integrity": "sha512-1w+/oSjEXZjMqsIvmkCRsOc8UBYv163bTWKTI8+1mxztvQPhCRYGTvZ/PL1w16xXHneIj/SLGfxWg2GWN2uexw==", + "license": "MIT", + "dependencies": { + "@jest/create-cache-key-function": "^29.7.0", + "@react-native/assets-registry": "0.81.5", + "@react-native/codegen": "0.81.5", + "@react-native/community-cli-plugin": "0.81.5", + "@react-native/gradle-plugin": "0.81.5", + "@react-native/js-polyfills": "0.81.5", + "@react-native/normalize-colors": "0.81.5", + "@react-native/virtualized-lists": "0.81.5", + "abort-controller": "^3.0.0", + "anser": "^1.4.9", + "ansi-regex": "^5.0.0", + "babel-jest": "^29.7.0", + "babel-plugin-syntax-hermes-parser": "0.29.1", + "base64-js": "^1.5.1", + "commander": "^12.0.0", + "flow-enums-runtime": "^0.0.6", + "glob": "^7.1.1", + "invariant": "^2.2.4", + "jest-environment-node": "^29.7.0", + "memoize-one": "^5.0.0", + "metro-runtime": "^0.83.1", + "metro-source-map": "^0.83.1", + "nullthrows": "^1.1.1", + "pretty-format": "^29.7.0", + "promise": "^8.3.0", + "react-devtools-core": "^6.1.5", + "react-refresh": "^0.14.0", + "regenerator-runtime": "^0.13.2", + "scheduler": "0.26.0", + "semver": "^7.1.3", + "stacktrace-parser": "^0.1.10", + "whatwg-fetch": "^3.0.0", + "ws": "^6.2.3", + "yargs": "^17.6.2" + }, + "bin": { + "react-native": "cli.js" + }, + "engines": { + "node": ">= 20.19.4" + }, + "peerDependencies": { + "@types/react": "^19.1.0", + "react": "^19.1.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-native-gesture-handler": { + "version": "2.28.0", + "resolved": "https://registry.npmjs.org/react-native-gesture-handler/-/react-native-gesture-handler-2.28.0.tgz", + "integrity": "sha512-0msfJ1vRxXKVgTgvL+1ZOoYw3/0z1R+Ked0+udoJhyplC2jbVKIJ8Z1bzWdpQRCV3QcQ87Op0zJVE5DhKK2A0A==", + "license": "MIT", + "dependencies": { + "@egjs/hammerjs": "^2.0.17", + "hoist-non-react-statics": "^3.3.0", + "invariant": "^2.2.4" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "node_modules/react-native-is-edge-to-edge": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/react-native-is-edge-to-edge/-/react-native-is-edge-to-edge-1.2.1.tgz", + "integrity": "sha512-FLbPWl/MyYQWz+KwqOZsSyj2JmLKglHatd3xLZWskXOpRaio4LfEDEz8E/A6uD8QoTHW6Aobw1jbEwK7KMgR7Q==", + "license": "MIT", + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "node_modules/react-native-purchases": { + "version": "9.10.5", + "resolved": "https://registry.npmjs.org/react-native-purchases/-/react-native-purchases-9.10.5.tgz", + "integrity": "sha512-ofs33aTgdjyjUDZgCtCKYfvl4gBtJrOV77/SXyDzSxTttNjg+8BWGckF3ALfBg69uU65xrXsqfyU3U+Cl86IdQ==", + "license": "MIT", + "workspaces": [ + "examples/purchaseTesterTypescript", + "react-native-purchases-ui" + ], + "dependencies": { + "@revenuecat/purchases-js-hybrid-mappings": "17.41.1", + "@revenuecat/purchases-typescript-internal": "17.41.1" + }, + "peerDependencies": { + "react": ">= 16.6.3", + "react-native": ">= 0.73.0", + "react-native-web": "*" + }, + "peerDependenciesMeta": { + "react-native-web": { + "optional": true + } + } + }, + "node_modules/react-native-purchases-ui": { + "version": "9.10.5", + "resolved": "https://registry.npmjs.org/react-native-purchases-ui/-/react-native-purchases-ui-9.10.5.tgz", + "integrity": "sha512-vull2ssjJSfCNQ0zM/KanZXm4RIJB4KfzbAvE2O93dRK/T6yK8ggi403NQcTyM9B6oLI9NPEKBR+sMk5koT/ew==", + "license": "MIT", + "dependencies": { + "@revenuecat/purchases-typescript-internal": "17.41.1" + }, + "peerDependencies": { + "react": "*", + "react-native": ">= 0.73.0", + "react-native-purchases": "9.10.5", + "react-native-web": "*" + }, + "peerDependenciesMeta": { + "react-native-web": { + "optional": true + } + } + }, + "node_modules/react-native-reanimated": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-4.1.6.tgz", + "integrity": "sha512-F+ZJBYiok/6Jzp1re75F/9aLzkgoQCOh4yxrnwATa8392RvM3kx+fiXXFvwcgE59v48lMwd9q0nzF1oJLXpfxQ==", + "license": "MIT", + "dependencies": { + "react-native-is-edge-to-edge": "^1.2.1", + "semver": "7.7.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0", + "react": "*", + "react-native": "*", + "react-native-worklets": ">=0.5.0" + } + }, + "node_modules/react-native-reanimated/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/react-native-safe-area-context": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-5.6.2.tgz", + "integrity": "sha512-4XGqMNj5qjUTYywJqpdWZ9IG8jgkS3h06sfVjfw5yZQZfWnRFXczi0GnYyFyCc2EBps/qFmoCH8fez//WumdVg==", + "license": "MIT", + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "node_modules/react-native-screens": { + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/react-native-screens/-/react-native-screens-4.16.0.tgz", + "integrity": "sha512-yIAyh7F/9uWkOzCi1/2FqvNvK6Wb9Y1+Kzn16SuGfN9YFJDTbwlzGRvePCNTOX0recpLQF3kc2FmvMUhyTCH1Q==", + "license": "MIT", + "dependencies": { + "react-freeze": "^1.0.0", + "react-native-is-edge-to-edge": "^1.2.1", + "warn-once": "^0.1.0" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "node_modules/react-native-svg": { + "version": "15.12.1", + "resolved": "https://registry.npmjs.org/react-native-svg/-/react-native-svg-15.12.1.tgz", + "integrity": "sha512-vCuZJDf8a5aNC2dlMovEv4Z0jjEUET53lm/iILFnFewa15b4atjVxU6Wirm6O9y6dEsdjDZVD7Q3QM4T1wlI8g==", + "license": "MIT", + "dependencies": { + "css-select": "^5.1.0", + "css-tree": "^1.1.3", + "warn-once": "0.1.1" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "node_modules/react-native-web": { + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/react-native-web/-/react-native-web-0.21.2.tgz", + "integrity": "sha512-SO2t9/17zM4iEnFvlu2DA9jqNbzNhoUP+AItkoCOyFmDMOhUnBBznBDCYN92fGdfAkfQlWzPoez6+zLxFNsZEg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.6", + "@react-native/normalize-colors": "^0.74.1", + "fbjs": "^3.0.4", + "inline-style-prefixer": "^7.0.1", + "memoize-one": "^6.0.0", + "nullthrows": "^1.1.1", + "postcss-value-parser": "^4.2.0", + "styleq": "^0.1.3" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-native-web/node_modules/@react-native/normalize-colors": { + "version": "0.74.89", + "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.74.89.tgz", + "integrity": "sha512-qoMMXddVKVhZ8PA1AbUCk83trpd6N+1nF2A6k1i6LsQObyS92fELuk8kU/lQs6M7BsMHwqyLCpQJ1uFgNvIQXg==", + "license": "MIT" + }, + "node_modules/react-native-web/node_modules/memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", + "license": "MIT" + }, + "node_modules/react-native-worklets": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/react-native-worklets/-/react-native-worklets-0.5.1.tgz", + "integrity": "sha512-lJG6Uk9YuojjEX/tQrCbcbmpdLCSFxDK1rJlkDhgqkVi1KZzG7cdcBFQRqyNOOzR9Y0CXNuldmtWTGOyM0k0+w==", + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-arrow-functions": "^7.0.0-0", + "@babel/plugin-transform-class-properties": "^7.0.0-0", + "@babel/plugin-transform-classes": "^7.0.0-0", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.0.0-0", + "@babel/plugin-transform-optional-chaining": "^7.0.0-0", + "@babel/plugin-transform-shorthand-properties": "^7.0.0-0", + "@babel/plugin-transform-template-literals": "^7.0.0-0", + "@babel/plugin-transform-unicode-regex": "^7.0.0-0", + "@babel/preset-typescript": "^7.16.7", + "convert-source-map": "^2.0.0", + "semver": "7.7.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0", + "react": "*", + "react-native": "*" + } + }, + "node_modules/react-native-worklets/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/react-native/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", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/react-native/node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/react-native/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", + "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/react-native/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/react-native/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/react-native/node_modules/ws": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", + "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", + "license": "MIT", + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "node_modules/react-refresh": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", + "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-remove-scroll": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz", + "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.7", + "react-style-singleton": "^2.2.3", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.3" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", + "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", + "license": "MIT", + "dependencies": { + "react-style-singleton": "^2.2.2", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", + "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", + "license": "MIT", + "dependencies": { + "get-nonce": "^1.0.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-test-renderer": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-19.1.0.tgz", + "integrity": "sha512-jXkSl3CpvPYEF+p/eGDLB4sPoDX8pKkYvRl9+rR8HxLY0X04vW7hCm1/0zHoUSjPZ3bDa+wXWNTDVIw/R8aDVw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "react-is": "^19.1.0", + "scheduler": "^0.26.0" + }, + "peerDependencies": { + "react": "^19.1.0" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", + "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "license": "MIT" + }, + "node_modules/regexpu-core": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", + "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.2", + "regjsgen": "^0.8.0", + "regjsparser": "^0.13.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.2.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz", + "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.1.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requireg": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/requireg/-/requireg-0.2.2.tgz", + "integrity": "sha512-nYzyjnFcPNGR3lx9lwPPPnuQxv6JWEZd2Ci0u9opN7N5zUEPIhY/GbL3vMGOr2UXwEg9WwSyV9X9Y/kLFgPsOg==", + "dependencies": { + "nested-error-stacks": "~2.0.1", + "rc": "~1.2.7", + "resolve": "~1.7.1" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/requireg/node_modules/resolve": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", + "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", + "license": "MIT", + "dependencies": { + "path-parse": "^1.0.5" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-global": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", + "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", + "license": "MIT", + "dependencies": { + "global-dirs": "^0.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-workspace-root": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/resolve-workspace-root/-/resolve-workspace-root-2.0.1.tgz", + "integrity": "sha512-nR23LHAvaI6aHtMg6RWoaHpdR4D881Nydkzi2CixINyg9T00KgaJdJI6Vwty+Ps8WLxZHuxsS0BseWjxSA4C+w==", + "license": "MIT" + }, + "node_modules/resolve.exports": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", + "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", + "license": "MIT", + "dependencies": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + }, + "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", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/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", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/rimraf/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", + "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/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/rtl-detect": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/rtl-detect/-/rtl-detect-1.1.2.tgz", + "integrity": "sha512-PGMBq03+TTG/p/cRB7HCLKJ1MgDIi07+QU1faSjiYRfmY5UsAttV9Hs08jDAHVwcOwmVLcSJkpwyfXszVjWfIQ==", + "license": "BSD-3-Clause" + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "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/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/sax": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.4.tgz", + "integrity": "sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/scheduler": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", + "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/send": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.4.1", + "range-parser": "~1.2.1", + "statuses": "~2.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/send/node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serialize-error": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", + "integrity": "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/serve-static": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "~0.19.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-static/node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/server-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/server-only/-/server-only-0.0.1.tgz", + "integrity": "sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==", + "license": "MIT" + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "license": "MIT" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/sf-symbols-typescript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/sf-symbols-typescript/-/sf-symbols-typescript-2.2.0.tgz", + "integrity": "sha512-TPbeg0b7ylrswdGCji8FRGFAKuqbpQlLbL8SOle3j1iHSs5Ob5mhvMAxWN2UItOjgALAB5Zp3fmMfj8mbWvXKw==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "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" + }, + "node_modules/simple-plist": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.3.1.tgz", + "integrity": "sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==", + "license": "MIT", + "dependencies": { + "bplist-creator": "0.1.0", + "bplist-parser": "0.3.1", + "plist": "^3.0.5" + } + }, + "node_modules/simple-plist/node_modules/bplist-parser": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.1.tgz", + "integrity": "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==", + "license": "MIT", + "dependencies": { + "big-integer": "1.6.x" + }, + "engines": { + "node": ">= 5.10.0" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.4.tgz", + "integrity": "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "license": "MIT" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/slugify": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz", + "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-on-first": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", + "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" + }, + "node_modules/stack-generator": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/stack-generator/-/stack-generator-2.0.10.tgz", + "integrity": "sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "stackframe": "^1.3.4" + } + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/stackframe": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", + "license": "MIT" + }, + "node_modules/stacktrace-gps": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/stacktrace-gps/-/stacktrace-gps-3.1.2.tgz", + "integrity": "sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "source-map": "0.5.6", + "stackframe": "^1.3.4" + } + }, + "node_modules/stacktrace-gps/node_modules/source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stacktrace-js": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stacktrace-js/-/stacktrace-js-2.0.2.tgz", + "integrity": "sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "error-stack-parser": "^2.0.6", + "stack-generator": "^2.0.5", + "stacktrace-gps": "^3.0.4" + } + }, + "node_modules/stacktrace-parser": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.11.tgz", + "integrity": "sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.7.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/stream-buffers": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", + "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==", + "license": "Unlicense", + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/strict-uri-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", + "integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-length/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==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "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", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/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", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/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", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "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", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, + "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/structured-headers": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/structured-headers/-/structured-headers-0.4.1.tgz", + "integrity": "sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg==", + "license": "MIT" + }, + "node_modules/styleq": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/styleq/-/styleq-0.1.3.tgz", + "integrity": "sha512-3ZUifmCDCQanjeej1f6kyl/BeP/Vae5EYkQ9iJfUm/QwZvlgnZzyflqAsAWYURdtea8Vkvswu2GrC57h3qffcA==", + "license": "MIT" + }, + "node_modules/sucrase": { + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", + "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "tinyglobby": "^0.2.11", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tar": { + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.7.tgz", + "integrity": "sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terser": { + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.0.tgz", + "integrity": "sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg==", + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "license": "MIT" + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/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", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/test-exclude/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", + "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/test-exclude/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/throat": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "license": "BSD-3-Clause" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "license": "Apache-2.0" + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", + "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ua-parser-js": { + "version": "1.0.41", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.41.tgz", + "integrity": "sha512-LbBDqdIC5s8iROCUjMbW1f5dJQTEFB1+KO9ogbvlb3nm9n4YHa5p4KTvFPWvh2Hs8gZMBuiB1/8+pdfe/tDPug==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + } + ], + "license": "MIT", + "bin": { + "ua-parser-js": "script/cli.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/undici": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.23.0.tgz", + "integrity": "sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g==", + "license": "MIT", + "engines": { + "node": ">=18.17" + } + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "license": "MIT" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", + "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", + "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "license": "MIT", + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/use-callback-ref": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", + "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-latest-callback": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/use-latest-callback/-/use-latest-callback-0.2.6.tgz", + "integrity": "sha512-FvRG9i1HSo0wagmX63Vrm8SnlUU3LMM3WyZkQ76RnslpBrX694AdG4A0zQBx2B3ZifFA0yv/BaEHGBnEax5rZg==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/use-sidecar": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", + "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", + "license": "MIT", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", + "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "devOptional": true, + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/validate-npm-package-name": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", + "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vaul": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vaul/-/vaul-1.1.2.tgz", + "integrity": "sha512-ZFkClGpWyI2WUQjdLJ/BaGuV6AVQiJ3uELGk3OYtP+B6yCO7Cmn9vPFXVJkRaGkOJu3m8bQMgtyzNHixULceQA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-dialog": "^1.1.1" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc" + } + }, + "node_modules/vlq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", + "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==", + "license": "MIT" + }, + "node_modules/w3c-xmlserializer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", + "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/warn-once": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/warn-once/-/warn-once-0.1.1.tgz", + "integrity": "sha512-VkQZJbO8zVImzYFteBXvBOZEl1qL175WH8VmZcxF2fZAoudNhNDvHi+doCaAEdU2l2vtcIwa2zn0QK5+I1HQ3Q==", + "license": "MIT" + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "license": "MIT", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-fetch": { + "version": "3.6.20", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", + "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", + "license": "MIT" + }, + "node_modules/whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url-without-unicode": { + "version": "8.0.0-3", + "resolved": "https://registry.npmjs.org/whatwg-url-without-unicode/-/whatwg-url-without-unicode-8.0.0-3.tgz", + "integrity": "sha512-HoKuzZrUlgpz35YO27XgD28uh/WJH4B0+3ttFqRo//lmq+9T/mIOJ6kqmINI9HpUpz1imRC/nR/lxKpJiv0uig==", + "license": "MIT", + "dependencies": { + "buffer": "^5.4.3", + "punycode": "^2.1.1", + "webidl-conversions": "^5.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/whatwg-url/node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "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", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.20", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", + "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wonka": { + "version": "6.3.5", + "resolved": "https://registry.npmjs.org/wonka/-/wonka-6.3.5.tgz", + "integrity": "sha512-SSil+ecw6B4/Dm7Pf2sAshKQ5hWFvfyGlfPbEd6A14dOH6VDjrmbY86u6nZvy9omGwwIPFR8V41+of1EezgoUw==", + "license": "MIT" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/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", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/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", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/ws": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", + "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xcode": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/xcode/-/xcode-3.0.1.tgz", + "integrity": "sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA==", + "license": "Apache-2.0", + "dependencies": { + "simple-plist": "^1.1.0", + "uuid": "^7.0.3" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12" + } + }, + "node_modules/xml2js": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.0.tgz", + "integrity": "sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==", + "license": "MIT", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xml2js/node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", + "license": "MIT", + "engines": { + "node": ">=8.0" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true, + "license": "MIT" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", + "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json index 91b4a4e..78bc8a4 100644 --- a/package.json +++ b/package.json @@ -1,79 +1,79 @@ -{ - "name": "greenlens", - "version": "2.1.4", - "main": "expo-router/entry", - "private": true, - "scripts": { - "start": "expo start --offline", - "android": "expo start --android --offline", - "ios": "expo start --ios --offline", - "web": "expo start --web --offline", - "build:dev": "eas build --profile development --platform android", - "build:preview": "eas build --profile preview --platform android", - "build:prod": "eas build --profile production --platform android", - "test": "jest", - "audit:semantic": "node scripts/generate_semantic_audit.js" - }, - "jest": { - "preset": "jest-expo", - "transformIgnorePatterns": [ - "node_modules/(?!((jest-)?react-native|@react-native(-community)?)|expo(nent)?|@expo(nent)?/.*|@expo-google-fonts/.*|react-navigation|@react-navigation/.*|@sentry/react-native|native-base|react-native-svg)" - ], - "setupFiles": [ - "./jest.setup.js" - ] - }, - "dependencies": { - "@expo/vector-icons": "^15.0.3", - "@google/genai": "^1.38.0", - "@react-native-async-storage/async-storage": "2.2.0", - "expo": "^54.0.33", - "expo-application": "~7.0.8", - "expo-asset": "~12.0.12", - "expo-av": "^16.0.8", - "expo-blur": "~15.0.8", - "expo-build-properties": "^55.0.9", - "expo-camera": "~17.0.10", - "expo-constants": "~18.0.13", - "expo-dev-client": "~6.0.20", - "expo-device": "~8.0.10", - "expo-file-system": "~19.0.21", - "expo-font": "~14.0.11", - "expo-haptics": "~15.0.8", - "expo-image-manipulator": "~14.0.8", - "expo-image-picker": "~17.0.10", - "expo-linking": "~8.0.11", - "expo-localization": "~17.0.8", - "expo-notifications": "~0.32.16", - "expo-router": "~6.0.23", - "expo-secure-store": "~15.0.8", - "expo-splash-screen": "~31.0.13", - "expo-sqlite": "~16.0.10", - "expo-status-bar": "~3.0.9", - "expo-updates": "~29.0.16", - "expo-video": "~3.0.16", - "posthog-react-native": "^4.37.1", - "react": "19.1.0", - "react-dom": "19.1.0", - "react-native": "0.81.5", - "react-native-gesture-handler": "~2.28.0", - "react-native-purchases": "^9.10.5", - "react-native-purchases-ui": "^9.10.5", - "react-native-reanimated": "~4.1.1", - "react-native-safe-area-context": "~5.6.0", - "react-native-screens": "~4.16.0", - "react-native-svg": "^15.12.1", - "react-native-web": "^0.21.2", - "react-native-worklets": "0.5.1" - }, - "devDependencies": { - "@babel/core": "^7.25.0", - "@testing-library/jest-native": "^5.4.3", - "@testing-library/react-native": "^13.3.3", - "@types/jest": "^29.5.14", - "@types/react": "~19.1.0", - "jest": "^29.7.0", - "jest-expo": "^54.0.17", - "typescript": "^5.3.0" - } -} +{ + "name": "greenlens", + "version": "2.1.4", + "main": "expo-router/entry", + "private": true, + "scripts": { + "start": "expo start --offline", + "android": "expo start --android --offline", + "ios": "expo start --ios --offline", + "web": "expo start --web --offline", + "build:dev": "eas build --profile development --platform android", + "build:preview": "eas build --profile preview --platform android", + "build:prod": "eas build --profile production --platform android", + "test": "jest", + "audit:semantic": "node scripts/generate_semantic_audit.js" + }, + "jest": { + "preset": "jest-expo", + "transformIgnorePatterns": [ + "node_modules/(?!((jest-)?react-native|@react-native(-community)?)|expo(nent)?|@expo(nent)?/.*|@expo-google-fonts/.*|react-navigation|@react-navigation/.*|@sentry/react-native|native-base|react-native-svg)" + ], + "setupFiles": [ + "./jest.setup.js" + ] + }, + "dependencies": { + "@expo/vector-icons": "^15.0.3", + "@google/genai": "^1.38.0", + "@react-native-async-storage/async-storage": "2.2.0", + "expo": "^54.0.33", + "expo-application": "~7.0.8", + "expo-asset": "~12.0.12", + "expo-av": "^16.0.8", + "expo-blur": "~15.0.8", + "expo-build-properties": "^55.0.9", + "expo-camera": "~17.0.10", + "expo-constants": "~18.0.13", + "expo-dev-client": "~6.0.20", + "expo-device": "~8.0.10", + "expo-file-system": "~19.0.21", + "expo-font": "~14.0.11", + "expo-haptics": "~15.0.8", + "expo-image-manipulator": "~14.0.8", + "expo-image-picker": "~17.0.10", + "expo-linking": "~8.0.11", + "expo-localization": "~17.0.8", + "expo-notifications": "~0.32.16", + "expo-router": "~6.0.23", + "expo-secure-store": "~15.0.8", + "expo-splash-screen": "~31.0.13", + "expo-sqlite": "~16.0.10", + "expo-status-bar": "~3.0.9", + "expo-updates": "~29.0.16", + "expo-video": "~3.0.16", + "posthog-react-native": "^4.37.1", + "react": "19.1.0", + "react-dom": "19.1.0", + "react-native": "0.81.5", + "react-native-gesture-handler": "~2.28.0", + "react-native-purchases": "^9.10.5", + "react-native-purchases-ui": "^9.10.5", + "react-native-reanimated": "~4.1.1", + "react-native-safe-area-context": "~5.6.0", + "react-native-screens": "~4.16.0", + "react-native-svg": "^15.12.1", + "react-native-web": "^0.21.2", + "react-native-worklets": "0.5.1" + }, + "devDependencies": { + "@babel/core": "^7.25.0", + "@testing-library/jest-native": "^5.4.3", + "@testing-library/react-native": "^13.3.3", + "@types/jest": "^29.5.14", + "@types/react": "~19.1.0", + "jest": "^29.7.0", + "jest-expo": "^54.0.17", + "typescript": "^5.3.0" + } +} diff --git a/plants_dump_utf8.json b/plants_dump_utf8.json index 6817391..843ffdd 100644 --- a/plants_dump_utf8.json +++ b/plants_dump_utf8.json @@ -1,4444 +1,4444 @@ -[ - { - "id": "plant_8bfe537a28c86289", - "name": "Aasblume", - "botanicalName": "Stapelia grandiflora", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/2c/Stapelia_grandiflora_flowers.jpg/330px-Stapelia_grandiflora_flowers.jpg", - "imageStatus": "ok", - "description": "Die Aasblume hat fleischige, gruene Staengel und riesige, sternfoermige Blueten mit aasartigem Duft.", - "categories": [ - "succulent", - "flowering", - "sun" - ], - "careInfo": { - "waterIntervalDays": 14, - "light": "Helles bis volles Licht", - "temp": "18-30 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_3e0a9ac0f2e3487e", - "name": "Adromischus", - "botanicalName": "Adromischus cristatus", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/14/Adromischus_cristatus.jpg/330px-Adromischus_cristatus.jpg", - "imageStatus": "ok", - "description": "Adromischus ist eine kompakte Sukkulente mit ungewoehnlich wellenrandigen Blaettern auf kurzen Staengeln.", - "categories": [ - "easy", - "succulent", - "sun" - ], - "careInfo": { - "waterIntervalDays": 14, - "light": "Helles bis volles Licht", - "temp": "15-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_b149587ebd02e88b", - "name": "Afrikanisches Veilchen", - "botanicalName": "Saintpaulia ionantha", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/73/African_violet_Saintpaulia_ionantha.jpg/330px-African_violet_Saintpaulia_ionantha.jpg", - "imageStatus": "ok", - "description": "Das Afrikanische Veilchen ist eine kleine, kompakte Bluehpflanze mit samtigen Blaettern und violetten Blueten.", - "categories": [ - "easy", - "flowering", - "low_light" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles indirektes Licht", - "temp": "18-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_163ec12a26b24198", - "name": "Agave", - "botanicalName": "Agave americana", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/58/Agave_americana_%28detail%29.jpg/330px-Agave_americana_%28detail%29.jpg", - "imageStatus": "ok", - "description": "Die Agave ist eine imposante Sukkulente mit steifen, blaugruenen Blaettern mit Stacheln. Sie bluet nur einmal.", - "categories": [ - "succulent", - "sun", - "large" - ], - "careInfo": { - "waterIntervalDays": 21, - "light": "Volles Sonnenlicht", - "temp": "10-35 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_f35722f0d85fcbf0", - "name": "Aglaoneme", - "botanicalName": "Aglaonema commutatum", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/13/Aglaonema_commutatum.jpg/330px-Aglaonema_commutatum.jpg", - "imageStatus": "ok", - "description": "Die Aglaoneme ist eine dekorative Zimmerpflanze mit silbrig-gruen gemusterten Blaettern. Tolerant gegenueber wenig Licht.", - "categories": [ - "easy", - "low_light", - "patterned" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Wenig bis helles Licht", - "temp": "15-26 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_929f7f7041e0b030", - "name": "Aloe Vera", - "botanicalName": "Aloe vera", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/05/Aloe_Vera_houseplant.jpg/330px-Aloe_Vera_houseplant.jpg", - "imageStatus": "ok", - "description": "Aloe Vera ist eine beliebte Heilpflanze. Das Gel wird fuer Haut- und Wundpflege verwendet.", - "categories": [ - "easy", - "succulent", - "medicinal", - "sun" - ], - "careInfo": { - "waterIntervalDays": 14, - "light": "Volles Sonnenlicht", - "temp": "18-24 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_521cc31a3ab2a5b1", - "name": "Alpenveilchen", - "botanicalName": "Cyclamen persicum", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/84/Cyclamen_persicum.jpg/330px-Cyclamen_persicum.jpg", - "imageStatus": "ok", - "description": "Das Alpenveilchen bluet im Herbst und Winter mit eleganten Blueten in Rosa, Rot oder Weiss.", - "categories": [ - "flowering" - ], - "careInfo": { - "waterIntervalDays": 5, - "light": "Helles indirektes Licht", - "temp": "12-18 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_c623dbd931826123", - "name": "Amazona-Taro", - "botanicalName": "Alocasia amazonica", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/7e/Alocasia_%27Polly%27_or_Amazon_Taro.jpg/330px-Alocasia_%27Polly%27_or_Amazon_Taro.jpg", - "imageStatus": "ok", - "description": "Der Amazona-Taro besticht mit dunkelgruenen, pfeilfoermigen Blaettern mit markant weissen Rippen.", - "categories": [ - "patterned", - "high_humidity", - "large" - ], - "careInfo": { - "waterIntervalDays": 5, - "light": "Indirektes Licht", - "temp": "18-27 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_c2890f36d8fc9da0", - "name": "Arnika", - "botanicalName": "Arnica montana", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/eb/Arnica_montana_full.jpg/330px-Arnica_montana_full.jpg", - "imageStatus": "ok", - "description": "Arnika ist eine bekannte Heilpflanze aus den Alpen mit goldgelben Korbbluten. Sie wird fuer Muskeln und Gelenke verwendet.", - "categories": [ - "medicinal", - "flowering", - "sun" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Volles Sonnenlicht", - "temp": "10-20 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_fdadaf062de2c567", - "name": "Aubergine", - "botanicalName": "Solanum melongena", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/55/Aubergine.jpg/330px-Aubergine.jpg", - "imageStatus": "ok", - "description": "Die Aubergine ist eine Gemuese┬¡pflanze mit grossen, violetten Fruechten. Sie benoetigt viel Waerme und Sonne.", - "categories": [ - "sun", - "bright_light" - ], - "careInfo": { - "waterIntervalDays": 5, - "light": "Volles Sonnenlicht", - "temp": "20-30 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_480619fefb890692", - "name": "Baldrian", - "botanicalName": "Valeriana officinalis", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/8a/Valeriana_officinalis_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-105.jpg/330px-Valeriana_officinalis_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-105.jpg", - "imageStatus": "ok", - "description": "Baldrian ist ein bekanntes Heilkraut mit weissen bis roeslichen Blueten. Die Wurzeln werden zur Schlaffoerderung verwendet.", - "categories": [ - "medicinal", - "flowering" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles bis volles Licht", - "temp": "15-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_b73b967c062264fa", - "name": "Bambusrohr", - "botanicalName": "Bambusa vulgaris", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/47/BambusaVulgarisStriata.jpg/330px-BambusaVulgarisStriata.jpg", - "imageStatus": "ok", - "description": "Das Bambusrohr ist eine schnell wachsende Bambusart mit gelbgruenen Halmen. Sehr dekorativ und vielseitig nutzbar.", - "categories": [ - "easy", - "large" - ], - "careInfo": { - "waterIntervalDays": 5, - "light": "Helles bis volles Licht", - "temp": "15-30 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_1b52f8bc38189420", - "name": "Bananenpflanze", - "botanicalName": "Musa acuminata", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/be/Musa_acuminata_1_%28Luc_Viatour%29.jpg/330px-Musa_acuminata_1_%28Luc_Viatour%29.jpg", - "imageStatus": "ok", - "description": "Die Bananenpflanze ist eine tropische Staude mit riesigen, glaenzenden Blaettern. Im Zimmer selten fruechttragend.", - "categories": [ - "large", - "high_humidity" - ], - "careInfo": { - "waterIntervalDays": 5, - "light": "Helles bis volles Licht", - "temp": "20-30 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_65672e0cb49ca62d", - "name": "Basilikum", - "botanicalName": "Ocimum basilicum", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/90/Basil-Basilico-Ocimum_basilicum-albahaca.jpg/330px-Basil-Basilico-Ocimum_basilicum-albahaca.jpg", - "imageStatus": "ok", - "description": "Basilikum ist das beliebteste Kuechenkraut mit intensiv aromatischen, gruenen Blaettern. Fuer Pesto verwendet.", - "categories": [ - "easy", - "medicinal", - "sun" - ], - "careInfo": { - "waterIntervalDays": 2, - "light": "Volles Sonnenlicht", - "temp": "18-30 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_11f9d18d047193e4", - "name": "Bergpalme", - "botanicalName": "Chamaedorea elegans", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/8e/Chamaedorea_elegans2.jpg/330px-Chamaedorea_elegans2.jpg", - "imageStatus": "ok", - "description": "Die Bergpalme ist eine kompakte Zimmerpalme fuer schattigere Standorte. Ideal fuer dunkle Innenraeume.", - "categories": [ - "easy", - "low_light", - "tree", - "air_purifier" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Wenig bis helles Licht", - "temp": "15-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_519742b7ea9df158", - "name": "Billbergia", - "botanicalName": "Billbergia nutans", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e8/Billbergia_nutans.jpg/330px-Billbergia_nutans.jpg", - "imageStatus": "ok", - "description": "Die Billbergia ist eine robuste Bromelie mit schmalen, gruenen Blaettern und h├ñngenden, blauen und gruenen Blueten.", - "categories": [ - "easy", - "flowering" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles indirektes Licht", - "temp": "15-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_2347cc2289a2ef8b", - "name": "Birkenfeige", - "botanicalName": "Ficus benjamina", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/25/Ficus_benjamina.jpg/330px-Ficus_benjamina.jpg", - "imageStatus": "ok", - "description": "Die Birkenfeige ist ein eleganter Zimmerstrauch mit haengenden Aesten und kleinen, glaenzenden Blaettern.", - "categories": [ - "tree", - "air_purifier" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles indirektes Licht", - "temp": "16-24 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_4be713bff78ae299", - "name": "Blauer Kreuzkraut", - "botanicalName": "Senecio serpens", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/45/Blue_chalk_sticks_%28Senecio_serpens%29.jpg/330px-Blue_chalk_sticks_%28Senecio_serpens%29.jpg", - "imageStatus": "ok", - "description": "Der Blaue Kreuzkraut hat zylindrische, blaublaugruene Blaetter und einen kriechenden Wuchs. Sehr dekorativ.", - "categories": [ - "easy", - "succulent", - "sun" - ], - "careInfo": { - "waterIntervalDays": 14, - "light": "Helles bis volles Licht", - "temp": "15-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_51da778adc3d568f", - "name": "Blaues Kanaelfarn", - "botanicalName": "Phlebodium aureum", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e1/Phlebodium_aureum_1.jpg/330px-Phlebodium_aureum_1.jpg", - "imageStatus": "ok", - "description": "Der Blaue Kanaelfarn hat wachsartige, blaugruene Wedel und glaenzende Wurzelstaemme. Sehr dekorativ.", - "categories": [ - "high_humidity", - "air_purifier" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles indirektes Licht", - "temp": "18-27 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_f696d8640ac1e58b", - "name": "Bleistiftkaktus", - "botanicalName": "Euphorbia tirucalli", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/59/Euphorbia_tirucalli.jpg/330px-Euphorbia_tirucalli.jpg", - "imageStatus": "ok", - "description": "Der Bleistiftkaktus ist eine sukkulente Wolfsmilch mit duennen, zylindrischen Zweigen ohne Blaetter.", - "categories": [ - "easy", - "succulent", - "sun" - ], - "careInfo": { - "waterIntervalDays": 14, - "light": "Volles Sonnenlicht", - "temp": "18-30 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_fcfdae786a599215", - "name": "Bleiwurz", - "botanicalName": "Plumbago auriculata", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/f3/Plumbago_auriculata.jpg/330px-Plumbago_auriculata.jpg", - "imageStatus": "ok", - "description": "Die Bleiwurz ist ein halbimmergruener Strauch mit himmelblauen Blueten, der fast das ganze Jahr bluet.", - "categories": [ - "flowering", - "sun", - "bright_light" - ], - "careInfo": { - "waterIntervalDays": 5, - "light": "Volles Sonnenlicht", - "temp": "15-27 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_2778ede47b41928b", - "name": "Blumenschilfrohr", - "botanicalName": "Canna indica", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c9/Canna_indica2.jpg/330px-Canna_indica2.jpg", - "imageStatus": "ok", - "description": "Das Blumenschilfrohr hat grosse, tropisch wirkende Blaetter und auffaellige Blueten in Rot, Orange oder Gelb.", - "categories": [ - "flowering", - "sun", - "large" - ], - "careInfo": { - "waterIntervalDays": 5, - "light": "Volles Sonnenlicht", - "temp": "18-28 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_7b30624e5b0b4c89", - "name": "Blutroter Storchschnabel", - "botanicalName": "Geranium sanguineum", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/34/Geranium_sanguineum_R01.jpg/330px-Geranium_sanguineum_R01.jpg", - "imageStatus": "ok", - "description": "Der Blutrote Storchschnabel ist ein zierlicher Storchschnabel mit intensiv magentafarbenen Blueten.", - "categories": [ - "easy", - "flowering" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles bis volles Licht", - "temp": "10-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_766e50dd1b0308ae", - "name": "Bogenhanf", - "botanicalName": "Sansevieria trifasciata", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/fb/Snake_Plant_%28Sansevieria_trifasciata_%27Laurentii%27%29.jpg/330px-Snake_Plant_%28Sansevieria_trifasciata_%27Laurentii%27%29.jpg", - "imageStatus": "ok", - "description": "Der Bogenhanf ist eine pflegeleichte Sukkulente. Reinigt die Luft und vertraegt Vernachlaessigung.", - "categories": [ - "easy", - "low_light", - "air_purifier" - ], - "careInfo": { - "waterIntervalDays": 14, - "light": "Wenig bis helles Licht", - "temp": "15-27 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_c71619cd9a02cef2", - "name": "Bonsai-Feige", - "botanicalName": "Ficus retusa", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b7/Ficus_retusa_bonsai_10.jpg/330px-Ficus_retusa_bonsai_10.jpg", - "imageStatus": "ok", - "description": "Die Bonsai-Feige ist eine klassische Bonsai-Art mit kleinen, elliptischen Blaettern. Sehr formbar.", - "categories": [ - "easy", - "tree" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles indirektes Licht", - "temp": "16-24 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_a65e5c9dedb9cd6f", - "name": "Bougainvillea", - "botanicalName": "Bougainvillea spectabilis", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e4/Bougainvillea_spectabilis_Willd.jpg/330px-Bougainvillea_spectabilis_Willd.jpg", - "imageStatus": "ok", - "description": "Die Bougainvillea ist eine rankenreiche Kletterpflanze mit leuchtend farbigen Hochblaettern in Rot, Orange oder Pink.", - "categories": [ - "flowering", - "sun", - "bright_light" - ], - "careInfo": { - "waterIntervalDays": 5, - "light": "Volles Sonnenlicht", - "temp": "18-30 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_34a9a605f91a0e38", - "name": "Brutblatt", - "botanicalName": "Kalanchoe daigremontiana", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/8d/Kalanchoe_daigremontiana.jpg/330px-Kalanchoe_daigremontiana.jpg", - "imageStatus": "ok", - "description": "Das Brutblatt bildet entlang des Blattrandes zahlreiche kleine Jungpflanzen. Eine faszinierende Sukkulente.", - "categories": [ - "easy", - "succulent", - "sun" - ], - "careInfo": { - "waterIntervalDays": 14, - "light": "Helles bis volles Licht", - "temp": "15-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_ca3703f121432723", - "name": "Buntblatt", - "botanicalName": "Caladium bicolor", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/cd/Caladium_bicolor_002.JPG/330px-Caladium_bicolor_002.JPG", - "imageStatus": "ok", - "description": "Das Buntblatt beeindruckt mit transparenten, bunt gemusterten Blaettern in Pink, Rot, Weiss und Gruen.", - "categories": [ - "patterned", - "high_humidity" - ], - "careInfo": { - "waterIntervalDays": 5, - "light": "Indirektes Licht", - "temp": "20-30 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_de32e74f5d2e4f07", - "name": "Calibrachoa", - "botanicalName": "Calibrachoa hybrida", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/0a/Calibrachoa_hybrid_2.jpg/330px-Calibrachoa_hybrid_2.jpg", - "imageStatus": "ok", - "description": "Calibrachoa ist eine petunienaehnliche Haengepflanze mit unzaehligen, kleinen Trichterbluten in allen Farben.", - "categories": [ - "easy", - "flowering", - "hanging", - "sun" - ], - "careInfo": { - "waterIntervalDays": 2, - "light": "Volles Sonnenlicht", - "temp": "15-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_df8b72684a52d16d", - "name": "Calla", - "botanicalName": "Zantedeschia aethiopica", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/1c/Zantedeschia_aethiopica_2.jpg/330px-Zantedeschia_aethiopica_2.jpg", - "imageStatus": "ok", - "description": "Die Calla hat elegante, trichterfoermige weisse Hochblaetter und glaenzende, herzfoermige Blaetter. Sehr edel.", - "categories": [ - "flowering", - "high_humidity" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles indirektes Licht", - "temp": "15-24 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_c1e5518101af0660", - "name": "Callisia", - "botanicalName": "Callisia repens", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/09/Callisia_repens2.jpg/330px-Callisia_repens2.jpg", - "imageStatus": "ok", - "description": "Callisia repens ist ein kleines, kriechendes Kraut mit winzigen, gruenen Blaettern. Ideal fuer haengende Behaelter.", - "categories": [ - "easy", - "hanging", - "pet_friendly" - ], - "careInfo": { - "waterIntervalDays": 5, - "light": "Helles indirektes Licht", - "temp": "15-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_e98319d5942ee47b", - "name": "Cattleya-Orchidee", - "botanicalName": "Cattleya labiata", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/bf/Cattleya_labiata_var_autumnalis.jpg/330px-Cattleya_labiata_var_autumnalis.jpg", - "imageStatus": "ok", - "description": "Die Cattleya ist die Koenigin der Orchideen mit ueppigen, duftenden Blueten in Lila, Rosa und Weiss.", - "categories": [ - "flowering", - "high_humidity" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles indirektes Licht", - "temp": "18-28 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_f5fef1b22db032e8", - "name": "Chili", - "botanicalName": "Capsicum annuum", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/f9/Chili_pepper_red.jpg/330px-Chili_pepper_red.jpg", - "imageStatus": "ok", - "description": "Chili ist eine beliebte Gemuese- und Zierpflanze mit leuchtenden, roten oder orangen Fruechten. Im Topf kultivierbar.", - "categories": [ - "easy", - "sun", - "medicinal" - ], - "careInfo": { - "waterIntervalDays": 4, - "light": "Volles Sonnenlicht", - "temp": "20-30 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_282d1b42588a5121", - "name": "Chinesische F├ñcherpalme", - "botanicalName": "Livistona chinensis", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/81/Livistona_chinensis_1.jpg/330px-Livistona_chinensis_1.jpg", - "imageStatus": "ok", - "description": "Die Chinesische F├ñcherpalme hat grosse, faecher┬¡foermige Blaetter auf einem einzelnen Stamm. Sehr dekorativ.", - "categories": [ - "tree", - "bright_light" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles bis volles Licht", - "temp": "15-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_beef88438a4a5a77", - "name": "Chinesische Rose", - "botanicalName": "Rosa chinensis", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/d4/Rosa_chinensis_at_Dunedin_Botanic_Garden_1.jpg/330px-Rosa_chinensis_at_Dunedin_Botanic_Garden_1.jpg", - "imageStatus": "ok", - "description": "Die Chinesische Rose ist eine der Stammarten vieler Gartenrosen und bluet fast ununterbrochen.", - "categories": [ - "flowering", - "sun" - ], - "careInfo": { - "waterIntervalDays": 5, - "light": "Volles Sonnenlicht", - "temp": "15-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_3062bd4ee2363d81", - "name": "Chinesischer Blauregen", - "botanicalName": "Wisteria sinensis", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/92/Wisteria_sinensis.jpg/330px-Wisteria_sinensis.jpg", - "imageStatus": "ok", - "description": "Der Chinesische Blauregen ist ein ueppiger Kletterkuenstler mit langen, duftenden Bluetentrauben in Lila.", - "categories": [ - "flowering", - "sun", - "large" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Volles Sonnenlicht", - "temp": "10-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_552c1df47769e60a", - "name": "Christusdorn", - "botanicalName": "Euphorbia milii", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/3a/Euphorbia_milii.jpg/330px-Euphorbia_milii.jpg", - "imageStatus": "ok", - "description": "Der Christusdorn ist eine sukkulente Wolfsmilch mit stacheligen Zweigen und kleinen roten oder gelben Hochblaettern.", - "categories": [ - "easy", - "succulent", - "flowering", - "sun" - ], - "careInfo": { - "waterIntervalDays": 10, - "light": "Helles bis volles Licht", - "temp": "15-28 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_d726e9204f2d2353", - "name": "Chrysantheme", - "botanicalName": "Chrysanthemum indicum", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/65/Chrysanthemum_indicum1.jpg/330px-Chrysanthemum_indicum1.jpg", - "imageStatus": "ok", - "description": "Die Chrysantheme ist die klassische Herbstblume mit ueppigen, dichten Blueten in vielen Farben.", - "categories": [ - "flowering" - ], - "careInfo": { - "waterIntervalDays": 4, - "light": "Helles bis volles Licht", - "temp": "12-22 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_79e87c68ecaf5082", - "name": "Columnea", - "botanicalName": "Columnea gloriosa", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/27/Columnea_gloriosa1.jpg/330px-Columnea_gloriosa1.jpg", - "imageStatus": "ok", - "description": "Die Columnea ist eine haengende Zimmerpflanze mit kleinen, behaarten Blaettern und leuchtend roten, roehrenfoermigen Blueten.", - "categories": [ - "flowering", - "hanging", - "high_humidity" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles indirektes Licht", - "temp": "18-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_5136b27d56c24f26", - "name": "Cryptanthus", - "botanicalName": "Cryptanthus bivittatus", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/cd/Cryptanthus_bivittatus.jpg/330px-Cryptanthus_bivittatus.jpg", - "imageStatus": "ok", - "description": "Cryptanthus ist eine niedrig wachsende Bromelie mit sternfoermigen Rosetten und gemusterten Blaettern. Fuer Terrarien.", - "categories": [ - "patterned", - "high_humidity" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles indirektes Licht", - "temp": "18-27 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_177a5dd7d3237533", - "name": "Ctenanthe", - "botanicalName": "Ctenanthe burle-marxii", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/39/Ctenanthe_burle-marxii.jpg/330px-Ctenanthe_burle-marxii.jpg", - "imageStatus": "ok", - "description": "Die Ctenanthe hat faszinierend gemusterte Blaetter mit dunkelgruunem Fischgraetenmuster auf hellgruunem Hintergrund.", - "categories": [ - "patterned", - "high_humidity" - ], - "careInfo": { - "waterIntervalDays": 5, - "light": "Indirektes Licht", - "temp": "18-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_d38f9fdbd2fc0128", - "name": "Dahlie", - "botanicalName": "Dahlia pinnata", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/00/Dahlia_x_hybrida.jpg/330px-Dahlia_x_hybrida.jpg", - "imageStatus": "ok", - "description": "Die Dahlie ist eine prachtvolle Sommerblume mit Blueten in allen Groessen und Formen. Sie wird aus Knollen gezogen.", - "categories": [ - "flowering", - "sun" - ], - "careInfo": { - "waterIntervalDays": 5, - "light": "Volles Sonnenlicht", - "temp": "15-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_0f54f9b5c4726b7c", - "name": "Dendrobium", - "botanicalName": "Dendrobium nobile", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e7/Dendrobium_nobile1.jpg/330px-Dendrobium_nobile1.jpg", - "imageStatus": "ok", - "description": "Das Dendrobium ist eine beliebte Zimmerorchidee mit langen Pseudobulben, die im Winter mit Blueten besetzt werden.", - "categories": [ - "flowering", - "high_humidity" - ], - "careInfo": { - "waterIntervalDays": 10, - "light": "Helles indirektes Licht", - "temp": "15-28 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_4a40e184dc1158af", - "name": "Dieffenbachie", - "botanicalName": "Dieffenbachia seguine", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b3/Dieffenbachia_seguine_1.jpg/330px-Dieffenbachia_seguine_1.jpg", - "imageStatus": "ok", - "description": "Die Dieffenbachie ist eine tropische Blattschmuckpflanze mit grossen, gruen-weiss gefleckten Blaettern.", - "categories": [ - "easy", - "low_light", - "air_purifier" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles indirektes Licht", - "temp": "18-26 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_5a0f781f2fbe33a1", - "name": "Dischidia", - "botanicalName": "Dischidia ruscifolia", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/93/Dischidia_ruscifolia.jpg/330px-Dischidia_ruscifolia.jpg", - "imageStatus": "ok", - "description": "Die Dischidia ist eine epiphytische Haengepflanze mit kleinen, runden Blaettern entlang duenner Ranken.", - "categories": [ - "succulent", - "hanging" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles indirektes Licht", - "temp": "18-27 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_d888afa045930bba", - "name": "Drachenbaum", - "botanicalName": "Dracaena marginata", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/8a/Dracaena_marginata_2.jpg/330px-Dracaena_marginata_2.jpg", - "imageStatus": "ok", - "description": "Der Drachenbaum ist eine schlanke Zimmerpflanze mit roten, schmalen Blaettern auf langen Staemmen.", - "categories": [ - "easy", - "air_purifier", - "tree" - ], - "careInfo": { - "waterIntervalDays": 10, - "light": "Helles indirektes Licht", - "temp": "15-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_03f2e14e6adb42c5", - "name": "Drehfrucht", - "botanicalName": "Streptocarpus hybridus", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/07/Streptocarpus_saxorum.jpg/330px-Streptocarpus_saxorum.jpg", - "imageStatus": "ok", - "description": "Die Drehfrucht ist ein Gesneriengewaechs mit langen, gerippten Blaettern und trichterfoermigen Blueten in Lila oder Rosa.", - "categories": [ - "flowering" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles indirektes Licht", - "temp": "15-22 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_3c9b2546fb073192", - "name": "Dudleya", - "botanicalName": "Dudleya brittonii", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/44/Dudleya_brittonii_01.jpg/330px-Dudleya_brittonii_01.jpg", - "imageStatus": "ok", - "description": "Dudleya ist eine rosetten┬¡bildende Sukkulente mit silbrig-weissen, mehligen Blaettern. Sehr elegant.", - "categories": [ - "easy", - "succulent", - "sun" - ], - "careInfo": { - "waterIntervalDays": 14, - "light": "Volles Sonnenlicht", - "temp": "10-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_db00b284aaf5553b", - "name": "Duftsteinrich", - "botanicalName": "Lobularia maritima", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/11/Lobularia_maritima.jpg/330px-Lobularia_maritima.jpg", - "imageStatus": "ok", - "description": "Der Duftsteinrich ist ein niedrig wachsendes Pflanzchen mit winzigen, weissen oder lilafarbenen Blueten und suessem Duft.", - "categories": [ - "easy", - "flowering" - ], - "careInfo": { - "waterIntervalDays": 3, - "light": "Helles bis volles Licht", - "temp": "10-22 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_19ba49fd14de0fd2", - "name": "Echeverie", - "botanicalName": "Echeveria elegans", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/85/Echeveria_elegans_-_1.jpg/330px-Echeveria_elegans_-_1.jpg", - "imageStatus": "ok", - "description": "Die Echeverie bildet symmetrische, rosettenfoermige Sukkulenten mit blaugruenen Blaettern. Pflegeleicht.", - "categories": [ - "easy", - "succulent", - "sun" - ], - "careInfo": { - "waterIntervalDays": 14, - "light": "Volles Sonnenlicht", - "temp": "15-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_adc9e050aeb462c7", - "name": "Echter Lavendel", - "botanicalName": "Lavandula angustifolia", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/40/Lavandula_angustifolia_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-087.jpg/330px-Lavandula_angustifolia_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-087.jpg", - "imageStatus": "ok", - "description": "Der Echte Lavendel ist ein aromatischer Halbstrauch mit lilafarbenen Bluetenaehren. Herrlicher Duft.", - "categories": [ - "medicinal", - "sun", - "bright_light" - ], - "careInfo": { - "waterIntervalDays": 10, - "light": "Volles Sonnenlicht", - "temp": "10-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_2f9ab7e162ca10e4", - "name": "Efeu", - "botanicalName": "Hedera helix", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/51/Hedera_helix_-_leaves.jpg/330px-Hedera_helix_-_leaves.jpg", - "imageStatus": "ok", - "description": "Efeu ist eine robuste Kletter- und Haengepflanze mit charakteristischen, dreilappigen Blaettern. Sehr langlebig.", - "categories": [ - "easy", - "low_light", - "hanging", - "air_purifier" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Wenig bis helles Licht", - "temp": "10-20 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_81cfa08a34c49816", - "name": "Efeu-Geranie", - "botanicalName": "Pelargonium peltatum", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/ad/Pelargonium_peltatum.jpg/330px-Pelargonium_peltatum.jpg", - "imageStatus": "ok", - "description": "Die Efeu-Geranie hat efeufoermige, glaenzende Blaetter und bluet den ganzen Sommer in leuchtenden Farben.", - "categories": [ - "easy", - "flowering", - "hanging", - "sun" - ], - "careInfo": { - "waterIntervalDays": 5, - "light": "Helles bis volles Licht", - "temp": "15-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_797b7521a46e11b0", - "name": "Efeutute", - "botanicalName": "Epipremnum aureum", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/62/Money_Plant_%28Epipremnum_aureum%29_4.jpg/330px-Money_Plant_%28Epipremnum_aureum%29_4.jpg", - "imageStatus": "ok", - "description": "Die Efeutute ist eine robuste Haengepflanze. Ideal fuer Anfaenger und reinigt die Raumluft.", - "categories": [ - "easy", - "low_light", - "hanging", - "air_purifier" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Wenig bis helles Licht", - "temp": "15-30 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_13694071ae9ffebd", - "name": "Einblatt", - "botanicalName": "Spathiphyllum wallisii", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/bd/Spathiphyllum_cochlearispathum_RTBG.jpg/330px-Spathiphyllum_cochlearispathum_RTBG.jpg", - "imageStatus": "ok", - "description": "Das Einblatt besticht durch elegante weisse Blueten. Eine der besten luftreinigenden Zimmerpflanzen.", - "categories": [ - "easy", - "low_light", - "flowering", - "air_purifier" - ], - "careInfo": { - "waterIntervalDays": 5, - "light": "Indirektes Licht", - "temp": "18-27 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_dc1a3a410bf856da", - "name": "Erdbeere", - "botanicalName": "Fragaria ananassa", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/29/PerfectStrawberry.jpg/330px-PerfectStrawberry.jpg", - "imageStatus": "ok", - "description": "Die Erdbeere ist ein beliebtes Obst fuer Balkon und Terrasse mit aromatischen, roten Fruechten.", - "categories": [ - "easy", - "pet_friendly", - "sun" - ], - "careInfo": { - "waterIntervalDays": 3, - "light": "Helles bis volles Licht", - "temp": "15-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_3900a4af2d8f685c", - "name": "Eselschwanz", - "botanicalName": "Sedum morganianum", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/1a/Sedum_morganianum.jpg/330px-Sedum_morganianum.jpg", - "imageStatus": "ok", - "description": "Der Eselschwanz ist eine haengende Sukkulente mit langen Trieben aus dichten, blaugruenen Blaettchen.", - "categories": [ - "easy", - "succulent", - "hanging", - "sun" - ], - "careInfo": { - "waterIntervalDays": 14, - "light": "Volles Sonnenlicht", - "temp": "15-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_bcda607d5ebeba6e", - "name": "Faecherahorn", - "botanicalName": "Acer palmatum", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/5e/Acer_palmatum_in_Prospect_Park_edit.jpg/330px-Acer_palmatum_in_Prospect_Park_edit.jpg", - "imageStatus": "ok", - "description": "Der Faecherahorn ist ein japanischer Zierahorn mit feingeschnittenen, faecherfoermigen Blaettern in Gruen oder Rot.", - "categories": [ - "tree", - "patterned" - ], - "careInfo": { - "waterIntervalDays": 5, - "light": "Helles bis volles Licht", - "temp": "10-22 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_f8e84be57621f80c", - "name": "Fass-Kaktus", - "botanicalName": "Ferocactus cylindraceus", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Ferocactus_cylindraceus.jpg/330px-Ferocactus_cylindraceus.jpg", - "imageStatus": "ok", - "description": "Der Fass-Kaktus ist ein zylindrischer Wuestenkaktus mit langen, roten Stacheln. Sehr langlebig.", - "categories": [ - "easy", - "succulent", - "sun" - ], - "careInfo": { - "waterIntervalDays": 21, - "light": "Volles Sonnenlicht", - "temp": "15-35 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_502fa49e2138d4e5", - "name": "Fatsia", - "botanicalName": "Fatsia japonica", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/60/Fatsia_japonica_02.jpg/330px-Fatsia_japonica_02.jpg", - "imageStatus": "ok", - "description": "Die Fatsia ist ein dekorativer Zimmerstrauch mit grossen, handfoermigen, glaenzenden Blaettern. Sehr robust.", - "categories": [ - "easy", - "low_light" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles indirektes Licht", - "temp": "10-20 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_4d2d5509b4c55176", - "name": "Fettkraut", - "botanicalName": "Pinguicula grandiflora", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/3e/Pinguicula_grandiflora.jpg/330px-Pinguicula_grandiflora.jpg", - "imageStatus": "ok", - "description": "Das Fettkraut faengt Insekten mit klebrigen Blaettern. Es bluet mit violetten, sporenartigen Blueten.", - "categories": [ - "flowering", - "high_humidity" - ], - "careInfo": { - "waterIntervalDays": 5, - "light": "Helles indirektes Licht", - "temp": "10-20 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_321162597569e247", - "name": "Flamingoblume", - "botanicalName": "Anthurium andraeanum", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/8b/AnthuriumAndraenum.jpg/330px-AnthuriumAndraenum.jpg", - "imageStatus": "ok", - "description": "Die Flamingoblume faellt durch leuchtend rote, wachsartige Hochblaetter auf. Bluet fast das ganze Jahr.", - "categories": [ - "flowering", - "high_humidity" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles indirektes Licht", - "temp": "18-28 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_a45983ad9bacfbd3", - "name": "Flammen-Bromelie", - "botanicalName": "Vriesea splendens", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/18/Vriesea_splendens2.jpg/330px-Vriesea_splendens2.jpg", - "imageStatus": "ok", - "description": "Die Flammen-Bromelie hat geb├ñnderte, dunkelgruene Blaetter und einen spektakulaeren, roten Bluetenstand.", - "categories": [ - "flowering", - "patterned", - "high_humidity" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles indirektes Licht", - "temp": "18-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_4385d6c520bf6b30", - "name": "Fleissiges Lieschen", - "botanicalName": "Impatiens walleriana", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/02/Impatiens_walleriana_-_Flei%C3%9Figes_Lieschen.jpg/330px-Impatiens_walleriana_-_Flei%C3%9Figes_Lieschen.jpg", - "imageStatus": "ok", - "description": "Das Fleissige Lieschen bluet von Fruehling bis Herbst unermudlich in vielen Farben.", - "categories": [ - "easy", - "flowering" - ], - "careInfo": { - "waterIntervalDays": 2, - "light": "Helles indirektes Licht", - "temp": "16-24 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_a1224f40826b5089", - "name": "Forellen-Begonie", - "botanicalName": "Begonia maculata", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e5/Begonia_maculata_wightii.jpg/330px-Begonia_maculata_wightii.jpg", - "imageStatus": "ok", - "description": "Die Forellen-Begonie hat olivgruene Blaetter mit silbernen Punkten und einer roten Unterseite. Atemberaubend.", - "categories": [ - "patterned", - "high_humidity" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles indirektes Licht", - "temp": "18-27 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_fbe673c97a27643c", - "name": "Frauenhaarfarn", - "botanicalName": "Adiantum raddianum", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/5d/Adiantum_raddianum_2.jpg/330px-Adiantum_raddianum_2.jpg", - "imageStatus": "ok", - "description": "Der Frauenhaarfarn hat zarte, feingliedrige Wedel auf schwarzen, draht┬¡aehnlichen Stielen. Liebt Feuchtigkeit.", - "categories": [ - "high_humidity" - ], - "careInfo": { - "waterIntervalDays": 3, - "light": "Helles indirektes Licht", - "temp": "18-27 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_253febdb6b4c4860", - "name": "Fuchsie", - "botanicalName": "Fuchsia hybrida", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/13/Fuchsia_with_bee.jpg/330px-Fuchsia_with_bee.jpg", - "imageStatus": "ok", - "description": "Die Fuchsie haengt mit eleganten, zweifarbigen Blueten wie kleine Ohrringe herab. Ideal fuer Ampeln.", - "categories": [ - "flowering", - "hanging" - ], - "careInfo": { - "waterIntervalDays": 3, - "light": "Helles indirektes Licht", - "temp": "14-22 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_7e81c1b15627e3d7", - "name": "Gardenie", - "botanicalName": "Gardenia jasminoides", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a4/Gardenia_jasminoides.jpg/330px-Gardenia_jasminoides.jpg", - "imageStatus": "ok", - "description": "Die Gardenie fasziniert mit cremefarbenen, intensiv duftenden Blueten. Anspruchsvoll in der Pflege.", - "categories": [ - "flowering", - "high_humidity" - ], - "careInfo": { - "waterIntervalDays": 5, - "light": "Helles indirektes Licht", - "temp": "18-23 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_c63e701e278fa8ae", - "name": "Gasteria", - "botanicalName": "Gasteria carinata", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/26/Gasteria_bicolor_var._liliputana.jpg/330px-Gasteria_bicolor_var._liliputana.jpg", - "imageStatus": "ok", - "description": "Die Gasteria ist eine kleine Sukkulente mit zweireihig angeordneten, zungenfoermigen, gefleckten Blaettern.", - "categories": [ - "easy", - "succulent", - "low_light" - ], - "careInfo": { - "waterIntervalDays": 14, - "light": "Helles indirektes Licht", - "temp": "15-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_fa2afbb2eb4500a7", - "name": "Gebet-Pflanze", - "botanicalName": "Maranta leuconeura", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/2d/Maranta_leuconeura.jpg/330px-Maranta_leuconeura.jpg", - "imageStatus": "ok", - "description": "Die Gebet-Pflanze faltet ihre gemusterten Blaetter nachts wie Haende zusammen. Faszinierende rote und gruene Muster.", - "categories": [ - "patterned", - "high_humidity", - "pet_friendly" - ], - "careInfo": { - "waterIntervalDays": 5, - "light": "Indirektes Licht", - "temp": "18-27 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_16c869313cd292ca", - "name": "Geigenfeige", - "botanicalName": "Ficus lyrata", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a8/Ficus_lyrata_%28Fiddle_leaf_Fig%29_%282939566785%29.jpg/330px-Ficus_lyrata_%28Fiddle_leaf_Fig%29_%282939566785%29.jpg", - "imageStatus": "ok", - "description": "Die Geigenfeige ist ein Trendbaum mit grossen, geigenfoermigen Blaettern. Benoetigt viel Licht.", - "categories": [ - "tree", - "bright_light", - "large" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles indirektes Licht", - "temp": "18-27 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_25cb30720168c488", - "name": "Geisterpflanze", - "botanicalName": "Graptopetalum paraguayense", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/67/Graptopetalum_paraguayense_-_ghost_plant.jpg/330px-Graptopetalum_paraguayense_-_ghost_plant.jpg", - "imageStatus": "ok", - "description": "Die Geisterpflanze hat zartgraue bis perlmutt-rosafarbene, rosettenfoermige Blaetter. Sehr robuste Sukkulente.", - "categories": [ - "easy", - "succulent", - "sun" - ], - "careInfo": { - "waterIntervalDays": 14, - "light": "Volles Sonnenlicht", - "temp": "15-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_87b1168e48dec833", - "name": "Gerbera", - "botanicalName": "Gerbera jamesonii", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/5a/Gerbera_jamesonii.jpg/330px-Gerbera_jamesonii.jpg", - "imageStatus": "ok", - "description": "Die Gerbera ist eine farbenfrohe Schnittblume mit grossen, sonnenblumenaehnlichen Blueten. Sehr beliebt.", - "categories": [ - "flowering", - "bright_light", - "air_purifier" - ], - "careInfo": { - "waterIntervalDays": 5, - "light": "Helles bis volles Licht", - "temp": "15-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_b93632ad7bfff83a", - "name": "Geweihfarn", - "botanicalName": "Platycerium bifurcatum", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/4c/Staghorn_Fern_Platycerium_bifurcatum.jpg/330px-Staghorn_Fern_Platycerium_bifurcatum.jpg", - "imageStatus": "ok", - "description": "Der Geweihfarn hat gespaltene Wedel, die einem Hirschgeweih aehneln. Er ist ein epiphytischer Farn fuer Holz.", - "categories": [ - "hanging", - "high_humidity" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles indirektes Licht", - "temp": "15-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_7e449dc7aefa50dc", - "name": "Gloxinie", - "botanicalName": "Gloxinia speciosa", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/91/Gloxinia_tubiflora.jpg/330px-Gloxinia_tubiflora.jpg", - "imageStatus": "ok", - "description": "Die Gloxinie hat grosse, samtartige Blueten in Violett, Rosa oder Weiss mit farbigen Raendern.", - "categories": [ - "flowering", - "high_humidity" - ], - "careInfo": { - "waterIntervalDays": 5, - "light": "Helles indirektes Licht", - "temp": "18-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_d77c5e78b5a6cd52", - "name": "Goldene Tonne", - "botanicalName": "Echinocactus grusonii", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/70/Echinocactus_grusonii_Hildm.jpg/330px-Echinocactus_grusonii_Hildm.jpg", - "imageStatus": "ok", - "description": "Die Goldene Tonne ist ein ikonischer kugelfoermiger Kaktus mit goldgelben Stacheln. Waechst langsam aber imposant.", - "categories": [ - "easy", - "succulent", - "sun" - ], - "careInfo": { - "waterIntervalDays": 21, - "light": "Volles Sonnenlicht", - "temp": "15-35 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_86b6774738a97ccf", - "name": "Goldener Bambus", - "botanicalName": "Phyllostachys aurea", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/93/Phyllostachys_aurea_4.jpg/330px-Phyllostachys_aurea_4.jpg", - "imageStatus": "ok", - "description": "Der Goldene Bambus hat elegante, goldgelbe Halme mit engstehenden Knoten. Sehr dekorativ als Sichtschutz.", - "categories": [ - "easy", - "large" - ], - "careInfo": { - "waterIntervalDays": 5, - "light": "Helles bis volles Licht", - "temp": "10-30 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_cd5e679bdf1106fa", - "name": "Goldfruchtpalme", - "botanicalName": "Dypsis lutescens", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c2/Dypsis_lutescens1.jpg/330px-Dypsis_lutescens1.jpg", - "imageStatus": "ok", - "description": "Die Goldfruchtpalme ist eine elegante Zimmerpalme mit gelblich-gruenen Stielen und gefiederten Wedeln.", - "categories": [ - "air_purifier", - "tree" - ], - "careInfo": { - "waterIntervalDays": 5, - "light": "Helles indirektes Licht", - "temp": "18-27 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_64ff12d55ec3e694", - "name": "Granatapfelbaum", - "botanicalName": "Punica granatum", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/9f/Garnet_Pomegranate.jpg/330px-Garnet_Pomegranate.jpg", - "imageStatus": "ok", - "description": "Der Granatapfelbaum hat leuchtend rote Blueten und rote, essbare Fruechte mit rubinroten Kernen.", - "categories": [ - "flowering", - "sun", - "tree", - "medicinal" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Volles Sonnenlicht", - "temp": "15-28 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_6979e7e4cf35ae8e", - "name": "Grosse Brennessel", - "botanicalName": "Urtica dioica", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/ae/Urtica_dioica.jpg/330px-Urtica_dioica.jpg", - "imageStatus": "ok", - "description": "Die Grosse Brennessel ist eine Heilpflanze mit brennenden Haaren. Die Blaetter sind reich an Vitaminen und Mineralien.", - "categories": [ - "medicinal" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles bis volles Licht", - "temp": "10-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_e4804808615a29be", - "name": "Grosse Strahlenaralie", - "botanicalName": "Schefflera actinophylla", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/8c/Brassaia_actinophylla_large.jpg/330px-Brassaia_actinophylla_large.jpg", - "imageStatus": "ok", - "description": "Die Grosse Strahlenaralie kann grosse, handfoermige Blaetter entwickeln. Sie ist ideal als Zimmerstrauch.", - "categories": [ - "easy", - "tree", - "large" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles indirektes Licht", - "temp": "18-27 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_0ee7b22313a79a28", - "name": "Gruene Minze", - "botanicalName": "Mentha spicata", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/ae/Mint-leaves-2007.jpg/330px-Mint-leaves-2007.jpg", - "imageStatus": "ok", - "description": "Die Gruene Minze ist ein wuchsfreudiges Kuechenkraut mit frischem, minzigem Duft. Fuer Tee und Cocktails.", - "categories": [ - "easy", - "medicinal" - ], - "careInfo": { - "waterIntervalDays": 3, - "light": "Helles bis volles Licht", - "temp": "15-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_52fa97990402f644", - "name": "Gruenlilie", - "botanicalName": "Chlorophytum comosum", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/6c/Chlorophytum_comosum_01.jpg/330px-Chlorophytum_comosum_01.jpg", - "imageStatus": "ok", - "description": "Die Gruenlilie ist eine klassische Haengepflanze mit langen, gruen-weissen Blaettern. Sehr pflegeleicht.", - "categories": [ - "easy", - "hanging", - "pet_friendly", - "air_purifier" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles indirektes Licht", - "temp": "15-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_730c6fc12cf97511", - "name": "Guave", - "botanicalName": "Psidium guajava", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/00/Guava_ID.jpg/330px-Guava_ID.jpg", - "imageStatus": "ok", - "description": "Die Guave ist ein tropischer Obstbaum mit gelblich-weissen Fruechten. Sie ist reich an Vitamin C.", - "categories": [ - "sun", - "tree", - "medicinal" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Volles Sonnenlicht", - "temp": "18-30 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_39c58604790693b9", - "name": "Gummibaum", - "botanicalName": "Ficus elastica", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/3a/Ficus_elastica_India_Ink_%28Rubberplant%29.jpg/330px-Ficus_elastica_India_Ink_%28Rubberplant%29.jpg", - "imageStatus": "ok", - "description": "Der Gummibaum ist eine imposante Zimmerpflanze mit grossen, glaenzenden, lederartigen Blaettern. Reinigt die Luft.", - "categories": [ - "easy", - "air_purifier", - "tree" - ], - "careInfo": { - "waterIntervalDays": 10, - "light": "Helles indirektes Licht", - "temp": "16-24 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_aa6664ed7adebcb5", - "name": "Gurke", - "botanicalName": "Cucumis sativus", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/12/Cucumbers_-_whole_and_slice.jpg/330px-Cucumbers_-_whole_and_slice.jpg", - "imageStatus": "ok", - "description": "Die Gurke ist eine rankende Gemuese┬¡pflanze mit gruenen, erfrischenden Fruechten. Im Balkonkasten kultivierbar.", - "categories": [ - "easy", - "sun", - "hanging" - ], - "careInfo": { - "waterIntervalDays": 3, - "light": "Volles Sonnenlicht", - "temp": "18-28 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_46b49e1b0e69fa64", - "name": "Guzmania", - "botanicalName": "Guzmania lingulata", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/3b/Guzmania_lingulata.jpg/330px-Guzmania_lingulata.jpg", - "imageStatus": "ok", - "description": "Die Guzmania ist eine Bromelie mit gl├ñnzenden, gruenen Blaettern und einem leuchtend roten, sternfoermigen Bluetenstand.", - "categories": [ - "flowering", - "high_humidity" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles indirektes Licht", - "temp": "18-27 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_81cd86630aca39e5", - "name": "Hange-Birke", - "botanicalName": "Betula pendula", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/90/Betula_pendula_young_leaves.jpg/330px-Betula_pendula_young_leaves.jpg", - "imageStatus": "ok", - "description": "Die Haenge-Birke hat charakteristisch weisse Rinde und haengende Zweige. Die Blaetter werden in der Heilkunde genutzt.", - "categories": [ - "medicinal", - "tree", - "large" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Volles Sonnenlicht", - "temp": "10-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_f94ccafdbc6c519d", - "name": "Hasenohren-Kaktus", - "botanicalName": "Opuntia microdasys", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a3/Opuntia_microdasys_3.jpg/330px-Opuntia_microdasys_3.jpg", - "imageStatus": "ok", - "description": "Der Hasenohren-Kaktus hat flache, ovale Triebe mit dichten weissen Glochiden. Klassischer Zimmerkaktus.", - "categories": [ - "easy", - "succulent", - "sun" - ], - "careInfo": { - "waterIntervalDays": 21, - "light": "Volles Sonnenlicht", - "temp": "10-35 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_f297c0da1221e6d4", - "name": "Heliamphora", - "botanicalName": "Heliamphora nutans", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/6f/Heliamphora_nutans.jpg/330px-Heliamphora_nutans.jpg", - "imageStatus": "ok", - "description": "Heliamphora ist eine urtuemliche Kannenpflanze aus den Tafelbergen Venezuelas. Sehr dekorativ und selten.", - "categories": [ - "high_humidity" - ], - "careInfo": { - "waterIntervalDays": 5, - "light": "Helles indirektes Licht", - "temp": "15-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_39436f8620e13b0e", - "name": "Heliconia", - "botanicalName": "Heliconia psittacorum", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/9e/Heliconia_psittacorum.jpg/330px-Heliconia_psittacorum.jpg", - "imageStatus": "ok", - "description": "Die Heliconia hat leuchtend orangefarbe oder rote, bootsfoermige Hochblaetter. Eine exotische Tropenpflanze.", - "categories": [ - "flowering", - "high_humidity", - "bright_light" - ], - "careInfo": { - "waterIntervalDays": 5, - "light": "Helles bis volles Licht", - "temp": "20-30 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_b246d39c63f29a40", - "name": "Herzblatt-Philodendron", - "botanicalName": "Philodendron hederaceum", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/55/Philodendron_hederaceum.jpg/330px-Philodendron_hederaceum.jpg", - "imageStatus": "ok", - "description": "Der Herzblatt-Philodendron ist eine pflegeleichte Kletter- oder Haengepflanze mit herzfoermigen Blaettern.", - "categories": [ - "easy", - "low_light", - "hanging" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Indirektes Licht", - "temp": "18-28 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_3de588912c04dc7f", - "name": "Herzkette", - "botanicalName": "Ceropegia woodii", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/5b/Ceropegia_woodii_Kew.jpg/330px-Ceropegia_woodii_Kew.jpg", - "imageStatus": "ok", - "description": "Die Herzkette hat duenne, haengende Ranken mit herzfoermigen, silbergrau gemusterten Blaettchen.", - "categories": [ - "easy", - "succulent", - "hanging", - "patterned" - ], - "careInfo": { - "waterIntervalDays": 14, - "light": "Helles indirektes Licht", - "temp": "15-27 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_8b5798718a1dc5c6", - "name": "Hibiskus", - "botanicalName": "Hibiscus rosa-sinensis", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/11/Hibiscus_rosa-sinensis_4.jpg/330px-Hibiscus_rosa-sinensis_4.jpg", - "imageStatus": "ok", - "description": "Der Hibiskus begeistert mit grossen, trompetenfoermigen Blueten in Rot, Orange und Rosa.", - "categories": [ - "flowering", - "sun", - "bright_light" - ], - "careInfo": { - "waterIntervalDays": 3, - "light": "Volles Sonnenlicht", - "temp": "18-28 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_0306abe03e6d7296", - "name": "Hyazinthe", - "botanicalName": "Hyacinthus orientalis", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/3b/Hyacinth_Hyacinthus_orientalis.jpg/330px-Hyacinth_Hyacinthus_orientalis.jpg", - "imageStatus": "ok", - "description": "Die Hyazinthe bezaubert mit dichten Bluetenrispen und intensivem Duft in Blau, Rosa, Weiss oder Gelb.", - "categories": [ - "easy", - "flowering" - ], - "careInfo": { - "waterIntervalDays": 5, - "light": "Helles bis volles Licht", - "temp": "10-18 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_4e66095e06f32cf4", - "name": "Indische Azalee", - "botanicalName": "Azalea indica", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b1/Indian_azalea.jpg/330px-Indian_azalea.jpg", - "imageStatus": "ok", - "description": "Die Indische Azalee ist ein beliebter Zierstrauch mit grossen, auffaelligen Blueten in Rosa- und Rott├Ânen.", - "categories": [ - "flowering" - ], - "careInfo": { - "waterIntervalDays": 4, - "light": "Helles indirektes Licht", - "temp": "10-20 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_902876241a0c1f6f", - "name": "Ingwer", - "botanicalName": "Zingiber officinale", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/33/Fresh_ginger_root.jpg/330px-Fresh_ginger_root.jpg", - "imageStatus": "ok", - "description": "Ingwer ist eine tropische Gewuerzpflanze mit aromatischen Knollen. Die Blaetter sind schilfartig.", - "categories": [ - "medicinal", - "high_humidity" - ], - "careInfo": { - "waterIntervalDays": 5, - "light": "Helles indirektes Licht", - "temp": "20-30 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_2f9ba405e4cbd7de", - "name": "Jadepflanze", - "botanicalName": "Crassula ovata", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a9/Crassula_ovata_3.jpg/330px-Crassula_ovata_3.jpg", - "imageStatus": "ok", - "description": "Die Jadepflanze ist eine langlebige Sukkulente mit dicken, ovalen Blaettern. In Japan gilt sie als Gluecksbringer.", - "categories": [ - "easy", - "succulent", - "sun" - ], - "careInfo": { - "waterIntervalDays": 14, - "light": "Helles bis volles Licht", - "temp": "15-24 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_192fc2d6932b5621", - "name": "Japanische Aucube", - "botanicalName": "Aucuba japonica", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/f2/Aucuba_japonica.jpg/330px-Aucuba_japonica.jpg", - "imageStatus": "ok", - "description": "Die Japanische Aucube hat glaenzende, gruene oder gelbgefleckte Blaetter. Sehr schattenvertraeglich.", - "categories": [ - "easy", - "low_light" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Wenig bis helles Licht", - "temp": "10-20 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_a0c9b297c07374b5", - "name": "Japanische Azalee", - "botanicalName": "Rhododendron simsii", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/ec/Rhododendron_simsii_flowers.jpg/330px-Rhododendron_simsii_flowers.jpg", - "imageStatus": "ok", - "description": "Die Japanische Azalee bluet im Winter und Fruehling ueppig mit leuchtend roten, rosa oder weissen Blueten.", - "categories": [ - "flowering" - ], - "careInfo": { - "waterIntervalDays": 4, - "light": "Helles indirektes Licht", - "temp": "10-18 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_28ae5636958be358", - "name": "Jasmin", - "botanicalName": "Jasminum polyanthum", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/af/Jasminum_polyanthum.jpg/330px-Jasminum_polyanthum.jpg", - "imageStatus": "ok", - "description": "Der Jasmin ist eine Kletterpflanze mit intensiv duftenden, weissen Blueten. Er bluet im Winter und Fruehling.", - "categories": [ - "flowering" - ], - "careInfo": { - "waterIntervalDays": 5, - "light": "Helles bis volles Licht", - "temp": "10-22 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_8fea9248ff0c7bb5", - "name": "Johanniskraut", - "botanicalName": "Hypericum perforatum", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/2c/Hypericum_perforatum.jpg/330px-Hypericum_perforatum.jpg", - "imageStatus": "ok", - "description": "Das Johanniskraut hat leuchtend gelbe Blueten und ist ein wichtiges Heilkraut gegen Depressionen und Stimmungstiefs.", - "categories": [ - "medicinal", - "flowering", - "sun" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Volles Sonnenlicht", - "temp": "10-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_c2b3a25e00acf3e2", - "name": "Kaffeestrauch", - "botanicalName": "Coffea arabica", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c5/Arabica_Coffee_Beans.jpg/330px-Arabica_Coffee_Beans.jpg", - "imageStatus": "ok", - "description": "Der Kaffeestrauch hat glaenzende, dunkelgruene Blaetter und entwickelt rote Kaffe┬¡ekirschen. Kann im Topf gehalten werden.", - "categories": [ - "easy", - "medicinal" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles indirektes Licht", - "temp": "18-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_7597db1c1b395452", - "name": "Kalanchoe", - "botanicalName": "Kalanchoe blossfeldiana", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/2e/Kalanchoe_blossfeldiana3.jpg/330px-Kalanchoe_blossfeldiana3.jpg", - "imageStatus": "ok", - "description": "Die Kalanchoe ist eine beliebte Bluehpflanze mit leuchtenden Blueten in Rot, Orange, Gelb oder Rosa.", - "categories": [ - "easy", - "succulent", - "flowering", - "sun" - ], - "careInfo": { - "waterIntervalDays": 10, - "light": "Helles bis volles Licht", - "temp": "15-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_735b19d4a6efe5c0", - "name": "Kamelie", - "botanicalName": "Camellia japonica", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/93/Camellia_japonica_cv_Nuccio%27s_Pearl.jpg/330px-Camellia_japonica_cv_Nuccio%27s_Pearl.jpg", - "imageStatus": "ok", - "description": "Die Kamelie ist ein eleganter Zierstrauch mit glaenzenden Blaettern und rosenaehnlichen Blueten von Januar bis April.", - "categories": [ - "flowering" - ], - "careInfo": { - "waterIntervalDays": 5, - "light": "Helles indirektes Licht", - "temp": "7-18 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_e0432335ee4f0033", - "name": "Kamille", - "botanicalName": "Chamomilla recutita", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/cc/Chamomile_%40_Oulu.jpg/330px-Chamomile_%40_Oulu.jpg", - "imageStatus": "ok", - "description": "Die Kamille ist ein beliebtes Heilkraut mit kleinen, weiss-gelben Blueten. Das aetherische Oel wirkt beruhigend.", - "categories": [ - "easy", - "medicinal", - "sun" - ], - "careInfo": { - "waterIntervalDays": 5, - "light": "Volles Sonnenlicht", - "temp": "15-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_de21871ad8dcaefd", - "name": "Kaninchen-Ohren", - "botanicalName": "Kalanchoe tomentosa", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/58/Kalanchoe_tomentosa.jpg/330px-Kalanchoe_tomentosa.jpg", - "imageStatus": "ok", - "description": "Kaninchen-Ohren haben weisslich-filzige Blaetter mit braunen Raendern, die Kaninchen┬¡ohren aehneln. Sehr dekorativ.", - "categories": [ - "easy", - "succulent", - "sun" - ], - "careInfo": { - "waterIntervalDays": 14, - "light": "Helles bis volles Licht", - "temp": "15-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_cb7817f551f6c73e", - "name": "Kannenpflanze", - "botanicalName": "Nepenthes alata", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c2/Nepenthes_alata_pitchers.jpg/330px-Nepenthes_alata_pitchers.jpg", - "imageStatus": "ok", - "description": "Die Kannenpflanze bildet grosse, gefuellte Kannen als Insekten┬¡fallen. Eine faszinierende, tropische Pflanze.", - "categories": [ - "high_humidity", - "hanging" - ], - "careInfo": { - "waterIntervalDays": 5, - "light": "Helles indirektes Licht", - "temp": "20-30 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_325a00f384ac1a15", - "name": "Kap-Aloe", - "botanicalName": "Aloe arborescens", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/01/Aloe_arborescens_flower.jpg/330px-Aloe_arborescens_flower.jpg", - "imageStatus": "ok", - "description": "Die Kap-Aloe ist eine strauchige Aloe mit schmalen, gezaehnten Blaettern und leuchtend roten Bluetenaehren im Winter.", - "categories": [ - "easy", - "succulent", - "medicinal", - "sun" - ], - "careInfo": { - "waterIntervalDays": 14, - "light": "Volles Sonnenlicht", - "temp": "10-30 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_bb4dea2113550a88", - "name": "Kap-Aloe (ferox)", - "botanicalName": "Aloe ferox", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/aa/Aloe_ferox_%28Kew%29.jpg/330px-Aloe_ferox_%28Kew%29.jpg", - "imageStatus": "ok", - "description": "Aloe ferox ist eine grosse, imposante Aloe mit stachligen, blaugruenen Blaettern und leuchtend roten Bluetenaehren.", - "categories": [ - "succulent", - "medicinal", - "sun", - "large" - ], - "careInfo": { - "waterIntervalDays": 14, - "light": "Volles Sonnenlicht", - "temp": "10-30 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_f8c518688fd2d49b", - "name": "Karotte", - "botanicalName": "Daucus carota", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a2/Daucus_carota_subsp._sativus.jpg/330px-Daucus_carota_subsp._sativus.jpg", - "imageStatus": "ok", - "description": "Die Karotte ist eine beliebte Gemuese┬¡pflanze mit orangefarbenen Wurzeln. Im tiefen Topf kultivierbar.", - "categories": [ - "easy", - "medicinal" - ], - "careInfo": { - "waterIntervalDays": 5, - "light": "Helles bis volles Licht", - "temp": "15-22 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_c605a83dcbce1a97", - "name": "Kentia-Palme", - "botanicalName": "Howea forsteriana", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/66/Howea_forsteriana.jpg/330px-Howea_forsteriana.jpg", - "imageStatus": "ok", - "description": "Die Kentia-Palme ist eine der elegantesten Zimmerpalmen mit langen, herabh├ñngenden Fiederblaettern.", - "categories": [ - "tree", - "low_light" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles indirektes Licht", - "temp": "18-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_bf13d931fa5427de", - "name": "Keulenlilie", - "botanicalName": "Cordyline australis", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/77/Cordyline_australis.jpg/330px-Cordyline_australis.jpg", - "imageStatus": "ok", - "description": "Die Keulenlilie hat lange, schmale, gruene oder rotbraune Blaetter in einem dekorativen Schopf.", - "categories": [ - "easy", - "tree", - "sun" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles bis volles Licht", - "temp": "10-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_205589ef30c6f380", - "name": "Kleeblume", - "botanicalName": "Oxalis triangularis", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/32/Oxalis_triangularis_ssp_papilionacea_2.jpg/330px-Oxalis_triangularis_ssp_papilionacea_2.jpg", - "imageStatus": "ok", - "description": "Die Kleeblume hat tiefviolette, dreieckige Blaetter und zarte rosa Blueten. Sie faltet die Blaetter bei Dunkelheit.", - "categories": [ - "flowering", - "patterned", - "pet_friendly" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles indirektes Licht", - "temp": "15-24 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_e1f0a5c763e6f721", - "name": "Kleine Wachsblume", - "botanicalName": "Hoya bella", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/15/Hoya_bella_close.jpg/330px-Hoya_bella_close.jpg", - "imageStatus": "ok", - "description": "Die Kleine Wachsblume traegt zierliche, sternfoermige weisse Blueten mit rosa Mitte. Haengende Sukkulente.", - "categories": [ - "flowering", - "hanging", - "succulent" - ], - "careInfo": { - "waterIntervalDays": 10, - "light": "Helles indirektes Licht", - "temp": "18-27 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_156a82fb0d4e7201", - "name": "Knollen-Begonie", - "botanicalName": "Begonia tuberhybrida", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/62/Begonia_tuberhybrida.jpg/330px-Begonia_tuberhybrida.jpg", - "imageStatus": "ok", - "description": "Die Knollen-Begonie hat riesige, rosenaehnliche Blueten in leuchtendem Rot, Orange, Gelb oder Weiss.", - "categories": [ - "flowering", - "high_humidity" - ], - "careInfo": { - "waterIntervalDays": 5, - "light": "Helles indirektes Licht", - "temp": "15-22 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_6fdbc0c3fc6d0820", - "name": "Koenigin der Nacht", - "botanicalName": "Epiphyllum oxypetalum", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/d5/Epiphyllum_oxypetalum_flower.jpg/330px-Epiphyllum_oxypetalum_flower.jpg", - "imageStatus": "ok", - "description": "Die Koenigin der Nacht bluet nur eine einzige Nacht lang mit riesigen, intensiv duftenden weissen Blueten.", - "categories": [ - "flowering", - "succulent" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Indirektes Licht", - "temp": "18-27 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_fb262dee6cb22325", - "name": "Koenigs-Protea", - "botanicalName": "Protea cynaroides", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/67/Protea_cynaroides_-_King_Protea.jpg/330px-Protea_cynaroides_-_King_Protea.jpg", - "imageStatus": "ok", - "description": "Die Koenigs-Protea ist die Nationalblume Suedafrikas mit riesigen, imposanten Bluetenkoepfen. Eine echte Besonderheit.", - "categories": [ - "flowering", - "sun", - "large" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Volles Sonnenlicht", - "temp": "10-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_c18b4430b4dfeef8", - "name": "Koenigsbegonie", - "botanicalName": "Begonia rex", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/ee/Begonia_rex_2.jpg/330px-Begonia_rex_2.jpg", - "imageStatus": "ok", - "description": "Die Koenigsbegonie beeindruckt mit prachtvoll gemusterten Blaettern in Silber, Rot und Gruen.", - "categories": [ - "patterned", - "high_humidity" - ], - "careInfo": { - "waterIntervalDays": 5, - "light": "Indirektes Licht", - "temp": "18-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_71f244d60e9fb18d", - "name": "Konophytum", - "botanicalName": "Conophytum calculus", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/32/Conophytum_calculus.jpg/330px-Conophytum_calculus.jpg", - "imageStatus": "ok", - "description": "Das Konophytum ist eine sehr kompakte Sukkulente, die zwei Blaetter zu einer kugelfoermigen Form verschmilzt.", - "categories": [ - "succulent", - "sun" - ], - "careInfo": { - "waterIntervalDays": 21, - "light": "Volles Sonnenlicht", - "temp": "10-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_5f6dd525e28bd218", - "name": "Korallenkaktus", - "botanicalName": "Rhipsalis baccifera", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a1/Rhipsalis_baccifera0.jpg/330px-Rhipsalis_baccifera0.jpg", - "imageStatus": "ok", - "description": "Der Korallenkaktus ist ein epiphytischer Kaktus mit duennen, haengenden Trieben und kleinen weissen Beeren.", - "categories": [ - "succulent", - "hanging" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Indirektes Licht", - "temp": "18-27 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_fd037b7881ac3430", - "name": "Korbmarante", - "botanicalName": "Calathea orbifolia", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e7/Starr_080716-9470_Calathea_crotalifera.jpg/330px-Starr_080716-9470_Calathea_crotalifera.jpg", - "imageStatus": "ok", - "description": "Die Korbmarante beeindruckt mit grossen, runden Blaettern mit silbergrunem Muster. Liebt hohe Luftfeuchtigkeit.", - "categories": [ - "patterned", - "high_humidity" - ], - "careInfo": { - "waterIntervalDays": 5, - "light": "Indirektes Licht", - "temp": "18-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_612f629e95b2c540", - "name": "Kotyledon", - "botanicalName": "Cotyledon orbiculata", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/17/Cotyledon_orbiculata2.jpg/330px-Cotyledon_orbiculata2.jpg", - "imageStatus": "ok", - "description": "Kotyledon hat dickfleischige, runde Blaetter mit einem mehligen, weisslichen Belag. Sehr trockenheitsresistent.", - "categories": [ - "easy", - "succulent", - "sun" - ], - "careInfo": { - "waterIntervalDays": 14, - "light": "Helles bis volles Licht", - "temp": "15-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_adce82fe150c9814", - "name": "Krokus", - "botanicalName": "Crocus vernus", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a9/Crocus_vernus_1.jpg/330px-Crocus_vernus_1.jpg", - "imageStatus": "ok", - "description": "Der Krokus ist einer der ersten Fruehjahrs┬¡boten mit kelchfoermigen Blueten in Lila, Weiss und Gelb.", - "categories": [ - "easy", - "flowering" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles bis volles Licht", - "temp": "5-15 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_64ba168636b5e8a3", - "name": "Kurkuma", - "botanicalName": "Curcuma longa", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/3a/Curcuma_longa_roots.jpg/330px-Curcuma_longa_roots.jpg", - "imageStatus": "ok", - "description": "Kurkuma ist eine tropische Gewuerzpflanze mit breiten Blaettern und leuchtend gelber Wurzel. Wichtiges Heilgewuerz.", - "categories": [ - "medicinal", - "high_humidity" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles bis volles Licht", - "temp": "20-30 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_bb51efcb52023c48", - "name": "Lebende Steine", - "botanicalName": "Lithops julii", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/35/Lithops_julii_ssp_fulleri_vanzylii_cole_no._246.jpg/330px-Lithops_julii_ssp_fulleri_vanzylii_cole_no._246.jpg", - "imageStatus": "ok", - "description": "Lebende Steine sind faszinierende Mimikry-Sukkulenten, die Kieselsteinen taeuschen aehnlich sehen. Sehr trockenheitsresistent.", - "categories": [ - "succulent", - "sun" - ], - "careInfo": { - "waterIntervalDays": 21, - "light": "Volles Sonnenlicht", - "temp": "10-30 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_0a16a89a9de52d5c", - "name": "Lila Tradescantia", - "botanicalName": "Tradescantia pallida", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c9/Purple_tradescantia.jpg/330px-Purple_tradescantia.jpg", - "imageStatus": "ok", - "description": "Die Lila Tradescantia hat leuchtend purpurrote Blaetter und ist sehr auffaellig. Sie liebt viel Licht.", - "categories": [ - "easy", - "hanging", - "sun" - ], - "careInfo": { - "waterIntervalDays": 5, - "light": "Helles bis volles Licht", - "temp": "15-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_a34bdd68ffb97e12", - "name": "Lippenstiftpflanze", - "botanicalName": "Aeschynanthus radicans", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/66/Aeschynanthus_lobbianus.jpg/330px-Aeschynanthus_lobbianus.jpg", - "imageStatus": "ok", - "description": "Die Lippenstiftpflanze hat haengende Triebe mit glaenzenden Blaettern und leuchtend roten Roehrenbluten.", - "categories": [ - "flowering", - "hanging", - "high_humidity" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles indirektes Licht", - "temp": "18-27 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_db7b7c883a5fb716", - "name": "Luftpflanze", - "botanicalName": "Tillandsia ionantha", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/f6/Tillandsia_ionantha.jpg/330px-Tillandsia_ionantha.jpg", - "imageStatus": "ok", - "description": "Die Luftpflanze ist eine kompakte Bromelie ohne Topferde. Sie nimmt Wasser und Naehrstoffe ueber die Blattschuppen auf.", - "categories": [ - "easy", - "sun" - ], - "careInfo": { - "waterIntervalDays": 3, - "light": "Helles bis volles Licht", - "temp": "15-30 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_fafb81415756f893", - "name": "Madagaskar-Jasmin", - "botanicalName": "Stephanotis floribunda", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e1/Stephanotis_floribunda1.jpg/330px-Stephanotis_floribunda1.jpg", - "imageStatus": "ok", - "description": "Der Madagaskar-Jasmin hat dicke, glaenzende Blaetter und wachsweisse, intensiv duftende Blueten. Klassische Hochzeitsblume.", - "categories": [ - "flowering" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles indirektes Licht", - "temp": "18-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_cabb9c3df66307ba", - "name": "Maisstrauch", - "botanicalName": "Dracaena fragrans", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/75/Dracaena_fragrans_-_Corn_Plant_%283622131419%29.jpg/330px-Dracaena_fragrans_-_Corn_Plant_%283622131419%29.jpg", - "imageStatus": "ok", - "description": "Der Maisstrauch ist eine robuste Zimmerpflanze mit breiten, gestreiften Blaettern. Gedeiht auch bei wenig Licht.", - "categories": [ - "easy", - "low_light", - "air_purifier", - "tree" - ], - "careInfo": { - "waterIntervalDays": 10, - "light": "Helles indirektes Licht", - "temp": "15-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_d52a80feceba729c", - "name": "Mammillaria", - "botanicalName": "Mammillaria zeilmanniana", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/37/Mammillaria_zeilmanniana_2.jpg/330px-Mammillaria_zeilmanniana_2.jpg", - "imageStatus": "ok", - "description": "Die Mammillaria ist ein kompakter, kugelfoermiger Kaktus, der im Fruehling einen Kranz aus rosa Blueten traegt.", - "categories": [ - "easy", - "succulent", - "flowering", - "sun" - ], - "careInfo": { - "waterIntervalDays": 14, - "light": "Volles Sonnenlicht", - "temp": "15-35 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_9406fa4ffbef305b", - "name": "Mangold", - "botanicalName": "Beta vulgaris", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/1a/Chard_multicolored.jpg/330px-Chard_multicolored.jpg", - "imageStatus": "ok", - "description": "Mangold ist ein farbenfrohes Blattgemuese mit bunten Stielen in Rot, Gelb, Orange und Weiss.", - "categories": [ - "easy", - "patterned" - ], - "careInfo": { - "waterIntervalDays": 3, - "light": "Helles bis volles Licht", - "temp": "10-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_ca9b1576aab12566", - "name": "Marmor-Efeutute", - "botanicalName": "Epipremnum aureum Marble Queen", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/3f/Epipremnum_aureum_31082012.jpg/330px-Epipremnum_aureum_31082012.jpg", - "imageStatus": "ok", - "description": "Die Marmor-Efeutute hat cremeweiss-gruen marmorierte Blaetter. Eine dekorative Variante der klassischen Efeutute.", - "categories": [ - "easy", - "hanging", - "air_purifier" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles indirektes Licht", - "temp": "15-30 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_95de7815c2f690ce", - "name": "Mexikanische F├ñcherpalme", - "botanicalName": "Washingtonia robusta", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/93/Washingtonia_robusta_2.jpg/330px-Washingtonia_robusta_2.jpg", - "imageStatus": "ok", - "description": "Die Mexikanische F├ñcherpalme ist eine schlanke, hohe Palme mit faecher┬¡foermigen Blaettern. Sehr hitzetolerant.", - "categories": [ - "tree", - "sun", - "large" - ], - "careInfo": { - "waterIntervalDays": 10, - "light": "Volles Sonnenlicht", - "temp": "15-35 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_01ed2f643e7d5d8e", - "name": "Mini-Monstera", - "botanicalName": "Rhaphidophora tetrasperma", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/18/Rhaphidophora_tetrasperma_01.jpg/330px-Rhaphidophora_tetrasperma_01.jpg", - "imageStatus": "ok", - "description": "Die Mini-Monstera hat monstera┬¡aehnliche, gelochte Blaetter auf einer kompakten, klettternden Pflanze. Sehr trendig.", - "categories": [ - "easy", - "hanging" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles indirektes Licht", - "temp": "18-27 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_8e8b8bf4c4f7bdb6", - "name": "Mond-Kaktus", - "botanicalName": "Gymnocalycium mihanovichii", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/47/Gymnocalycium_mihanovichii.jpg/330px-Gymnocalycium_mihanovichii.jpg", - "imageStatus": "ok", - "description": "Der Mond-Kaktus ist eine farbenfrohe Veredelung eines chlorophylllosen Kaktus auf einem gruenen Unterlagekaktus.", - "categories": [ - "easy", - "succulent" - ], - "careInfo": { - "waterIntervalDays": 14, - "light": "Indirektes Licht", - "temp": "15-30 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_e8ab689f2d26d8b2", - "name": "Mondstein-Pflanze", - "botanicalName": "Pachyphytum oviferum", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/44/Pachyphytum_oviferum_%28Moonstones%29.jpg/330px-Pachyphytum_oviferum_%28Moonstones%29.jpg", - "imageStatus": "ok", - "description": "Die Mondstein-Pflanze hat dicke, ovale Blaetter mit einem pastellrosafarbenen, mehligen Ueberzug.", - "categories": [ - "easy", - "succulent", - "sun" - ], - "careInfo": { - "waterIntervalDays": 14, - "light": "Volles Sonnenlicht", - "temp": "15-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_8106ae1b2a8d0a09", - "name": "Monstera", - "botanicalName": "Monstera deliciosa", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/2e/Monstera_deliciosa2.jpg/330px-Monstera_deliciosa2.jpg", - "imageStatus": "ok", - "description": "Die Monstera ist eine tropische Kletterpflanze mit charakteristisch gelochten Blaettern. Sehr beliebt weltweit.", - "categories": [ - "easy", - "large", - "air_purifier" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles indirektes Licht", - "temp": "18-27 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_b843de18953d2232", - "name": "Monstera adansonii", - "botanicalName": "Monstera adansonii", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/bd/Monstera_adansonii_1.jpg/330px-Monstera_adansonii_1.jpg", - "imageStatus": "ok", - "description": "Monstera adansonii hat herzfoermige Blaetter mit zahlreichen runden Lochern. Eine rankende Zimmerpflanze.", - "categories": [ - "easy", - "hanging" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles indirektes Licht", - "temp": "18-27 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_44c152d886d0b190", - "name": "Monstera obliqua", - "botanicalName": "Monstera obliqua", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/0e/Monstera_obliqua.jpg/330px-Monstera_obliqua.jpg", - "imageStatus": "ok", - "description": "Monstera obliqua ist eine seltene Monstera-Art mit filigranen Blaettern, die hauptsaechlich aus Lochern bestehen.", - "categories": [ - "hanging", - "patterned" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles indirektes Licht", - "temp": "18-27 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_da8adeffa961a540", - "name": "Moos-Crassula", - "botanicalName": "Crassula muscosa", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/ae/Crassula_muscosa.jpg/330px-Crassula_muscosa.jpg", - "imageStatus": "ok", - "description": "Die Moos-Crassula hat dicht aneinandergereihte, winzige gruene Blaetter auf unverzweigten Trieben. Sieht aus wie Moos.", - "categories": [ - "easy", - "succulent", - "sun" - ], - "careInfo": { - "waterIntervalDays": 14, - "light": "Helles bis volles Licht", - "temp": "15-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_917a7775d4ada0c1", - "name": "Muschelingwer", - "botanicalName": "Alpinia zerumbet", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c0/Alpinia_zerumbet_3.jpg/330px-Alpinia_zerumbet_3.jpg", - "imageStatus": "ok", - "description": "Der Muschelingwer hat lange, elegante Blaetter und haengende Bluetenrispen mit weiss-rosa Bluetchen.", - "categories": [ - "flowering", - "high_humidity", - "large" - ], - "careInfo": { - "waterIntervalDays": 5, - "light": "Helles bis volles Licht", - "temp": "20-30 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_de18a22fc81062c9", - "name": "Neon-Efeutute", - "botanicalName": "Epipremnum pinnatum Neon", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/04/Epipremnum_pinnatum_-_neon_pothos.jpg/330px-Epipremnum_pinnatum_-_neon_pothos.jpg", - "imageStatus": "ok", - "description": "Die Neon-Efeutute hat leuchtend limonengruene Blaetter. Sehr auffaellig und pflegeleicht.", - "categories": [ - "easy", - "hanging", - "air_purifier" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles indirektes Licht", - "temp": "15-30 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_3d4bc95e6500e9fc", - "name": "Neoregelia", - "botanicalName": "Neoregelia carolinae", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/68/Neoregelia_carolinae.jpg/330px-Neoregelia_carolinae.jpg", - "imageStatus": "ok", - "description": "Die Neoregelia ist eine Bromelie, bei der das Herzblatt zur Bluetzeit leuchtend rot wird. Sehr dekorativ.", - "categories": [ - "flowering", - "patterned", - "bright_light" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles bis volles Licht", - "temp": "18-27 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_c62ac934518110bb", - "name": "Neuguinea-Balsamine", - "botanicalName": "Impatiens hawkeri", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/44/Impatiens_hawkeri.jpg/330px-Impatiens_hawkeri.jpg", - "imageStatus": "ok", - "description": "Die Neuguinea-Balsamine hat grosse, leuchtende Blueten und ist sehr bluehfreudig. Ideal fuer Terrassen.", - "categories": [ - "easy", - "flowering" - ], - "careInfo": { - "waterIntervalDays": 3, - "light": "Helles indirektes Licht", - "temp": "18-27 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_3dec7298828d7d5b", - "name": "Oleander", - "botanicalName": "Nerium oleander", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/66/Nerium_oleander_flowers_leaves.jpg/330px-Nerium_oleander_flowers_leaves.jpg", - "imageStatus": "ok", - "description": "Der Oleander ist ein mediteraner Strauch mit leuchtend roten, rosa oder weissen Blueten. Sehr hitzetolerant.", - "categories": [ - "flowering", - "sun", - "bright_light" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Volles Sonnenlicht", - "temp": "15-28 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_8915ad2e41841f3d", - "name": "Orangenbaum", - "botanicalName": "Citrus sinensis", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/43/Ambersweet_oranges.jpg/330px-Ambersweet_oranges.jpg", - "imageStatus": "ok", - "description": "Der Orangenbaum ist ein kleiner, immergruener Baum mit weissen Blueten und orangen Fruechten.", - "categories": [ - "sun", - "tree", - "medicinal" - ], - "careInfo": { - "waterIntervalDays": 5, - "light": "Volles Sonnenlicht", - "temp": "18-28 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_d61f0c50e94b917d", - "name": "Oregano", - "botanicalName": "Origanum vulgare", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c5/Origanum_vulgare_-_harilik_pune.jpg/330px-Origanum_vulgare_-_harilik_pune.jpg", - "imageStatus": "ok", - "description": "Oregano ist ein aromatisches Kuechenkraut mit runden, behaarten Blaettern. In mediterraner Kueche beliebt.", - "categories": [ - "easy", - "medicinal", - "sun" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Volles Sonnenlicht", - "temp": "15-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_a62147e5f0805622", - "name": "Osterglocke", - "botanicalName": "Narcissus pseudonarcissus", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/0a/Narcissus_pseudonarcissus.jpg/330px-Narcissus_pseudonarcissus.jpg", - "imageStatus": "ok", - "description": "Die Osterglocke ist der klassische Fruehjahrsblueher mit leuchtend gelben, trompetenfoermigen Blueten.", - "categories": [ - "flowering" - ], - "careInfo": { - "waterIntervalDays": 5, - "light": "Helles bis volles Licht", - "temp": "10-18 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_f66ecda188a5efad", - "name": "Ostertrompete", - "botanicalName": "Lilium longiflorum", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/48/Lilium_longiflorum_Ether.jpg/330px-Lilium_longiflorum_Ether.jpg", - "imageStatus": "ok", - "description": "Die Ostertrompete hat grosse, weisse, trichterfoermige Blueten mit intensivem Duft. Klassische Osterblume.", - "categories": [ - "flowering", - "bright_light" - ], - "careInfo": { - "waterIntervalDays": 5, - "light": "Helles bis volles Licht", - "temp": "15-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_e4f082a4e9f3a8c5", - "name": "Papaya", - "botanicalName": "Carica papaya", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/d0/Papaya_cross_section_BNC.jpg/330px-Papaya_cross_section_BNC.jpg", - "imageStatus": "ok", - "description": "Die Papaya ist eine tropische Fruchtpflanze mit grossen, gelappten Blaettern und orangen Fruechten.", - "categories": [ - "sun", - "large", - "medicinal" - ], - "careInfo": { - "waterIntervalDays": 5, - "light": "Volles Sonnenlicht", - "temp": "20-35 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_612cf58237a77a91", - "name": "Paradiesvogelblume", - "botanicalName": "Strelitzia reginae", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a1/24701-nature-natural-beauty.jpg/330px-24701-nature-natural-beauty.jpg", - "imageStatus": "ok", - "description": "Die Paradiesvogelblume beeindruckt mit leuchtend orangefarbenen und blauen Blueten, die einem Vogel aehneln.", - "categories": [ - "flowering", - "sun", - "large" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Volles Sonnenlicht", - "temp": "18-26 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_61ec02f0a706b922", - "name": "Paragraphenpflanze", - "botanicalName": "Cyperus alternifolius", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/15/Cyperus_alternifolius_2.jpg/330px-Cyperus_alternifolius_2.jpg", - "imageStatus": "ok", - "description": "Die Paragraphenpflanze hat lange, grasartige Blaetter, die sternfoermig vom Stiel abstehen. Sie liebt viel Wasser.", - "categories": [ - "high_humidity" - ], - "careInfo": { - "waterIntervalDays": 3, - "light": "Helles bis volles Licht", - "temp": "18-27 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_13543a8abb8f50c8", - "name": "Passionsblume", - "botanicalName": "Passiflora caerulea", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c9/Passiflora_caerulea.jpg/330px-Passiflora_caerulea.jpg", - "imageStatus": "ok", - "description": "Die Passionsblume ist eine faszinierende Kletterpflanze mit komplex strukturierten, blau-weissen Blueten.", - "categories": [ - "flowering", - "hanging" - ], - "careInfo": { - "waterIntervalDays": 5, - "light": "Helles bis volles Licht", - "temp": "15-27 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_b9a0c1910297e2cb", - "name": "Perlenschnur-Pflanze", - "botanicalName": "Senecio rowleyanus", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/04/Senecio_rowleyanus_2.jpg/330px-Senecio_rowleyanus_2.jpg", - "imageStatus": "ok", - "description": "Die Perlenschnur-Pflanze hat haengende Ranken mit kugelfoermigen, perlenaehnlichen Blaettern. Einzigartige Sukkulente.", - "categories": [ - "easy", - "succulent", - "hanging" - ], - "careInfo": { - "waterIntervalDays": 14, - "light": "Helles bis volles Licht", - "temp": "15-27 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_ab8fc977bd930772", - "name": "Peruanischer Fackelkaktus", - "botanicalName": "Cereus peruvianus", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/79/Cereus_repandus.jpg/330px-Cereus_repandus.jpg", - "imageStatus": "ok", - "description": "Der Peruanische Fackelkaktus ist ein saeulenfoermiger Kaktus, der im Innenraum bis zu 2 m hoch werden kann.", - "categories": [ - "easy", - "succulent", - "sun", - "large" - ], - "careInfo": { - "waterIntervalDays": 21, - "light": "Volles Sonnenlicht", - "temp": "15-35 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_f57319d9209a678f", - "name": "Petersilie", - "botanicalName": "Petroselinum crispum", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/39/Petroselinum_crispum.jpg/330px-Petroselinum_crispum.jpg", - "imageStatus": "ok", - "description": "Petersilie ist eines der meistgenutzten Kuechenkraeuter mit frisch-aromatischem Geschmack. Reich an Vitaminen.", - "categories": [ - "easy", - "medicinal" - ], - "careInfo": { - "waterIntervalDays": 3, - "light": "Helles Licht", - "temp": "10-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_d859b55b599f2742", - "name": "Petunie", - "botanicalName": "Petunia hybrida", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/3d/Petunia_hybrida_hort.%2C_flowers.jpg/330px-Petunia_hybrida_hort.%2C_flowers.jpg", - "imageStatus": "ok", - "description": "Die Petunie ist eine der beliebtesten Balkonpflanzen mit trichterfoermigen Blueten in unzaehligen Farben.", - "categories": [ - "easy", - "flowering", - "sun" - ], - "careInfo": { - "waterIntervalDays": 2, - "light": "Volles Sonnenlicht", - "temp": "15-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_9f46ccdc5b9b10f3", - "name": "Pfeilblatt", - "botanicalName": "Syngonium podophyllum", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/f7/Syngonium_podophyllum_-_Flickr_-_peganum.jpg/330px-Syngonium_podophyllum_-_Flickr_-_peganum.jpg", - "imageStatus": "ok", - "description": "Das Pfeilblatt hat charakteristisch pfeilfoermige Blaetter, die sich mit dem Alter weiterentwickeln.", - "categories": [ - "easy", - "hanging" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles indirektes Licht", - "temp": "16-27 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_c7b763cec4d30529", - "name": "Pferdeschwanzpalme", - "botanicalName": "Beaucarnea recurvata", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/73/Beaucarnea_recurvata.jpg/330px-Beaucarnea_recurvata.jpg", - "imageStatus": "ok", - "description": "Die Pferdeschwanzpalme hat einen verdickten Stammbasis als Wasserspeicher und lange, schmale Blaetter.", - "categories": [ - "easy", - "succulent", - "tree", - "sun" - ], - "careInfo": { - "waterIntervalDays": 21, - "light": "Volles Sonnenlicht", - "temp": "15-30 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_418e4442c57e9974", - "name": "Philodendron bipinnatifidum", - "botanicalName": "Philodendron bipinnatifidum", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/37/Philodendron_bipinnatifidum_kz01.jpg/330px-Philodendron_bipinnatifidum_kz01.jpg", - "imageStatus": "ok", - "description": "Philodendron bipinnatifidum hat grosse, tief gelappte Blaetter. Er entwickelt einen beeindruckenden, baumfoermigen Wuchs.", - "categories": [ - "easy", - "large" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles indirektes Licht", - "temp": "18-27 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_64223543ba5ff673", - "name": "Philodendron gloriosum", - "botanicalName": "Philodendron gloriosum", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/52/Philodendron_gloriosum1.jpg/330px-Philodendron_gloriosum1.jpg", - "imageStatus": "ok", - "description": "Philodendron gloriosum hat grosse, samtige, herzfoermige Blaetter mit weissen Rippen. Eine atemberaubende Pflanze.", - "categories": [ - "patterned", - "high_humidity", - "large" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles indirektes Licht", - "temp": "18-27 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_6a5d7ac021669bb4", - "name": "Primel", - "botanicalName": "Primula vulgaris", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/2d/Primula_vulgaris_white.jpg/330px-Primula_vulgaris_white.jpg", - "imageStatus": "ok", - "description": "Die Primel ist einer der ersten Fruehjahrs┬¡boten mit lebhaften Blueten in Gelb, Pink, Rot und Lila.", - "categories": [ - "flowering" - ], - "careInfo": { - "waterIntervalDays": 4, - "light": "Helles indirektes Licht", - "temp": "10-18 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_045dd35819e8793f", - "name": "Purpursonnentau", - "botanicalName": "Sarracenia purpurea", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/6e/Sarracenia_purpurea.jpg/330px-Sarracenia_purpurea.jpg", - "imageStatus": "ok", - "description": "Der Purpursonnentau ist eine fleischfressende Kannenpflanze mit purpurroten Kannen. Faengt Insekten.", - "categories": [ - "sun", - "high_humidity" - ], - "careInfo": { - "waterIntervalDays": 3, - "light": "Volles Sonnenlicht", - "temp": "5-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_1feebf3d053224a9", - "name": "Radieschen", - "botanicalName": "Raphanus sativus", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/5a/Radish_ps10.jpg/330px-Radish_ps10.jpg", - "imageStatus": "ok", - "description": "Das Radieschen ist ein schnellwachsendes Gemuese mit runden, roten Knollen. Es reift in nur 3-4 Wochen.", - "categories": [ - "easy" - ], - "careInfo": { - "waterIntervalDays": 2, - "light": "Helles bis volles Licht", - "temp": "10-22 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_563226faba183e0d", - "name": "Regenbogenmoos", - "botanicalName": "Selaginella uncinata", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/09/Selaginella_uncinata_at_SBG.jpg/330px-Selaginella_uncinata_at_SBG.jpg", - "imageStatus": "ok", - "description": "Das Regenbogenmoos hat schuppenfoermige Blaetter, die im Licht schillernd irisieren. Dekorativ fuer Terrarien.", - "categories": [ - "high_humidity", - "patterned" - ], - "careInfo": { - "waterIntervalDays": 5, - "light": "Helles indirektes Licht", - "temp": "18-27 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_a6883747d701df71", - "name": "Riemenblatt", - "botanicalName": "Clivia miniata", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/21/Clivia_miniata.jpg/330px-Clivia_miniata.jpg", - "imageStatus": "ok", - "description": "Das Riemenblatt ist eine dekorative Zimmerpflanze mit leuchtend orangefarbenen Blueten im Fruehling.", - "categories": [ - "flowering", - "low_light" - ], - "careInfo": { - "waterIntervalDays": 10, - "light": "Helles indirektes Licht", - "temp": "15-24 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_5e0e0211b3e815d1", - "name": "Rippenpeperomie", - "botanicalName": "Peperomia caperata", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/22/Peperomia_caperata_Rosso.jpg/330px-Peperomia_caperata_Rosso.jpg", - "imageStatus": "ok", - "description": "Die Rippenpeperomie hat tief gerippte, dunkelgruene bis violette Blaetter mit einer samtigen Textur.", - "categories": [ - "easy", - "pet_friendly" - ], - "careInfo": { - "waterIntervalDays": 10, - "light": "Helles indirektes Licht", - "temp": "18-26 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_f3c4aea00446ce7d", - "name": "Ritterstern", - "botanicalName": "Hippeastrum hybrid", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c7/Hippeastrum_%27Red_Lion%27.jpg/330px-Hippeastrum_%27Red_Lion%27.jpg", - "imageStatus": "ok", - "description": "Der Ritterstern beeindruckt im Winter mit riesigen, trompetenfoermigen Blueten in Rot, Pink oder Weiss.", - "categories": [ - "flowering", - "bright_light" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles bis volles Licht", - "temp": "18-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_ce9ff96b95f4fe81", - "name": "Rosengeranie", - "botanicalName": "Pelargonium graveolens", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/81/Pelargonium_graveolens.jpg/330px-Pelargonium_graveolens.jpg", - "imageStatus": "ok", - "description": "Die Rosengeranie ist eine Duftpflanze mit tief eingeschnittenen Blaettern und rosaenlichem Aroma.", - "categories": [ - "easy", - "medicinal", - "sun" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Volles Sonnenlicht", - "temp": "15-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_bc06c3ee948f7ba7", - "name": "Rosmarin", - "botanicalName": "Rosmarinus officinalis", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/ae/Rosemary_bush.jpg/330px-Rosemary_bush.jpg", - "imageStatus": "ok", - "description": "Rosmarin ist ein aromatisches Kraut mit nadelartigen Blaettern und blauen Blueten. In der Kueche unverzichtbar.", - "categories": [ - "easy", - "medicinal", - "sun" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Volles Sonnenlicht", - "temp": "10-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_a50df676efef7b7d", - "name": "Roter Fingerhut", - "botanicalName": "Digitalis purpurea", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a1/Digitalis_purpurea_Koehler.jpg/330px-Digitalis_purpurea_Koehler.jpg", - "imageStatus": "ok", - "description": "Der Rote Fingerhut hat hohe Bluetenstaende mit roehrenfoermigen, gepunkteten Blueten in Rosa. Wichtige Arzneipflanze.", - "categories": [ - "medicinal", - "flowering" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles bis volles Licht", - "temp": "10-20 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_4f9c3ae955d4b1b0", - "name": "Roter Philodendron", - "botanicalName": "Philodendron erubescens", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/18/Philodendron_erubescens.jpg/330px-Philodendron_erubescens.jpg", - "imageStatus": "ok", - "description": "Der Rote Philodendron hat glaenzende, herzfoermige Blaetter, die jung roetrlich erscheinen. Sehr dekorativ.", - "categories": [ - "easy", - "hanging" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles indirektes Licht", - "temp": "18-27 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_b6887f02c51a178f", - "name": "Salat", - "botanicalName": "Lactuca sativa", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/7f/Lettuce_in_garden.jpg/330px-Lettuce_in_garden.jpg", - "imageStatus": "ok", - "description": "Salat ist eine schnell wachsende Blattgemuese┬¡pflanze. Im Topf und Balkonkasten sehr gut zu kultivieren.", - "categories": [ - "easy" - ], - "careInfo": { - "waterIntervalDays": 3, - "light": "Helles bis volles Licht", - "temp": "10-22 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_e3f7fa02342527b0", - "name": "Salbei", - "botanicalName": "Salvia officinalis", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b2/Salvia_officinalis_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-118.jpg/330px-Salvia_officinalis_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-118.jpg", - "imageStatus": "ok", - "description": "Salbei ist ein aromatisches Heilkraut mit silbrig-gruenen Blaettern. Er hat antibakterielle und entzuendungshem┬¡mende Wirkung.", - "categories": [ - "easy", - "medicinal", - "sun" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Volles Sonnenlicht", - "temp": "10-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_5ce8d8944fd3edc3", - "name": "San-Pedro-Kaktus", - "botanicalName": "Echinopsis pachanoi", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/3d/Echinopsis_pachanoi.jpg/330px-Echinopsis_pachanoi.jpg", - "imageStatus": "ok", - "description": "Der San-Pedro-Kaktus ist ein schnell wachsender, saeulenfoermiger Kaktus aus den Anden.", - "categories": [ - "easy", - "succulent", - "sun" - ], - "careInfo": { - "waterIntervalDays": 14, - "light": "Volles Sonnenlicht", - "temp": "10-35 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_d30b54367d7c0ccc", - "name": "Satinpothos", - "botanicalName": "Scindapsus pictus", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/65/Scindapsus_pictus.jpg/330px-Scindapsus_pictus.jpg", - "imageStatus": "ok", - "description": "Der Satinpothos hat samtig-glaenzende, silbrig gefleckte Blaetter auf langen, haengenden Ranken.", - "categories": [ - "easy", - "hanging", - "patterned" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles indirektes Licht", - "temp": "18-28 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_cbc9b35001d4f2fa", - "name": "Schafgarbe", - "botanicalName": "Achillea millefolium", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/91/Achillea_millefolium.jpg/330px-Achillea_millefolium.jpg", - "imageStatus": "ok", - "description": "Die Schafgarbe hat weisse oder rosafarbene Bluetenschirme und fein gefiederte Blaetter. Wichtige Heilpflanze.", - "categories": [ - "medicinal", - "flowering", - "sun" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Volles Sonnenlicht", - "temp": "10-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_ceea5c9d9b527cea", - "name": "Schamkraut", - "botanicalName": "Mimosa pudica", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/8b/Mimosa_pudica_touch.jpg/330px-Mimosa_pudica_touch.jpg", - "imageStatus": "ok", - "description": "Das Schamkraut faltet seine Blaettchen blitzschnell zusammen, wenn man sie beruehrt. Ein faszinierendes Erlebnis.", - "categories": [ - "easy", - "pet_friendly" - ], - "careInfo": { - "waterIntervalDays": 5, - "light": "Helles bis volles Licht", - "temp": "20-28 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_f02576d98e962040", - "name": "Schmetterlingsorchidee", - "botanicalName": "Phalaenopsis amabilis", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/1a/Phalaenopsis_amabilis_Orchi_054.jpg/330px-Phalaenopsis_amabilis_Orchi_054.jpg", - "imageStatus": "ok", - "description": "Die Schmetterlingsorchidee ist die bekannteste Zimmerorchidee. Sie bluet bei guter Pflege monatelang.", - "categories": [ - "flowering", - "high_humidity" - ], - "careInfo": { - "waterIntervalDays": 10, - "light": "Helles indirektes Licht", - "temp": "18-28 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_1b8072d12aee4246", - "name": "Schnittlauch", - "botanicalName": "Allium schoenoprasum", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a2/Allium_schoenoprasum_close_up.jpg/330px-Allium_schoenoprasum_close_up.jpg", - "imageStatus": "ok", - "description": "Schnittlauch ist ein beliebtes Kuechenkraut mit roehrenfoermigen Blaettern und lila Blueten.", - "categories": [ - "easy", - "medicinal" - ], - "careInfo": { - "waterIntervalDays": 3, - "light": "Helles bis volles Licht", - "temp": "10-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_2dcb1ec9ac8b968f", - "name": "Schraubenbaum", - "botanicalName": "Pandanus veitchii", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/7e/Pandanus_utilis_Reunion.jpg/330px-Pandanus_utilis_Reunion.jpg", - "imageStatus": "ok", - "description": "Der Schraubenbaum hat spiralfoermig angeordnete, gruenweiss gestreifte Blaetter. Sehr dekorativ und exotisch.", - "categories": [ - "patterned", - "bright_light" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles bis volles Licht", - "temp": "18-27 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_40f7fbbd6ef0e3ba", - "name": "Schusterpflanze", - "botanicalName": "Aspidistra elatior", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/fc/Aspidistra_elatior1.jpg/330px-Aspidistra_elatior1.jpg", - "imageStatus": "ok", - "description": "Die Schusterpflanze ist eine extrem robuste Zimmerpflanze mit langen, dunkelgruenen Blaettern. Vertraegt tiefe Temperaturen.", - "categories": [ - "easy", - "low_light" - ], - "careInfo": { - "waterIntervalDays": 14, - "light": "Wenig bis helles Licht", - "temp": "10-20 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_fb7db49b3c127f71", - "name": "Schwarze Rose (Aeonium)", - "botanicalName": "Aeonium arboreum", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e2/Aeonium_arboreum_-_Schwarze_Rose_-_2009-03-14_-_Jardim_Botanico_Madeira_3.jpg/330px-Aeonium_arboreum_-_Schwarze_Rose_-_2009-03-14_-_Jardim_Botanico_Madeira_3.jpg", - "imageStatus": "ok", - "description": "Das Aeonium bildet dekorative, rosettenfoermige Sukkulenten an verzweigten Stielen.", - "categories": [ - "succulent", - "sun" - ], - "careInfo": { - "waterIntervalDays": 10, - "light": "Volles Sonnenlicht", - "temp": "10-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_183e544c5601be51", - "name": "Schwarzer Holunder", - "botanicalName": "Sambucus nigra", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/6f/Sambucus_nigra_2.jpg/330px-Sambucus_nigra_2.jpg", - "imageStatus": "ok", - "description": "Der Schwarze Holunder hat weisse Doldenbluten und schwarze Beeren. Die Fruechte werden fuer Sirup und Saft verwendet.", - "categories": [ - "medicinal", - "tree", - "flowering" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles bis volles Licht", - "temp": "10-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_fc5f536d0b2ff76e", - "name": "Schwertfarn", - "botanicalName": "Nephrolepis exaltata", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/30/Boston_Fern_%282873392811%29.png/330px-Boston_Fern_%282873392811%29.png", - "imageStatus": "ok", - "description": "Der Schwertfarn ist ein klassischer Zimmerfarn mit eleganten, herabh├ñngenden Wedeln. Liebt Feuchtigkeit.", - "categories": [ - "hanging", - "high_humidity", - "air_purifier" - ], - "careInfo": { - "waterIntervalDays": 3, - "light": "Helles indirektes Licht", - "temp": "16-24 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_3c6961985d686c33", - "name": "Silber-Weide", - "botanicalName": "Salix alba", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/42/Salix_alba_Morton.jpg/330px-Salix_alba_Morton.jpg", - "imageStatus": "ok", - "description": "Die Silber-Weide hat silbrig-glaenzende Blaetter. Weidenrinde enth├ñlt Salicylsaeure, die Grundlage von Aspirin.", - "categories": [ - "medicinal", - "tree", - "large" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles bis volles Licht", - "temp": "10-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_4d4483c9e8f98e94", - "name": "Silbervase", - "botanicalName": "Aechmea fasciata", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a0/Aechmea_fasciata1.jpg/330px-Aechmea_fasciata1.jpg", - "imageStatus": "ok", - "description": "Die Silbervase ist eine Bromelie mit silbrig geb├ñnderten Blaettern und einem rosafarbenen Bluetenstand.", - "categories": [ - "flowering", - "patterned" - ], - "careInfo": { - "waterIntervalDays": 10, - "light": "Helles indirektes Licht", - "temp": "18-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_24c71b67fe2ed42a", - "name": "Socotra-Wuestenrose", - "botanicalName": "Adenium socotranum", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/88/Adenium_socotranum_2.jpg/330px-Adenium_socotranum_2.jpg", - "imageStatus": "ok", - "description": "Die Socotra-Wuestenrose ist eine seltene, endemische Art mit einem sehr dicken, knolligen Stamm und rosa Blueten.", - "categories": [ - "succulent", - "flowering", - "sun" - ], - "careInfo": { - "waterIntervalDays": 14, - "light": "Volles Sonnenlicht", - "temp": "20-35 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_a91db7a3318f3302", - "name": "Sonnenhut", - "botanicalName": "Echinacea purpurea", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/9e/Purple_coneflower_Echinacea_purpurea.jpg/330px-Purple_coneflower_Echinacea_purpurea.jpg", - "imageStatus": "ok", - "description": "Der Sonnenhut ist eine beliebte Heilpflanze mit grossen, pinkfarbenen Blueten. Er staerkt das Immunsystem.", - "categories": [ - "medicinal", - "flowering", - "sun" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles bis volles Licht", - "temp": "15-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_0aa802b967afc69a", - "name": "Sonnentau", - "botanicalName": "Drosera capensis", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/18/Drosera_capensis.jpg/330px-Drosera_capensis.jpg", - "imageStatus": "ok", - "description": "Der Sonnentau faengt Insekten mit klebrigen Tropfen auf seinen Blaettern. Eine faszinierende fleischfressende Pflanze.", - "categories": [ - "sun", - "high_humidity" - ], - "careInfo": { - "waterIntervalDays": 5, - "light": "Volles Sonnenlicht", - "temp": "15-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_db7dd5c2bff6c42d", - "name": "Spanisches Moos", - "botanicalName": "Tillandsia usneoides", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/d5/Tillandsia_usneoides_0002.jpg/330px-Tillandsia_usneoides_0002.jpg", - "imageStatus": "ok", - "description": "Das Spanische Moos ist eine epiphytische Bromelie ohne Wurzeln, die in der Luft haengt. Es benoetigt nur Feuchtigkeitsbespruehing.", - "categories": [ - "easy", - "hanging", - "air_purifier" - ], - "careInfo": { - "waterIntervalDays": 3, - "light": "Helles bis volles Licht", - "temp": "15-30 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_ac11d9bd0c391e9d", - "name": "Speckbaum", - "botanicalName": "Portulacaria afra", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/73/Portulacaria_afra_2.jpg/330px-Portulacaria_afra_2.jpg", - "imageStatus": "ok", - "description": "Der Speckbaum ist eine sukkulente Pflanze mit roten Stielen und kleinen, runden, glaenzenden Blaettern.", - "categories": [ - "easy", - "succulent", - "sun" - ], - "careInfo": { - "waterIntervalDays": 14, - "light": "Helles bis volles Licht", - "temp": "15-30 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_477dc83da2cd56cb", - "name": "Spiegelpeperomie", - "botanicalName": "Peperomia obtusifolia", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/7c/Peperomia_obtusifolia1.jpg/330px-Peperomia_obtusifolia1.jpg", - "imageStatus": "ok", - "description": "Die Spiegelpeperomie hat glaenzende, lederartige, oval-runde Blaetter in tiefem Gruen. Sehr robust.", - "categories": [ - "easy", - "pet_friendly", - "low_light" - ], - "careInfo": { - "waterIntervalDays": 10, - "light": "Helles indirektes Licht", - "temp": "16-26 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_4f624a47f15a976c", - "name": "Spinat", - "botanicalName": "Spinacia oleracea", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/d1/Spinach_leaves.jpg/330px-Spinach_leaves.jpg", - "imageStatus": "ok", - "description": "Spinat ist ein naehrstoffreiches Blattgemuese mit dunkelgruenen Blaettern. Reich an Eisen und Vitaminen.", - "categories": [ - "easy", - "medicinal" - ], - "careInfo": { - "waterIntervalDays": 3, - "light": "Helles bis volles Licht", - "temp": "10-20 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_c3b438f135460578", - "name": "Stab-Palme", - "botanicalName": "Rhapis excelsa", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/65/Rhapis_excelsa_02.jpg/330px-Rhapis_excelsa_02.jpg", - "imageStatus": "ok", - "description": "Die Stab-Palme ist eine elegante Zimmerpalme mit faecher┬¡foermigen Blaettern auf duennen, bambusartigen Staemmen.", - "categories": [ - "low_light", - "tree" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles indirektes Licht", - "temp": "15-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_e6998b94b6aa9483", - "name": "Stiefmuetterchen", - "botanicalName": "Viola wittrockiana", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/ea/Violas_at_Butchart_Gardens.jpg/330px-Violas_at_Butchart_Gardens.jpg", - "imageStatus": "ok", - "description": "Das Stiefmuetterchen ist ein bekannter Fruehjahrsblueher mit charakteristisch gezeichneten Blueten.", - "categories": [ - "easy", - "flowering" - ], - "careInfo": { - "waterIntervalDays": 3, - "light": "Helles bis volles Licht", - "temp": "5-18 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_4e7aa106c2e0dbed", - "name": "Stiefmuetterchen-Orchidee", - "botanicalName": "Miltoniopsis roezlii", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Miltoniopsis_roezlii.jpg/330px-Miltoniopsis_roezlii.jpg", - "imageStatus": "ok", - "description": "Die Stiefmuetterchen-Orchidee hat grosse, flache Blueten. Bevorzugt kuehle Temperaturen und hohe Luftfeuchtigkeit.", - "categories": [ - "flowering", - "high_humidity" - ], - "careInfo": { - "waterIntervalDays": 5, - "light": "Indirektes Licht", - "temp": "15-22 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_67521f8578f80480", - "name": "Strahlenaralie", - "botanicalName": "Schefflera arboricola", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/30/Schefflera_arboricola_3.jpg/330px-Schefflera_arboricola_3.jpg", - "imageStatus": "ok", - "description": "Die Strahlenaralie hat fingerfoermig angeordnete, glaenzende Blaetter auf langen Stielen. Sehr robuste Zimmerpflanze.", - "categories": [ - "easy", - "air_purifier", - "tree" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles indirektes Licht", - "temp": "15-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_15d0205868b79470", - "name": "Stromanthe", - "botanicalName": "Stromanthe sanguinea", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/8e/Stromanthe_sanguinea.jpg/330px-Stromanthe_sanguinea.jpg", - "imageStatus": "ok", - "description": "Die Stromanthe hat dekorative Blaetter mit weissem Muster und leuchtend roter Unterseite. Familie der Marantaceen.", - "categories": [ - "patterned", - "high_humidity" - ], - "careInfo": { - "waterIntervalDays": 5, - "light": "Helles indirektes Licht", - "temp": "18-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_9d6e62be0b1cb281", - "name": "Studentenblume", - "botanicalName": "Tagetes patula", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/63/Marigold_Tagetes.jpg/330px-Marigold_Tagetes.jpg", - "imageStatus": "ok", - "description": "Die Studentenblume ist eine robuste Sommerblume mit orangen oder gelben Blueten. Sie haelt Schadlinge fern.", - "categories": [ - "easy", - "flowering", - "medicinal", - "sun" - ], - "careInfo": { - "waterIntervalDays": 3, - "light": "Volles Sonnenlicht", - "temp": "15-28 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_4b198e1fefa08544", - "name": "Suesskartoffel", - "botanicalName": "Ipomoea batatas", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b7/Ipomoea_batatas_006.JPG/330px-Ipomoea_batatas_006.JPG", - "imageStatus": "ok", - "description": "Die Suesskartoffel-Zierpflanze hat dekorative, herzfoermige Blaetter in gruen oder dunkelviolett. Ideal als Haengepflanze.", - "categories": [ - "easy", - "hanging", - "sun" - ], - "careInfo": { - "waterIntervalDays": 5, - "light": "Volles Sonnenlicht", - "temp": "20-30 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_876974955b59c59e", - "name": "Tanzerinnen-Orchidee", - "botanicalName": "Oncidium sphacelatum", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/ee/Oncidium_sphacelatum_-_Flickr_002.jpg/330px-Oncidium_sphacelatum_-_Flickr_002.jpg", - "imageStatus": "ok", - "description": "Die Tanzerinnen-Orchidee traegt lange Rispen mit Hunderten kleiner, gelb-brauner Blueten. Sehr reichliche Bluetracht.", - "categories": [ - "flowering", - "high_humidity" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles indirektes Licht", - "temp": "18-27 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_2ee0814c52ec43e5", - "name": "Taro", - "botanicalName": "Colocasia esculenta", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/7f/Colocasia_esculenta_-_Kalo_lo%27i_%28taro%29.jpg/330px-Colocasia_esculenta_-_Kalo_lo%27i_%28taro%29.jpg", - "imageStatus": "ok", - "description": "Der Taro ist eine tropische Pflanze mit grossen, herzfoermigen Blaettern. Die Knollen sind Nahrungsquelle.", - "categories": [ - "high_humidity", - "large" - ], - "careInfo": { - "waterIntervalDays": 3, - "light": "Helles indirektes Licht", - "temp": "18-30 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_8860c603977b7048", - "name": "Teestrauch", - "botanicalName": "Camellia sinensis", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/04/TeaPlantation.jpg/330px-TeaPlantation.jpg", - "imageStatus": "ok", - "description": "Der Teestrauch ist die Pflanze, aus deren Blaettern Tee gewonnen wird. Er hat weisse Blueten und glaenzende Blaetter.", - "categories": [ - "medicinal" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles indirektes Licht", - "temp": "15-22 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_716160bf88dd9d13", - "name": "Tempel-Baum", - "botanicalName": "Plumeria rubra", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/27/Plumeria_rubra_Puu_Waawaa.jpg/330px-Plumeria_rubra_Puu_Waawaa.jpg", - "imageStatus": "ok", - "description": "Der Tempel-Baum hat intensiv duftende, sternfoermige Blueten in Weiss, Gelb oder Rosa. Klassische Tropenblume.", - "categories": [ - "flowering", - "sun", - "tree" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Volles Sonnenlicht", - "temp": "20-30 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_9b35df06e64f0898", - "name": "Thymian", - "botanicalName": "Thymus vulgaris", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c7/Thymus_vulgaris_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-274.jpg/330px-Thymus_vulgaris_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-274.jpg", - "imageStatus": "ok", - "description": "Thymian ist ein kleiner, aromatischer Strauch mit winzigen Blaettern und rosa Blueten. Wichtiges Kuechenkraut.", - "categories": [ - "easy", - "medicinal", - "sun" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Volles Sonnenlicht", - "temp": "10-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_4318ad8d02f7a1e3", - "name": "Tiroler Keulenlilie", - "botanicalName": "Cordyline fruticosa", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/17/Cordyline_fruticosa1.jpg/330px-Cordyline_fruticosa1.jpg", - "imageStatus": "ok", - "description": "Die Tiroler Keulenlilie hat leuchtend rote, gruene oder buntlaubige Blaetter. Eine exotische Zimmerpflanze.", - "categories": [ - "easy", - "patterned" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles indirektes Licht", - "temp": "18-27 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_6209cff29d20de9d", - "name": "Tomate", - "botanicalName": "Solanum lycopersicum", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/88/Salad_garden_cherry_tomatoes_are_picked.jpg/330px-Salad_garden_cherry_tomatoes_are_picked.jpg", - "imageStatus": "ok", - "description": "Die Tomate ist eine beliebte Gemuese- und Balkonpflanze mit roten, saftigen Fruechten. Im Topf kultivierbar.", - "categories": [ - "easy", - "sun", - "medicinal" - ], - "careInfo": { - "waterIntervalDays": 3, - "light": "Volles Sonnenlicht", - "temp": "18-28 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_5b5d63d3d16734c3", - "name": "Traubenhyazinthe", - "botanicalName": "Muscari armeniacum", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/aa/Muscari_armeniacum_1.jpg/330px-Muscari_armeniacum_1.jpg", - "imageStatus": "ok", - "description": "Die Traubenhyazinthe bildet dichte Trauben aus kleinen, blauen bis violetten Gloeckchen. Zuverlaessige Fruejahrszwiebel.", - "categories": [ - "easy", - "flowering" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles bis volles Licht", - "temp": "8-18 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_79692a800f05a5e6", - "name": "Triphylla-Fuchsie", - "botanicalName": "Fuchsia triphylla", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c1/Fuchsia_triphylla.jpg/330px-Fuchsia_triphylla.jpg", - "imageStatus": "ok", - "description": "Die Triphylla-Fuchsie hat lange, roehrenfoermige, orangefarbe Blueten in haengenden Trauben. Sehr exotisch.", - "categories": [ - "flowering", - "hanging" - ], - "careInfo": { - "waterIntervalDays": 3, - "light": "Helles indirektes Licht", - "temp": "15-22 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_6ad4ada285b323dd", - "name": "Tueipelfarn", - "botanicalName": "Polypodium vulgare", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/67/Polypodium_vulgare_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-106.jpg/330px-Polypodium_vulgare_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-106.jpg", - "imageStatus": "ok", - "description": "Der Tueipelfarn ist ein heimischer Farn mit gelappten Wedeln und runden Sporenhaeufchen auf der Unterseite.", - "categories": [ - "easy", - "medicinal" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles indirektes Licht", - "temp": "10-20 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_f03bc24e17022dd9", - "name": "Tueipelfarn (Microsorum)", - "botanicalName": "Microsorum punctatum", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/06/Microsorum_punctatum_0002.JPG/330px-Microsorum_punctatum_0002.JPG", - "imageStatus": "ok", - "description": "Microsorum punctatum ist ein tropischer Farn mit langen, ungeteilten, glaenzenden Wedeln. Fuer feuchte Standorte.", - "categories": [ - "high_humidity" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles indirektes Licht", - "temp": "18-27 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_a90c8b9c4cddc806", - "name": "Tulpe", - "botanicalName": "Tulipa gesneriana", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/41/Beautiful_red_and_yellow_tulips.jpg/330px-Beautiful_red_and_yellow_tulips.jpg", - "imageStatus": "ok", - "description": "Die Tulpe ist eine der beliebtesten Fruehjahrsblueher mit kelchfoermigen Blueten in unzaehligen Farben.", - "categories": [ - "easy", - "flowering" - ], - "careInfo": { - "waterIntervalDays": 5, - "light": "Helles bis volles Licht", - "temp": "8-18 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_ea198ff58c8805c6", - "name": "Ufopflanze", - "botanicalName": "Pilea peperomioides", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/6d/Pilea_peperomioides_Chinese_money_plant.jpg/330px-Pilea_peperomioides_Chinese_money_plant.jpg", - "imageStatus": "ok", - "description": "Die Ufopflanze hat unverwechselbare, runde Blaetter auf langen Stielen. Bildet leicht Ableger zum Verschenken.", - "categories": [ - "easy", - "pet_friendly" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles indirektes Licht", - "temp": "13-30 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_40fc59a7783f4dbd", - "name": "Vanda-Orchidee", - "botanicalName": "Vanda coerulea", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/55/Vanda_coerulea.jpg/330px-Vanda_coerulea.jpg", - "imageStatus": "ok", - "description": "Die Vanda-Orchidee ist bekannt fuer ihre seltene blaue Bluetenfarbe. Epiphytische Orchidee mit grossen Blueten.", - "categories": [ - "flowering", - "high_humidity", - "bright_light" - ], - "careInfo": { - "waterIntervalDays": 3, - "light": "Helles bis volles Licht", - "temp": "20-30 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_ec96801b21f4b888", - "name": "Vanille", - "botanicalName": "Vanilla planifolia", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/3b/Vanilla_planifolia_flowers.jpg/330px-Vanilla_planifolia_flowers.jpg", - "imageStatus": "ok", - "description": "Die Vanille ist eine kletternde Orchidee, aus deren Fruechten das beliebte Gewuerz gewonnen wird.", - "categories": [ - "flowering", - "high_humidity", - "medicinal" - ], - "careInfo": { - "waterIntervalDays": 5, - "light": "Helles indirektes Licht", - "temp": "20-30 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_e0c02d30e9553083", - "name": "Venusfliegenfalle", - "botanicalName": "Dionaea muscipula", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/34/Dionaea_muscipula.jpg/330px-Dionaea_muscipula.jpg", - "imageStatus": "ok", - "description": "Die Venusfliegenfalle ist eine fleischfressende Pflanze mit klappfallartigen Blaettern. Faengt Insekten.", - "categories": [ - "sun" - ], - "careInfo": { - "waterIntervalDays": 5, - "light": "Volles Sonnenlicht", - "temp": "15-30 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_621534b573f3fbd1", - "name": "Vogelnest-Farn", - "botanicalName": "Asplenium nidus", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/8e/Asplenium_nidus_at_Palmengarten_Frankfurt.jpg/330px-Asplenium_nidus_at_Palmengarten_Frankfurt.jpg", - "imageStatus": "ok", - "description": "Der Vogelnest-Farn hat ganzrandige, glaenzende Wedel, die eine Nestform bilden. Sehr dekorativ und robust.", - "categories": [ - "easy", - "high_humidity", - "low_light" - ], - "careInfo": { - "waterIntervalDays": 5, - "light": "Helles indirektes Licht", - "temp": "18-27 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_b109c47be52f9ec8", - "name": "Wachsblume", - "botanicalName": "Hoya carnosa", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/5c/Hoya_carnosa.jpg/330px-Hoya_carnosa.jpg", - "imageStatus": "ok", - "description": "Die Wachsblume ist eine Kletterpflanze mit dicken, wachsartigen Blaettern und sternfoermigen, duftenden Blueten.", - "categories": [ - "easy", - "flowering", - "hanging" - ], - "careInfo": { - "waterIntervalDays": 10, - "light": "Helles indirektes Licht", - "temp": "16-27 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_632f108725deeafe", - "name": "Wandelroeschen", - "botanicalName": "Lantana camara", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/af/Lantana_camara_-_flowers.jpg/330px-Lantana_camara_-_flowers.jpg", - "imageStatus": "ok", - "description": "Das Wandelroeschen hat kugelige Bluetenkoepfe, die die Farbe von Gelb ueber Orange zu Rot wechseln. Sehr attraktiv.", - "categories": [ - "flowering", - "sun", - "bright_light" - ], - "careInfo": { - "waterIntervalDays": 5, - "light": "Volles Sonnenlicht", - "temp": "18-28 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_c64390ca3c3743fe", - "name": "Wasserschlauch", - "botanicalName": "Utricularia gibba", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/9d/Utricularia_gibba.jpg/330px-Utricularia_gibba.jpg", - "imageStatus": "ok", - "description": "Der Wasserschlauch ist eine wasserbewohnende fleischfressende Pflanze mit Schlaeuchen als Insekten┬¡fallen.", - "categories": [ - "high_humidity", - "sun" - ], - "careInfo": { - "waterIntervalDays": 2, - "light": "Helles bis volles Licht", - "temp": "15-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_33f62ca8680da000", - "name": "Weihnachtskaktus", - "botanicalName": "Schlumbergera truncata", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/ad/Schlumbergera_truncatus.jpg/330px-Schlumbergera_truncatus.jpg", - "imageStatus": "ok", - "description": "Der Weihnachtskaktus erfreut zur Weihnachtszeit mit leuchtenden Blueten in Rosa, Rot oder Weiss.", - "categories": [ - "easy", - "succulent", - "flowering" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles indirektes Licht", - "temp": "15-21 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_8218a6240dd4a406", - "name": "Weihnachtsstern", - "botanicalName": "Euphorbia pulcherrima", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/5b/Poinsettia_Euphorbia_pulcherrima_Red_Christmas.jpg/330px-Poinsettia_Euphorbia_pulcherrima_Red_Christmas.jpg", - "imageStatus": "ok", - "description": "Der Weihnachtsstern ist die klassische Winterpflanze mit leuchtend roten Hochblaettern. Er steht symbolisch fuer Weihnachten.", - "categories": [ - "flowering" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles indirektes Licht", - "temp": "15-22 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_4275140824142c04", - "name": "Weisse Strelitzie", - "botanicalName": "Strelitzia nicolai", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/ba/Strelitzia_nicolai_3.jpg/330px-Strelitzia_nicolai_3.jpg", - "imageStatus": "ok", - "description": "Die Weisse Strelitzie ist ein beeindruckender Zimmerstrauch mit grossen, blaugruenen Blaettern und weiss-blauen Blueten.", - "categories": [ - "large", - "tree", - "bright_light" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles bis volles Licht", - "temp": "18-27 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_0a06480067428b83", - "name": "Weisse Tradescantia", - "botanicalName": "Tradescantia fluminensis", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/3a/Tradescantia_fluminensis_2.jpg/330px-Tradescantia_fluminensis_2.jpg", - "imageStatus": "ok", - "description": "Die Weisse Tradescantia hat gruene Blaetter mit weisslichen Unterseiten. Sehr robust und schnellwachsend.", - "categories": [ - "easy", - "hanging" - ], - "careInfo": { - "waterIntervalDays": 5, - "light": "Helles indirektes Licht", - "temp": "15-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_316228d023b525c1", - "name": "Wermut", - "botanicalName": "Artemisia absinthium", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/00/Artemisia_absinthium.jpg/330px-Artemisia_absinthium.jpg", - "imageStatus": "ok", - "description": "Wermut ist ein stark aromatisches Heilkraut mit silbrig-gruenen, tief eingeschnittenen Blaettern. Fuer Kraeuterlikoere.", - "categories": [ - "medicinal", - "sun" - ], - "careInfo": { - "waterIntervalDays": 14, - "light": "Volles Sonnenlicht", - "temp": "10-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_77608bbef47bdc04", - "name": "Wuestenrose", - "botanicalName": "Adenium obesum", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/85/Adenium_obesum.jpg/330px-Adenium_obesum.jpg", - "imageStatus": "ok", - "description": "Die Wuestenrose ist eine sukkulente Zimmerpflanze mit dickem Stamm und leuchtend pinken Blueten.", - "categories": [ - "succulent", - "flowering", - "sun" - ], - "careInfo": { - "waterIntervalDays": 10, - "light": "Volles Sonnenlicht", - "temp": "20-35 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_a0e4e7fa68bbad41", - "name": "Yucca-Palme", - "botanicalName": "Yucca elephantipes", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/18/Yucca_elephantipes_2012.jpg/330px-Yucca_elephantipes_2012.jpg", - "imageStatus": "ok", - "description": "Die Yucca-Palme ist eine robuste Zimmerpflanze mit starrem, immergruenem Blaetterschopf auf einem dicken Stamm.", - "categories": [ - "easy", - "tree", - "sun" - ], - "careInfo": { - "waterIntervalDays": 14, - "light": "Helles bis volles Licht", - "temp": "15-28 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_49c4a36c24338324", - "name": "Zamioculcas", - "botanicalName": "Zamioculcas zamiifolia", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/cf/Zamioculcas_zamiifolia_1.jpg/330px-Zamioculcas_zamiifolia_1.jpg", - "imageStatus": "ok", - "description": "Die Zamioculcas ist eine ausdauernde Zimmerpflanze mit glaenzenden Fiederbl├ñttern. Sehr trockenheitstolerant.", - "categories": [ - "easy", - "low_light", - "air_purifier" - ], - "careInfo": { - "waterIntervalDays": 14, - "light": "Wenig bis helles Licht", - "temp": "15-26 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_28107fe5558dfaa3", - "name": "Zaubernuss", - "botanicalName": "Hamamelis mollis", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/79/Hamamelis_mollis_J2.jpg/330px-Hamamelis_mollis_J2.jpg", - "imageStatus": "ok", - "description": "Die Zaubernuss bluet im Winter mit fadendunnen, gelben Bluetenkranzeln, die bis -10 Grad standhalten.", - "categories": [ - "flowering", - "medicinal" - ], - "careInfo": { - "waterIntervalDays": 10, - "light": "Helles bis volles Licht", - "temp": "10-20 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_75abff461b3d9bf8", - "name": "Zebra-Haworthie", - "botanicalName": "Haworthia fasciata", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/2d/Haworthia_fasciata01.jpg/330px-Haworthia_fasciata01.jpg", - "imageStatus": "ok", - "description": "Die Zebra-Haworthie ist eine kompakte Sukkulente mit weissen Querstreifen auf dunkelgruenen Blaettern.", - "categories": [ - "easy", - "succulent", - "low_light" - ], - "careInfo": { - "waterIntervalDays": 14, - "light": "Helles indirektes Licht", - "temp": "15-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_f7d0af5f2c284fff", - "name": "Zebrakraut", - "botanicalName": "Tradescantia zebrina", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/d9/Tradescantia_zebrina_-_Starr_%28cropped%29.jpg/330px-Tradescantia_zebrina_-_Starr_%28cropped%29.jpg", - "imageStatus": "ok", - "description": "Das Zebrakraut faellt durch seine silbrig-lila gestreiften Blaetter auf. Schnellwachsende Haengepflanze.", - "categories": [ - "easy", - "hanging", - "patterned" - ], - "careInfo": { - "waterIntervalDays": 5, - "light": "Helles indirektes Licht", - "temp": "15-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_ec8a05c334d66976", - "name": "Zinnie", - "botanicalName": "Zinnia elegans", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/25/Zinnia_elegans_cv_Giant_Dahlia_Flowered_Scarlet.jpg/330px-Zinnia_elegans_cv_Giant_Dahlia_Flowered_Scarlet.jpg", - "imageStatus": "ok", - "description": "Die Zinnie ist eine leuchtende Sommerblume mit grossen, dahlienaehnlichen Blueten. Sehr robust und hitzetolerant.", - "categories": [ - "easy", - "flowering", - "sun" - ], - "careInfo": { - "waterIntervalDays": 3, - "light": "Volles Sonnenlicht", - "temp": "18-30 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_29250eba0cf2291f", - "name": "Zitronenbaum", - "botanicalName": "Citrus limon", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/18/Citrus_limon_Lemon_%28Rutaceae%29_Fruit.jpg/330px-Citrus_limon_Lemon_%28Rutaceae%29_Fruit.jpg", - "imageStatus": "ok", - "description": "Der Zitronenbaum ist ein kleiner, immergruener Baum mit weissen, duftenden Blueten und gelben Fruechten.", - "categories": [ - "sun", - "tree", - "medicinal" - ], - "careInfo": { - "waterIntervalDays": 5, - "light": "Volles Sonnenlicht", - "temp": "18-28 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_8febd56fe7368d57", - "name": "Zitronenmelisse", - "botanicalName": "Melissa officinalis", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/40/Melissa_officinalis_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-089.jpg/330px-Melissa_officinalis_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-089.jpg", - "imageStatus": "ok", - "description": "Die Zitronenmelisse ist ein zitronig duftendes Heilkraut. Sie beruhigt die Nerven und foerdert den Schlaf.", - "categories": [ - "easy", - "medicinal" - ], - "careInfo": { - "waterIntervalDays": 5, - "light": "Helles bis volles Licht", - "temp": "15-25 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_3a3d31c9d818021b", - "name": "Zwergdattelpalme", - "botanicalName": "Phoenix roebelenii", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/41/Phoenix_roebelenii0.jpg/330px-Phoenix_roebelenii0.jpg", - "imageStatus": "ok", - "description": "Die Zwergdattelpalme ist eine zierliche Palme mit eleganten, gebogenen Fiederblaettern. Tropisches Flair.", - "categories": [ - "tree", - "bright_light" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles bis volles Licht", - "temp": "18-27 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_5c8f76b2c7d187f1", - "name": "Zylindrischer Bogenhanf", - "botanicalName": "Sansevieria cylindrica", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a2/Sansevieria_cylindrica.jpg/330px-Sansevieria_cylindrica.jpg", - "imageStatus": "ok", - "description": "Der Zylindrische Bogenhanf hat zylindrische, aufrechte Blaetter, die sich nach oben verjuengen. Sehr pflegeleicht.", - "categories": [ - "easy", - "succulent", - "sun" - ], - "careInfo": { - "waterIntervalDays": 14, - "light": "Helles bis volles Licht", - "temp": "15-27 ┬░C" - }, - "confidence": 1 - }, - { - "id": "plant_7fe204e226887efa", - "name": "Zymbidium", - "botanicalName": "Cymbidium lowianum", - "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/94/Cymbidium_Orchidglade_Davos_Orchid_%28Orchi%29.jpg/330px-Cymbidium_Orchidglade_Davos_Orchid_%28Orchi%29.jpg", - "imageStatus": "ok", - "description": "Das Zymbidium ist eine robuste Orchidee mit langen, grassartigen Blaettern und eleganten Bluetenrispen.", - "categories": [ - "flowering" - ], - "careInfo": { - "waterIntervalDays": 7, - "light": "Helles Licht", - "temp": "12-24 ┬░C" - }, - "confidence": 1 - } -] +[ + { + "id": "plant_8bfe537a28c86289", + "name": "Aasblume", + "botanicalName": "Stapelia grandiflora", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/2c/Stapelia_grandiflora_flowers.jpg/330px-Stapelia_grandiflora_flowers.jpg", + "imageStatus": "ok", + "description": "Die Aasblume hat fleischige, gruene Staengel und riesige, sternfoermige Blueten mit aasartigem Duft.", + "categories": [ + "succulent", + "flowering", + "sun" + ], + "careInfo": { + "waterIntervalDays": 14, + "light": "Helles bis volles Licht", + "temp": "18-30 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_3e0a9ac0f2e3487e", + "name": "Adromischus", + "botanicalName": "Adromischus cristatus", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/14/Adromischus_cristatus.jpg/330px-Adromischus_cristatus.jpg", + "imageStatus": "ok", + "description": "Adromischus ist eine kompakte Sukkulente mit ungewoehnlich wellenrandigen Blaettern auf kurzen Staengeln.", + "categories": [ + "easy", + "succulent", + "sun" + ], + "careInfo": { + "waterIntervalDays": 14, + "light": "Helles bis volles Licht", + "temp": "15-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_b149587ebd02e88b", + "name": "Afrikanisches Veilchen", + "botanicalName": "Saintpaulia ionantha", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/73/African_violet_Saintpaulia_ionantha.jpg/330px-African_violet_Saintpaulia_ionantha.jpg", + "imageStatus": "ok", + "description": "Das Afrikanische Veilchen ist eine kleine, kompakte Bluehpflanze mit samtigen Blaettern und violetten Blueten.", + "categories": [ + "easy", + "flowering", + "low_light" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles indirektes Licht", + "temp": "18-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_163ec12a26b24198", + "name": "Agave", + "botanicalName": "Agave americana", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/58/Agave_americana_%28detail%29.jpg/330px-Agave_americana_%28detail%29.jpg", + "imageStatus": "ok", + "description": "Die Agave ist eine imposante Sukkulente mit steifen, blaugruenen Blaettern mit Stacheln. Sie bluet nur einmal.", + "categories": [ + "succulent", + "sun", + "large" + ], + "careInfo": { + "waterIntervalDays": 21, + "light": "Volles Sonnenlicht", + "temp": "10-35 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_f35722f0d85fcbf0", + "name": "Aglaoneme", + "botanicalName": "Aglaonema commutatum", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/13/Aglaonema_commutatum.jpg/330px-Aglaonema_commutatum.jpg", + "imageStatus": "ok", + "description": "Die Aglaoneme ist eine dekorative Zimmerpflanze mit silbrig-gruen gemusterten Blaettern. Tolerant gegenueber wenig Licht.", + "categories": [ + "easy", + "low_light", + "patterned" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Wenig bis helles Licht", + "temp": "15-26 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_929f7f7041e0b030", + "name": "Aloe Vera", + "botanicalName": "Aloe vera", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/05/Aloe_Vera_houseplant.jpg/330px-Aloe_Vera_houseplant.jpg", + "imageStatus": "ok", + "description": "Aloe Vera ist eine beliebte Heilpflanze. Das Gel wird fuer Haut- und Wundpflege verwendet.", + "categories": [ + "easy", + "succulent", + "medicinal", + "sun" + ], + "careInfo": { + "waterIntervalDays": 14, + "light": "Volles Sonnenlicht", + "temp": "18-24 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_521cc31a3ab2a5b1", + "name": "Alpenveilchen", + "botanicalName": "Cyclamen persicum", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/84/Cyclamen_persicum.jpg/330px-Cyclamen_persicum.jpg", + "imageStatus": "ok", + "description": "Das Alpenveilchen bluet im Herbst und Winter mit eleganten Blueten in Rosa, Rot oder Weiss.", + "categories": [ + "flowering" + ], + "careInfo": { + "waterIntervalDays": 5, + "light": "Helles indirektes Licht", + "temp": "12-18 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_c623dbd931826123", + "name": "Amazona-Taro", + "botanicalName": "Alocasia amazonica", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/7e/Alocasia_%27Polly%27_or_Amazon_Taro.jpg/330px-Alocasia_%27Polly%27_or_Amazon_Taro.jpg", + "imageStatus": "ok", + "description": "Der Amazona-Taro besticht mit dunkelgruenen, pfeilfoermigen Blaettern mit markant weissen Rippen.", + "categories": [ + "patterned", + "high_humidity", + "large" + ], + "careInfo": { + "waterIntervalDays": 5, + "light": "Indirektes Licht", + "temp": "18-27 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_c2890f36d8fc9da0", + "name": "Arnika", + "botanicalName": "Arnica montana", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/eb/Arnica_montana_full.jpg/330px-Arnica_montana_full.jpg", + "imageStatus": "ok", + "description": "Arnika ist eine bekannte Heilpflanze aus den Alpen mit goldgelben Korbbluten. Sie wird fuer Muskeln und Gelenke verwendet.", + "categories": [ + "medicinal", + "flowering", + "sun" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Volles Sonnenlicht", + "temp": "10-20 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_fdadaf062de2c567", + "name": "Aubergine", + "botanicalName": "Solanum melongena", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/55/Aubergine.jpg/330px-Aubergine.jpg", + "imageStatus": "ok", + "description": "Die Aubergine ist eine Gemuese┬¡pflanze mit grossen, violetten Fruechten. Sie benoetigt viel Waerme und Sonne.", + "categories": [ + "sun", + "bright_light" + ], + "careInfo": { + "waterIntervalDays": 5, + "light": "Volles Sonnenlicht", + "temp": "20-30 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_480619fefb890692", + "name": "Baldrian", + "botanicalName": "Valeriana officinalis", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/8a/Valeriana_officinalis_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-105.jpg/330px-Valeriana_officinalis_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-105.jpg", + "imageStatus": "ok", + "description": "Baldrian ist ein bekanntes Heilkraut mit weissen bis roeslichen Blueten. Die Wurzeln werden zur Schlaffoerderung verwendet.", + "categories": [ + "medicinal", + "flowering" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles bis volles Licht", + "temp": "15-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_b73b967c062264fa", + "name": "Bambusrohr", + "botanicalName": "Bambusa vulgaris", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/47/BambusaVulgarisStriata.jpg/330px-BambusaVulgarisStriata.jpg", + "imageStatus": "ok", + "description": "Das Bambusrohr ist eine schnell wachsende Bambusart mit gelbgruenen Halmen. Sehr dekorativ und vielseitig nutzbar.", + "categories": [ + "easy", + "large" + ], + "careInfo": { + "waterIntervalDays": 5, + "light": "Helles bis volles Licht", + "temp": "15-30 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_1b52f8bc38189420", + "name": "Bananenpflanze", + "botanicalName": "Musa acuminata", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/be/Musa_acuminata_1_%28Luc_Viatour%29.jpg/330px-Musa_acuminata_1_%28Luc_Viatour%29.jpg", + "imageStatus": "ok", + "description": "Die Bananenpflanze ist eine tropische Staude mit riesigen, glaenzenden Blaettern. Im Zimmer selten fruechttragend.", + "categories": [ + "large", + "high_humidity" + ], + "careInfo": { + "waterIntervalDays": 5, + "light": "Helles bis volles Licht", + "temp": "20-30 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_65672e0cb49ca62d", + "name": "Basilikum", + "botanicalName": "Ocimum basilicum", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/90/Basil-Basilico-Ocimum_basilicum-albahaca.jpg/330px-Basil-Basilico-Ocimum_basilicum-albahaca.jpg", + "imageStatus": "ok", + "description": "Basilikum ist das beliebteste Kuechenkraut mit intensiv aromatischen, gruenen Blaettern. Fuer Pesto verwendet.", + "categories": [ + "easy", + "medicinal", + "sun" + ], + "careInfo": { + "waterIntervalDays": 2, + "light": "Volles Sonnenlicht", + "temp": "18-30 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_11f9d18d047193e4", + "name": "Bergpalme", + "botanicalName": "Chamaedorea elegans", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/8e/Chamaedorea_elegans2.jpg/330px-Chamaedorea_elegans2.jpg", + "imageStatus": "ok", + "description": "Die Bergpalme ist eine kompakte Zimmerpalme fuer schattigere Standorte. Ideal fuer dunkle Innenraeume.", + "categories": [ + "easy", + "low_light", + "tree", + "air_purifier" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Wenig bis helles Licht", + "temp": "15-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_519742b7ea9df158", + "name": "Billbergia", + "botanicalName": "Billbergia nutans", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e8/Billbergia_nutans.jpg/330px-Billbergia_nutans.jpg", + "imageStatus": "ok", + "description": "Die Billbergia ist eine robuste Bromelie mit schmalen, gruenen Blaettern und h├ñngenden, blauen und gruenen Blueten.", + "categories": [ + "easy", + "flowering" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles indirektes Licht", + "temp": "15-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_2347cc2289a2ef8b", + "name": "Birkenfeige", + "botanicalName": "Ficus benjamina", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/25/Ficus_benjamina.jpg/330px-Ficus_benjamina.jpg", + "imageStatus": "ok", + "description": "Die Birkenfeige ist ein eleganter Zimmerstrauch mit haengenden Aesten und kleinen, glaenzenden Blaettern.", + "categories": [ + "tree", + "air_purifier" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles indirektes Licht", + "temp": "16-24 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_4be713bff78ae299", + "name": "Blauer Kreuzkraut", + "botanicalName": "Senecio serpens", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/45/Blue_chalk_sticks_%28Senecio_serpens%29.jpg/330px-Blue_chalk_sticks_%28Senecio_serpens%29.jpg", + "imageStatus": "ok", + "description": "Der Blaue Kreuzkraut hat zylindrische, blaublaugruene Blaetter und einen kriechenden Wuchs. Sehr dekorativ.", + "categories": [ + "easy", + "succulent", + "sun" + ], + "careInfo": { + "waterIntervalDays": 14, + "light": "Helles bis volles Licht", + "temp": "15-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_51da778adc3d568f", + "name": "Blaues Kanaelfarn", + "botanicalName": "Phlebodium aureum", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e1/Phlebodium_aureum_1.jpg/330px-Phlebodium_aureum_1.jpg", + "imageStatus": "ok", + "description": "Der Blaue Kanaelfarn hat wachsartige, blaugruene Wedel und glaenzende Wurzelstaemme. Sehr dekorativ.", + "categories": [ + "high_humidity", + "air_purifier" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles indirektes Licht", + "temp": "18-27 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_f696d8640ac1e58b", + "name": "Bleistiftkaktus", + "botanicalName": "Euphorbia tirucalli", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/59/Euphorbia_tirucalli.jpg/330px-Euphorbia_tirucalli.jpg", + "imageStatus": "ok", + "description": "Der Bleistiftkaktus ist eine sukkulente Wolfsmilch mit duennen, zylindrischen Zweigen ohne Blaetter.", + "categories": [ + "easy", + "succulent", + "sun" + ], + "careInfo": { + "waterIntervalDays": 14, + "light": "Volles Sonnenlicht", + "temp": "18-30 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_fcfdae786a599215", + "name": "Bleiwurz", + "botanicalName": "Plumbago auriculata", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/f3/Plumbago_auriculata.jpg/330px-Plumbago_auriculata.jpg", + "imageStatus": "ok", + "description": "Die Bleiwurz ist ein halbimmergruener Strauch mit himmelblauen Blueten, der fast das ganze Jahr bluet.", + "categories": [ + "flowering", + "sun", + "bright_light" + ], + "careInfo": { + "waterIntervalDays": 5, + "light": "Volles Sonnenlicht", + "temp": "15-27 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_2778ede47b41928b", + "name": "Blumenschilfrohr", + "botanicalName": "Canna indica", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c9/Canna_indica2.jpg/330px-Canna_indica2.jpg", + "imageStatus": "ok", + "description": "Das Blumenschilfrohr hat grosse, tropisch wirkende Blaetter und auffaellige Blueten in Rot, Orange oder Gelb.", + "categories": [ + "flowering", + "sun", + "large" + ], + "careInfo": { + "waterIntervalDays": 5, + "light": "Volles Sonnenlicht", + "temp": "18-28 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_7b30624e5b0b4c89", + "name": "Blutroter Storchschnabel", + "botanicalName": "Geranium sanguineum", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/34/Geranium_sanguineum_R01.jpg/330px-Geranium_sanguineum_R01.jpg", + "imageStatus": "ok", + "description": "Der Blutrote Storchschnabel ist ein zierlicher Storchschnabel mit intensiv magentafarbenen Blueten.", + "categories": [ + "easy", + "flowering" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles bis volles Licht", + "temp": "10-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_766e50dd1b0308ae", + "name": "Bogenhanf", + "botanicalName": "Sansevieria trifasciata", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/fb/Snake_Plant_%28Sansevieria_trifasciata_%27Laurentii%27%29.jpg/330px-Snake_Plant_%28Sansevieria_trifasciata_%27Laurentii%27%29.jpg", + "imageStatus": "ok", + "description": "Der Bogenhanf ist eine pflegeleichte Sukkulente. Reinigt die Luft und vertraegt Vernachlaessigung.", + "categories": [ + "easy", + "low_light", + "air_purifier" + ], + "careInfo": { + "waterIntervalDays": 14, + "light": "Wenig bis helles Licht", + "temp": "15-27 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_c71619cd9a02cef2", + "name": "Bonsai-Feige", + "botanicalName": "Ficus retusa", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b7/Ficus_retusa_bonsai_10.jpg/330px-Ficus_retusa_bonsai_10.jpg", + "imageStatus": "ok", + "description": "Die Bonsai-Feige ist eine klassische Bonsai-Art mit kleinen, elliptischen Blaettern. Sehr formbar.", + "categories": [ + "easy", + "tree" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles indirektes Licht", + "temp": "16-24 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_a65e5c9dedb9cd6f", + "name": "Bougainvillea", + "botanicalName": "Bougainvillea spectabilis", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e4/Bougainvillea_spectabilis_Willd.jpg/330px-Bougainvillea_spectabilis_Willd.jpg", + "imageStatus": "ok", + "description": "Die Bougainvillea ist eine rankenreiche Kletterpflanze mit leuchtend farbigen Hochblaettern in Rot, Orange oder Pink.", + "categories": [ + "flowering", + "sun", + "bright_light" + ], + "careInfo": { + "waterIntervalDays": 5, + "light": "Volles Sonnenlicht", + "temp": "18-30 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_34a9a605f91a0e38", + "name": "Brutblatt", + "botanicalName": "Kalanchoe daigremontiana", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/8d/Kalanchoe_daigremontiana.jpg/330px-Kalanchoe_daigremontiana.jpg", + "imageStatus": "ok", + "description": "Das Brutblatt bildet entlang des Blattrandes zahlreiche kleine Jungpflanzen. Eine faszinierende Sukkulente.", + "categories": [ + "easy", + "succulent", + "sun" + ], + "careInfo": { + "waterIntervalDays": 14, + "light": "Helles bis volles Licht", + "temp": "15-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_ca3703f121432723", + "name": "Buntblatt", + "botanicalName": "Caladium bicolor", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/cd/Caladium_bicolor_002.JPG/330px-Caladium_bicolor_002.JPG", + "imageStatus": "ok", + "description": "Das Buntblatt beeindruckt mit transparenten, bunt gemusterten Blaettern in Pink, Rot, Weiss und Gruen.", + "categories": [ + "patterned", + "high_humidity" + ], + "careInfo": { + "waterIntervalDays": 5, + "light": "Indirektes Licht", + "temp": "20-30 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_de32e74f5d2e4f07", + "name": "Calibrachoa", + "botanicalName": "Calibrachoa hybrida", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/0a/Calibrachoa_hybrid_2.jpg/330px-Calibrachoa_hybrid_2.jpg", + "imageStatus": "ok", + "description": "Calibrachoa ist eine petunienaehnliche Haengepflanze mit unzaehligen, kleinen Trichterbluten in allen Farben.", + "categories": [ + "easy", + "flowering", + "hanging", + "sun" + ], + "careInfo": { + "waterIntervalDays": 2, + "light": "Volles Sonnenlicht", + "temp": "15-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_df8b72684a52d16d", + "name": "Calla", + "botanicalName": "Zantedeschia aethiopica", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/1c/Zantedeschia_aethiopica_2.jpg/330px-Zantedeschia_aethiopica_2.jpg", + "imageStatus": "ok", + "description": "Die Calla hat elegante, trichterfoermige weisse Hochblaetter und glaenzende, herzfoermige Blaetter. Sehr edel.", + "categories": [ + "flowering", + "high_humidity" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles indirektes Licht", + "temp": "15-24 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_c1e5518101af0660", + "name": "Callisia", + "botanicalName": "Callisia repens", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/09/Callisia_repens2.jpg/330px-Callisia_repens2.jpg", + "imageStatus": "ok", + "description": "Callisia repens ist ein kleines, kriechendes Kraut mit winzigen, gruenen Blaettern. Ideal fuer haengende Behaelter.", + "categories": [ + "easy", + "hanging", + "pet_friendly" + ], + "careInfo": { + "waterIntervalDays": 5, + "light": "Helles indirektes Licht", + "temp": "15-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_e98319d5942ee47b", + "name": "Cattleya-Orchidee", + "botanicalName": "Cattleya labiata", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/bf/Cattleya_labiata_var_autumnalis.jpg/330px-Cattleya_labiata_var_autumnalis.jpg", + "imageStatus": "ok", + "description": "Die Cattleya ist die Koenigin der Orchideen mit ueppigen, duftenden Blueten in Lila, Rosa und Weiss.", + "categories": [ + "flowering", + "high_humidity" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles indirektes Licht", + "temp": "18-28 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_f5fef1b22db032e8", + "name": "Chili", + "botanicalName": "Capsicum annuum", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/f9/Chili_pepper_red.jpg/330px-Chili_pepper_red.jpg", + "imageStatus": "ok", + "description": "Chili ist eine beliebte Gemuese- und Zierpflanze mit leuchtenden, roten oder orangen Fruechten. Im Topf kultivierbar.", + "categories": [ + "easy", + "sun", + "medicinal" + ], + "careInfo": { + "waterIntervalDays": 4, + "light": "Volles Sonnenlicht", + "temp": "20-30 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_282d1b42588a5121", + "name": "Chinesische F├ñcherpalme", + "botanicalName": "Livistona chinensis", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/81/Livistona_chinensis_1.jpg/330px-Livistona_chinensis_1.jpg", + "imageStatus": "ok", + "description": "Die Chinesische F├ñcherpalme hat grosse, faecher┬¡foermige Blaetter auf einem einzelnen Stamm. Sehr dekorativ.", + "categories": [ + "tree", + "bright_light" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles bis volles Licht", + "temp": "15-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_beef88438a4a5a77", + "name": "Chinesische Rose", + "botanicalName": "Rosa chinensis", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/d4/Rosa_chinensis_at_Dunedin_Botanic_Garden_1.jpg/330px-Rosa_chinensis_at_Dunedin_Botanic_Garden_1.jpg", + "imageStatus": "ok", + "description": "Die Chinesische Rose ist eine der Stammarten vieler Gartenrosen und bluet fast ununterbrochen.", + "categories": [ + "flowering", + "sun" + ], + "careInfo": { + "waterIntervalDays": 5, + "light": "Volles Sonnenlicht", + "temp": "15-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_3062bd4ee2363d81", + "name": "Chinesischer Blauregen", + "botanicalName": "Wisteria sinensis", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/92/Wisteria_sinensis.jpg/330px-Wisteria_sinensis.jpg", + "imageStatus": "ok", + "description": "Der Chinesische Blauregen ist ein ueppiger Kletterkuenstler mit langen, duftenden Bluetentrauben in Lila.", + "categories": [ + "flowering", + "sun", + "large" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Volles Sonnenlicht", + "temp": "10-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_552c1df47769e60a", + "name": "Christusdorn", + "botanicalName": "Euphorbia milii", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/3a/Euphorbia_milii.jpg/330px-Euphorbia_milii.jpg", + "imageStatus": "ok", + "description": "Der Christusdorn ist eine sukkulente Wolfsmilch mit stacheligen Zweigen und kleinen roten oder gelben Hochblaettern.", + "categories": [ + "easy", + "succulent", + "flowering", + "sun" + ], + "careInfo": { + "waterIntervalDays": 10, + "light": "Helles bis volles Licht", + "temp": "15-28 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_d726e9204f2d2353", + "name": "Chrysantheme", + "botanicalName": "Chrysanthemum indicum", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/65/Chrysanthemum_indicum1.jpg/330px-Chrysanthemum_indicum1.jpg", + "imageStatus": "ok", + "description": "Die Chrysantheme ist die klassische Herbstblume mit ueppigen, dichten Blueten in vielen Farben.", + "categories": [ + "flowering" + ], + "careInfo": { + "waterIntervalDays": 4, + "light": "Helles bis volles Licht", + "temp": "12-22 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_79e87c68ecaf5082", + "name": "Columnea", + "botanicalName": "Columnea gloriosa", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/27/Columnea_gloriosa1.jpg/330px-Columnea_gloriosa1.jpg", + "imageStatus": "ok", + "description": "Die Columnea ist eine haengende Zimmerpflanze mit kleinen, behaarten Blaettern und leuchtend roten, roehrenfoermigen Blueten.", + "categories": [ + "flowering", + "hanging", + "high_humidity" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles indirektes Licht", + "temp": "18-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_5136b27d56c24f26", + "name": "Cryptanthus", + "botanicalName": "Cryptanthus bivittatus", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/cd/Cryptanthus_bivittatus.jpg/330px-Cryptanthus_bivittatus.jpg", + "imageStatus": "ok", + "description": "Cryptanthus ist eine niedrig wachsende Bromelie mit sternfoermigen Rosetten und gemusterten Blaettern. Fuer Terrarien.", + "categories": [ + "patterned", + "high_humidity" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles indirektes Licht", + "temp": "18-27 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_177a5dd7d3237533", + "name": "Ctenanthe", + "botanicalName": "Ctenanthe burle-marxii", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/39/Ctenanthe_burle-marxii.jpg/330px-Ctenanthe_burle-marxii.jpg", + "imageStatus": "ok", + "description": "Die Ctenanthe hat faszinierend gemusterte Blaetter mit dunkelgruunem Fischgraetenmuster auf hellgruunem Hintergrund.", + "categories": [ + "patterned", + "high_humidity" + ], + "careInfo": { + "waterIntervalDays": 5, + "light": "Indirektes Licht", + "temp": "18-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_d38f9fdbd2fc0128", + "name": "Dahlie", + "botanicalName": "Dahlia pinnata", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/00/Dahlia_x_hybrida.jpg/330px-Dahlia_x_hybrida.jpg", + "imageStatus": "ok", + "description": "Die Dahlie ist eine prachtvolle Sommerblume mit Blueten in allen Groessen und Formen. Sie wird aus Knollen gezogen.", + "categories": [ + "flowering", + "sun" + ], + "careInfo": { + "waterIntervalDays": 5, + "light": "Volles Sonnenlicht", + "temp": "15-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_0f54f9b5c4726b7c", + "name": "Dendrobium", + "botanicalName": "Dendrobium nobile", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e7/Dendrobium_nobile1.jpg/330px-Dendrobium_nobile1.jpg", + "imageStatus": "ok", + "description": "Das Dendrobium ist eine beliebte Zimmerorchidee mit langen Pseudobulben, die im Winter mit Blueten besetzt werden.", + "categories": [ + "flowering", + "high_humidity" + ], + "careInfo": { + "waterIntervalDays": 10, + "light": "Helles indirektes Licht", + "temp": "15-28 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_4a40e184dc1158af", + "name": "Dieffenbachie", + "botanicalName": "Dieffenbachia seguine", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b3/Dieffenbachia_seguine_1.jpg/330px-Dieffenbachia_seguine_1.jpg", + "imageStatus": "ok", + "description": "Die Dieffenbachie ist eine tropische Blattschmuckpflanze mit grossen, gruen-weiss gefleckten Blaettern.", + "categories": [ + "easy", + "low_light", + "air_purifier" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles indirektes Licht", + "temp": "18-26 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_5a0f781f2fbe33a1", + "name": "Dischidia", + "botanicalName": "Dischidia ruscifolia", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/93/Dischidia_ruscifolia.jpg/330px-Dischidia_ruscifolia.jpg", + "imageStatus": "ok", + "description": "Die Dischidia ist eine epiphytische Haengepflanze mit kleinen, runden Blaettern entlang duenner Ranken.", + "categories": [ + "succulent", + "hanging" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles indirektes Licht", + "temp": "18-27 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_d888afa045930bba", + "name": "Drachenbaum", + "botanicalName": "Dracaena marginata", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/8a/Dracaena_marginata_2.jpg/330px-Dracaena_marginata_2.jpg", + "imageStatus": "ok", + "description": "Der Drachenbaum ist eine schlanke Zimmerpflanze mit roten, schmalen Blaettern auf langen Staemmen.", + "categories": [ + "easy", + "air_purifier", + "tree" + ], + "careInfo": { + "waterIntervalDays": 10, + "light": "Helles indirektes Licht", + "temp": "15-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_03f2e14e6adb42c5", + "name": "Drehfrucht", + "botanicalName": "Streptocarpus hybridus", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/07/Streptocarpus_saxorum.jpg/330px-Streptocarpus_saxorum.jpg", + "imageStatus": "ok", + "description": "Die Drehfrucht ist ein Gesneriengewaechs mit langen, gerippten Blaettern und trichterfoermigen Blueten in Lila oder Rosa.", + "categories": [ + "flowering" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles indirektes Licht", + "temp": "15-22 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_3c9b2546fb073192", + "name": "Dudleya", + "botanicalName": "Dudleya brittonii", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/44/Dudleya_brittonii_01.jpg/330px-Dudleya_brittonii_01.jpg", + "imageStatus": "ok", + "description": "Dudleya ist eine rosetten┬¡bildende Sukkulente mit silbrig-weissen, mehligen Blaettern. Sehr elegant.", + "categories": [ + "easy", + "succulent", + "sun" + ], + "careInfo": { + "waterIntervalDays": 14, + "light": "Volles Sonnenlicht", + "temp": "10-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_db00b284aaf5553b", + "name": "Duftsteinrich", + "botanicalName": "Lobularia maritima", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/11/Lobularia_maritima.jpg/330px-Lobularia_maritima.jpg", + "imageStatus": "ok", + "description": "Der Duftsteinrich ist ein niedrig wachsendes Pflanzchen mit winzigen, weissen oder lilafarbenen Blueten und suessem Duft.", + "categories": [ + "easy", + "flowering" + ], + "careInfo": { + "waterIntervalDays": 3, + "light": "Helles bis volles Licht", + "temp": "10-22 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_19ba49fd14de0fd2", + "name": "Echeverie", + "botanicalName": "Echeveria elegans", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/85/Echeveria_elegans_-_1.jpg/330px-Echeveria_elegans_-_1.jpg", + "imageStatus": "ok", + "description": "Die Echeverie bildet symmetrische, rosettenfoermige Sukkulenten mit blaugruenen Blaettern. Pflegeleicht.", + "categories": [ + "easy", + "succulent", + "sun" + ], + "careInfo": { + "waterIntervalDays": 14, + "light": "Volles Sonnenlicht", + "temp": "15-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_adc9e050aeb462c7", + "name": "Echter Lavendel", + "botanicalName": "Lavandula angustifolia", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/40/Lavandula_angustifolia_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-087.jpg/330px-Lavandula_angustifolia_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-087.jpg", + "imageStatus": "ok", + "description": "Der Echte Lavendel ist ein aromatischer Halbstrauch mit lilafarbenen Bluetenaehren. Herrlicher Duft.", + "categories": [ + "medicinal", + "sun", + "bright_light" + ], + "careInfo": { + "waterIntervalDays": 10, + "light": "Volles Sonnenlicht", + "temp": "10-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_2f9ab7e162ca10e4", + "name": "Efeu", + "botanicalName": "Hedera helix", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/51/Hedera_helix_-_leaves.jpg/330px-Hedera_helix_-_leaves.jpg", + "imageStatus": "ok", + "description": "Efeu ist eine robuste Kletter- und Haengepflanze mit charakteristischen, dreilappigen Blaettern. Sehr langlebig.", + "categories": [ + "easy", + "low_light", + "hanging", + "air_purifier" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Wenig bis helles Licht", + "temp": "10-20 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_81cfa08a34c49816", + "name": "Efeu-Geranie", + "botanicalName": "Pelargonium peltatum", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/ad/Pelargonium_peltatum.jpg/330px-Pelargonium_peltatum.jpg", + "imageStatus": "ok", + "description": "Die Efeu-Geranie hat efeufoermige, glaenzende Blaetter und bluet den ganzen Sommer in leuchtenden Farben.", + "categories": [ + "easy", + "flowering", + "hanging", + "sun" + ], + "careInfo": { + "waterIntervalDays": 5, + "light": "Helles bis volles Licht", + "temp": "15-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_797b7521a46e11b0", + "name": "Efeutute", + "botanicalName": "Epipremnum aureum", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/62/Money_Plant_%28Epipremnum_aureum%29_4.jpg/330px-Money_Plant_%28Epipremnum_aureum%29_4.jpg", + "imageStatus": "ok", + "description": "Die Efeutute ist eine robuste Haengepflanze. Ideal fuer Anfaenger und reinigt die Raumluft.", + "categories": [ + "easy", + "low_light", + "hanging", + "air_purifier" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Wenig bis helles Licht", + "temp": "15-30 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_13694071ae9ffebd", + "name": "Einblatt", + "botanicalName": "Spathiphyllum wallisii", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/bd/Spathiphyllum_cochlearispathum_RTBG.jpg/330px-Spathiphyllum_cochlearispathum_RTBG.jpg", + "imageStatus": "ok", + "description": "Das Einblatt besticht durch elegante weisse Blueten. Eine der besten luftreinigenden Zimmerpflanzen.", + "categories": [ + "easy", + "low_light", + "flowering", + "air_purifier" + ], + "careInfo": { + "waterIntervalDays": 5, + "light": "Indirektes Licht", + "temp": "18-27 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_dc1a3a410bf856da", + "name": "Erdbeere", + "botanicalName": "Fragaria ananassa", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/29/PerfectStrawberry.jpg/330px-PerfectStrawberry.jpg", + "imageStatus": "ok", + "description": "Die Erdbeere ist ein beliebtes Obst fuer Balkon und Terrasse mit aromatischen, roten Fruechten.", + "categories": [ + "easy", + "pet_friendly", + "sun" + ], + "careInfo": { + "waterIntervalDays": 3, + "light": "Helles bis volles Licht", + "temp": "15-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_3900a4af2d8f685c", + "name": "Eselschwanz", + "botanicalName": "Sedum morganianum", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/1a/Sedum_morganianum.jpg/330px-Sedum_morganianum.jpg", + "imageStatus": "ok", + "description": "Der Eselschwanz ist eine haengende Sukkulente mit langen Trieben aus dichten, blaugruenen Blaettchen.", + "categories": [ + "easy", + "succulent", + "hanging", + "sun" + ], + "careInfo": { + "waterIntervalDays": 14, + "light": "Volles Sonnenlicht", + "temp": "15-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_bcda607d5ebeba6e", + "name": "Faecherahorn", + "botanicalName": "Acer palmatum", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/5e/Acer_palmatum_in_Prospect_Park_edit.jpg/330px-Acer_palmatum_in_Prospect_Park_edit.jpg", + "imageStatus": "ok", + "description": "Der Faecherahorn ist ein japanischer Zierahorn mit feingeschnittenen, faecherfoermigen Blaettern in Gruen oder Rot.", + "categories": [ + "tree", + "patterned" + ], + "careInfo": { + "waterIntervalDays": 5, + "light": "Helles bis volles Licht", + "temp": "10-22 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_f8e84be57621f80c", + "name": "Fass-Kaktus", + "botanicalName": "Ferocactus cylindraceus", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Ferocactus_cylindraceus.jpg/330px-Ferocactus_cylindraceus.jpg", + "imageStatus": "ok", + "description": "Der Fass-Kaktus ist ein zylindrischer Wuestenkaktus mit langen, roten Stacheln. Sehr langlebig.", + "categories": [ + "easy", + "succulent", + "sun" + ], + "careInfo": { + "waterIntervalDays": 21, + "light": "Volles Sonnenlicht", + "temp": "15-35 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_502fa49e2138d4e5", + "name": "Fatsia", + "botanicalName": "Fatsia japonica", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/60/Fatsia_japonica_02.jpg/330px-Fatsia_japonica_02.jpg", + "imageStatus": "ok", + "description": "Die Fatsia ist ein dekorativer Zimmerstrauch mit grossen, handfoermigen, glaenzenden Blaettern. Sehr robust.", + "categories": [ + "easy", + "low_light" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles indirektes Licht", + "temp": "10-20 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_4d2d5509b4c55176", + "name": "Fettkraut", + "botanicalName": "Pinguicula grandiflora", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/3e/Pinguicula_grandiflora.jpg/330px-Pinguicula_grandiflora.jpg", + "imageStatus": "ok", + "description": "Das Fettkraut faengt Insekten mit klebrigen Blaettern. Es bluet mit violetten, sporenartigen Blueten.", + "categories": [ + "flowering", + "high_humidity" + ], + "careInfo": { + "waterIntervalDays": 5, + "light": "Helles indirektes Licht", + "temp": "10-20 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_321162597569e247", + "name": "Flamingoblume", + "botanicalName": "Anthurium andraeanum", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/8b/AnthuriumAndraenum.jpg/330px-AnthuriumAndraenum.jpg", + "imageStatus": "ok", + "description": "Die Flamingoblume faellt durch leuchtend rote, wachsartige Hochblaetter auf. Bluet fast das ganze Jahr.", + "categories": [ + "flowering", + "high_humidity" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles indirektes Licht", + "temp": "18-28 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_a45983ad9bacfbd3", + "name": "Flammen-Bromelie", + "botanicalName": "Vriesea splendens", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/18/Vriesea_splendens2.jpg/330px-Vriesea_splendens2.jpg", + "imageStatus": "ok", + "description": "Die Flammen-Bromelie hat geb├ñnderte, dunkelgruene Blaetter und einen spektakulaeren, roten Bluetenstand.", + "categories": [ + "flowering", + "patterned", + "high_humidity" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles indirektes Licht", + "temp": "18-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_4385d6c520bf6b30", + "name": "Fleissiges Lieschen", + "botanicalName": "Impatiens walleriana", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/02/Impatiens_walleriana_-_Flei%C3%9Figes_Lieschen.jpg/330px-Impatiens_walleriana_-_Flei%C3%9Figes_Lieschen.jpg", + "imageStatus": "ok", + "description": "Das Fleissige Lieschen bluet von Fruehling bis Herbst unermudlich in vielen Farben.", + "categories": [ + "easy", + "flowering" + ], + "careInfo": { + "waterIntervalDays": 2, + "light": "Helles indirektes Licht", + "temp": "16-24 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_a1224f40826b5089", + "name": "Forellen-Begonie", + "botanicalName": "Begonia maculata", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e5/Begonia_maculata_wightii.jpg/330px-Begonia_maculata_wightii.jpg", + "imageStatus": "ok", + "description": "Die Forellen-Begonie hat olivgruene Blaetter mit silbernen Punkten und einer roten Unterseite. Atemberaubend.", + "categories": [ + "patterned", + "high_humidity" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles indirektes Licht", + "temp": "18-27 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_fbe673c97a27643c", + "name": "Frauenhaarfarn", + "botanicalName": "Adiantum raddianum", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/5d/Adiantum_raddianum_2.jpg/330px-Adiantum_raddianum_2.jpg", + "imageStatus": "ok", + "description": "Der Frauenhaarfarn hat zarte, feingliedrige Wedel auf schwarzen, draht┬¡aehnlichen Stielen. Liebt Feuchtigkeit.", + "categories": [ + "high_humidity" + ], + "careInfo": { + "waterIntervalDays": 3, + "light": "Helles indirektes Licht", + "temp": "18-27 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_253febdb6b4c4860", + "name": "Fuchsie", + "botanicalName": "Fuchsia hybrida", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/13/Fuchsia_with_bee.jpg/330px-Fuchsia_with_bee.jpg", + "imageStatus": "ok", + "description": "Die Fuchsie haengt mit eleganten, zweifarbigen Blueten wie kleine Ohrringe herab. Ideal fuer Ampeln.", + "categories": [ + "flowering", + "hanging" + ], + "careInfo": { + "waterIntervalDays": 3, + "light": "Helles indirektes Licht", + "temp": "14-22 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_7e81c1b15627e3d7", + "name": "Gardenie", + "botanicalName": "Gardenia jasminoides", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a4/Gardenia_jasminoides.jpg/330px-Gardenia_jasminoides.jpg", + "imageStatus": "ok", + "description": "Die Gardenie fasziniert mit cremefarbenen, intensiv duftenden Blueten. Anspruchsvoll in der Pflege.", + "categories": [ + "flowering", + "high_humidity" + ], + "careInfo": { + "waterIntervalDays": 5, + "light": "Helles indirektes Licht", + "temp": "18-23 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_c63e701e278fa8ae", + "name": "Gasteria", + "botanicalName": "Gasteria carinata", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/26/Gasteria_bicolor_var._liliputana.jpg/330px-Gasteria_bicolor_var._liliputana.jpg", + "imageStatus": "ok", + "description": "Die Gasteria ist eine kleine Sukkulente mit zweireihig angeordneten, zungenfoermigen, gefleckten Blaettern.", + "categories": [ + "easy", + "succulent", + "low_light" + ], + "careInfo": { + "waterIntervalDays": 14, + "light": "Helles indirektes Licht", + "temp": "15-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_fa2afbb2eb4500a7", + "name": "Gebet-Pflanze", + "botanicalName": "Maranta leuconeura", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/2d/Maranta_leuconeura.jpg/330px-Maranta_leuconeura.jpg", + "imageStatus": "ok", + "description": "Die Gebet-Pflanze faltet ihre gemusterten Blaetter nachts wie Haende zusammen. Faszinierende rote und gruene Muster.", + "categories": [ + "patterned", + "high_humidity", + "pet_friendly" + ], + "careInfo": { + "waterIntervalDays": 5, + "light": "Indirektes Licht", + "temp": "18-27 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_16c869313cd292ca", + "name": "Geigenfeige", + "botanicalName": "Ficus lyrata", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a8/Ficus_lyrata_%28Fiddle_leaf_Fig%29_%282939566785%29.jpg/330px-Ficus_lyrata_%28Fiddle_leaf_Fig%29_%282939566785%29.jpg", + "imageStatus": "ok", + "description": "Die Geigenfeige ist ein Trendbaum mit grossen, geigenfoermigen Blaettern. Benoetigt viel Licht.", + "categories": [ + "tree", + "bright_light", + "large" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles indirektes Licht", + "temp": "18-27 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_25cb30720168c488", + "name": "Geisterpflanze", + "botanicalName": "Graptopetalum paraguayense", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/67/Graptopetalum_paraguayense_-_ghost_plant.jpg/330px-Graptopetalum_paraguayense_-_ghost_plant.jpg", + "imageStatus": "ok", + "description": "Die Geisterpflanze hat zartgraue bis perlmutt-rosafarbene, rosettenfoermige Blaetter. Sehr robuste Sukkulente.", + "categories": [ + "easy", + "succulent", + "sun" + ], + "careInfo": { + "waterIntervalDays": 14, + "light": "Volles Sonnenlicht", + "temp": "15-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_87b1168e48dec833", + "name": "Gerbera", + "botanicalName": "Gerbera jamesonii", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/5a/Gerbera_jamesonii.jpg/330px-Gerbera_jamesonii.jpg", + "imageStatus": "ok", + "description": "Die Gerbera ist eine farbenfrohe Schnittblume mit grossen, sonnenblumenaehnlichen Blueten. Sehr beliebt.", + "categories": [ + "flowering", + "bright_light", + "air_purifier" + ], + "careInfo": { + "waterIntervalDays": 5, + "light": "Helles bis volles Licht", + "temp": "15-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_b93632ad7bfff83a", + "name": "Geweihfarn", + "botanicalName": "Platycerium bifurcatum", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/4c/Staghorn_Fern_Platycerium_bifurcatum.jpg/330px-Staghorn_Fern_Platycerium_bifurcatum.jpg", + "imageStatus": "ok", + "description": "Der Geweihfarn hat gespaltene Wedel, die einem Hirschgeweih aehneln. Er ist ein epiphytischer Farn fuer Holz.", + "categories": [ + "hanging", + "high_humidity" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles indirektes Licht", + "temp": "15-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_7e449dc7aefa50dc", + "name": "Gloxinie", + "botanicalName": "Gloxinia speciosa", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/91/Gloxinia_tubiflora.jpg/330px-Gloxinia_tubiflora.jpg", + "imageStatus": "ok", + "description": "Die Gloxinie hat grosse, samtartige Blueten in Violett, Rosa oder Weiss mit farbigen Raendern.", + "categories": [ + "flowering", + "high_humidity" + ], + "careInfo": { + "waterIntervalDays": 5, + "light": "Helles indirektes Licht", + "temp": "18-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_d77c5e78b5a6cd52", + "name": "Goldene Tonne", + "botanicalName": "Echinocactus grusonii", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/70/Echinocactus_grusonii_Hildm.jpg/330px-Echinocactus_grusonii_Hildm.jpg", + "imageStatus": "ok", + "description": "Die Goldene Tonne ist ein ikonischer kugelfoermiger Kaktus mit goldgelben Stacheln. Waechst langsam aber imposant.", + "categories": [ + "easy", + "succulent", + "sun" + ], + "careInfo": { + "waterIntervalDays": 21, + "light": "Volles Sonnenlicht", + "temp": "15-35 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_86b6774738a97ccf", + "name": "Goldener Bambus", + "botanicalName": "Phyllostachys aurea", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/93/Phyllostachys_aurea_4.jpg/330px-Phyllostachys_aurea_4.jpg", + "imageStatus": "ok", + "description": "Der Goldene Bambus hat elegante, goldgelbe Halme mit engstehenden Knoten. Sehr dekorativ als Sichtschutz.", + "categories": [ + "easy", + "large" + ], + "careInfo": { + "waterIntervalDays": 5, + "light": "Helles bis volles Licht", + "temp": "10-30 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_cd5e679bdf1106fa", + "name": "Goldfruchtpalme", + "botanicalName": "Dypsis lutescens", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c2/Dypsis_lutescens1.jpg/330px-Dypsis_lutescens1.jpg", + "imageStatus": "ok", + "description": "Die Goldfruchtpalme ist eine elegante Zimmerpalme mit gelblich-gruenen Stielen und gefiederten Wedeln.", + "categories": [ + "air_purifier", + "tree" + ], + "careInfo": { + "waterIntervalDays": 5, + "light": "Helles indirektes Licht", + "temp": "18-27 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_64ff12d55ec3e694", + "name": "Granatapfelbaum", + "botanicalName": "Punica granatum", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/9f/Garnet_Pomegranate.jpg/330px-Garnet_Pomegranate.jpg", + "imageStatus": "ok", + "description": "Der Granatapfelbaum hat leuchtend rote Blueten und rote, essbare Fruechte mit rubinroten Kernen.", + "categories": [ + "flowering", + "sun", + "tree", + "medicinal" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Volles Sonnenlicht", + "temp": "15-28 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_6979e7e4cf35ae8e", + "name": "Grosse Brennessel", + "botanicalName": "Urtica dioica", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/ae/Urtica_dioica.jpg/330px-Urtica_dioica.jpg", + "imageStatus": "ok", + "description": "Die Grosse Brennessel ist eine Heilpflanze mit brennenden Haaren. Die Blaetter sind reich an Vitaminen und Mineralien.", + "categories": [ + "medicinal" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles bis volles Licht", + "temp": "10-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_e4804808615a29be", + "name": "Grosse Strahlenaralie", + "botanicalName": "Schefflera actinophylla", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/8c/Brassaia_actinophylla_large.jpg/330px-Brassaia_actinophylla_large.jpg", + "imageStatus": "ok", + "description": "Die Grosse Strahlenaralie kann grosse, handfoermige Blaetter entwickeln. Sie ist ideal als Zimmerstrauch.", + "categories": [ + "easy", + "tree", + "large" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles indirektes Licht", + "temp": "18-27 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_0ee7b22313a79a28", + "name": "Gruene Minze", + "botanicalName": "Mentha spicata", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/ae/Mint-leaves-2007.jpg/330px-Mint-leaves-2007.jpg", + "imageStatus": "ok", + "description": "Die Gruene Minze ist ein wuchsfreudiges Kuechenkraut mit frischem, minzigem Duft. Fuer Tee und Cocktails.", + "categories": [ + "easy", + "medicinal" + ], + "careInfo": { + "waterIntervalDays": 3, + "light": "Helles bis volles Licht", + "temp": "15-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_52fa97990402f644", + "name": "Gruenlilie", + "botanicalName": "Chlorophytum comosum", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/6c/Chlorophytum_comosum_01.jpg/330px-Chlorophytum_comosum_01.jpg", + "imageStatus": "ok", + "description": "Die Gruenlilie ist eine klassische Haengepflanze mit langen, gruen-weissen Blaettern. Sehr pflegeleicht.", + "categories": [ + "easy", + "hanging", + "pet_friendly", + "air_purifier" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles indirektes Licht", + "temp": "15-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_730c6fc12cf97511", + "name": "Guave", + "botanicalName": "Psidium guajava", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/00/Guava_ID.jpg/330px-Guava_ID.jpg", + "imageStatus": "ok", + "description": "Die Guave ist ein tropischer Obstbaum mit gelblich-weissen Fruechten. Sie ist reich an Vitamin C.", + "categories": [ + "sun", + "tree", + "medicinal" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Volles Sonnenlicht", + "temp": "18-30 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_39c58604790693b9", + "name": "Gummibaum", + "botanicalName": "Ficus elastica", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/3a/Ficus_elastica_India_Ink_%28Rubberplant%29.jpg/330px-Ficus_elastica_India_Ink_%28Rubberplant%29.jpg", + "imageStatus": "ok", + "description": "Der Gummibaum ist eine imposante Zimmerpflanze mit grossen, glaenzenden, lederartigen Blaettern. Reinigt die Luft.", + "categories": [ + "easy", + "air_purifier", + "tree" + ], + "careInfo": { + "waterIntervalDays": 10, + "light": "Helles indirektes Licht", + "temp": "16-24 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_aa6664ed7adebcb5", + "name": "Gurke", + "botanicalName": "Cucumis sativus", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/12/Cucumbers_-_whole_and_slice.jpg/330px-Cucumbers_-_whole_and_slice.jpg", + "imageStatus": "ok", + "description": "Die Gurke ist eine rankende Gemuese┬¡pflanze mit gruenen, erfrischenden Fruechten. Im Balkonkasten kultivierbar.", + "categories": [ + "easy", + "sun", + "hanging" + ], + "careInfo": { + "waterIntervalDays": 3, + "light": "Volles Sonnenlicht", + "temp": "18-28 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_46b49e1b0e69fa64", + "name": "Guzmania", + "botanicalName": "Guzmania lingulata", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/3b/Guzmania_lingulata.jpg/330px-Guzmania_lingulata.jpg", + "imageStatus": "ok", + "description": "Die Guzmania ist eine Bromelie mit gl├ñnzenden, gruenen Blaettern und einem leuchtend roten, sternfoermigen Bluetenstand.", + "categories": [ + "flowering", + "high_humidity" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles indirektes Licht", + "temp": "18-27 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_81cd86630aca39e5", + "name": "Hange-Birke", + "botanicalName": "Betula pendula", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/90/Betula_pendula_young_leaves.jpg/330px-Betula_pendula_young_leaves.jpg", + "imageStatus": "ok", + "description": "Die Haenge-Birke hat charakteristisch weisse Rinde und haengende Zweige. Die Blaetter werden in der Heilkunde genutzt.", + "categories": [ + "medicinal", + "tree", + "large" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Volles Sonnenlicht", + "temp": "10-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_f94ccafdbc6c519d", + "name": "Hasenohren-Kaktus", + "botanicalName": "Opuntia microdasys", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a3/Opuntia_microdasys_3.jpg/330px-Opuntia_microdasys_3.jpg", + "imageStatus": "ok", + "description": "Der Hasenohren-Kaktus hat flache, ovale Triebe mit dichten weissen Glochiden. Klassischer Zimmerkaktus.", + "categories": [ + "easy", + "succulent", + "sun" + ], + "careInfo": { + "waterIntervalDays": 21, + "light": "Volles Sonnenlicht", + "temp": "10-35 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_f297c0da1221e6d4", + "name": "Heliamphora", + "botanicalName": "Heliamphora nutans", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/6f/Heliamphora_nutans.jpg/330px-Heliamphora_nutans.jpg", + "imageStatus": "ok", + "description": "Heliamphora ist eine urtuemliche Kannenpflanze aus den Tafelbergen Venezuelas. Sehr dekorativ und selten.", + "categories": [ + "high_humidity" + ], + "careInfo": { + "waterIntervalDays": 5, + "light": "Helles indirektes Licht", + "temp": "15-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_39436f8620e13b0e", + "name": "Heliconia", + "botanicalName": "Heliconia psittacorum", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/9e/Heliconia_psittacorum.jpg/330px-Heliconia_psittacorum.jpg", + "imageStatus": "ok", + "description": "Die Heliconia hat leuchtend orangefarbe oder rote, bootsfoermige Hochblaetter. Eine exotische Tropenpflanze.", + "categories": [ + "flowering", + "high_humidity", + "bright_light" + ], + "careInfo": { + "waterIntervalDays": 5, + "light": "Helles bis volles Licht", + "temp": "20-30 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_b246d39c63f29a40", + "name": "Herzblatt-Philodendron", + "botanicalName": "Philodendron hederaceum", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/55/Philodendron_hederaceum.jpg/330px-Philodendron_hederaceum.jpg", + "imageStatus": "ok", + "description": "Der Herzblatt-Philodendron ist eine pflegeleichte Kletter- oder Haengepflanze mit herzfoermigen Blaettern.", + "categories": [ + "easy", + "low_light", + "hanging" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Indirektes Licht", + "temp": "18-28 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_3de588912c04dc7f", + "name": "Herzkette", + "botanicalName": "Ceropegia woodii", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/5b/Ceropegia_woodii_Kew.jpg/330px-Ceropegia_woodii_Kew.jpg", + "imageStatus": "ok", + "description": "Die Herzkette hat duenne, haengende Ranken mit herzfoermigen, silbergrau gemusterten Blaettchen.", + "categories": [ + "easy", + "succulent", + "hanging", + "patterned" + ], + "careInfo": { + "waterIntervalDays": 14, + "light": "Helles indirektes Licht", + "temp": "15-27 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_8b5798718a1dc5c6", + "name": "Hibiskus", + "botanicalName": "Hibiscus rosa-sinensis", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/11/Hibiscus_rosa-sinensis_4.jpg/330px-Hibiscus_rosa-sinensis_4.jpg", + "imageStatus": "ok", + "description": "Der Hibiskus begeistert mit grossen, trompetenfoermigen Blueten in Rot, Orange und Rosa.", + "categories": [ + "flowering", + "sun", + "bright_light" + ], + "careInfo": { + "waterIntervalDays": 3, + "light": "Volles Sonnenlicht", + "temp": "18-28 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_0306abe03e6d7296", + "name": "Hyazinthe", + "botanicalName": "Hyacinthus orientalis", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/3b/Hyacinth_Hyacinthus_orientalis.jpg/330px-Hyacinth_Hyacinthus_orientalis.jpg", + "imageStatus": "ok", + "description": "Die Hyazinthe bezaubert mit dichten Bluetenrispen und intensivem Duft in Blau, Rosa, Weiss oder Gelb.", + "categories": [ + "easy", + "flowering" + ], + "careInfo": { + "waterIntervalDays": 5, + "light": "Helles bis volles Licht", + "temp": "10-18 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_4e66095e06f32cf4", + "name": "Indische Azalee", + "botanicalName": "Azalea indica", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b1/Indian_azalea.jpg/330px-Indian_azalea.jpg", + "imageStatus": "ok", + "description": "Die Indische Azalee ist ein beliebter Zierstrauch mit grossen, auffaelligen Blueten in Rosa- und Rott├Ânen.", + "categories": [ + "flowering" + ], + "careInfo": { + "waterIntervalDays": 4, + "light": "Helles indirektes Licht", + "temp": "10-20 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_902876241a0c1f6f", + "name": "Ingwer", + "botanicalName": "Zingiber officinale", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/33/Fresh_ginger_root.jpg/330px-Fresh_ginger_root.jpg", + "imageStatus": "ok", + "description": "Ingwer ist eine tropische Gewuerzpflanze mit aromatischen Knollen. Die Blaetter sind schilfartig.", + "categories": [ + "medicinal", + "high_humidity" + ], + "careInfo": { + "waterIntervalDays": 5, + "light": "Helles indirektes Licht", + "temp": "20-30 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_2f9ba405e4cbd7de", + "name": "Jadepflanze", + "botanicalName": "Crassula ovata", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a9/Crassula_ovata_3.jpg/330px-Crassula_ovata_3.jpg", + "imageStatus": "ok", + "description": "Die Jadepflanze ist eine langlebige Sukkulente mit dicken, ovalen Blaettern. In Japan gilt sie als Gluecksbringer.", + "categories": [ + "easy", + "succulent", + "sun" + ], + "careInfo": { + "waterIntervalDays": 14, + "light": "Helles bis volles Licht", + "temp": "15-24 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_192fc2d6932b5621", + "name": "Japanische Aucube", + "botanicalName": "Aucuba japonica", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/f2/Aucuba_japonica.jpg/330px-Aucuba_japonica.jpg", + "imageStatus": "ok", + "description": "Die Japanische Aucube hat glaenzende, gruene oder gelbgefleckte Blaetter. Sehr schattenvertraeglich.", + "categories": [ + "easy", + "low_light" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Wenig bis helles Licht", + "temp": "10-20 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_a0c9b297c07374b5", + "name": "Japanische Azalee", + "botanicalName": "Rhododendron simsii", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/ec/Rhododendron_simsii_flowers.jpg/330px-Rhododendron_simsii_flowers.jpg", + "imageStatus": "ok", + "description": "Die Japanische Azalee bluet im Winter und Fruehling ueppig mit leuchtend roten, rosa oder weissen Blueten.", + "categories": [ + "flowering" + ], + "careInfo": { + "waterIntervalDays": 4, + "light": "Helles indirektes Licht", + "temp": "10-18 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_28ae5636958be358", + "name": "Jasmin", + "botanicalName": "Jasminum polyanthum", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/af/Jasminum_polyanthum.jpg/330px-Jasminum_polyanthum.jpg", + "imageStatus": "ok", + "description": "Der Jasmin ist eine Kletterpflanze mit intensiv duftenden, weissen Blueten. Er bluet im Winter und Fruehling.", + "categories": [ + "flowering" + ], + "careInfo": { + "waterIntervalDays": 5, + "light": "Helles bis volles Licht", + "temp": "10-22 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_8fea9248ff0c7bb5", + "name": "Johanniskraut", + "botanicalName": "Hypericum perforatum", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/2c/Hypericum_perforatum.jpg/330px-Hypericum_perforatum.jpg", + "imageStatus": "ok", + "description": "Das Johanniskraut hat leuchtend gelbe Blueten und ist ein wichtiges Heilkraut gegen Depressionen und Stimmungstiefs.", + "categories": [ + "medicinal", + "flowering", + "sun" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Volles Sonnenlicht", + "temp": "10-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_c2b3a25e00acf3e2", + "name": "Kaffeestrauch", + "botanicalName": "Coffea arabica", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c5/Arabica_Coffee_Beans.jpg/330px-Arabica_Coffee_Beans.jpg", + "imageStatus": "ok", + "description": "Der Kaffeestrauch hat glaenzende, dunkelgruene Blaetter und entwickelt rote Kaffe┬¡ekirschen. Kann im Topf gehalten werden.", + "categories": [ + "easy", + "medicinal" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles indirektes Licht", + "temp": "18-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_7597db1c1b395452", + "name": "Kalanchoe", + "botanicalName": "Kalanchoe blossfeldiana", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/2e/Kalanchoe_blossfeldiana3.jpg/330px-Kalanchoe_blossfeldiana3.jpg", + "imageStatus": "ok", + "description": "Die Kalanchoe ist eine beliebte Bluehpflanze mit leuchtenden Blueten in Rot, Orange, Gelb oder Rosa.", + "categories": [ + "easy", + "succulent", + "flowering", + "sun" + ], + "careInfo": { + "waterIntervalDays": 10, + "light": "Helles bis volles Licht", + "temp": "15-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_735b19d4a6efe5c0", + "name": "Kamelie", + "botanicalName": "Camellia japonica", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/93/Camellia_japonica_cv_Nuccio%27s_Pearl.jpg/330px-Camellia_japonica_cv_Nuccio%27s_Pearl.jpg", + "imageStatus": "ok", + "description": "Die Kamelie ist ein eleganter Zierstrauch mit glaenzenden Blaettern und rosenaehnlichen Blueten von Januar bis April.", + "categories": [ + "flowering" + ], + "careInfo": { + "waterIntervalDays": 5, + "light": "Helles indirektes Licht", + "temp": "7-18 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_e0432335ee4f0033", + "name": "Kamille", + "botanicalName": "Chamomilla recutita", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/cc/Chamomile_%40_Oulu.jpg/330px-Chamomile_%40_Oulu.jpg", + "imageStatus": "ok", + "description": "Die Kamille ist ein beliebtes Heilkraut mit kleinen, weiss-gelben Blueten. Das aetherische Oel wirkt beruhigend.", + "categories": [ + "easy", + "medicinal", + "sun" + ], + "careInfo": { + "waterIntervalDays": 5, + "light": "Volles Sonnenlicht", + "temp": "15-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_de21871ad8dcaefd", + "name": "Kaninchen-Ohren", + "botanicalName": "Kalanchoe tomentosa", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/58/Kalanchoe_tomentosa.jpg/330px-Kalanchoe_tomentosa.jpg", + "imageStatus": "ok", + "description": "Kaninchen-Ohren haben weisslich-filzige Blaetter mit braunen Raendern, die Kaninchen┬¡ohren aehneln. Sehr dekorativ.", + "categories": [ + "easy", + "succulent", + "sun" + ], + "careInfo": { + "waterIntervalDays": 14, + "light": "Helles bis volles Licht", + "temp": "15-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_cb7817f551f6c73e", + "name": "Kannenpflanze", + "botanicalName": "Nepenthes alata", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c2/Nepenthes_alata_pitchers.jpg/330px-Nepenthes_alata_pitchers.jpg", + "imageStatus": "ok", + "description": "Die Kannenpflanze bildet grosse, gefuellte Kannen als Insekten┬¡fallen. Eine faszinierende, tropische Pflanze.", + "categories": [ + "high_humidity", + "hanging" + ], + "careInfo": { + "waterIntervalDays": 5, + "light": "Helles indirektes Licht", + "temp": "20-30 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_325a00f384ac1a15", + "name": "Kap-Aloe", + "botanicalName": "Aloe arborescens", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/01/Aloe_arborescens_flower.jpg/330px-Aloe_arborescens_flower.jpg", + "imageStatus": "ok", + "description": "Die Kap-Aloe ist eine strauchige Aloe mit schmalen, gezaehnten Blaettern und leuchtend roten Bluetenaehren im Winter.", + "categories": [ + "easy", + "succulent", + "medicinal", + "sun" + ], + "careInfo": { + "waterIntervalDays": 14, + "light": "Volles Sonnenlicht", + "temp": "10-30 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_bb4dea2113550a88", + "name": "Kap-Aloe (ferox)", + "botanicalName": "Aloe ferox", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/aa/Aloe_ferox_%28Kew%29.jpg/330px-Aloe_ferox_%28Kew%29.jpg", + "imageStatus": "ok", + "description": "Aloe ferox ist eine grosse, imposante Aloe mit stachligen, blaugruenen Blaettern und leuchtend roten Bluetenaehren.", + "categories": [ + "succulent", + "medicinal", + "sun", + "large" + ], + "careInfo": { + "waterIntervalDays": 14, + "light": "Volles Sonnenlicht", + "temp": "10-30 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_f8c518688fd2d49b", + "name": "Karotte", + "botanicalName": "Daucus carota", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a2/Daucus_carota_subsp._sativus.jpg/330px-Daucus_carota_subsp._sativus.jpg", + "imageStatus": "ok", + "description": "Die Karotte ist eine beliebte Gemuese┬¡pflanze mit orangefarbenen Wurzeln. Im tiefen Topf kultivierbar.", + "categories": [ + "easy", + "medicinal" + ], + "careInfo": { + "waterIntervalDays": 5, + "light": "Helles bis volles Licht", + "temp": "15-22 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_c605a83dcbce1a97", + "name": "Kentia-Palme", + "botanicalName": "Howea forsteriana", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/66/Howea_forsteriana.jpg/330px-Howea_forsteriana.jpg", + "imageStatus": "ok", + "description": "Die Kentia-Palme ist eine der elegantesten Zimmerpalmen mit langen, herabh├ñngenden Fiederblaettern.", + "categories": [ + "tree", + "low_light" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles indirektes Licht", + "temp": "18-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_bf13d931fa5427de", + "name": "Keulenlilie", + "botanicalName": "Cordyline australis", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/77/Cordyline_australis.jpg/330px-Cordyline_australis.jpg", + "imageStatus": "ok", + "description": "Die Keulenlilie hat lange, schmale, gruene oder rotbraune Blaetter in einem dekorativen Schopf.", + "categories": [ + "easy", + "tree", + "sun" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles bis volles Licht", + "temp": "10-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_205589ef30c6f380", + "name": "Kleeblume", + "botanicalName": "Oxalis triangularis", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/32/Oxalis_triangularis_ssp_papilionacea_2.jpg/330px-Oxalis_triangularis_ssp_papilionacea_2.jpg", + "imageStatus": "ok", + "description": "Die Kleeblume hat tiefviolette, dreieckige Blaetter und zarte rosa Blueten. Sie faltet die Blaetter bei Dunkelheit.", + "categories": [ + "flowering", + "patterned", + "pet_friendly" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles indirektes Licht", + "temp": "15-24 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_e1f0a5c763e6f721", + "name": "Kleine Wachsblume", + "botanicalName": "Hoya bella", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/15/Hoya_bella_close.jpg/330px-Hoya_bella_close.jpg", + "imageStatus": "ok", + "description": "Die Kleine Wachsblume traegt zierliche, sternfoermige weisse Blueten mit rosa Mitte. Haengende Sukkulente.", + "categories": [ + "flowering", + "hanging", + "succulent" + ], + "careInfo": { + "waterIntervalDays": 10, + "light": "Helles indirektes Licht", + "temp": "18-27 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_156a82fb0d4e7201", + "name": "Knollen-Begonie", + "botanicalName": "Begonia tuberhybrida", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/62/Begonia_tuberhybrida.jpg/330px-Begonia_tuberhybrida.jpg", + "imageStatus": "ok", + "description": "Die Knollen-Begonie hat riesige, rosenaehnliche Blueten in leuchtendem Rot, Orange, Gelb oder Weiss.", + "categories": [ + "flowering", + "high_humidity" + ], + "careInfo": { + "waterIntervalDays": 5, + "light": "Helles indirektes Licht", + "temp": "15-22 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_6fdbc0c3fc6d0820", + "name": "Koenigin der Nacht", + "botanicalName": "Epiphyllum oxypetalum", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/d5/Epiphyllum_oxypetalum_flower.jpg/330px-Epiphyllum_oxypetalum_flower.jpg", + "imageStatus": "ok", + "description": "Die Koenigin der Nacht bluet nur eine einzige Nacht lang mit riesigen, intensiv duftenden weissen Blueten.", + "categories": [ + "flowering", + "succulent" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Indirektes Licht", + "temp": "18-27 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_fb262dee6cb22325", + "name": "Koenigs-Protea", + "botanicalName": "Protea cynaroides", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/67/Protea_cynaroides_-_King_Protea.jpg/330px-Protea_cynaroides_-_King_Protea.jpg", + "imageStatus": "ok", + "description": "Die Koenigs-Protea ist die Nationalblume Suedafrikas mit riesigen, imposanten Bluetenkoepfen. Eine echte Besonderheit.", + "categories": [ + "flowering", + "sun", + "large" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Volles Sonnenlicht", + "temp": "10-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_c18b4430b4dfeef8", + "name": "Koenigsbegonie", + "botanicalName": "Begonia rex", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/ee/Begonia_rex_2.jpg/330px-Begonia_rex_2.jpg", + "imageStatus": "ok", + "description": "Die Koenigsbegonie beeindruckt mit prachtvoll gemusterten Blaettern in Silber, Rot und Gruen.", + "categories": [ + "patterned", + "high_humidity" + ], + "careInfo": { + "waterIntervalDays": 5, + "light": "Indirektes Licht", + "temp": "18-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_71f244d60e9fb18d", + "name": "Konophytum", + "botanicalName": "Conophytum calculus", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/32/Conophytum_calculus.jpg/330px-Conophytum_calculus.jpg", + "imageStatus": "ok", + "description": "Das Konophytum ist eine sehr kompakte Sukkulente, die zwei Blaetter zu einer kugelfoermigen Form verschmilzt.", + "categories": [ + "succulent", + "sun" + ], + "careInfo": { + "waterIntervalDays": 21, + "light": "Volles Sonnenlicht", + "temp": "10-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_5f6dd525e28bd218", + "name": "Korallenkaktus", + "botanicalName": "Rhipsalis baccifera", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a1/Rhipsalis_baccifera0.jpg/330px-Rhipsalis_baccifera0.jpg", + "imageStatus": "ok", + "description": "Der Korallenkaktus ist ein epiphytischer Kaktus mit duennen, haengenden Trieben und kleinen weissen Beeren.", + "categories": [ + "succulent", + "hanging" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Indirektes Licht", + "temp": "18-27 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_fd037b7881ac3430", + "name": "Korbmarante", + "botanicalName": "Calathea orbifolia", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e7/Starr_080716-9470_Calathea_crotalifera.jpg/330px-Starr_080716-9470_Calathea_crotalifera.jpg", + "imageStatus": "ok", + "description": "Die Korbmarante beeindruckt mit grossen, runden Blaettern mit silbergrunem Muster. Liebt hohe Luftfeuchtigkeit.", + "categories": [ + "patterned", + "high_humidity" + ], + "careInfo": { + "waterIntervalDays": 5, + "light": "Indirektes Licht", + "temp": "18-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_612f629e95b2c540", + "name": "Kotyledon", + "botanicalName": "Cotyledon orbiculata", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/17/Cotyledon_orbiculata2.jpg/330px-Cotyledon_orbiculata2.jpg", + "imageStatus": "ok", + "description": "Kotyledon hat dickfleischige, runde Blaetter mit einem mehligen, weisslichen Belag. Sehr trockenheitsresistent.", + "categories": [ + "easy", + "succulent", + "sun" + ], + "careInfo": { + "waterIntervalDays": 14, + "light": "Helles bis volles Licht", + "temp": "15-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_adce82fe150c9814", + "name": "Krokus", + "botanicalName": "Crocus vernus", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a9/Crocus_vernus_1.jpg/330px-Crocus_vernus_1.jpg", + "imageStatus": "ok", + "description": "Der Krokus ist einer der ersten Fruehjahrs┬¡boten mit kelchfoermigen Blueten in Lila, Weiss und Gelb.", + "categories": [ + "easy", + "flowering" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles bis volles Licht", + "temp": "5-15 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_64ba168636b5e8a3", + "name": "Kurkuma", + "botanicalName": "Curcuma longa", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/3a/Curcuma_longa_roots.jpg/330px-Curcuma_longa_roots.jpg", + "imageStatus": "ok", + "description": "Kurkuma ist eine tropische Gewuerzpflanze mit breiten Blaettern und leuchtend gelber Wurzel. Wichtiges Heilgewuerz.", + "categories": [ + "medicinal", + "high_humidity" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles bis volles Licht", + "temp": "20-30 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_bb51efcb52023c48", + "name": "Lebende Steine", + "botanicalName": "Lithops julii", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/35/Lithops_julii_ssp_fulleri_vanzylii_cole_no._246.jpg/330px-Lithops_julii_ssp_fulleri_vanzylii_cole_no._246.jpg", + "imageStatus": "ok", + "description": "Lebende Steine sind faszinierende Mimikry-Sukkulenten, die Kieselsteinen taeuschen aehnlich sehen. Sehr trockenheitsresistent.", + "categories": [ + "succulent", + "sun" + ], + "careInfo": { + "waterIntervalDays": 21, + "light": "Volles Sonnenlicht", + "temp": "10-30 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_0a16a89a9de52d5c", + "name": "Lila Tradescantia", + "botanicalName": "Tradescantia pallida", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c9/Purple_tradescantia.jpg/330px-Purple_tradescantia.jpg", + "imageStatus": "ok", + "description": "Die Lila Tradescantia hat leuchtend purpurrote Blaetter und ist sehr auffaellig. Sie liebt viel Licht.", + "categories": [ + "easy", + "hanging", + "sun" + ], + "careInfo": { + "waterIntervalDays": 5, + "light": "Helles bis volles Licht", + "temp": "15-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_a34bdd68ffb97e12", + "name": "Lippenstiftpflanze", + "botanicalName": "Aeschynanthus radicans", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/66/Aeschynanthus_lobbianus.jpg/330px-Aeschynanthus_lobbianus.jpg", + "imageStatus": "ok", + "description": "Die Lippenstiftpflanze hat haengende Triebe mit glaenzenden Blaettern und leuchtend roten Roehrenbluten.", + "categories": [ + "flowering", + "hanging", + "high_humidity" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles indirektes Licht", + "temp": "18-27 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_db7b7c883a5fb716", + "name": "Luftpflanze", + "botanicalName": "Tillandsia ionantha", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/f6/Tillandsia_ionantha.jpg/330px-Tillandsia_ionantha.jpg", + "imageStatus": "ok", + "description": "Die Luftpflanze ist eine kompakte Bromelie ohne Topferde. Sie nimmt Wasser und Naehrstoffe ueber die Blattschuppen auf.", + "categories": [ + "easy", + "sun" + ], + "careInfo": { + "waterIntervalDays": 3, + "light": "Helles bis volles Licht", + "temp": "15-30 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_fafb81415756f893", + "name": "Madagaskar-Jasmin", + "botanicalName": "Stephanotis floribunda", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e1/Stephanotis_floribunda1.jpg/330px-Stephanotis_floribunda1.jpg", + "imageStatus": "ok", + "description": "Der Madagaskar-Jasmin hat dicke, glaenzende Blaetter und wachsweisse, intensiv duftende Blueten. Klassische Hochzeitsblume.", + "categories": [ + "flowering" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles indirektes Licht", + "temp": "18-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_cabb9c3df66307ba", + "name": "Maisstrauch", + "botanicalName": "Dracaena fragrans", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/75/Dracaena_fragrans_-_Corn_Plant_%283622131419%29.jpg/330px-Dracaena_fragrans_-_Corn_Plant_%283622131419%29.jpg", + "imageStatus": "ok", + "description": "Der Maisstrauch ist eine robuste Zimmerpflanze mit breiten, gestreiften Blaettern. Gedeiht auch bei wenig Licht.", + "categories": [ + "easy", + "low_light", + "air_purifier", + "tree" + ], + "careInfo": { + "waterIntervalDays": 10, + "light": "Helles indirektes Licht", + "temp": "15-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_d52a80feceba729c", + "name": "Mammillaria", + "botanicalName": "Mammillaria zeilmanniana", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/37/Mammillaria_zeilmanniana_2.jpg/330px-Mammillaria_zeilmanniana_2.jpg", + "imageStatus": "ok", + "description": "Die Mammillaria ist ein kompakter, kugelfoermiger Kaktus, der im Fruehling einen Kranz aus rosa Blueten traegt.", + "categories": [ + "easy", + "succulent", + "flowering", + "sun" + ], + "careInfo": { + "waterIntervalDays": 14, + "light": "Volles Sonnenlicht", + "temp": "15-35 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_9406fa4ffbef305b", + "name": "Mangold", + "botanicalName": "Beta vulgaris", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/1a/Chard_multicolored.jpg/330px-Chard_multicolored.jpg", + "imageStatus": "ok", + "description": "Mangold ist ein farbenfrohes Blattgemuese mit bunten Stielen in Rot, Gelb, Orange und Weiss.", + "categories": [ + "easy", + "patterned" + ], + "careInfo": { + "waterIntervalDays": 3, + "light": "Helles bis volles Licht", + "temp": "10-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_ca9b1576aab12566", + "name": "Marmor-Efeutute", + "botanicalName": "Epipremnum aureum Marble Queen", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/3f/Epipremnum_aureum_31082012.jpg/330px-Epipremnum_aureum_31082012.jpg", + "imageStatus": "ok", + "description": "Die Marmor-Efeutute hat cremeweiss-gruen marmorierte Blaetter. Eine dekorative Variante der klassischen Efeutute.", + "categories": [ + "easy", + "hanging", + "air_purifier" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles indirektes Licht", + "temp": "15-30 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_95de7815c2f690ce", + "name": "Mexikanische F├ñcherpalme", + "botanicalName": "Washingtonia robusta", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/93/Washingtonia_robusta_2.jpg/330px-Washingtonia_robusta_2.jpg", + "imageStatus": "ok", + "description": "Die Mexikanische F├ñcherpalme ist eine schlanke, hohe Palme mit faecher┬¡foermigen Blaettern. Sehr hitzetolerant.", + "categories": [ + "tree", + "sun", + "large" + ], + "careInfo": { + "waterIntervalDays": 10, + "light": "Volles Sonnenlicht", + "temp": "15-35 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_01ed2f643e7d5d8e", + "name": "Mini-Monstera", + "botanicalName": "Rhaphidophora tetrasperma", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/18/Rhaphidophora_tetrasperma_01.jpg/330px-Rhaphidophora_tetrasperma_01.jpg", + "imageStatus": "ok", + "description": "Die Mini-Monstera hat monstera┬¡aehnliche, gelochte Blaetter auf einer kompakten, klettternden Pflanze. Sehr trendig.", + "categories": [ + "easy", + "hanging" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles indirektes Licht", + "temp": "18-27 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_8e8b8bf4c4f7bdb6", + "name": "Mond-Kaktus", + "botanicalName": "Gymnocalycium mihanovichii", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/47/Gymnocalycium_mihanovichii.jpg/330px-Gymnocalycium_mihanovichii.jpg", + "imageStatus": "ok", + "description": "Der Mond-Kaktus ist eine farbenfrohe Veredelung eines chlorophylllosen Kaktus auf einem gruenen Unterlagekaktus.", + "categories": [ + "easy", + "succulent" + ], + "careInfo": { + "waterIntervalDays": 14, + "light": "Indirektes Licht", + "temp": "15-30 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_e8ab689f2d26d8b2", + "name": "Mondstein-Pflanze", + "botanicalName": "Pachyphytum oviferum", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/44/Pachyphytum_oviferum_%28Moonstones%29.jpg/330px-Pachyphytum_oviferum_%28Moonstones%29.jpg", + "imageStatus": "ok", + "description": "Die Mondstein-Pflanze hat dicke, ovale Blaetter mit einem pastellrosafarbenen, mehligen Ueberzug.", + "categories": [ + "easy", + "succulent", + "sun" + ], + "careInfo": { + "waterIntervalDays": 14, + "light": "Volles Sonnenlicht", + "temp": "15-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_8106ae1b2a8d0a09", + "name": "Monstera", + "botanicalName": "Monstera deliciosa", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/2e/Monstera_deliciosa2.jpg/330px-Monstera_deliciosa2.jpg", + "imageStatus": "ok", + "description": "Die Monstera ist eine tropische Kletterpflanze mit charakteristisch gelochten Blaettern. Sehr beliebt weltweit.", + "categories": [ + "easy", + "large", + "air_purifier" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles indirektes Licht", + "temp": "18-27 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_b843de18953d2232", + "name": "Monstera adansonii", + "botanicalName": "Monstera adansonii", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/bd/Monstera_adansonii_1.jpg/330px-Monstera_adansonii_1.jpg", + "imageStatus": "ok", + "description": "Monstera adansonii hat herzfoermige Blaetter mit zahlreichen runden Lochern. Eine rankende Zimmerpflanze.", + "categories": [ + "easy", + "hanging" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles indirektes Licht", + "temp": "18-27 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_44c152d886d0b190", + "name": "Monstera obliqua", + "botanicalName": "Monstera obliqua", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/0e/Monstera_obliqua.jpg/330px-Monstera_obliqua.jpg", + "imageStatus": "ok", + "description": "Monstera obliqua ist eine seltene Monstera-Art mit filigranen Blaettern, die hauptsaechlich aus Lochern bestehen.", + "categories": [ + "hanging", + "patterned" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles indirektes Licht", + "temp": "18-27 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_da8adeffa961a540", + "name": "Moos-Crassula", + "botanicalName": "Crassula muscosa", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/ae/Crassula_muscosa.jpg/330px-Crassula_muscosa.jpg", + "imageStatus": "ok", + "description": "Die Moos-Crassula hat dicht aneinandergereihte, winzige gruene Blaetter auf unverzweigten Trieben. Sieht aus wie Moos.", + "categories": [ + "easy", + "succulent", + "sun" + ], + "careInfo": { + "waterIntervalDays": 14, + "light": "Helles bis volles Licht", + "temp": "15-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_917a7775d4ada0c1", + "name": "Muschelingwer", + "botanicalName": "Alpinia zerumbet", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c0/Alpinia_zerumbet_3.jpg/330px-Alpinia_zerumbet_3.jpg", + "imageStatus": "ok", + "description": "Der Muschelingwer hat lange, elegante Blaetter und haengende Bluetenrispen mit weiss-rosa Bluetchen.", + "categories": [ + "flowering", + "high_humidity", + "large" + ], + "careInfo": { + "waterIntervalDays": 5, + "light": "Helles bis volles Licht", + "temp": "20-30 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_de18a22fc81062c9", + "name": "Neon-Efeutute", + "botanicalName": "Epipremnum pinnatum Neon", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/04/Epipremnum_pinnatum_-_neon_pothos.jpg/330px-Epipremnum_pinnatum_-_neon_pothos.jpg", + "imageStatus": "ok", + "description": "Die Neon-Efeutute hat leuchtend limonengruene Blaetter. Sehr auffaellig und pflegeleicht.", + "categories": [ + "easy", + "hanging", + "air_purifier" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles indirektes Licht", + "temp": "15-30 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_3d4bc95e6500e9fc", + "name": "Neoregelia", + "botanicalName": "Neoregelia carolinae", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/68/Neoregelia_carolinae.jpg/330px-Neoregelia_carolinae.jpg", + "imageStatus": "ok", + "description": "Die Neoregelia ist eine Bromelie, bei der das Herzblatt zur Bluetzeit leuchtend rot wird. Sehr dekorativ.", + "categories": [ + "flowering", + "patterned", + "bright_light" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles bis volles Licht", + "temp": "18-27 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_c62ac934518110bb", + "name": "Neuguinea-Balsamine", + "botanicalName": "Impatiens hawkeri", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/44/Impatiens_hawkeri.jpg/330px-Impatiens_hawkeri.jpg", + "imageStatus": "ok", + "description": "Die Neuguinea-Balsamine hat grosse, leuchtende Blueten und ist sehr bluehfreudig. Ideal fuer Terrassen.", + "categories": [ + "easy", + "flowering" + ], + "careInfo": { + "waterIntervalDays": 3, + "light": "Helles indirektes Licht", + "temp": "18-27 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_3dec7298828d7d5b", + "name": "Oleander", + "botanicalName": "Nerium oleander", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/66/Nerium_oleander_flowers_leaves.jpg/330px-Nerium_oleander_flowers_leaves.jpg", + "imageStatus": "ok", + "description": "Der Oleander ist ein mediteraner Strauch mit leuchtend roten, rosa oder weissen Blueten. Sehr hitzetolerant.", + "categories": [ + "flowering", + "sun", + "bright_light" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Volles Sonnenlicht", + "temp": "15-28 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_8915ad2e41841f3d", + "name": "Orangenbaum", + "botanicalName": "Citrus sinensis", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/43/Ambersweet_oranges.jpg/330px-Ambersweet_oranges.jpg", + "imageStatus": "ok", + "description": "Der Orangenbaum ist ein kleiner, immergruener Baum mit weissen Blueten und orangen Fruechten.", + "categories": [ + "sun", + "tree", + "medicinal" + ], + "careInfo": { + "waterIntervalDays": 5, + "light": "Volles Sonnenlicht", + "temp": "18-28 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_d61f0c50e94b917d", + "name": "Oregano", + "botanicalName": "Origanum vulgare", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c5/Origanum_vulgare_-_harilik_pune.jpg/330px-Origanum_vulgare_-_harilik_pune.jpg", + "imageStatus": "ok", + "description": "Oregano ist ein aromatisches Kuechenkraut mit runden, behaarten Blaettern. In mediterraner Kueche beliebt.", + "categories": [ + "easy", + "medicinal", + "sun" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Volles Sonnenlicht", + "temp": "15-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_a62147e5f0805622", + "name": "Osterglocke", + "botanicalName": "Narcissus pseudonarcissus", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/0a/Narcissus_pseudonarcissus.jpg/330px-Narcissus_pseudonarcissus.jpg", + "imageStatus": "ok", + "description": "Die Osterglocke ist der klassische Fruehjahrsblueher mit leuchtend gelben, trompetenfoermigen Blueten.", + "categories": [ + "flowering" + ], + "careInfo": { + "waterIntervalDays": 5, + "light": "Helles bis volles Licht", + "temp": "10-18 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_f66ecda188a5efad", + "name": "Ostertrompete", + "botanicalName": "Lilium longiflorum", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/48/Lilium_longiflorum_Ether.jpg/330px-Lilium_longiflorum_Ether.jpg", + "imageStatus": "ok", + "description": "Die Ostertrompete hat grosse, weisse, trichterfoermige Blueten mit intensivem Duft. Klassische Osterblume.", + "categories": [ + "flowering", + "bright_light" + ], + "careInfo": { + "waterIntervalDays": 5, + "light": "Helles bis volles Licht", + "temp": "15-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_e4f082a4e9f3a8c5", + "name": "Papaya", + "botanicalName": "Carica papaya", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/d0/Papaya_cross_section_BNC.jpg/330px-Papaya_cross_section_BNC.jpg", + "imageStatus": "ok", + "description": "Die Papaya ist eine tropische Fruchtpflanze mit grossen, gelappten Blaettern und orangen Fruechten.", + "categories": [ + "sun", + "large", + "medicinal" + ], + "careInfo": { + "waterIntervalDays": 5, + "light": "Volles Sonnenlicht", + "temp": "20-35 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_612cf58237a77a91", + "name": "Paradiesvogelblume", + "botanicalName": "Strelitzia reginae", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a1/24701-nature-natural-beauty.jpg/330px-24701-nature-natural-beauty.jpg", + "imageStatus": "ok", + "description": "Die Paradiesvogelblume beeindruckt mit leuchtend orangefarbenen und blauen Blueten, die einem Vogel aehneln.", + "categories": [ + "flowering", + "sun", + "large" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Volles Sonnenlicht", + "temp": "18-26 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_61ec02f0a706b922", + "name": "Paragraphenpflanze", + "botanicalName": "Cyperus alternifolius", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/15/Cyperus_alternifolius_2.jpg/330px-Cyperus_alternifolius_2.jpg", + "imageStatus": "ok", + "description": "Die Paragraphenpflanze hat lange, grasartige Blaetter, die sternfoermig vom Stiel abstehen. Sie liebt viel Wasser.", + "categories": [ + "high_humidity" + ], + "careInfo": { + "waterIntervalDays": 3, + "light": "Helles bis volles Licht", + "temp": "18-27 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_13543a8abb8f50c8", + "name": "Passionsblume", + "botanicalName": "Passiflora caerulea", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c9/Passiflora_caerulea.jpg/330px-Passiflora_caerulea.jpg", + "imageStatus": "ok", + "description": "Die Passionsblume ist eine faszinierende Kletterpflanze mit komplex strukturierten, blau-weissen Blueten.", + "categories": [ + "flowering", + "hanging" + ], + "careInfo": { + "waterIntervalDays": 5, + "light": "Helles bis volles Licht", + "temp": "15-27 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_b9a0c1910297e2cb", + "name": "Perlenschnur-Pflanze", + "botanicalName": "Senecio rowleyanus", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/04/Senecio_rowleyanus_2.jpg/330px-Senecio_rowleyanus_2.jpg", + "imageStatus": "ok", + "description": "Die Perlenschnur-Pflanze hat haengende Ranken mit kugelfoermigen, perlenaehnlichen Blaettern. Einzigartige Sukkulente.", + "categories": [ + "easy", + "succulent", + "hanging" + ], + "careInfo": { + "waterIntervalDays": 14, + "light": "Helles bis volles Licht", + "temp": "15-27 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_ab8fc977bd930772", + "name": "Peruanischer Fackelkaktus", + "botanicalName": "Cereus peruvianus", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/79/Cereus_repandus.jpg/330px-Cereus_repandus.jpg", + "imageStatus": "ok", + "description": "Der Peruanische Fackelkaktus ist ein saeulenfoermiger Kaktus, der im Innenraum bis zu 2 m hoch werden kann.", + "categories": [ + "easy", + "succulent", + "sun", + "large" + ], + "careInfo": { + "waterIntervalDays": 21, + "light": "Volles Sonnenlicht", + "temp": "15-35 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_f57319d9209a678f", + "name": "Petersilie", + "botanicalName": "Petroselinum crispum", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/39/Petroselinum_crispum.jpg/330px-Petroselinum_crispum.jpg", + "imageStatus": "ok", + "description": "Petersilie ist eines der meistgenutzten Kuechenkraeuter mit frisch-aromatischem Geschmack. Reich an Vitaminen.", + "categories": [ + "easy", + "medicinal" + ], + "careInfo": { + "waterIntervalDays": 3, + "light": "Helles Licht", + "temp": "10-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_d859b55b599f2742", + "name": "Petunie", + "botanicalName": "Petunia hybrida", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/3d/Petunia_hybrida_hort.%2C_flowers.jpg/330px-Petunia_hybrida_hort.%2C_flowers.jpg", + "imageStatus": "ok", + "description": "Die Petunie ist eine der beliebtesten Balkonpflanzen mit trichterfoermigen Blueten in unzaehligen Farben.", + "categories": [ + "easy", + "flowering", + "sun" + ], + "careInfo": { + "waterIntervalDays": 2, + "light": "Volles Sonnenlicht", + "temp": "15-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_9f46ccdc5b9b10f3", + "name": "Pfeilblatt", + "botanicalName": "Syngonium podophyllum", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/f7/Syngonium_podophyllum_-_Flickr_-_peganum.jpg/330px-Syngonium_podophyllum_-_Flickr_-_peganum.jpg", + "imageStatus": "ok", + "description": "Das Pfeilblatt hat charakteristisch pfeilfoermige Blaetter, die sich mit dem Alter weiterentwickeln.", + "categories": [ + "easy", + "hanging" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles indirektes Licht", + "temp": "16-27 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_c7b763cec4d30529", + "name": "Pferdeschwanzpalme", + "botanicalName": "Beaucarnea recurvata", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/73/Beaucarnea_recurvata.jpg/330px-Beaucarnea_recurvata.jpg", + "imageStatus": "ok", + "description": "Die Pferdeschwanzpalme hat einen verdickten Stammbasis als Wasserspeicher und lange, schmale Blaetter.", + "categories": [ + "easy", + "succulent", + "tree", + "sun" + ], + "careInfo": { + "waterIntervalDays": 21, + "light": "Volles Sonnenlicht", + "temp": "15-30 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_418e4442c57e9974", + "name": "Philodendron bipinnatifidum", + "botanicalName": "Philodendron bipinnatifidum", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/37/Philodendron_bipinnatifidum_kz01.jpg/330px-Philodendron_bipinnatifidum_kz01.jpg", + "imageStatus": "ok", + "description": "Philodendron bipinnatifidum hat grosse, tief gelappte Blaetter. Er entwickelt einen beeindruckenden, baumfoermigen Wuchs.", + "categories": [ + "easy", + "large" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles indirektes Licht", + "temp": "18-27 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_64223543ba5ff673", + "name": "Philodendron gloriosum", + "botanicalName": "Philodendron gloriosum", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/52/Philodendron_gloriosum1.jpg/330px-Philodendron_gloriosum1.jpg", + "imageStatus": "ok", + "description": "Philodendron gloriosum hat grosse, samtige, herzfoermige Blaetter mit weissen Rippen. Eine atemberaubende Pflanze.", + "categories": [ + "patterned", + "high_humidity", + "large" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles indirektes Licht", + "temp": "18-27 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_6a5d7ac021669bb4", + "name": "Primel", + "botanicalName": "Primula vulgaris", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/2d/Primula_vulgaris_white.jpg/330px-Primula_vulgaris_white.jpg", + "imageStatus": "ok", + "description": "Die Primel ist einer der ersten Fruehjahrs┬¡boten mit lebhaften Blueten in Gelb, Pink, Rot und Lila.", + "categories": [ + "flowering" + ], + "careInfo": { + "waterIntervalDays": 4, + "light": "Helles indirektes Licht", + "temp": "10-18 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_045dd35819e8793f", + "name": "Purpursonnentau", + "botanicalName": "Sarracenia purpurea", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/6e/Sarracenia_purpurea.jpg/330px-Sarracenia_purpurea.jpg", + "imageStatus": "ok", + "description": "Der Purpursonnentau ist eine fleischfressende Kannenpflanze mit purpurroten Kannen. Faengt Insekten.", + "categories": [ + "sun", + "high_humidity" + ], + "careInfo": { + "waterIntervalDays": 3, + "light": "Volles Sonnenlicht", + "temp": "5-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_1feebf3d053224a9", + "name": "Radieschen", + "botanicalName": "Raphanus sativus", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/5a/Radish_ps10.jpg/330px-Radish_ps10.jpg", + "imageStatus": "ok", + "description": "Das Radieschen ist ein schnellwachsendes Gemuese mit runden, roten Knollen. Es reift in nur 3-4 Wochen.", + "categories": [ + "easy" + ], + "careInfo": { + "waterIntervalDays": 2, + "light": "Helles bis volles Licht", + "temp": "10-22 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_563226faba183e0d", + "name": "Regenbogenmoos", + "botanicalName": "Selaginella uncinata", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/09/Selaginella_uncinata_at_SBG.jpg/330px-Selaginella_uncinata_at_SBG.jpg", + "imageStatus": "ok", + "description": "Das Regenbogenmoos hat schuppenfoermige Blaetter, die im Licht schillernd irisieren. Dekorativ fuer Terrarien.", + "categories": [ + "high_humidity", + "patterned" + ], + "careInfo": { + "waterIntervalDays": 5, + "light": "Helles indirektes Licht", + "temp": "18-27 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_a6883747d701df71", + "name": "Riemenblatt", + "botanicalName": "Clivia miniata", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/21/Clivia_miniata.jpg/330px-Clivia_miniata.jpg", + "imageStatus": "ok", + "description": "Das Riemenblatt ist eine dekorative Zimmerpflanze mit leuchtend orangefarbenen Blueten im Fruehling.", + "categories": [ + "flowering", + "low_light" + ], + "careInfo": { + "waterIntervalDays": 10, + "light": "Helles indirektes Licht", + "temp": "15-24 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_5e0e0211b3e815d1", + "name": "Rippenpeperomie", + "botanicalName": "Peperomia caperata", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/22/Peperomia_caperata_Rosso.jpg/330px-Peperomia_caperata_Rosso.jpg", + "imageStatus": "ok", + "description": "Die Rippenpeperomie hat tief gerippte, dunkelgruene bis violette Blaetter mit einer samtigen Textur.", + "categories": [ + "easy", + "pet_friendly" + ], + "careInfo": { + "waterIntervalDays": 10, + "light": "Helles indirektes Licht", + "temp": "18-26 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_f3c4aea00446ce7d", + "name": "Ritterstern", + "botanicalName": "Hippeastrum hybrid", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c7/Hippeastrum_%27Red_Lion%27.jpg/330px-Hippeastrum_%27Red_Lion%27.jpg", + "imageStatus": "ok", + "description": "Der Ritterstern beeindruckt im Winter mit riesigen, trompetenfoermigen Blueten in Rot, Pink oder Weiss.", + "categories": [ + "flowering", + "bright_light" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles bis volles Licht", + "temp": "18-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_ce9ff96b95f4fe81", + "name": "Rosengeranie", + "botanicalName": "Pelargonium graveolens", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/81/Pelargonium_graveolens.jpg/330px-Pelargonium_graveolens.jpg", + "imageStatus": "ok", + "description": "Die Rosengeranie ist eine Duftpflanze mit tief eingeschnittenen Blaettern und rosaenlichem Aroma.", + "categories": [ + "easy", + "medicinal", + "sun" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Volles Sonnenlicht", + "temp": "15-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_bc06c3ee948f7ba7", + "name": "Rosmarin", + "botanicalName": "Rosmarinus officinalis", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/ae/Rosemary_bush.jpg/330px-Rosemary_bush.jpg", + "imageStatus": "ok", + "description": "Rosmarin ist ein aromatisches Kraut mit nadelartigen Blaettern und blauen Blueten. In der Kueche unverzichtbar.", + "categories": [ + "easy", + "medicinal", + "sun" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Volles Sonnenlicht", + "temp": "10-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_a50df676efef7b7d", + "name": "Roter Fingerhut", + "botanicalName": "Digitalis purpurea", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a1/Digitalis_purpurea_Koehler.jpg/330px-Digitalis_purpurea_Koehler.jpg", + "imageStatus": "ok", + "description": "Der Rote Fingerhut hat hohe Bluetenstaende mit roehrenfoermigen, gepunkteten Blueten in Rosa. Wichtige Arzneipflanze.", + "categories": [ + "medicinal", + "flowering" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles bis volles Licht", + "temp": "10-20 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_4f9c3ae955d4b1b0", + "name": "Roter Philodendron", + "botanicalName": "Philodendron erubescens", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/18/Philodendron_erubescens.jpg/330px-Philodendron_erubescens.jpg", + "imageStatus": "ok", + "description": "Der Rote Philodendron hat glaenzende, herzfoermige Blaetter, die jung roetrlich erscheinen. Sehr dekorativ.", + "categories": [ + "easy", + "hanging" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles indirektes Licht", + "temp": "18-27 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_b6887f02c51a178f", + "name": "Salat", + "botanicalName": "Lactuca sativa", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/7f/Lettuce_in_garden.jpg/330px-Lettuce_in_garden.jpg", + "imageStatus": "ok", + "description": "Salat ist eine schnell wachsende Blattgemuese┬¡pflanze. Im Topf und Balkonkasten sehr gut zu kultivieren.", + "categories": [ + "easy" + ], + "careInfo": { + "waterIntervalDays": 3, + "light": "Helles bis volles Licht", + "temp": "10-22 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_e3f7fa02342527b0", + "name": "Salbei", + "botanicalName": "Salvia officinalis", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b2/Salvia_officinalis_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-118.jpg/330px-Salvia_officinalis_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-118.jpg", + "imageStatus": "ok", + "description": "Salbei ist ein aromatisches Heilkraut mit silbrig-gruenen Blaettern. Er hat antibakterielle und entzuendungshem┬¡mende Wirkung.", + "categories": [ + "easy", + "medicinal", + "sun" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Volles Sonnenlicht", + "temp": "10-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_5ce8d8944fd3edc3", + "name": "San-Pedro-Kaktus", + "botanicalName": "Echinopsis pachanoi", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/3d/Echinopsis_pachanoi.jpg/330px-Echinopsis_pachanoi.jpg", + "imageStatus": "ok", + "description": "Der San-Pedro-Kaktus ist ein schnell wachsender, saeulenfoermiger Kaktus aus den Anden.", + "categories": [ + "easy", + "succulent", + "sun" + ], + "careInfo": { + "waterIntervalDays": 14, + "light": "Volles Sonnenlicht", + "temp": "10-35 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_d30b54367d7c0ccc", + "name": "Satinpothos", + "botanicalName": "Scindapsus pictus", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/65/Scindapsus_pictus.jpg/330px-Scindapsus_pictus.jpg", + "imageStatus": "ok", + "description": "Der Satinpothos hat samtig-glaenzende, silbrig gefleckte Blaetter auf langen, haengenden Ranken.", + "categories": [ + "easy", + "hanging", + "patterned" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles indirektes Licht", + "temp": "18-28 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_cbc9b35001d4f2fa", + "name": "Schafgarbe", + "botanicalName": "Achillea millefolium", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/91/Achillea_millefolium.jpg/330px-Achillea_millefolium.jpg", + "imageStatus": "ok", + "description": "Die Schafgarbe hat weisse oder rosafarbene Bluetenschirme und fein gefiederte Blaetter. Wichtige Heilpflanze.", + "categories": [ + "medicinal", + "flowering", + "sun" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Volles Sonnenlicht", + "temp": "10-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_ceea5c9d9b527cea", + "name": "Schamkraut", + "botanicalName": "Mimosa pudica", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/8b/Mimosa_pudica_touch.jpg/330px-Mimosa_pudica_touch.jpg", + "imageStatus": "ok", + "description": "Das Schamkraut faltet seine Blaettchen blitzschnell zusammen, wenn man sie beruehrt. Ein faszinierendes Erlebnis.", + "categories": [ + "easy", + "pet_friendly" + ], + "careInfo": { + "waterIntervalDays": 5, + "light": "Helles bis volles Licht", + "temp": "20-28 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_f02576d98e962040", + "name": "Schmetterlingsorchidee", + "botanicalName": "Phalaenopsis amabilis", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/1a/Phalaenopsis_amabilis_Orchi_054.jpg/330px-Phalaenopsis_amabilis_Orchi_054.jpg", + "imageStatus": "ok", + "description": "Die Schmetterlingsorchidee ist die bekannteste Zimmerorchidee. Sie bluet bei guter Pflege monatelang.", + "categories": [ + "flowering", + "high_humidity" + ], + "careInfo": { + "waterIntervalDays": 10, + "light": "Helles indirektes Licht", + "temp": "18-28 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_1b8072d12aee4246", + "name": "Schnittlauch", + "botanicalName": "Allium schoenoprasum", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a2/Allium_schoenoprasum_close_up.jpg/330px-Allium_schoenoprasum_close_up.jpg", + "imageStatus": "ok", + "description": "Schnittlauch ist ein beliebtes Kuechenkraut mit roehrenfoermigen Blaettern und lila Blueten.", + "categories": [ + "easy", + "medicinal" + ], + "careInfo": { + "waterIntervalDays": 3, + "light": "Helles bis volles Licht", + "temp": "10-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_2dcb1ec9ac8b968f", + "name": "Schraubenbaum", + "botanicalName": "Pandanus veitchii", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/7e/Pandanus_utilis_Reunion.jpg/330px-Pandanus_utilis_Reunion.jpg", + "imageStatus": "ok", + "description": "Der Schraubenbaum hat spiralfoermig angeordnete, gruenweiss gestreifte Blaetter. Sehr dekorativ und exotisch.", + "categories": [ + "patterned", + "bright_light" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles bis volles Licht", + "temp": "18-27 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_40f7fbbd6ef0e3ba", + "name": "Schusterpflanze", + "botanicalName": "Aspidistra elatior", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/fc/Aspidistra_elatior1.jpg/330px-Aspidistra_elatior1.jpg", + "imageStatus": "ok", + "description": "Die Schusterpflanze ist eine extrem robuste Zimmerpflanze mit langen, dunkelgruenen Blaettern. Vertraegt tiefe Temperaturen.", + "categories": [ + "easy", + "low_light" + ], + "careInfo": { + "waterIntervalDays": 14, + "light": "Wenig bis helles Licht", + "temp": "10-20 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_fb7db49b3c127f71", + "name": "Schwarze Rose (Aeonium)", + "botanicalName": "Aeonium arboreum", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e2/Aeonium_arboreum_-_Schwarze_Rose_-_2009-03-14_-_Jardim_Botanico_Madeira_3.jpg/330px-Aeonium_arboreum_-_Schwarze_Rose_-_2009-03-14_-_Jardim_Botanico_Madeira_3.jpg", + "imageStatus": "ok", + "description": "Das Aeonium bildet dekorative, rosettenfoermige Sukkulenten an verzweigten Stielen.", + "categories": [ + "succulent", + "sun" + ], + "careInfo": { + "waterIntervalDays": 10, + "light": "Volles Sonnenlicht", + "temp": "10-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_183e544c5601be51", + "name": "Schwarzer Holunder", + "botanicalName": "Sambucus nigra", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/6f/Sambucus_nigra_2.jpg/330px-Sambucus_nigra_2.jpg", + "imageStatus": "ok", + "description": "Der Schwarze Holunder hat weisse Doldenbluten und schwarze Beeren. Die Fruechte werden fuer Sirup und Saft verwendet.", + "categories": [ + "medicinal", + "tree", + "flowering" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles bis volles Licht", + "temp": "10-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_fc5f536d0b2ff76e", + "name": "Schwertfarn", + "botanicalName": "Nephrolepis exaltata", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/30/Boston_Fern_%282873392811%29.png/330px-Boston_Fern_%282873392811%29.png", + "imageStatus": "ok", + "description": "Der Schwertfarn ist ein klassischer Zimmerfarn mit eleganten, herabh├ñngenden Wedeln. Liebt Feuchtigkeit.", + "categories": [ + "hanging", + "high_humidity", + "air_purifier" + ], + "careInfo": { + "waterIntervalDays": 3, + "light": "Helles indirektes Licht", + "temp": "16-24 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_3c6961985d686c33", + "name": "Silber-Weide", + "botanicalName": "Salix alba", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/42/Salix_alba_Morton.jpg/330px-Salix_alba_Morton.jpg", + "imageStatus": "ok", + "description": "Die Silber-Weide hat silbrig-glaenzende Blaetter. Weidenrinde enth├ñlt Salicylsaeure, die Grundlage von Aspirin.", + "categories": [ + "medicinal", + "tree", + "large" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles bis volles Licht", + "temp": "10-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_4d4483c9e8f98e94", + "name": "Silbervase", + "botanicalName": "Aechmea fasciata", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a0/Aechmea_fasciata1.jpg/330px-Aechmea_fasciata1.jpg", + "imageStatus": "ok", + "description": "Die Silbervase ist eine Bromelie mit silbrig geb├ñnderten Blaettern und einem rosafarbenen Bluetenstand.", + "categories": [ + "flowering", + "patterned" + ], + "careInfo": { + "waterIntervalDays": 10, + "light": "Helles indirektes Licht", + "temp": "18-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_24c71b67fe2ed42a", + "name": "Socotra-Wuestenrose", + "botanicalName": "Adenium socotranum", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/88/Adenium_socotranum_2.jpg/330px-Adenium_socotranum_2.jpg", + "imageStatus": "ok", + "description": "Die Socotra-Wuestenrose ist eine seltene, endemische Art mit einem sehr dicken, knolligen Stamm und rosa Blueten.", + "categories": [ + "succulent", + "flowering", + "sun" + ], + "careInfo": { + "waterIntervalDays": 14, + "light": "Volles Sonnenlicht", + "temp": "20-35 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_a91db7a3318f3302", + "name": "Sonnenhut", + "botanicalName": "Echinacea purpurea", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/9e/Purple_coneflower_Echinacea_purpurea.jpg/330px-Purple_coneflower_Echinacea_purpurea.jpg", + "imageStatus": "ok", + "description": "Der Sonnenhut ist eine beliebte Heilpflanze mit grossen, pinkfarbenen Blueten. Er staerkt das Immunsystem.", + "categories": [ + "medicinal", + "flowering", + "sun" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles bis volles Licht", + "temp": "15-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_0aa802b967afc69a", + "name": "Sonnentau", + "botanicalName": "Drosera capensis", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/18/Drosera_capensis.jpg/330px-Drosera_capensis.jpg", + "imageStatus": "ok", + "description": "Der Sonnentau faengt Insekten mit klebrigen Tropfen auf seinen Blaettern. Eine faszinierende fleischfressende Pflanze.", + "categories": [ + "sun", + "high_humidity" + ], + "careInfo": { + "waterIntervalDays": 5, + "light": "Volles Sonnenlicht", + "temp": "15-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_db7dd5c2bff6c42d", + "name": "Spanisches Moos", + "botanicalName": "Tillandsia usneoides", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/d5/Tillandsia_usneoides_0002.jpg/330px-Tillandsia_usneoides_0002.jpg", + "imageStatus": "ok", + "description": "Das Spanische Moos ist eine epiphytische Bromelie ohne Wurzeln, die in der Luft haengt. Es benoetigt nur Feuchtigkeitsbespruehing.", + "categories": [ + "easy", + "hanging", + "air_purifier" + ], + "careInfo": { + "waterIntervalDays": 3, + "light": "Helles bis volles Licht", + "temp": "15-30 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_ac11d9bd0c391e9d", + "name": "Speckbaum", + "botanicalName": "Portulacaria afra", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/73/Portulacaria_afra_2.jpg/330px-Portulacaria_afra_2.jpg", + "imageStatus": "ok", + "description": "Der Speckbaum ist eine sukkulente Pflanze mit roten Stielen und kleinen, runden, glaenzenden Blaettern.", + "categories": [ + "easy", + "succulent", + "sun" + ], + "careInfo": { + "waterIntervalDays": 14, + "light": "Helles bis volles Licht", + "temp": "15-30 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_477dc83da2cd56cb", + "name": "Spiegelpeperomie", + "botanicalName": "Peperomia obtusifolia", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/7c/Peperomia_obtusifolia1.jpg/330px-Peperomia_obtusifolia1.jpg", + "imageStatus": "ok", + "description": "Die Spiegelpeperomie hat glaenzende, lederartige, oval-runde Blaetter in tiefem Gruen. Sehr robust.", + "categories": [ + "easy", + "pet_friendly", + "low_light" + ], + "careInfo": { + "waterIntervalDays": 10, + "light": "Helles indirektes Licht", + "temp": "16-26 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_4f624a47f15a976c", + "name": "Spinat", + "botanicalName": "Spinacia oleracea", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/d1/Spinach_leaves.jpg/330px-Spinach_leaves.jpg", + "imageStatus": "ok", + "description": "Spinat ist ein naehrstoffreiches Blattgemuese mit dunkelgruenen Blaettern. Reich an Eisen und Vitaminen.", + "categories": [ + "easy", + "medicinal" + ], + "careInfo": { + "waterIntervalDays": 3, + "light": "Helles bis volles Licht", + "temp": "10-20 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_c3b438f135460578", + "name": "Stab-Palme", + "botanicalName": "Rhapis excelsa", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/65/Rhapis_excelsa_02.jpg/330px-Rhapis_excelsa_02.jpg", + "imageStatus": "ok", + "description": "Die Stab-Palme ist eine elegante Zimmerpalme mit faecher┬¡foermigen Blaettern auf duennen, bambusartigen Staemmen.", + "categories": [ + "low_light", + "tree" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles indirektes Licht", + "temp": "15-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_e6998b94b6aa9483", + "name": "Stiefmuetterchen", + "botanicalName": "Viola wittrockiana", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/ea/Violas_at_Butchart_Gardens.jpg/330px-Violas_at_Butchart_Gardens.jpg", + "imageStatus": "ok", + "description": "Das Stiefmuetterchen ist ein bekannter Fruehjahrsblueher mit charakteristisch gezeichneten Blueten.", + "categories": [ + "easy", + "flowering" + ], + "careInfo": { + "waterIntervalDays": 3, + "light": "Helles bis volles Licht", + "temp": "5-18 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_4e7aa106c2e0dbed", + "name": "Stiefmuetterchen-Orchidee", + "botanicalName": "Miltoniopsis roezlii", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Miltoniopsis_roezlii.jpg/330px-Miltoniopsis_roezlii.jpg", + "imageStatus": "ok", + "description": "Die Stiefmuetterchen-Orchidee hat grosse, flache Blueten. Bevorzugt kuehle Temperaturen und hohe Luftfeuchtigkeit.", + "categories": [ + "flowering", + "high_humidity" + ], + "careInfo": { + "waterIntervalDays": 5, + "light": "Indirektes Licht", + "temp": "15-22 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_67521f8578f80480", + "name": "Strahlenaralie", + "botanicalName": "Schefflera arboricola", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/30/Schefflera_arboricola_3.jpg/330px-Schefflera_arboricola_3.jpg", + "imageStatus": "ok", + "description": "Die Strahlenaralie hat fingerfoermig angeordnete, glaenzende Blaetter auf langen Stielen. Sehr robuste Zimmerpflanze.", + "categories": [ + "easy", + "air_purifier", + "tree" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles indirektes Licht", + "temp": "15-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_15d0205868b79470", + "name": "Stromanthe", + "botanicalName": "Stromanthe sanguinea", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/8e/Stromanthe_sanguinea.jpg/330px-Stromanthe_sanguinea.jpg", + "imageStatus": "ok", + "description": "Die Stromanthe hat dekorative Blaetter mit weissem Muster und leuchtend roter Unterseite. Familie der Marantaceen.", + "categories": [ + "patterned", + "high_humidity" + ], + "careInfo": { + "waterIntervalDays": 5, + "light": "Helles indirektes Licht", + "temp": "18-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_9d6e62be0b1cb281", + "name": "Studentenblume", + "botanicalName": "Tagetes patula", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/63/Marigold_Tagetes.jpg/330px-Marigold_Tagetes.jpg", + "imageStatus": "ok", + "description": "Die Studentenblume ist eine robuste Sommerblume mit orangen oder gelben Blueten. Sie haelt Schadlinge fern.", + "categories": [ + "easy", + "flowering", + "medicinal", + "sun" + ], + "careInfo": { + "waterIntervalDays": 3, + "light": "Volles Sonnenlicht", + "temp": "15-28 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_4b198e1fefa08544", + "name": "Suesskartoffel", + "botanicalName": "Ipomoea batatas", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b7/Ipomoea_batatas_006.JPG/330px-Ipomoea_batatas_006.JPG", + "imageStatus": "ok", + "description": "Die Suesskartoffel-Zierpflanze hat dekorative, herzfoermige Blaetter in gruen oder dunkelviolett. Ideal als Haengepflanze.", + "categories": [ + "easy", + "hanging", + "sun" + ], + "careInfo": { + "waterIntervalDays": 5, + "light": "Volles Sonnenlicht", + "temp": "20-30 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_876974955b59c59e", + "name": "Tanzerinnen-Orchidee", + "botanicalName": "Oncidium sphacelatum", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/ee/Oncidium_sphacelatum_-_Flickr_002.jpg/330px-Oncidium_sphacelatum_-_Flickr_002.jpg", + "imageStatus": "ok", + "description": "Die Tanzerinnen-Orchidee traegt lange Rispen mit Hunderten kleiner, gelb-brauner Blueten. Sehr reichliche Bluetracht.", + "categories": [ + "flowering", + "high_humidity" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles indirektes Licht", + "temp": "18-27 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_2ee0814c52ec43e5", + "name": "Taro", + "botanicalName": "Colocasia esculenta", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/7f/Colocasia_esculenta_-_Kalo_lo%27i_%28taro%29.jpg/330px-Colocasia_esculenta_-_Kalo_lo%27i_%28taro%29.jpg", + "imageStatus": "ok", + "description": "Der Taro ist eine tropische Pflanze mit grossen, herzfoermigen Blaettern. Die Knollen sind Nahrungsquelle.", + "categories": [ + "high_humidity", + "large" + ], + "careInfo": { + "waterIntervalDays": 3, + "light": "Helles indirektes Licht", + "temp": "18-30 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_8860c603977b7048", + "name": "Teestrauch", + "botanicalName": "Camellia sinensis", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/04/TeaPlantation.jpg/330px-TeaPlantation.jpg", + "imageStatus": "ok", + "description": "Der Teestrauch ist die Pflanze, aus deren Blaettern Tee gewonnen wird. Er hat weisse Blueten und glaenzende Blaetter.", + "categories": [ + "medicinal" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles indirektes Licht", + "temp": "15-22 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_716160bf88dd9d13", + "name": "Tempel-Baum", + "botanicalName": "Plumeria rubra", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/27/Plumeria_rubra_Puu_Waawaa.jpg/330px-Plumeria_rubra_Puu_Waawaa.jpg", + "imageStatus": "ok", + "description": "Der Tempel-Baum hat intensiv duftende, sternfoermige Blueten in Weiss, Gelb oder Rosa. Klassische Tropenblume.", + "categories": [ + "flowering", + "sun", + "tree" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Volles Sonnenlicht", + "temp": "20-30 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_9b35df06e64f0898", + "name": "Thymian", + "botanicalName": "Thymus vulgaris", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c7/Thymus_vulgaris_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-274.jpg/330px-Thymus_vulgaris_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-274.jpg", + "imageStatus": "ok", + "description": "Thymian ist ein kleiner, aromatischer Strauch mit winzigen Blaettern und rosa Blueten. Wichtiges Kuechenkraut.", + "categories": [ + "easy", + "medicinal", + "sun" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Volles Sonnenlicht", + "temp": "10-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_4318ad8d02f7a1e3", + "name": "Tiroler Keulenlilie", + "botanicalName": "Cordyline fruticosa", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/17/Cordyline_fruticosa1.jpg/330px-Cordyline_fruticosa1.jpg", + "imageStatus": "ok", + "description": "Die Tiroler Keulenlilie hat leuchtend rote, gruene oder buntlaubige Blaetter. Eine exotische Zimmerpflanze.", + "categories": [ + "easy", + "patterned" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles indirektes Licht", + "temp": "18-27 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_6209cff29d20de9d", + "name": "Tomate", + "botanicalName": "Solanum lycopersicum", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/88/Salad_garden_cherry_tomatoes_are_picked.jpg/330px-Salad_garden_cherry_tomatoes_are_picked.jpg", + "imageStatus": "ok", + "description": "Die Tomate ist eine beliebte Gemuese- und Balkonpflanze mit roten, saftigen Fruechten. Im Topf kultivierbar.", + "categories": [ + "easy", + "sun", + "medicinal" + ], + "careInfo": { + "waterIntervalDays": 3, + "light": "Volles Sonnenlicht", + "temp": "18-28 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_5b5d63d3d16734c3", + "name": "Traubenhyazinthe", + "botanicalName": "Muscari armeniacum", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/aa/Muscari_armeniacum_1.jpg/330px-Muscari_armeniacum_1.jpg", + "imageStatus": "ok", + "description": "Die Traubenhyazinthe bildet dichte Trauben aus kleinen, blauen bis violetten Gloeckchen. Zuverlaessige Fruejahrszwiebel.", + "categories": [ + "easy", + "flowering" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles bis volles Licht", + "temp": "8-18 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_79692a800f05a5e6", + "name": "Triphylla-Fuchsie", + "botanicalName": "Fuchsia triphylla", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c1/Fuchsia_triphylla.jpg/330px-Fuchsia_triphylla.jpg", + "imageStatus": "ok", + "description": "Die Triphylla-Fuchsie hat lange, roehrenfoermige, orangefarbe Blueten in haengenden Trauben. Sehr exotisch.", + "categories": [ + "flowering", + "hanging" + ], + "careInfo": { + "waterIntervalDays": 3, + "light": "Helles indirektes Licht", + "temp": "15-22 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_6ad4ada285b323dd", + "name": "Tueipelfarn", + "botanicalName": "Polypodium vulgare", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/67/Polypodium_vulgare_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-106.jpg/330px-Polypodium_vulgare_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-106.jpg", + "imageStatus": "ok", + "description": "Der Tueipelfarn ist ein heimischer Farn mit gelappten Wedeln und runden Sporenhaeufchen auf der Unterseite.", + "categories": [ + "easy", + "medicinal" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles indirektes Licht", + "temp": "10-20 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_f03bc24e17022dd9", + "name": "Tueipelfarn (Microsorum)", + "botanicalName": "Microsorum punctatum", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/06/Microsorum_punctatum_0002.JPG/330px-Microsorum_punctatum_0002.JPG", + "imageStatus": "ok", + "description": "Microsorum punctatum ist ein tropischer Farn mit langen, ungeteilten, glaenzenden Wedeln. Fuer feuchte Standorte.", + "categories": [ + "high_humidity" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles indirektes Licht", + "temp": "18-27 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_a90c8b9c4cddc806", + "name": "Tulpe", + "botanicalName": "Tulipa gesneriana", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/41/Beautiful_red_and_yellow_tulips.jpg/330px-Beautiful_red_and_yellow_tulips.jpg", + "imageStatus": "ok", + "description": "Die Tulpe ist eine der beliebtesten Fruehjahrsblueher mit kelchfoermigen Blueten in unzaehligen Farben.", + "categories": [ + "easy", + "flowering" + ], + "careInfo": { + "waterIntervalDays": 5, + "light": "Helles bis volles Licht", + "temp": "8-18 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_ea198ff58c8805c6", + "name": "Ufopflanze", + "botanicalName": "Pilea peperomioides", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/6d/Pilea_peperomioides_Chinese_money_plant.jpg/330px-Pilea_peperomioides_Chinese_money_plant.jpg", + "imageStatus": "ok", + "description": "Die Ufopflanze hat unverwechselbare, runde Blaetter auf langen Stielen. Bildet leicht Ableger zum Verschenken.", + "categories": [ + "easy", + "pet_friendly" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles indirektes Licht", + "temp": "13-30 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_40fc59a7783f4dbd", + "name": "Vanda-Orchidee", + "botanicalName": "Vanda coerulea", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/55/Vanda_coerulea.jpg/330px-Vanda_coerulea.jpg", + "imageStatus": "ok", + "description": "Die Vanda-Orchidee ist bekannt fuer ihre seltene blaue Bluetenfarbe. Epiphytische Orchidee mit grossen Blueten.", + "categories": [ + "flowering", + "high_humidity", + "bright_light" + ], + "careInfo": { + "waterIntervalDays": 3, + "light": "Helles bis volles Licht", + "temp": "20-30 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_ec96801b21f4b888", + "name": "Vanille", + "botanicalName": "Vanilla planifolia", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/3b/Vanilla_planifolia_flowers.jpg/330px-Vanilla_planifolia_flowers.jpg", + "imageStatus": "ok", + "description": "Die Vanille ist eine kletternde Orchidee, aus deren Fruechten das beliebte Gewuerz gewonnen wird.", + "categories": [ + "flowering", + "high_humidity", + "medicinal" + ], + "careInfo": { + "waterIntervalDays": 5, + "light": "Helles indirektes Licht", + "temp": "20-30 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_e0c02d30e9553083", + "name": "Venusfliegenfalle", + "botanicalName": "Dionaea muscipula", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/34/Dionaea_muscipula.jpg/330px-Dionaea_muscipula.jpg", + "imageStatus": "ok", + "description": "Die Venusfliegenfalle ist eine fleischfressende Pflanze mit klappfallartigen Blaettern. Faengt Insekten.", + "categories": [ + "sun" + ], + "careInfo": { + "waterIntervalDays": 5, + "light": "Volles Sonnenlicht", + "temp": "15-30 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_621534b573f3fbd1", + "name": "Vogelnest-Farn", + "botanicalName": "Asplenium nidus", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/8e/Asplenium_nidus_at_Palmengarten_Frankfurt.jpg/330px-Asplenium_nidus_at_Palmengarten_Frankfurt.jpg", + "imageStatus": "ok", + "description": "Der Vogelnest-Farn hat ganzrandige, glaenzende Wedel, die eine Nestform bilden. Sehr dekorativ und robust.", + "categories": [ + "easy", + "high_humidity", + "low_light" + ], + "careInfo": { + "waterIntervalDays": 5, + "light": "Helles indirektes Licht", + "temp": "18-27 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_b109c47be52f9ec8", + "name": "Wachsblume", + "botanicalName": "Hoya carnosa", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/5c/Hoya_carnosa.jpg/330px-Hoya_carnosa.jpg", + "imageStatus": "ok", + "description": "Die Wachsblume ist eine Kletterpflanze mit dicken, wachsartigen Blaettern und sternfoermigen, duftenden Blueten.", + "categories": [ + "easy", + "flowering", + "hanging" + ], + "careInfo": { + "waterIntervalDays": 10, + "light": "Helles indirektes Licht", + "temp": "16-27 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_632f108725deeafe", + "name": "Wandelroeschen", + "botanicalName": "Lantana camara", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/af/Lantana_camara_-_flowers.jpg/330px-Lantana_camara_-_flowers.jpg", + "imageStatus": "ok", + "description": "Das Wandelroeschen hat kugelige Bluetenkoepfe, die die Farbe von Gelb ueber Orange zu Rot wechseln. Sehr attraktiv.", + "categories": [ + "flowering", + "sun", + "bright_light" + ], + "careInfo": { + "waterIntervalDays": 5, + "light": "Volles Sonnenlicht", + "temp": "18-28 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_c64390ca3c3743fe", + "name": "Wasserschlauch", + "botanicalName": "Utricularia gibba", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/9d/Utricularia_gibba.jpg/330px-Utricularia_gibba.jpg", + "imageStatus": "ok", + "description": "Der Wasserschlauch ist eine wasserbewohnende fleischfressende Pflanze mit Schlaeuchen als Insekten┬¡fallen.", + "categories": [ + "high_humidity", + "sun" + ], + "careInfo": { + "waterIntervalDays": 2, + "light": "Helles bis volles Licht", + "temp": "15-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_33f62ca8680da000", + "name": "Weihnachtskaktus", + "botanicalName": "Schlumbergera truncata", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/ad/Schlumbergera_truncatus.jpg/330px-Schlumbergera_truncatus.jpg", + "imageStatus": "ok", + "description": "Der Weihnachtskaktus erfreut zur Weihnachtszeit mit leuchtenden Blueten in Rosa, Rot oder Weiss.", + "categories": [ + "easy", + "succulent", + "flowering" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles indirektes Licht", + "temp": "15-21 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_8218a6240dd4a406", + "name": "Weihnachtsstern", + "botanicalName": "Euphorbia pulcherrima", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/5b/Poinsettia_Euphorbia_pulcherrima_Red_Christmas.jpg/330px-Poinsettia_Euphorbia_pulcherrima_Red_Christmas.jpg", + "imageStatus": "ok", + "description": "Der Weihnachtsstern ist die klassische Winterpflanze mit leuchtend roten Hochblaettern. Er steht symbolisch fuer Weihnachten.", + "categories": [ + "flowering" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles indirektes Licht", + "temp": "15-22 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_4275140824142c04", + "name": "Weisse Strelitzie", + "botanicalName": "Strelitzia nicolai", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/ba/Strelitzia_nicolai_3.jpg/330px-Strelitzia_nicolai_3.jpg", + "imageStatus": "ok", + "description": "Die Weisse Strelitzie ist ein beeindruckender Zimmerstrauch mit grossen, blaugruenen Blaettern und weiss-blauen Blueten.", + "categories": [ + "large", + "tree", + "bright_light" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles bis volles Licht", + "temp": "18-27 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_0a06480067428b83", + "name": "Weisse Tradescantia", + "botanicalName": "Tradescantia fluminensis", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/3a/Tradescantia_fluminensis_2.jpg/330px-Tradescantia_fluminensis_2.jpg", + "imageStatus": "ok", + "description": "Die Weisse Tradescantia hat gruene Blaetter mit weisslichen Unterseiten. Sehr robust und schnellwachsend.", + "categories": [ + "easy", + "hanging" + ], + "careInfo": { + "waterIntervalDays": 5, + "light": "Helles indirektes Licht", + "temp": "15-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_316228d023b525c1", + "name": "Wermut", + "botanicalName": "Artemisia absinthium", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/00/Artemisia_absinthium.jpg/330px-Artemisia_absinthium.jpg", + "imageStatus": "ok", + "description": "Wermut ist ein stark aromatisches Heilkraut mit silbrig-gruenen, tief eingeschnittenen Blaettern. Fuer Kraeuterlikoere.", + "categories": [ + "medicinal", + "sun" + ], + "careInfo": { + "waterIntervalDays": 14, + "light": "Volles Sonnenlicht", + "temp": "10-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_77608bbef47bdc04", + "name": "Wuestenrose", + "botanicalName": "Adenium obesum", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/85/Adenium_obesum.jpg/330px-Adenium_obesum.jpg", + "imageStatus": "ok", + "description": "Die Wuestenrose ist eine sukkulente Zimmerpflanze mit dickem Stamm und leuchtend pinken Blueten.", + "categories": [ + "succulent", + "flowering", + "sun" + ], + "careInfo": { + "waterIntervalDays": 10, + "light": "Volles Sonnenlicht", + "temp": "20-35 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_a0e4e7fa68bbad41", + "name": "Yucca-Palme", + "botanicalName": "Yucca elephantipes", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/18/Yucca_elephantipes_2012.jpg/330px-Yucca_elephantipes_2012.jpg", + "imageStatus": "ok", + "description": "Die Yucca-Palme ist eine robuste Zimmerpflanze mit starrem, immergruenem Blaetterschopf auf einem dicken Stamm.", + "categories": [ + "easy", + "tree", + "sun" + ], + "careInfo": { + "waterIntervalDays": 14, + "light": "Helles bis volles Licht", + "temp": "15-28 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_49c4a36c24338324", + "name": "Zamioculcas", + "botanicalName": "Zamioculcas zamiifolia", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/cf/Zamioculcas_zamiifolia_1.jpg/330px-Zamioculcas_zamiifolia_1.jpg", + "imageStatus": "ok", + "description": "Die Zamioculcas ist eine ausdauernde Zimmerpflanze mit glaenzenden Fiederbl├ñttern. Sehr trockenheitstolerant.", + "categories": [ + "easy", + "low_light", + "air_purifier" + ], + "careInfo": { + "waterIntervalDays": 14, + "light": "Wenig bis helles Licht", + "temp": "15-26 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_28107fe5558dfaa3", + "name": "Zaubernuss", + "botanicalName": "Hamamelis mollis", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/79/Hamamelis_mollis_J2.jpg/330px-Hamamelis_mollis_J2.jpg", + "imageStatus": "ok", + "description": "Die Zaubernuss bluet im Winter mit fadendunnen, gelben Bluetenkranzeln, die bis -10 Grad standhalten.", + "categories": [ + "flowering", + "medicinal" + ], + "careInfo": { + "waterIntervalDays": 10, + "light": "Helles bis volles Licht", + "temp": "10-20 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_75abff461b3d9bf8", + "name": "Zebra-Haworthie", + "botanicalName": "Haworthia fasciata", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/2d/Haworthia_fasciata01.jpg/330px-Haworthia_fasciata01.jpg", + "imageStatus": "ok", + "description": "Die Zebra-Haworthie ist eine kompakte Sukkulente mit weissen Querstreifen auf dunkelgruenen Blaettern.", + "categories": [ + "easy", + "succulent", + "low_light" + ], + "careInfo": { + "waterIntervalDays": 14, + "light": "Helles indirektes Licht", + "temp": "15-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_f7d0af5f2c284fff", + "name": "Zebrakraut", + "botanicalName": "Tradescantia zebrina", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/d9/Tradescantia_zebrina_-_Starr_%28cropped%29.jpg/330px-Tradescantia_zebrina_-_Starr_%28cropped%29.jpg", + "imageStatus": "ok", + "description": "Das Zebrakraut faellt durch seine silbrig-lila gestreiften Blaetter auf. Schnellwachsende Haengepflanze.", + "categories": [ + "easy", + "hanging", + "patterned" + ], + "careInfo": { + "waterIntervalDays": 5, + "light": "Helles indirektes Licht", + "temp": "15-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_ec8a05c334d66976", + "name": "Zinnie", + "botanicalName": "Zinnia elegans", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/25/Zinnia_elegans_cv_Giant_Dahlia_Flowered_Scarlet.jpg/330px-Zinnia_elegans_cv_Giant_Dahlia_Flowered_Scarlet.jpg", + "imageStatus": "ok", + "description": "Die Zinnie ist eine leuchtende Sommerblume mit grossen, dahlienaehnlichen Blueten. Sehr robust und hitzetolerant.", + "categories": [ + "easy", + "flowering", + "sun" + ], + "careInfo": { + "waterIntervalDays": 3, + "light": "Volles Sonnenlicht", + "temp": "18-30 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_29250eba0cf2291f", + "name": "Zitronenbaum", + "botanicalName": "Citrus limon", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/18/Citrus_limon_Lemon_%28Rutaceae%29_Fruit.jpg/330px-Citrus_limon_Lemon_%28Rutaceae%29_Fruit.jpg", + "imageStatus": "ok", + "description": "Der Zitronenbaum ist ein kleiner, immergruener Baum mit weissen, duftenden Blueten und gelben Fruechten.", + "categories": [ + "sun", + "tree", + "medicinal" + ], + "careInfo": { + "waterIntervalDays": 5, + "light": "Volles Sonnenlicht", + "temp": "18-28 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_8febd56fe7368d57", + "name": "Zitronenmelisse", + "botanicalName": "Melissa officinalis", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/40/Melissa_officinalis_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-089.jpg/330px-Melissa_officinalis_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-089.jpg", + "imageStatus": "ok", + "description": "Die Zitronenmelisse ist ein zitronig duftendes Heilkraut. Sie beruhigt die Nerven und foerdert den Schlaf.", + "categories": [ + "easy", + "medicinal" + ], + "careInfo": { + "waterIntervalDays": 5, + "light": "Helles bis volles Licht", + "temp": "15-25 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_3a3d31c9d818021b", + "name": "Zwergdattelpalme", + "botanicalName": "Phoenix roebelenii", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/41/Phoenix_roebelenii0.jpg/330px-Phoenix_roebelenii0.jpg", + "imageStatus": "ok", + "description": "Die Zwergdattelpalme ist eine zierliche Palme mit eleganten, gebogenen Fiederblaettern. Tropisches Flair.", + "categories": [ + "tree", + "bright_light" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles bis volles Licht", + "temp": "18-27 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_5c8f76b2c7d187f1", + "name": "Zylindrischer Bogenhanf", + "botanicalName": "Sansevieria cylindrica", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a2/Sansevieria_cylindrica.jpg/330px-Sansevieria_cylindrica.jpg", + "imageStatus": "ok", + "description": "Der Zylindrische Bogenhanf hat zylindrische, aufrechte Blaetter, die sich nach oben verjuengen. Sehr pflegeleicht.", + "categories": [ + "easy", + "succulent", + "sun" + ], + "careInfo": { + "waterIntervalDays": 14, + "light": "Helles bis volles Licht", + "temp": "15-27 ┬░C" + }, + "confidence": 1 + }, + { + "id": "plant_7fe204e226887efa", + "name": "Zymbidium", + "botanicalName": "Cymbidium lowianum", + "imageUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/94/Cymbidium_Orchidglade_Davos_Orchid_%28Orchi%29.jpg/330px-Cymbidium_Orchidglade_Davos_Orchid_%28Orchi%29.jpg", + "imageStatus": "ok", + "description": "Das Zymbidium ist eine robuste Orchidee mit langen, grassartigen Blaettern und eleganten Bluetenrispen.", + "categories": [ + "flowering" + ], + "careInfo": { + "waterIntervalDays": 7, + "light": "Helles Licht", + "temp": "12-24 ┬░C" + }, + "confidence": 1 + } +] diff --git a/prototype.html b/prototype.html index 23cd31c..a3d10ee 100644 --- a/prototype.html +++ b/prototype.html @@ -1,258 +1,258 @@ - - - - - - GreenLens Premium Prototype - - - -
-
- -
- -
-

My Collection

-

12 healthy plants

-
- -
-
- - - - -
85%
-
Care Score
-
- -
-
-
-
-
Hydration
-
72%
-
-
-
- -
-

Plant List goes here...

-
-
- - + + + + + + GreenLens Premium Prototype + + + +
+
+ +
+ +
+

My Collection

+

12 healthy plants

+
+ +
+
+ + + + +
85%
+
Care Score
+
+ +
+
+
+
+
Hydration
+
72%
+
+
+
+ +
+

Plant List goes here...

+
+
+ + diff --git a/railway.json b/railway.json new file mode 100644 index 0000000..1d3402a --- /dev/null +++ b/railway.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://railway.app/railway.schema.json", + "deploy": { + "startCommand": "cd server && npm install && npm start" + } +} diff --git a/review-change-candidates.md b/review-change-candidates.md index 90d2129..6b128a1 100644 --- a/review-change-candidates.md +++ b/review-change-candidates.md @@ -1,98 +1,98 @@ -# Review Change Candidates - -Date: 2026-03-12 - -Purpose: -- collect the user-provided `AENDERN` review items in one place -- separate already-applied semantic fixes from deferred raw source array reordering - -Status summary: -- semantic fixes: applied -- export ordering: already normalized in `all-plants-categories.csv` -- source-array ordering in the batch files: deferred on purpose - -## Applied Semantic Fixes - -- `Anthurium clarinervium`: `patterned|high_humidity|pet_friendly` -> `patterned|high_humidity` -- `Anthurium crystallinum`: `patterned|high_humidity|pet_friendly` -> `patterned|high_humidity` -- `Camellia sinensis`: `[]` -> `flowering` -- `Mimosa pudica`: `[]` -> `flowering|bright_light` -- `Spinacia oleracea`: `[]` -> `easy` - -## Deferred Raw Source Array Reordering - -These were left out of the source files because the export generator now canonicalizes category order in `all-plants-categories.csv`. If you still want the raw `categories` arrays in the batch files normalized too, these are the deferred candidates from the review list. - -- `Acer platanoides`: `tree|sun|large` -> `tree|large|sun` -- `Achillea millefolium`: `medicinal|flowering|sun` -> `flowering|medicinal|sun` -- `Adenium obesum`: `succulent|flowering|sun` -> `flowering|succulent|sun` -- `Adenium socotranum`: `succulent|flowering|sun` -> `flowering|succulent|sun` -- `Agave americana`: `succulent|sun|large` -> `succulent|large|sun` -- `Aglaonema commutatum`: `easy|low_light|patterned` -> `easy|patterned|low_light` -- `Alocasia amazonica`: `patterned|high_humidity|large` -> `patterned|large|high_humidity` -- `Aloe ferox`: `succulent|medicinal|sun|large` -> `succulent|medicinal|large|sun` -- `Alpinia zerumbet`: `flowering|high_humidity|large` -> `flowering|large|high_humidity` -- `Solanum aviculare`: `medicinal|flowering|sun` -> `flowering|medicinal|sun` -- `Solanum laciniatum`: `medicinal|flowering|sun` -> `flowering|medicinal|sun` -- `Strelitzia reginae`: `flowering|sun|large` -> `flowering|large|sun` -- `Agapanthus africanus`: `flowering|sun|large` -> `flowering|large|sun` -- `Aquilegia vulgaris`: `flowering|sun|pet_friendly` -> `flowering|pet_friendly|sun` -- `Momordica balsamina`: `flowering|sun|medicinal` -> `flowering|medicinal|sun` -- `Thunbergia alata`: `flowering|sun|hanging` -> `flowering|hanging|sun` -- `Gerbera jamesonii`: `flowering|sun|pet_friendly` -> `flowering|pet_friendly|sun` -- `Hibiscus rosa-sinensis`: `flowering|sun|large` -> `flowering|large|sun` -- `Bergenia cordifolia`: `flowering|low_light|large` -> `flowering|large|low_light` -- `Photinia serratifolia`: `tree|sun|large` -> `tree|large|sun` -- `Chrysanthemum morifolium`: `flowering|sun|pet_friendly` -> `flowering|pet_friendly|sun` -- `Galanthus nivalis`: `flowering|low_light|pet_friendly` -> `flowering|pet_friendly|low_light` -- `Leucojum aestivum`: `flowering|low_light|pet_friendly` -> `flowering|pet_friendly|low_light` -- `Cyclamen persicum`: `flowering|low_light|pet_friendly` -> `flowering|pet_friendly|low_light` -- `Narcissus pseudonarcissus`: `flowering|sun|pet_friendly` -> `flowering|pet_friendly|sun` -- `Dahlia pinnata`: `flowering|sun|pet_friendly` -> `flowering|pet_friendly|sun` -- `Photinia fraseri`: `tree|sun|large` -> `tree|large|sun` -- `Rosa canina`: `flowering|sun|medicinal` -> `flowering|medicinal|sun` -- `Acer campestre`: `tree|sun|large` -> `tree|large|sun` -- `Amelanchier ovalis`: `flowering|sun|large` -> `flowering|large|sun` -- `Howea forsteriana`: `easy|pet_friendly|large|air_purifier|bright_light` -> `easy|pet_friendly|air_purifier|large|bright_light` -- `Dracaena trifasciata`: `easy|air_purifier|low_light|large` -> `easy|air_purifier|large|low_light` -- `Lobularia maritima`: `flowering|sun|hanging` -> `flowering|hanging|sun` -- `Buxus sempervirens`: `tree|sun|large` -> `tree|large|sun` -- `Cosmos bipinnatus`: `flowering|sun|pet_friendly` -> `flowering|pet_friendly|sun` -- `Lilium candidum`: `flowering|sun|pet_friendly` -> `flowering|pet_friendly|sun` -- `Origanum vulgare`: `medicinal|sun|pet_friendly` -> `medicinal|pet_friendly|sun` -- `Rudbeckia hirta`: `flowering|sun|pet_friendly` -> `flowering|pet_friendly|sun` -- `Hibiscus syriacus`: `flowering|sun|large` -> `flowering|large|sun` -- `Sedum acre`: `succulent|sun|pet_friendly` -> `succulent|pet_friendly|sun` -- `Fatsia japonica`: `tree|low_light|large` -> `tree|large|low_light` -- `Ocimum tenuiflorum`: `medicinal|sun|flowering` -> `flowering|medicinal|sun` -- `Ulmus minor`: `tree|sun|large` -> `tree|large|sun` -- `Ulmus americana`: `tree|sun|large` -> `tree|large|sun` -- `Ulmus glabra`: `tree|sun|large` -> `tree|large|sun` -- `Aloysia citrodora`: `medicinal|sun|flowering` -> `flowering|medicinal|sun` -- `Cucumis sativus`: `easy|sun|hanging` -> `easy|hanging|sun` -- `Citrullus lanatus`: `easy|sun|hanging` -> `easy|hanging|sun` -- `Hypoestes phyllostachya`: `patterned|bright_light|pet_friendly` -> `patterned|pet_friendly|bright_light` -- `Nephrolepis exaltata`: `air_purifier|high_humidity|pet_friendly` -> `air_purifier|pet_friendly|high_humidity` -- `Phalaenopsis amabilis`: `flowering|high_humidity|pet_friendly` -> `flowering|pet_friendly|high_humidity` -- `Plantago major`: `medicinal|sun|pet_friendly` -> `medicinal|pet_friendly|sun` -- `Chaenomeles japonica`: `flowering|sun|large` -> `flowering|large|sun` -- `Rhododendron ferrugineum`: `flowering|low_light|large` -> `flowering|large|low_light` -- `Brassica napus napobrassica`: `easy|sun|large` -> `easy|large|sun` -- `Salvia apiana`: `medicinal|sun|flowering` -> `flowering|medicinal|sun` -- `Salvia canariensis`: `medicinal|sun|flowering` -> `flowering|medicinal|sun` -- `Helianthus annuus`: `flowering|sun|large` -> `flowering|large|sun` -- `Syringa vulgaris`: `flowering|sun|large` -> `flowering|large|sun` -- `Calystegia sepium`: `flowering|sun|hanging` -> `flowering|hanging|sun` -- `Vanilla planifolia`: `flowering|high_humidity|hanging` -> `flowering|hanging|high_humidity` -- `Vanda coerulea`: `flowering|high_humidity|bright_light` -> `flowering|bright_light|high_humidity` -- `Verbascum thapsus`: `flowering|sun|medicinal` -> `flowering|medicinal|sun` -- `Washingtonia robusta`: `tree|sun|large` -> `tree|large|sun` -- `Wisteria sinensis`: `flowering|sun|large` -> `flowering|large|sun` -- `Yucca aloifolia`: `tree|sun|easy` -> `easy|tree|sun` - -## Notes - -- Some review items were omitted because they were explicit no-ops, duplicate rows, or already effectively normalized by the export layer. -- The obvious no-op reorder rows were removed from this file during cleanup. -- Some older order proposals may now be stale if a later semantic audit intentionally changed the underlying categories. -- The canonical order visible to QA should be taken from `all-plants-categories.csv`, not from the raw category array order inside the batch source files. +# Review Change Candidates + +Date: 2026-03-12 + +Purpose: +- collect the user-provided `AENDERN` review items in one place +- separate already-applied semantic fixes from deferred raw source array reordering + +Status summary: +- semantic fixes: applied +- export ordering: already normalized in `all-plants-categories.csv` +- source-array ordering in the batch files: deferred on purpose + +## Applied Semantic Fixes + +- `Anthurium clarinervium`: `patterned|high_humidity|pet_friendly` -> `patterned|high_humidity` +- `Anthurium crystallinum`: `patterned|high_humidity|pet_friendly` -> `patterned|high_humidity` +- `Camellia sinensis`: `[]` -> `flowering` +- `Mimosa pudica`: `[]` -> `flowering|bright_light` +- `Spinacia oleracea`: `[]` -> `easy` + +## Deferred Raw Source Array Reordering + +These were left out of the source files because the export generator now canonicalizes category order in `all-plants-categories.csv`. If you still want the raw `categories` arrays in the batch files normalized too, these are the deferred candidates from the review list. + +- `Acer platanoides`: `tree|sun|large` -> `tree|large|sun` +- `Achillea millefolium`: `medicinal|flowering|sun` -> `flowering|medicinal|sun` +- `Adenium obesum`: `succulent|flowering|sun` -> `flowering|succulent|sun` +- `Adenium socotranum`: `succulent|flowering|sun` -> `flowering|succulent|sun` +- `Agave americana`: `succulent|sun|large` -> `succulent|large|sun` +- `Aglaonema commutatum`: `easy|low_light|patterned` -> `easy|patterned|low_light` +- `Alocasia amazonica`: `patterned|high_humidity|large` -> `patterned|large|high_humidity` +- `Aloe ferox`: `succulent|medicinal|sun|large` -> `succulent|medicinal|large|sun` +- `Alpinia zerumbet`: `flowering|high_humidity|large` -> `flowering|large|high_humidity` +- `Solanum aviculare`: `medicinal|flowering|sun` -> `flowering|medicinal|sun` +- `Solanum laciniatum`: `medicinal|flowering|sun` -> `flowering|medicinal|sun` +- `Strelitzia reginae`: `flowering|sun|large` -> `flowering|large|sun` +- `Agapanthus africanus`: `flowering|sun|large` -> `flowering|large|sun` +- `Aquilegia vulgaris`: `flowering|sun|pet_friendly` -> `flowering|pet_friendly|sun` +- `Momordica balsamina`: `flowering|sun|medicinal` -> `flowering|medicinal|sun` +- `Thunbergia alata`: `flowering|sun|hanging` -> `flowering|hanging|sun` +- `Gerbera jamesonii`: `flowering|sun|pet_friendly` -> `flowering|pet_friendly|sun` +- `Hibiscus rosa-sinensis`: `flowering|sun|large` -> `flowering|large|sun` +- `Bergenia cordifolia`: `flowering|low_light|large` -> `flowering|large|low_light` +- `Photinia serratifolia`: `tree|sun|large` -> `tree|large|sun` +- `Chrysanthemum morifolium`: `flowering|sun|pet_friendly` -> `flowering|pet_friendly|sun` +- `Galanthus nivalis`: `flowering|low_light|pet_friendly` -> `flowering|pet_friendly|low_light` +- `Leucojum aestivum`: `flowering|low_light|pet_friendly` -> `flowering|pet_friendly|low_light` +- `Cyclamen persicum`: `flowering|low_light|pet_friendly` -> `flowering|pet_friendly|low_light` +- `Narcissus pseudonarcissus`: `flowering|sun|pet_friendly` -> `flowering|pet_friendly|sun` +- `Dahlia pinnata`: `flowering|sun|pet_friendly` -> `flowering|pet_friendly|sun` +- `Photinia fraseri`: `tree|sun|large` -> `tree|large|sun` +- `Rosa canina`: `flowering|sun|medicinal` -> `flowering|medicinal|sun` +- `Acer campestre`: `tree|sun|large` -> `tree|large|sun` +- `Amelanchier ovalis`: `flowering|sun|large` -> `flowering|large|sun` +- `Howea forsteriana`: `easy|pet_friendly|large|air_purifier|bright_light` -> `easy|pet_friendly|air_purifier|large|bright_light` +- `Dracaena trifasciata`: `easy|air_purifier|low_light|large` -> `easy|air_purifier|large|low_light` +- `Lobularia maritima`: `flowering|sun|hanging` -> `flowering|hanging|sun` +- `Buxus sempervirens`: `tree|sun|large` -> `tree|large|sun` +- `Cosmos bipinnatus`: `flowering|sun|pet_friendly` -> `flowering|pet_friendly|sun` +- `Lilium candidum`: `flowering|sun|pet_friendly` -> `flowering|pet_friendly|sun` +- `Origanum vulgare`: `medicinal|sun|pet_friendly` -> `medicinal|pet_friendly|sun` +- `Rudbeckia hirta`: `flowering|sun|pet_friendly` -> `flowering|pet_friendly|sun` +- `Hibiscus syriacus`: `flowering|sun|large` -> `flowering|large|sun` +- `Sedum acre`: `succulent|sun|pet_friendly` -> `succulent|pet_friendly|sun` +- `Fatsia japonica`: `tree|low_light|large` -> `tree|large|low_light` +- `Ocimum tenuiflorum`: `medicinal|sun|flowering` -> `flowering|medicinal|sun` +- `Ulmus minor`: `tree|sun|large` -> `tree|large|sun` +- `Ulmus americana`: `tree|sun|large` -> `tree|large|sun` +- `Ulmus glabra`: `tree|sun|large` -> `tree|large|sun` +- `Aloysia citrodora`: `medicinal|sun|flowering` -> `flowering|medicinal|sun` +- `Cucumis sativus`: `easy|sun|hanging` -> `easy|hanging|sun` +- `Citrullus lanatus`: `easy|sun|hanging` -> `easy|hanging|sun` +- `Hypoestes phyllostachya`: `patterned|bright_light|pet_friendly` -> `patterned|pet_friendly|bright_light` +- `Nephrolepis exaltata`: `air_purifier|high_humidity|pet_friendly` -> `air_purifier|pet_friendly|high_humidity` +- `Phalaenopsis amabilis`: `flowering|high_humidity|pet_friendly` -> `flowering|pet_friendly|high_humidity` +- `Plantago major`: `medicinal|sun|pet_friendly` -> `medicinal|pet_friendly|sun` +- `Chaenomeles japonica`: `flowering|sun|large` -> `flowering|large|sun` +- `Rhododendron ferrugineum`: `flowering|low_light|large` -> `flowering|large|low_light` +- `Brassica napus napobrassica`: `easy|sun|large` -> `easy|large|sun` +- `Salvia apiana`: `medicinal|sun|flowering` -> `flowering|medicinal|sun` +- `Salvia canariensis`: `medicinal|sun|flowering` -> `flowering|medicinal|sun` +- `Helianthus annuus`: `flowering|sun|large` -> `flowering|large|sun` +- `Syringa vulgaris`: `flowering|sun|large` -> `flowering|large|sun` +- `Calystegia sepium`: `flowering|sun|hanging` -> `flowering|hanging|sun` +- `Vanilla planifolia`: `flowering|high_humidity|hanging` -> `flowering|hanging|high_humidity` +- `Vanda coerulea`: `flowering|high_humidity|bright_light` -> `flowering|bright_light|high_humidity` +- `Verbascum thapsus`: `flowering|sun|medicinal` -> `flowering|medicinal|sun` +- `Washingtonia robusta`: `tree|sun|large` -> `tree|large|sun` +- `Wisteria sinensis`: `flowering|sun|large` -> `flowering|large|sun` +- `Yucca aloifolia`: `tree|sun|easy` -> `easy|tree|sun` + +## Notes + +- Some review items were omitted because they were explicit no-ops, duplicate rows, or already effectively normalized by the export layer. +- The obvious no-op reorder rows were removed from this file during cleanup. +- Some older order proposals may now be stale if a later semantic audit intentionally changed the underlying categories. +- The canonical order visible to QA should be taken from `all-plants-categories.csv`, not from the raw category array order inside the batch source files. diff --git a/scripts/fix_images.js b/scripts/fix_images.js index b14e735..e35ee59 100644 --- a/scripts/fix_images.js +++ b/scripts/fix_images.js @@ -1,192 +1,192 @@ -#!/usr/bin/env node -/** - * fix_images.js - * Finds broken image URLs in lexicon/catalog files and replaces them - * using Wikimedia Commons API. - */ - -const fs = require('fs'); -const https = require('https'); - -const FILES = [ - 'constants/lexiconBatch1.ts', - 'constants/lexiconBatch2.ts', - 'services/backend/mockCatalog.ts', -]; - -// Known manual fixes (botanicalName -> correct Wikimedia filename) -const MANUAL_FIXES = { - 'Chlorophytum comosum': 'Chlorophytum_comosum_01.jpg', - 'Syngonium podophyllum': 'Syngonium_podophyllum1.jpg', - 'Fuchsia hybrida': 'Fuchsia_%27Beacon%27.jpg', - 'Tillandsia usneoides': 'Tillandsia_usneoides_leaves.jpg', - 'Tillandsia ionantha': 'Tillandsia_ionantha0.jpg', -}; - -function sleep(ms) { - return new Promise(resolve => setTimeout(resolve, ms)); -} - -function httpGet(url) { - return new Promise((resolve, reject) => { - const req = https.get(url, { - headers: { - 'User-Agent': 'GreenLens-ImageFixer/1.0 (educational plant app)' - } - }, (res) => { - if (res.statusCode === 301 || res.statusCode === 302) { - resolve(httpGet(res.headers.location)); - return; - } - let data = ''; - res.on('data', chunk => data += chunk); - res.on('end', () => resolve({ status: res.statusCode, body: data })); - }); - req.on('error', reject); - req.setTimeout(10000, () => { - req.destroy(); - reject(new Error('timeout')); - }); - }); -} - -function checkUrl(url) { - return new Promise((resolve) => { - const req = https.get(url, { - headers: { 'User-Agent': 'GreenLens-ImageFixer/1.0' } - }, (res) => { - res.resume(); - resolve(res.statusCode === 200); - }); - req.on('error', () => resolve(false)); - req.setTimeout(8000, () => { req.destroy(); resolve(false); }); - }); -} - -async function searchWikimediaImage(botanicalName) { - const encoded = encodeURIComponent(botanicalName); - const url = `https://commons.wikimedia.org/w/api.php?action=query&generator=search&gsrnamespace=6&gsrsearch=${encoded}&gsrlimit=5&prop=imageinfo&iiprop=url&iiurlwidth=500&format=json`; - - try { - const res = await httpGet(url); - if (res.status !== 200) return null; - const data = JSON.parse(res.body); - const pages = data.query && data.query.pages; - if (!pages) return null; - - for (const page of Object.values(pages)) { - const info = page.imageinfo && page.imageinfo[0]; - if (!info) continue; - const thumbUrl = info.thumburl || info.url; - if (thumbUrl && (thumbUrl.endsWith('.jpg') || thumbUrl.endsWith('.png') || thumbUrl.endsWith('.JPG') || thumbUrl.endsWith('.PNG'))) { - return thumbUrl; - } - } - } catch (e) { - console.error(` API error for "${botanicalName}": ${e.message}`); - } - return null; -} - -function wikimediaThumbUrl(filename) { - // Build a 500px thumb URL from a bare filename - const name = filename.replace(/ /g, '_'); - const hash = require('crypto').createHash('md5').update(name).digest('hex'); - const d1 = hash[0]; - const d2 = hash.substring(0, 2); - const ext = name.split('.').pop().toLowerCase(); - const isJpg = ['jpg', 'jpeg'].includes(ext); - return `https://upload.wikimedia.org/wikipedia/commons/thumb/${d1}/${d2}/${name}/500px-${name}`; -} - -function parseEntries(content) { - // Match blocks: find name, botanicalName, imageUri - const entries = []; - const regex = /name:\s*['"]([^'"]+)['"]\s*,[\s\S]*?botanicalName:\s*['"]([^'"]+)['"]\s*,[\s\S]*?imageUri:\s*['"]([^'"]+)['"]/g; - let m; - while ((m = regex.exec(content)) !== null) { - entries.push({ - name: m[1], - botanicalName: m[2], - imageUri: m[3], - index: m.index, - }); - } - return entries; -} - -async function processFile(filepath) { - console.log(`\n=== Processing ${filepath} ===`); - let content = fs.readFileSync(filepath, 'utf8'); - const entries = parseEntries(content); - console.log(`Found ${entries.length} entries`); - - let fixCount = 0; - - for (const entry of entries) { - const { name, botanicalName, imageUri } = entry; - - // Check if URL is broken - process.stdout.write(` Checking ${botanicalName}... `); - const ok = await checkUrl(imageUri); - if (ok) { - console.log('OK'); - await sleep(100); - continue; - } - console.log('BROKEN'); - - let newUrl = null; - - // Check manual fixes first - if (MANUAL_FIXES[botanicalName]) { - const filename = MANUAL_FIXES[botanicalName]; - const thumb = wikimediaThumbUrl(filename); - console.log(` -> Manual fix: ${thumb}`); - newUrl = thumb; - } else { - // Query Wikimedia Commons API - console.log(` -> Searching Wikimedia for "${botanicalName}"...`); - newUrl = await searchWikimediaImage(botanicalName); - if (newUrl) { - console.log(` -> Found: ${newUrl}`); - } else { - console.log(` -> No result found, skipping`); - } - } - - if (newUrl) { - // Replace the old URL in content (escape for regex) - const escapedOld = imageUri.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); - content = content.replace(new RegExp(escapedOld, 'g'), newUrl); - fixCount++; - } - - await sleep(200); - } - - if (fixCount > 0) { - fs.writeFileSync(filepath, content, 'utf8'); - console.log(` => Wrote ${fixCount} fixes to ${filepath}`); - } else { - console.log(` => No changes needed`); - } - - return fixCount; -} - -async function main() { - console.log('GreenLens Image URL Fixer'); - console.log('========================'); - let totalFixes = 0; - for (const file of FILES) { - if (!fs.existsSync(file)) { - console.log(`\nSkipping ${file} (not found)`); - continue; - } - totalFixes += await processFile(file); - } - console.log(`\nDone. Total fixes: ${totalFixes}`); -} - -main().catch(console.error); +#!/usr/bin/env node +/** + * fix_images.js + * Finds broken image URLs in lexicon/catalog files and replaces them + * using Wikimedia Commons API. + */ + +const fs = require('fs'); +const https = require('https'); + +const FILES = [ + 'constants/lexiconBatch1.ts', + 'constants/lexiconBatch2.ts', + 'services/backend/mockCatalog.ts', +]; + +// Known manual fixes (botanicalName -> correct Wikimedia filename) +const MANUAL_FIXES = { + 'Chlorophytum comosum': 'Chlorophytum_comosum_01.jpg', + 'Syngonium podophyllum': 'Syngonium_podophyllum1.jpg', + 'Fuchsia hybrida': 'Fuchsia_%27Beacon%27.jpg', + 'Tillandsia usneoides': 'Tillandsia_usneoides_leaves.jpg', + 'Tillandsia ionantha': 'Tillandsia_ionantha0.jpg', +}; + +function sleep(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); +} + +function httpGet(url) { + return new Promise((resolve, reject) => { + const req = https.get(url, { + headers: { + 'User-Agent': 'GreenLens-ImageFixer/1.0 (educational plant app)' + } + }, (res) => { + if (res.statusCode === 301 || res.statusCode === 302) { + resolve(httpGet(res.headers.location)); + return; + } + let data = ''; + res.on('data', chunk => data += chunk); + res.on('end', () => resolve({ status: res.statusCode, body: data })); + }); + req.on('error', reject); + req.setTimeout(10000, () => { + req.destroy(); + reject(new Error('timeout')); + }); + }); +} + +function checkUrl(url) { + return new Promise((resolve) => { + const req = https.get(url, { + headers: { 'User-Agent': 'GreenLens-ImageFixer/1.0' } + }, (res) => { + res.resume(); + resolve(res.statusCode === 200); + }); + req.on('error', () => resolve(false)); + req.setTimeout(8000, () => { req.destroy(); resolve(false); }); + }); +} + +async function searchWikimediaImage(botanicalName) { + const encoded = encodeURIComponent(botanicalName); + const url = `https://commons.wikimedia.org/w/api.php?action=query&generator=search&gsrnamespace=6&gsrsearch=${encoded}&gsrlimit=5&prop=imageinfo&iiprop=url&iiurlwidth=500&format=json`; + + try { + const res = await httpGet(url); + if (res.status !== 200) return null; + const data = JSON.parse(res.body); + const pages = data.query && data.query.pages; + if (!pages) return null; + + for (const page of Object.values(pages)) { + const info = page.imageinfo && page.imageinfo[0]; + if (!info) continue; + const thumbUrl = info.thumburl || info.url; + if (thumbUrl && (thumbUrl.endsWith('.jpg') || thumbUrl.endsWith('.png') || thumbUrl.endsWith('.JPG') || thumbUrl.endsWith('.PNG'))) { + return thumbUrl; + } + } + } catch (e) { + console.error(` API error for "${botanicalName}": ${e.message}`); + } + return null; +} + +function wikimediaThumbUrl(filename) { + // Build a 500px thumb URL from a bare filename + const name = filename.replace(/ /g, '_'); + const hash = require('crypto').createHash('md5').update(name).digest('hex'); + const d1 = hash[0]; + const d2 = hash.substring(0, 2); + const ext = name.split('.').pop().toLowerCase(); + const isJpg = ['jpg', 'jpeg'].includes(ext); + return `https://upload.wikimedia.org/wikipedia/commons/thumb/${d1}/${d2}/${name}/500px-${name}`; +} + +function parseEntries(content) { + // Match blocks: find name, botanicalName, imageUri + const entries = []; + const regex = /name:\s*['"]([^'"]+)['"]\s*,[\s\S]*?botanicalName:\s*['"]([^'"]+)['"]\s*,[\s\S]*?imageUri:\s*['"]([^'"]+)['"]/g; + let m; + while ((m = regex.exec(content)) !== null) { + entries.push({ + name: m[1], + botanicalName: m[2], + imageUri: m[3], + index: m.index, + }); + } + return entries; +} + +async function processFile(filepath) { + console.log(`\n=== Processing ${filepath} ===`); + let content = fs.readFileSync(filepath, 'utf8'); + const entries = parseEntries(content); + console.log(`Found ${entries.length} entries`); + + let fixCount = 0; + + for (const entry of entries) { + const { name, botanicalName, imageUri } = entry; + + // Check if URL is broken + process.stdout.write(` Checking ${botanicalName}... `); + const ok = await checkUrl(imageUri); + if (ok) { + console.log('OK'); + await sleep(100); + continue; + } + console.log('BROKEN'); + + let newUrl = null; + + // Check manual fixes first + if (MANUAL_FIXES[botanicalName]) { + const filename = MANUAL_FIXES[botanicalName]; + const thumb = wikimediaThumbUrl(filename); + console.log(` -> Manual fix: ${thumb}`); + newUrl = thumb; + } else { + // Query Wikimedia Commons API + console.log(` -> Searching Wikimedia for "${botanicalName}"...`); + newUrl = await searchWikimediaImage(botanicalName); + if (newUrl) { + console.log(` -> Found: ${newUrl}`); + } else { + console.log(` -> No result found, skipping`); + } + } + + if (newUrl) { + // Replace the old URL in content (escape for regex) + const escapedOld = imageUri.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + content = content.replace(new RegExp(escapedOld, 'g'), newUrl); + fixCount++; + } + + await sleep(200); + } + + if (fixCount > 0) { + fs.writeFileSync(filepath, content, 'utf8'); + console.log(` => Wrote ${fixCount} fixes to ${filepath}`); + } else { + console.log(` => No changes needed`); + } + + return fixCount; +} + +async function main() { + console.log('GreenLens Image URL Fixer'); + console.log('========================'); + let totalFixes = 0; + for (const file of FILES) { + if (!fs.existsSync(file)) { + console.log(`\nSkipping ${file} (not found)`); + continue; + } + totalFixes += await processFile(file); + } + console.log(`\nDone. Total fixes: ${totalFixes}`); +} + +main().catch(console.error); diff --git a/scripts/generate_semantic_audit.js b/scripts/generate_semantic_audit.js index af3dc71..b334aec 100644 --- a/scripts/generate_semantic_audit.js +++ b/scripts/generate_semantic_audit.js @@ -1,314 +1,314 @@ -#!/usr/bin/env node -/* eslint-disable no-console */ -const fs = require('fs'); -const path = require('path'); -const vm = require('vm'); -const ts = require('typescript'); - -const ROOT_DIR = path.resolve(__dirname, '..'); -const OUTPUT_DIR = path.join(ROOT_DIR, 'audits', 'semantic-search'); -const CATEGORY_DIR = path.join(OUTPUT_DIR, 'categories'); -const ROOT_EXPORT_PATH = path.join(ROOT_DIR, 'all-plants-categories.csv'); -const BATCH_1_PATH = path.join(ROOT_DIR, 'constants', 'lexiconBatch1.ts'); -const BATCH_2_PATH = path.join(ROOT_DIR, 'constants', 'lexiconBatch2.ts'); - -const AUDIT_PRIORITY = [ - 'pet_friendly', - 'air_purifier', - 'medicinal', - 'low_light', - 'bright_light', - 'sun', - 'easy', - 'high_humidity', - 'hanging', - 'tree', - 'large', - 'patterned', - 'flowering', - 'succulent', -]; - -const HIGH_CONFIDENCE_MANUAL_REVIEW_CATEGORIES = new Set([ - 'pet_friendly', - 'air_purifier', - 'medicinal', -]); - -const CATEGORY_DISPLAY_ORDER = [ - 'easy', - 'pet_friendly', - 'flowering', - 'succulent', - 'patterned', - 'tree', - 'large', - 'medicinal', - 'hanging', - 'air_purifier', - 'low_light', - 'bright_light', - 'high_humidity', - 'sun', -]; - -const resolveTsFilePath = (fromFile, specifier) => { - if (!specifier.startsWith('.')) return null; - const fromDirectory = path.dirname(fromFile); - const absoluteBase = path.resolve(fromDirectory, specifier); - const candidates = [ - absoluteBase, - `${absoluteBase}.ts`, - `${absoluteBase}.tsx`, - path.join(absoluteBase, 'index.ts'), - ]; - - for (const candidate of candidates) { - if (fs.existsSync(candidate) && fs.statSync(candidate).isFile()) { - return candidate; - } - } - - return null; -}; - -const loadTsModule = (absolutePath, cache = new Map()) => { - if (cache.has(absolutePath)) return cache.get(absolutePath); - - const source = fs.readFileSync(absolutePath, 'utf8'); - const transpiled = ts.transpileModule(source, { - compilerOptions: { - module: ts.ModuleKind.CommonJS, - target: ts.ScriptTarget.ES2020, - esModuleInterop: true, - jsx: ts.JsxEmit.ReactJSX, - }, - fileName: absolutePath, - reportDiagnostics: false, - }).outputText; - - const module = { exports: {} }; - cache.set(absolutePath, module.exports); - - const localRequire = (specifier) => { - const resolvedTsPath = resolveTsFilePath(absolutePath, specifier); - if (resolvedTsPath) return loadTsModule(resolvedTsPath, cache); - return require(specifier); - }; - - const sandbox = { - module, - exports: module.exports, - require: localRequire, - __dirname: path.dirname(absolutePath), - __filename: absolutePath, - console, - process, - Buffer, - setTimeout, - clearTimeout, - }; - - vm.runInNewContext(transpiled, sandbox, { filename: absolutePath }); - cache.set(absolutePath, module.exports); - return module.exports; -}; - -const ensureDir = (directoryPath) => { - fs.mkdirSync(directoryPath, { recursive: true }); -}; - -const csvEscape = (value) => { - const stringValue = String(value ?? ''); - if (/[",\n]/.test(stringValue)) { - return `"${stringValue.replace(/"/g, '""')}"`; - } - return stringValue; -}; - -const writeCsv = (filePath, rows) => { - if (!rows.length) { - fs.writeFileSync(filePath, '', 'utf8'); - return; - } - - const headers = Object.keys(rows[0]); - const lines = [headers.join(',')]; - rows.forEach((row) => { - lines.push(headers.map((header) => csvEscape(row[header])).join(',')); - }); - fs.writeFileSync(filePath, `${lines.join('\n')}\n`, 'utf8'); -}; - -const normalizeCategoryFilename = (category) => category.replace(/[^a-z0-9_-]+/gi, '-').toLowerCase(); - -const sortCategories = (categories = []) => ( - [...categories].sort((left, right) => { - const leftIndex = CATEGORY_DISPLAY_ORDER.indexOf(left); - const rightIndex = CATEGORY_DISPLAY_ORDER.indexOf(right); - const normalizedLeft = leftIndex === -1 ? Number.MAX_SAFE_INTEGER : leftIndex; - const normalizedRight = rightIndex === -1 ? Number.MAX_SAFE_INTEGER : rightIndex; - return normalizedLeft - normalizedRight || left.localeCompare(right); - }) -); - -const buildRiskFlags = (entry) => { - const categories = new Set(entry.categories || []); - const flags = []; - - if (categories.has('low_light') && categories.has('sun')) { - flags.push('light_conflict_low_light_and_sun'); - } - if (categories.has('low_light') && categories.has('bright_light')) { - flags.push('light_conflict_low_light_and_bright_light'); - } - if (categories.has('succulent') && categories.has('high_humidity')) { - flags.push('succulent_high_humidity_combo_review'); - } - - (entry.categories || []).forEach((category) => { - if (HIGH_CONFIDENCE_MANUAL_REVIEW_CATEGORIES.has(category)) { - flags.push(`${category}_requires_external_evidence`); - } - }); - - return [...new Set(flags)]; -}; - -const toAuditRow = (entry, category) => ({ - category, - source_file: entry.sourceFile, - source_index: entry.sourceIndex, - name: entry.name, - botanical_name: entry.botanicalName, - description: entry.description || '', - light: entry.careInfo?.light || '', - temp: entry.careInfo?.temp || '', - water_interval_days: entry.careInfo?.waterIntervalDays ?? '', - all_categories: sortCategories(entry.categories || []).join('|'), - risk_flags: buildRiskFlags(entry).join('|'), - audit_status: '', - evidence_source: '', - evidence_url: '', - notes: '', -}); - -const toPlantCategoryRow = (entry) => ({ - source_file: entry.sourceFile, - source_index: entry.sourceIndex, - name: entry.name, - botanical_name: entry.botanicalName, - all_categories: sortCategories(entry.categories || []).join('|'), - category_count: (entry.categories || []).length, - description: entry.description || '', - light: entry.careInfo?.light || '', - temp: entry.careInfo?.temp || '', - water_interval_days: entry.careInfo?.waterIntervalDays ?? '', -}); - -const loadBatchEntries = () => { - const batch1Entries = loadTsModule(BATCH_1_PATH).LEXICON_BATCH_1_ENTRIES; - const batch2Entries = loadTsModule(BATCH_2_PATH).LEXICON_BATCH_2_ENTRIES; - - if (!Array.isArray(batch1Entries) || !Array.isArray(batch2Entries)) { - throw new Error('Could not load lexicon batch entries.'); - } - - return [ - ...batch1Entries.map((entry, index) => ({ ...entry, sourceFile: 'constants/lexiconBatch1.ts', sourceIndex: index + 1 })), - ...batch2Entries.map((entry, index) => ({ ...entry, sourceFile: 'constants/lexiconBatch2.ts', sourceIndex: index + 1 })), - ]; -}; - -const main = () => { - ensureDir(CATEGORY_DIR); - const entries = loadBatchEntries(); - const categories = [...new Set(entries.flatMap((entry) => entry.categories || []))].sort(); - - const summary = { - generatedAt: new Date().toISOString(), - totalEntries: entries.length, - categories: categories.map((category) => ({ - category, - count: entries.filter((entry) => (entry.categories || []).includes(category)).length, - priority: AUDIT_PRIORITY.indexOf(category) >= 0 ? AUDIT_PRIORITY.indexOf(category) + 1 : 999, - })).sort((left, right) => - left.priority - right.priority || - right.count - left.count || - left.category.localeCompare(right.category)), - }; - - const plantCategoryRows = [...entries] - .sort((left, right) => - left.botanicalName.localeCompare(right.botanicalName) || - left.name.localeCompare(right.name)) - .map((entry) => toPlantCategoryRow(entry)); - - const masterRows = []; - const suspiciousRows = []; - - categories.forEach((category) => { - const categoryEntries = entries - .filter((entry) => (entry.categories || []).includes(category)) - .sort((left, right) => - left.botanicalName.localeCompare(right.botanicalName) || - left.name.localeCompare(right.name)); - - const rows = categoryEntries.map((entry) => { - const row = toAuditRow(entry, category); - masterRows.push(row); - - const riskFlags = row.risk_flags ? row.risk_flags.split('|').filter(Boolean) : []; - if (riskFlags.length > 0) { - suspiciousRows.push({ - category, - source_file: entry.sourceFile, - source_index: entry.sourceIndex, - name: entry.name, - botanical_name: entry.botanicalName, - risk_flags: riskFlags.join('|'), - }); - } - - return row; - }); - - writeCsv(path.join(CATEGORY_DIR, `${normalizeCategoryFilename(category)}.csv`), rows); - }); - - writeCsv(path.join(OUTPUT_DIR, 'all-plants-categories.csv'), plantCategoryRows); - writeCsv(ROOT_EXPORT_PATH, plantCategoryRows); - writeCsv(path.join(OUTPUT_DIR, 'master.csv'), masterRows); - writeCsv(path.join(OUTPUT_DIR, 'suspicious.csv'), suspiciousRows); - fs.writeFileSync(path.join(OUTPUT_DIR, 'summary.json'), `${JSON.stringify(summary, null, 2)}\n`, 'utf8'); - fs.writeFileSync(path.join(OUTPUT_DIR, 'suspicious.json'), `${JSON.stringify(suspiciousRows, null, 2)}\n`, 'utf8'); - - const readme = `# Semantic Search Audit - -Generated: ${summary.generatedAt} - -Files: -- \`summary.json\`: category counts and suggested audit order -- \`all-plants-categories.csv\`: one row per plant with its full category list -- \`master.csv\`: all category assignments with blank evidence columns -- \`suspicious.csv\`: entries that require elevated review based on rule flags -- \`categories/*.csv\`: per-category audit sheets - -Suggested audit order: -${summary.categories.map((item) => `- ${item.category} (${item.count})`).join('\n')} - -Workflow: -1. Review one category CSV at a time. -2. Fill \`audit_status\`, \`evidence_source\`, \`evidence_url\`, and \`notes\`. -3. Apply only high-confidence source-tag corrections to the lexicon batch files. -4. Rebuild the server catalog from batches after source edits. -`; - - fs.writeFileSync(path.join(OUTPUT_DIR, 'README.md'), readme, 'utf8'); - - console.log(`Audit artifacts written to ${OUTPUT_DIR}`); - console.log(`Categories exported: ${categories.length}`); - console.log(`Suspicious rows flagged: ${suspiciousRows.length}`); -}; - -main(); +#!/usr/bin/env node +/* eslint-disable no-console */ +const fs = require('fs'); +const path = require('path'); +const vm = require('vm'); +const ts = require('typescript'); + +const ROOT_DIR = path.resolve(__dirname, '..'); +const OUTPUT_DIR = path.join(ROOT_DIR, 'audits', 'semantic-search'); +const CATEGORY_DIR = path.join(OUTPUT_DIR, 'categories'); +const ROOT_EXPORT_PATH = path.join(ROOT_DIR, 'all-plants-categories.csv'); +const BATCH_1_PATH = path.join(ROOT_DIR, 'constants', 'lexiconBatch1.ts'); +const BATCH_2_PATH = path.join(ROOT_DIR, 'constants', 'lexiconBatch2.ts'); + +const AUDIT_PRIORITY = [ + 'pet_friendly', + 'air_purifier', + 'medicinal', + 'low_light', + 'bright_light', + 'sun', + 'easy', + 'high_humidity', + 'hanging', + 'tree', + 'large', + 'patterned', + 'flowering', + 'succulent', +]; + +const HIGH_CONFIDENCE_MANUAL_REVIEW_CATEGORIES = new Set([ + 'pet_friendly', + 'air_purifier', + 'medicinal', +]); + +const CATEGORY_DISPLAY_ORDER = [ + 'easy', + 'pet_friendly', + 'flowering', + 'succulent', + 'patterned', + 'tree', + 'large', + 'medicinal', + 'hanging', + 'air_purifier', + 'low_light', + 'bright_light', + 'high_humidity', + 'sun', +]; + +const resolveTsFilePath = (fromFile, specifier) => { + if (!specifier.startsWith('.')) return null; + const fromDirectory = path.dirname(fromFile); + const absoluteBase = path.resolve(fromDirectory, specifier); + const candidates = [ + absoluteBase, + `${absoluteBase}.ts`, + `${absoluteBase}.tsx`, + path.join(absoluteBase, 'index.ts'), + ]; + + for (const candidate of candidates) { + if (fs.existsSync(candidate) && fs.statSync(candidate).isFile()) { + return candidate; + } + } + + return null; +}; + +const loadTsModule = (absolutePath, cache = new Map()) => { + if (cache.has(absolutePath)) return cache.get(absolutePath); + + const source = fs.readFileSync(absolutePath, 'utf8'); + const transpiled = ts.transpileModule(source, { + compilerOptions: { + module: ts.ModuleKind.CommonJS, + target: ts.ScriptTarget.ES2020, + esModuleInterop: true, + jsx: ts.JsxEmit.ReactJSX, + }, + fileName: absolutePath, + reportDiagnostics: false, + }).outputText; + + const module = { exports: {} }; + cache.set(absolutePath, module.exports); + + const localRequire = (specifier) => { + const resolvedTsPath = resolveTsFilePath(absolutePath, specifier); + if (resolvedTsPath) return loadTsModule(resolvedTsPath, cache); + return require(specifier); + }; + + const sandbox = { + module, + exports: module.exports, + require: localRequire, + __dirname: path.dirname(absolutePath), + __filename: absolutePath, + console, + process, + Buffer, + setTimeout, + clearTimeout, + }; + + vm.runInNewContext(transpiled, sandbox, { filename: absolutePath }); + cache.set(absolutePath, module.exports); + return module.exports; +}; + +const ensureDir = (directoryPath) => { + fs.mkdirSync(directoryPath, { recursive: true }); +}; + +const csvEscape = (value) => { + const stringValue = String(value ?? ''); + if (/[",\n]/.test(stringValue)) { + return `"${stringValue.replace(/"/g, '""')}"`; + } + return stringValue; +}; + +const writeCsv = (filePath, rows) => { + if (!rows.length) { + fs.writeFileSync(filePath, '', 'utf8'); + return; + } + + const headers = Object.keys(rows[0]); + const lines = [headers.join(',')]; + rows.forEach((row) => { + lines.push(headers.map((header) => csvEscape(row[header])).join(',')); + }); + fs.writeFileSync(filePath, `${lines.join('\n')}\n`, 'utf8'); +}; + +const normalizeCategoryFilename = (category) => category.replace(/[^a-z0-9_-]+/gi, '-').toLowerCase(); + +const sortCategories = (categories = []) => ( + [...categories].sort((left, right) => { + const leftIndex = CATEGORY_DISPLAY_ORDER.indexOf(left); + const rightIndex = CATEGORY_DISPLAY_ORDER.indexOf(right); + const normalizedLeft = leftIndex === -1 ? Number.MAX_SAFE_INTEGER : leftIndex; + const normalizedRight = rightIndex === -1 ? Number.MAX_SAFE_INTEGER : rightIndex; + return normalizedLeft - normalizedRight || left.localeCompare(right); + }) +); + +const buildRiskFlags = (entry) => { + const categories = new Set(entry.categories || []); + const flags = []; + + if (categories.has('low_light') && categories.has('sun')) { + flags.push('light_conflict_low_light_and_sun'); + } + if (categories.has('low_light') && categories.has('bright_light')) { + flags.push('light_conflict_low_light_and_bright_light'); + } + if (categories.has('succulent') && categories.has('high_humidity')) { + flags.push('succulent_high_humidity_combo_review'); + } + + (entry.categories || []).forEach((category) => { + if (HIGH_CONFIDENCE_MANUAL_REVIEW_CATEGORIES.has(category)) { + flags.push(`${category}_requires_external_evidence`); + } + }); + + return [...new Set(flags)]; +}; + +const toAuditRow = (entry, category) => ({ + category, + source_file: entry.sourceFile, + source_index: entry.sourceIndex, + name: entry.name, + botanical_name: entry.botanicalName, + description: entry.description || '', + light: entry.careInfo?.light || '', + temp: entry.careInfo?.temp || '', + water_interval_days: entry.careInfo?.waterIntervalDays ?? '', + all_categories: sortCategories(entry.categories || []).join('|'), + risk_flags: buildRiskFlags(entry).join('|'), + audit_status: '', + evidence_source: '', + evidence_url: '', + notes: '', +}); + +const toPlantCategoryRow = (entry) => ({ + source_file: entry.sourceFile, + source_index: entry.sourceIndex, + name: entry.name, + botanical_name: entry.botanicalName, + all_categories: sortCategories(entry.categories || []).join('|'), + category_count: (entry.categories || []).length, + description: entry.description || '', + light: entry.careInfo?.light || '', + temp: entry.careInfo?.temp || '', + water_interval_days: entry.careInfo?.waterIntervalDays ?? '', +}); + +const loadBatchEntries = () => { + const batch1Entries = loadTsModule(BATCH_1_PATH).LEXICON_BATCH_1_ENTRIES; + const batch2Entries = loadTsModule(BATCH_2_PATH).LEXICON_BATCH_2_ENTRIES; + + if (!Array.isArray(batch1Entries) || !Array.isArray(batch2Entries)) { + throw new Error('Could not load lexicon batch entries.'); + } + + return [ + ...batch1Entries.map((entry, index) => ({ ...entry, sourceFile: 'constants/lexiconBatch1.ts', sourceIndex: index + 1 })), + ...batch2Entries.map((entry, index) => ({ ...entry, sourceFile: 'constants/lexiconBatch2.ts', sourceIndex: index + 1 })), + ]; +}; + +const main = () => { + ensureDir(CATEGORY_DIR); + const entries = loadBatchEntries(); + const categories = [...new Set(entries.flatMap((entry) => entry.categories || []))].sort(); + + const summary = { + generatedAt: new Date().toISOString(), + totalEntries: entries.length, + categories: categories.map((category) => ({ + category, + count: entries.filter((entry) => (entry.categories || []).includes(category)).length, + priority: AUDIT_PRIORITY.indexOf(category) >= 0 ? AUDIT_PRIORITY.indexOf(category) + 1 : 999, + })).sort((left, right) => + left.priority - right.priority || + right.count - left.count || + left.category.localeCompare(right.category)), + }; + + const plantCategoryRows = [...entries] + .sort((left, right) => + left.botanicalName.localeCompare(right.botanicalName) || + left.name.localeCompare(right.name)) + .map((entry) => toPlantCategoryRow(entry)); + + const masterRows = []; + const suspiciousRows = []; + + categories.forEach((category) => { + const categoryEntries = entries + .filter((entry) => (entry.categories || []).includes(category)) + .sort((left, right) => + left.botanicalName.localeCompare(right.botanicalName) || + left.name.localeCompare(right.name)); + + const rows = categoryEntries.map((entry) => { + const row = toAuditRow(entry, category); + masterRows.push(row); + + const riskFlags = row.risk_flags ? row.risk_flags.split('|').filter(Boolean) : []; + if (riskFlags.length > 0) { + suspiciousRows.push({ + category, + source_file: entry.sourceFile, + source_index: entry.sourceIndex, + name: entry.name, + botanical_name: entry.botanicalName, + risk_flags: riskFlags.join('|'), + }); + } + + return row; + }); + + writeCsv(path.join(CATEGORY_DIR, `${normalizeCategoryFilename(category)}.csv`), rows); + }); + + writeCsv(path.join(OUTPUT_DIR, 'all-plants-categories.csv'), plantCategoryRows); + writeCsv(ROOT_EXPORT_PATH, plantCategoryRows); + writeCsv(path.join(OUTPUT_DIR, 'master.csv'), masterRows); + writeCsv(path.join(OUTPUT_DIR, 'suspicious.csv'), suspiciousRows); + fs.writeFileSync(path.join(OUTPUT_DIR, 'summary.json'), `${JSON.stringify(summary, null, 2)}\n`, 'utf8'); + fs.writeFileSync(path.join(OUTPUT_DIR, 'suspicious.json'), `${JSON.stringify(suspiciousRows, null, 2)}\n`, 'utf8'); + + const readme = `# Semantic Search Audit + +Generated: ${summary.generatedAt} + +Files: +- \`summary.json\`: category counts and suggested audit order +- \`all-plants-categories.csv\`: one row per plant with its full category list +- \`master.csv\`: all category assignments with blank evidence columns +- \`suspicious.csv\`: entries that require elevated review based on rule flags +- \`categories/*.csv\`: per-category audit sheets + +Suggested audit order: +${summary.categories.map((item) => `- ${item.category} (${item.count})`).join('\n')} + +Workflow: +1. Review one category CSV at a time. +2. Fill \`audit_status\`, \`evidence_source\`, \`evidence_url\`, and \`notes\`. +3. Apply only high-confidence source-tag corrections to the lexicon batch files. +4. Rebuild the server catalog from batches after source edits. +`; + + fs.writeFileSync(path.join(OUTPUT_DIR, 'README.md'), readme, 'utf8'); + + console.log(`Audit artifacts written to ${OUTPUT_DIR}`); + console.log(`Categories exported: ${categories.length}`); + console.log(`Suspicious rows flagged: ${suspiciousRows.length}`); +}; + +main(); diff --git a/scripts/render_social_videos.js b/scripts/render_social_videos.js new file mode 100644 index 0000000..827f3fc --- /dev/null +++ b/scripts/render_social_videos.js @@ -0,0 +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; +}); diff --git a/scripts/social-video-renderer.html b/scripts/social-video-renderer.html new file mode 100644 index 0000000..29628f0 --- /dev/null +++ b/scripts/social-video-renderer.html @@ -0,0 +1,286 @@ + + + + + + GreenLens Social Video Renderer + + + + + + + diff --git a/scripts/validate_all.ts b/scripts/validate_all.ts index 5e0db3d..929f651 100644 --- a/scripts/validate_all.ts +++ b/scripts/validate_all.ts @@ -1,55 +1,55 @@ -import * as fs from 'fs'; -import * as path from 'path'; - -// Using exact string parsing since importing the TS files directly in tsx could have issues if the environment isn't fully set up, but tsx should work. Let's just import them. -import { LEXICON_BATCH_1_ENTRIES } from '../constants/lexiconBatch1'; -import { LEXICON_BATCH_2_ENTRIES } from '../constants/lexiconBatch2'; - -const allPlants = [...LEXICON_BATCH_1_ENTRIES, ...LEXICON_BATCH_2_ENTRIES]; - -async function checkUrl(url: string): Promise { - const headers = { - 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', - 'Accept': 'image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8', - 'Referer': 'https://commons.wikimedia.org/' - }; - try { - const response = await fetch(url, { method: 'GET', headers }); - return response.status === 200; - } catch (error) { - return false; - } -} - -async function run() { - console.log(`Checking ${allPlants.length} plants...`); - let failedCount = 0; - const concurrency = 10; - - for (let i = 0; i < allPlants.length; i += concurrency) { - const batch = allPlants.slice(i, i + concurrency); - const results = await Promise.all(batch.map(async p => { - const ok = await checkUrl(p.imageUri); - return { - name: p.name, - url: p.imageUri, - ok - }; - })); - - for (const res of results) { - if (!res.ok) { - console.log(`❌ Failed: ${res.name} -> ${res.url}`); - failedCount++; - } - } - } - - if (failedCount === 0) { - console.log("✅ All image URLs are reachable!"); - } else { - console.log(`❌ ${failedCount} URLs failed.`); - } -} - -run(); +import * as fs from 'fs'; +import * as path from 'path'; + +// Using exact string parsing since importing the TS files directly in tsx could have issues if the environment isn't fully set up, but tsx should work. Let's just import them. +import { LEXICON_BATCH_1_ENTRIES } from '../constants/lexiconBatch1'; +import { LEXICON_BATCH_2_ENTRIES } from '../constants/lexiconBatch2'; + +const allPlants = [...LEXICON_BATCH_1_ENTRIES, ...LEXICON_BATCH_2_ENTRIES]; + +async function checkUrl(url: string): Promise { + const headers = { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', + 'Accept': 'image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8', + 'Referer': 'https://commons.wikimedia.org/' + }; + try { + const response = await fetch(url, { method: 'GET', headers }); + return response.status === 200; + } catch (error) { + return false; + } +} + +async function run() { + console.log(`Checking ${allPlants.length} plants...`); + let failedCount = 0; + const concurrency = 10; + + for (let i = 0; i < allPlants.length; i += concurrency) { + const batch = allPlants.slice(i, i + concurrency); + const results = await Promise.all(batch.map(async p => { + const ok = await checkUrl(p.imageUri); + return { + name: p.name, + url: p.imageUri, + ok + }; + })); + + for (const res of results) { + if (!res.ok) { + console.log(`❌ Failed: ${res.name} -> ${res.url}`); + failedCount++; + } + } + } + + if (failedCount === 0) { + console.log("✅ All image URLs are reachable!"); + } else { + console.log(`❌ ${failedCount} URLs failed.`); + } +} + +run(); diff --git a/server/.dockerignore b/server/.dockerignore index 09e76bc..fb5eb4c 100644 --- a/server/.dockerignore +++ b/server/.dockerignore @@ -1,4 +1,4 @@ -node_modules -.env -.env.* -npm-debug.log +node_modules +.env +.env.* +npm-debug.log diff --git a/server/Dockerfile b/server/Dockerfile index 7acded8..1ba6682 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 package*.json ./ +RUN npm ci --only=production + +COPY . . + +EXPOSE 3000 + +CMD ["node", "index.js"] diff --git a/server/app.json b/server/app.json index f865b5a..af07ad6 100644 --- a/server/app.json +++ b/server/app.json @@ -1,9 +1,9 @@ -{ - "expo": { - "extra": { - "eas": { - "projectId": "4fb7372e-83ce-4f18-9b48-e735f00d7243" - } - } - } -} +{ + "expo": { + "extra": { + "eas": { + "projectId": "4fb7372e-83ce-4f18-9b48-e735f00d7243" + } + } + } +} diff --git a/server/index.js b/server/index.js index 88f8d71..09d272f 100644 --- a/server/index.js +++ b/server/index.js @@ -1,487 +1,532 @@ -const fs = require('fs'); -const path = require('path'); -const dotenv = require('dotenv'); -const express = require('express'); -const cors = require('cors'); -const Stripe = require('stripe'); - -const loadEnvFiles = (filePaths) => { - const mergedFileEnv = {}; - for (const filePath of filePaths) { - if (!fs.existsSync(filePath)) continue; - Object.assign(mergedFileEnv, dotenv.parse(fs.readFileSync(filePath))); - } - - for (const [key, value] of Object.entries(mergedFileEnv)) { - if (process.env[key] === undefined) { - process.env[key] = value; - } - } -}; - -loadEnvFiles([ - path.join(__dirname, '..', '.env'), - path.join(__dirname, '.env'), - path.join(__dirname, '..', '.env.local'), - path.join(__dirname, '.env.local'), -]); - -const { closeDatabase, getDefaultDbPath, openDatabase, get, run } = require('./lib/sqlite'); -const { ensureAuthSchema, signUp: authSignUp, login: authLogin, issueToken, verifyJwt } = require('./lib/auth'); -const { - PlantImportValidationError, - ensurePlantSchema, - getPlantDiagnostics, - getPlants, - rebuildPlantsCatalog, -} = require('./lib/plants'); +const fs = require('fs'); +const path = require('path'); +const dotenv = require('dotenv'); +const express = require('express'); +const cors = require('cors'); +const Stripe = require('stripe'); + +const loadEnvFiles = (filePaths) => { + const mergedFileEnv = {}; + for (const filePath of filePaths) { + if (!fs.existsSync(filePath)) continue; + Object.assign(mergedFileEnv, dotenv.parse(fs.readFileSync(filePath))); + } + + for (const [key, value] of Object.entries(mergedFileEnv)) { + if (process.env[key] === undefined) { + process.env[key] = value; + } + } +}; + +loadEnvFiles([ + path.join(__dirname, '..', '.env'), + path.join(__dirname, '.env'), + path.join(__dirname, '..', '.env.local'), + path.join(__dirname, '.env.local'), +]); + +const { closeDatabase, getDefaultDbPath, openDatabase, get, run } = require('./lib/sqlite'); +const { ensureAuthSchema, signUp: authSignUp, login: authLogin, issueToken, verifyJwt } = require('./lib/auth'); +const { + PlantImportValidationError, + ensurePlantSchema, + getPlantDiagnostics, + getPlants, + rebuildPlantsCatalog, +} = require('./lib/plants'); const { chargeKey, consumeCreditsWithIdempotency, endpointKey, ensureBillingSchema, - getAccountSnapshot, - getBillingSummary, - getEndpointResponse, + getAccountSnapshot, + getBillingSummary, + getEndpointResponse, isInsufficientCreditsError, simulatePurchase, simulateWebhook, + syncRevenueCatCustomerInfo, + syncRevenueCatWebhookEvent, storeEndpointResponse, } = require('./lib/billing'); -const { - analyzePlantHealth, - getHealthModel, - getScanModel, - identifyPlant, - isConfigured: isOpenAiConfigured, -} = require('./lib/openai'); -const { applyCatalogGrounding, normalizeText } = require('./lib/scanGrounding'); -const { ensureStorageBucket, uploadImage, isStorageConfigured } = require('./lib/storage'); +const { + analyzePlantHealth, + getHealthModel, + getScanModel, + identifyPlant, + isConfigured: isOpenAiConfigured, +} = require('./lib/openai'); +const { applyCatalogGrounding, normalizeText } = require('./lib/scanGrounding'); +const { ensureStorageBucket, uploadImage, isStorageConfigured } = require('./lib/storage'); + +const app = express(); +const port = Number(process.env.PORT || 3000); +const plantsPublicDir = path.join(__dirname, 'public', 'plants'); +const stripeSecretKey = (process.env.STRIPE_SECRET_KEY || '').trim(); +if (!stripeSecretKey) { + console.error('STRIPE_SECRET_KEY is not set. Payment endpoints will fail.'); +} +const stripe = new Stripe(stripeSecretKey || 'sk_test_placeholder_key_not_configured'); + +const resolveStripeModeFromKey = (key, livePrefix, testPrefix) => { + const normalized = String(key || '').trim(); + if (normalized.startsWith(livePrefix)) return 'LIVE'; + if (normalized.startsWith(testPrefix)) return 'TEST'; + return 'MOCK'; +}; + +const getStripeSecretMode = () => + resolveStripeModeFromKey(process.env.STRIPE_SECRET_KEY, 'sk_live_', 'sk_test_'); + +const getStripePublishableMode = () => + resolveStripeModeFromKey( + process.env.STRIPE_PUBLISHABLE_KEY || process.env.EXPO_PUBLIC_STRIPE_PUBLISHABLE_KEY, + 'pk_live_', + 'pk_test_', + ); + +const SCAN_PRIMARY_COST = 1; +const SCAN_REVIEW_COST = 1; +const SEMANTIC_SEARCH_COST = 2; +const HEALTH_CHECK_COST = 2; +const LOW_CONFIDENCE_REVIEW_THRESHOLD = 0.8; + +const DEFAULT_BOOTSTRAP_PLANTS = [ + { + id: '1', + name: 'Monstera Deliciosa', + botanicalName: 'Monstera deliciosa', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/2/2e/Monstera_deliciosa2.jpg/330px-Monstera_deliciosa2.jpg', + description: 'A popular houseplant with large, holey leaves.', + categories: ['easy', 'large', 'air_purifier'], + confidence: 1, + careInfo: { + waterIntervalDays: 7, + temp: '18-27C', + light: 'Indirect bright light', + }, + }, + { + id: '2', + name: 'Snake Plant', + botanicalName: 'Sansevieria trifasciata', + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/f/fb/Snake_Plant_%28Sansevieria_trifasciata_%27Laurentii%27%29.jpg/330px-Snake_Plant_%28Sansevieria_trifasciata_%27Laurentii%27%29.jpg', + description: 'A hardy indoor plant known for its upright, sword-like leaves.', + categories: ['succulent', 'easy', 'low_light', 'air_purifier'], + confidence: 1, + careInfo: { + waterIntervalDays: 21, + temp: '15-30C', + light: 'Low to full light', + }, + }, +]; + +let db; + +const parseBoolean = (value, fallbackValue) => { + if (typeof value !== 'string') return fallbackValue; + const normalized = value.trim().toLowerCase(); + if (normalized === 'true' || normalized === '1') return true; + if (normalized === 'false' || normalized === '0') return false; + return fallbackValue; +}; + +const hashString = (value) => { + let hash = 0; + for (let i = 0; i < value.length; i += 1) { + hash = ((hash << 5) - hash + value.charCodeAt(i)) | 0; + } + return Math.abs(hash); +}; + +const clamp = (value, min, max) => { + return Math.min(max, Math.max(min, value)); +}; + +const nowIso = () => new Date().toISOString(); + +const hasImportAdminKey = Boolean(process.env.PLANT_IMPORT_ADMIN_KEY); +const isAuthorizedImport = (request) => { + if (!hasImportAdminKey) return true; + const provided = request.header('x-admin-key'); + return provided === process.env.PLANT_IMPORT_ADMIN_KEY; +}; + +const normalizeLanguage = (value) => { + return value === 'de' || value === 'en' || value === 'es' ? value : 'en'; +}; + +const resolveUserId = (request) => { + // 1. Bearer JWT (preferred — server-side auth) + const authHeader = request.header('authorization'); + if (authHeader && authHeader.startsWith('Bearer ')) { + const token = authHeader.slice(7); + if (token === 'guest') return 'guest'; + const payload = verifyJwt(token); + if (payload && payload.sub) return String(payload.sub); + } + // 2. Legacy X-User-Id header (kept for backward compat) + const headerUserId = request.header('x-user-id'); + if (typeof headerUserId === 'string' && headerUserId.trim()) return headerUserId.trim(); + const bodyUserId = typeof request.body?.userId === 'string' ? request.body.userId.trim() : ''; + if (bodyUserId) return bodyUserId; + return ''; +}; + +const resolveIdempotencyKey = (request) => { + const header = request.header('idempotency-key'); + if (typeof header === 'string' && header.trim()) return header.trim(); + return ''; +}; + +const toPlantResult = (entry, confidence) => { + return { + name: entry.name, + botanicalName: entry.botanicalName, + confidence: clamp(confidence, 0.05, 0.99), + description: entry.description || `${entry.name} identified from the plant catalog.`, + careInfo: { + waterIntervalDays: Math.max(1, Number(entry.careInfo?.waterIntervalDays) || 7), + light: entry.careInfo?.light || 'Unknown', + temp: entry.careInfo?.temp || 'Unknown', + }, + }; +}; + +const pickCatalogFallback = (entries, imageUri, preferHighConfidence = false) => { + if (!Array.isArray(entries) || entries.length === 0) return null; + const baseHash = hashString(`${imageUri || ''}|${entries.length}`); + const index = baseHash % entries.length; + // Low confidence so the user knows this is a hash-based guess, not a real identification + const confidence = preferHighConfidence + ? 0.22 + ((baseHash % 3) / 100) + : 0.18 + ((baseHash % 7) / 100); + console.warn('Using hash-based catalog fallback — OpenAI is unavailable or returned null.', { + plant: entries[index]?.name, + confidence, + imageHint: (imageUri || '').slice(0, 80), + }); + return toPlantResult(entries[index], confidence); +}; + +const toImportErrorPayload = (error) => { + if (error instanceof PlantImportValidationError) { + return { + status: 422, + body: { + code: 'IMPORT_VALIDATION_ERROR', + message: error.message, + details: error.details || [], + }, + }; + } + + return { + status: 500, + body: { + code: 'INTERNAL_ERROR', + message: error instanceof Error ? error.message : String(error), + }, + }; +}; + +const toApiErrorPayload = (error) => { + if (error && typeof error === 'object' && error.code === 'BAD_REQUEST') { + return { + status: 400, + body: { code: 'BAD_REQUEST', message: error.message || 'Invalid request.' }, + }; + } + + if (error && typeof error === 'object' && error.code === 'UNAUTHORIZED') { + return { + status: 401, + body: { code: 'UNAUTHORIZED', message: error.message || 'Unauthorized.' }, + }; + } + + if (isInsufficientCreditsError(error)) { + return { + status: 402, + body: { + code: 'INSUFFICIENT_CREDITS', + message: error.message || 'Insufficient credits.', + details: error.metadata || undefined, + }, + }; + } + + if (error && typeof error === 'object' && error.code === 'PROVIDER_ERROR') { + return { + status: 502, + body: { code: 'PROVIDER_ERROR', message: error.message || 'Provider request failed.' }, + }; + } + + if (error && typeof error === 'object' && error.code === 'TIMEOUT') { + return { + status: 504, + body: { code: 'TIMEOUT', message: error.message || 'Provider timed out.' }, + }; + } + + return { + status: 500, + body: { + code: 'PROVIDER_ERROR', + message: error instanceof Error ? error.message : String(error), + }, + }; +}; + +const ensureRequestAuth = (request) => { + const userId = resolveUserId(request); + if (!userId) { + const error = new Error('Missing X-User-Id header.'); + error.code = 'UNAUTHORIZED'; + throw error; + } + return userId; +}; + +const isGuest = (userId) => userId === 'guest'; + +const ensureNonEmptyString = (value, fieldName) => { + if (typeof value === 'string' && value.trim()) return value.trim(); + const error = new Error(`${fieldName} is required.`); + error.code = 'BAD_REQUEST'; + throw error; +}; + +const seedBootstrapCatalogIfNeeded = async () => { + const existing = await getPlants(db, { limit: 1 }); + if (existing.length > 0) return; + + await rebuildPlantsCatalog(db, DEFAULT_BOOTSTRAP_PLANTS, { + source: 'bootstrap', + preserveExistingIds: false, + enforceUniqueImages: false, + }); +}; + +app.use(cors()); +app.use('/plants', express.static(plantsPublicDir)); + +const revenueCatWebhookSecret = (process.env.REVENUECAT_WEBHOOK_SECRET || '').trim(); -const app = express(); -const port = Number(process.env.PORT || 3000); -const plantsPublicDir = path.join(__dirname, 'public', 'plants'); -const stripeSecretKey = (process.env.STRIPE_SECRET_KEY || '').trim(); -if (!stripeSecretKey) { - console.error('STRIPE_SECRET_KEY is not set. Payment endpoints will fail.'); -} -const stripe = new Stripe(stripeSecretKey || 'sk_test_placeholder_key_not_configured'); - -const resolveStripeModeFromKey = (key, livePrefix, testPrefix) => { - const normalized = String(key || '').trim(); - if (normalized.startsWith(livePrefix)) return 'LIVE'; - if (normalized.startsWith(testPrefix)) return 'TEST'; - return 'MOCK'; +const isAuthorizedRevenueCatWebhook = (request) => { + if (!revenueCatWebhookSecret) return true; + const headerValue = request.header('authorization') || request.header('Authorization') || ''; + const normalized = String(headerValue).trim(); + return normalized === revenueCatWebhookSecret || normalized === `Bearer ${revenueCatWebhookSecret}`; }; -const getStripeSecretMode = () => - resolveStripeModeFromKey(process.env.STRIPE_SECRET_KEY, 'sk_live_', 'sk_test_'); - -const getStripePublishableMode = () => - resolveStripeModeFromKey( - process.env.STRIPE_PUBLISHABLE_KEY || process.env.EXPO_PUBLIC_STRIPE_PUBLISHABLE_KEY, - 'pk_live_', - 'pk_test_', - ); - -const SCAN_PRIMARY_COST = 1; -const SCAN_REVIEW_COST = 1; -const SEMANTIC_SEARCH_COST = 2; -const HEALTH_CHECK_COST = 2; -const LOW_CONFIDENCE_REVIEW_THRESHOLD = 0.8; - -const DEFAULT_BOOTSTRAP_PLANTS = [ - { - id: '1', - name: 'Monstera Deliciosa', - botanicalName: 'Monstera deliciosa', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/2/2e/Monstera_deliciosa2.jpg/330px-Monstera_deliciosa2.jpg', - description: 'A popular houseplant with large, holey leaves.', - categories: ['easy', 'large', 'air_purifier'], - confidence: 1, - careInfo: { - waterIntervalDays: 7, - temp: '18-27C', - light: 'Indirect bright light', - }, - }, - { - id: '2', - name: 'Snake Plant', - botanicalName: 'Sansevieria trifasciata', - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/f/fb/Snake_Plant_%28Sansevieria_trifasciata_%27Laurentii%27%29.jpg/330px-Snake_Plant_%28Sansevieria_trifasciata_%27Laurentii%27%29.jpg', - description: 'A hardy indoor plant known for its upright, sword-like leaves.', - categories: ['succulent', 'easy', 'low_light', 'air_purifier'], - confidence: 1, - careInfo: { - waterIntervalDays: 21, - temp: '15-30C', - light: 'Low to full light', - }, - }, -]; - -let db; - -const parseBoolean = (value, fallbackValue) => { - if (typeof value !== 'string') return fallbackValue; - const normalized = value.trim().toLowerCase(); - if (normalized === 'true' || normalized === '1') return true; - if (normalized === 'false' || normalized === '0') return false; - return fallbackValue; -}; - -const hashString = (value) => { - let hash = 0; - for (let i = 0; i < value.length; i += 1) { - hash = ((hash << 5) - hash + value.charCodeAt(i)) | 0; - } - return Math.abs(hash); -}; - -const clamp = (value, min, max) => { - return Math.min(max, Math.max(min, value)); -}; - -const nowIso = () => new Date().toISOString(); - -const hasImportAdminKey = Boolean(process.env.PLANT_IMPORT_ADMIN_KEY); -const isAuthorizedImport = (request) => { - if (!hasImportAdminKey) return true; - const provided = request.header('x-admin-key'); - return provided === process.env.PLANT_IMPORT_ADMIN_KEY; -}; - -const normalizeLanguage = (value) => { - return value === 'de' || value === 'en' || value === 'es' ? value : 'en'; -}; - -const resolveUserId = (request) => { - // 1. Bearer JWT (preferred — server-side auth) - const authHeader = request.header('authorization'); - if (authHeader && authHeader.startsWith('Bearer ')) { - const token = authHeader.slice(7); - if (token === 'guest') return 'guest'; - const payload = verifyJwt(token); - if (payload && payload.sub) return String(payload.sub); - } - // 2. Legacy X-User-Id header (kept for backward compat) - const headerUserId = request.header('x-user-id'); - if (typeof headerUserId === 'string' && headerUserId.trim()) return headerUserId.trim(); - const bodyUserId = typeof request.body?.userId === 'string' ? request.body.userId.trim() : ''; - if (bodyUserId) return bodyUserId; - return ''; -}; - -const resolveIdempotencyKey = (request) => { - const header = request.header('idempotency-key'); - if (typeof header === 'string' && header.trim()) return header.trim(); - return ''; -}; - -const toPlantResult = (entry, confidence) => { - return { - name: entry.name, - botanicalName: entry.botanicalName, - confidence: clamp(confidence, 0.05, 0.99), - description: entry.description || `${entry.name} identified from the plant catalog.`, - careInfo: { - waterIntervalDays: Math.max(1, Number(entry.careInfo?.waterIntervalDays) || 7), - light: entry.careInfo?.light || 'Unknown', - temp: entry.careInfo?.temp || 'Unknown', - }, - }; -}; - -const pickCatalogFallback = (entries, imageUri, preferHighConfidence = false) => { - if (!Array.isArray(entries) || entries.length === 0) return null; - const baseHash = hashString(`${imageUri || ''}|${entries.length}`); - const index = baseHash % entries.length; - // Low confidence so the user knows this is a hash-based guess, not a real identification - const confidence = preferHighConfidence - ? 0.22 + ((baseHash % 3) / 100) - : 0.18 + ((baseHash % 7) / 100); - console.warn('Using hash-based catalog fallback — OpenAI is unavailable or returned null.', { - plant: entries[index]?.name, - confidence, - imageHint: (imageUri || '').slice(0, 80), - }); - return toPlantResult(entries[index], confidence); -}; - -const toImportErrorPayload = (error) => { - if (error instanceof PlantImportValidationError) { - return { - status: 422, - body: { - code: 'IMPORT_VALIDATION_ERROR', - message: error.message, - details: error.details || [], - }, - }; - } - - return { - status: 500, - body: { - code: 'INTERNAL_ERROR', - message: error instanceof Error ? error.message : String(error), - }, - }; -}; - -const toApiErrorPayload = (error) => { - if (error && typeof error === 'object' && error.code === 'BAD_REQUEST') { - return { - status: 400, - body: { code: 'BAD_REQUEST', message: error.message || 'Invalid request.' }, - }; - } - - if (error && typeof error === 'object' && error.code === 'UNAUTHORIZED') { - return { - status: 401, - body: { code: 'UNAUTHORIZED', message: error.message || 'Unauthorized.' }, - }; - } - - if (isInsufficientCreditsError(error)) { - return { - status: 402, - body: { - code: 'INSUFFICIENT_CREDITS', - message: error.message || 'Insufficient credits.', - details: error.metadata || undefined, - }, - }; - } - - if (error && typeof error === 'object' && error.code === 'PROVIDER_ERROR') { - return { - status: 502, - body: { code: 'PROVIDER_ERROR', message: error.message || 'Provider request failed.' }, - }; - } - - if (error && typeof error === 'object' && error.code === 'TIMEOUT') { - return { - status: 504, - body: { code: 'TIMEOUT', message: error.message || 'Provider timed out.' }, - }; - } - - return { - status: 500, - body: { - code: 'PROVIDER_ERROR', - message: error instanceof Error ? error.message : String(error), - }, - }; -}; - -const ensureRequestAuth = (request) => { - const userId = resolveUserId(request); - if (!userId) { - const error = new Error('Missing X-User-Id header.'); - error.code = 'UNAUTHORIZED'; - throw error; - } - return userId; -}; - -const isGuest = (userId) => userId === 'guest'; - -const ensureNonEmptyString = (value, fieldName) => { - if (typeof value === 'string' && value.trim()) return value.trim(); - const error = new Error(`${fieldName} is required.`); - error.code = 'BAD_REQUEST'; - throw error; -}; - -const seedBootstrapCatalogIfNeeded = async () => { - const existing = await getPlants(db, { limit: 1 }); - if (existing.length > 0) return; - - await rebuildPlantsCatalog(db, DEFAULT_BOOTSTRAP_PLANTS, { - source: 'bootstrap', - preserveExistingIds: false, - enforceUniqueImages: false, - }); -}; - -app.use(cors()); -app.use('/plants', express.static(plantsPublicDir)); - -// Webhook must be BEFORE express.json() to get the raw body +// Webhooks must be BEFORE express.json() to preserve raw body where required. app.post('/api/webhook', express.raw({ type: 'application/json' }), (request, response) => { const signature = request.headers['stripe-signature']; let event; - - try { - event = stripe.webhooks.constructEvent( - request.body, - signature, - process.env.STRIPE_WEBHOOK_SECRET, - ); - } catch (error) { - console.error(`Webhook Error: ${error.message}`); - response.status(400).send(`Webhook Error: ${error.message}`); - return; - } - - switch (event.type) { - case 'payment_intent.succeeded': - console.log('PaymentIntent succeeded.'); - break; - default: - console.log(`Unhandled event type: ${event.type}`); - break; - } + + try { + event = stripe.webhooks.constructEvent( + request.body, + signature, + process.env.STRIPE_WEBHOOK_SECRET, + ); + } catch (error) { + console.error(`Webhook Error: ${error.message}`); + response.status(400).send(`Webhook Error: ${error.message}`); + return; + } + + switch (event.type) { + case 'payment_intent.succeeded': + console.log('PaymentIntent succeeded.'); + break; + default: + console.log(`Unhandled event type: ${event.type}`); + break; + } response.json({ received: true }); }); -app.use(express.json({ limit: '10mb' })); +app.post('/api/revenuecat/webhook', express.json({ limit: '1mb' }), async (request, response) => { + try { + if (!isAuthorizedRevenueCatWebhook(request)) { + return response.status(401).json({ code: 'UNAUTHORIZED', message: 'Invalid RevenueCat webhook secret.' }); + } + const eventPayload = request.body?.event || request.body; + const result = await syncRevenueCatWebhookEvent(db, eventPayload); + response.status(200).json({ received: true, syncedAt: result.syncedAt }); + } catch (error) { + const payload = toApiErrorPayload(error); + response.status(payload.status).json(payload.body); + } +}); -app.get('/', (_request, response) => { - response.status(200).json({ - service: 'greenlns-api', - status: 'ok', - endpoints: [ - 'GET /health', - 'POST /api/payment-sheet', - 'GET /api/plants', - 'POST /api/plants/rebuild', - 'POST /auth/signup', - 'POST /auth/login', +app.use(express.json({ limit: '10mb' })); + +app.get('/', (_request, response) => { + response.status(200).json({ + service: 'greenlns-api', + status: 'ok', + endpoints: [ + 'GET /health', + 'POST /api/payment-sheet', + 'GET /api/plants', + 'POST /api/plants/rebuild', + 'POST /auth/signup', + 'POST /auth/login', 'GET /v1/billing/summary', + 'POST /v1/billing/sync-revenuecat', 'POST /v1/scan', - 'POST /v1/search/semantic', - 'POST /v1/health-check', - 'POST /v1/billing/simulate-purchase', - 'POST /v1/billing/simulate-webhook', + 'POST /v1/search/semantic', + 'POST /v1/health-check', + 'POST /v1/billing/simulate-purchase', + 'POST /v1/billing/simulate-webhook', 'POST /v1/upload/image', + 'POST /api/revenuecat/webhook', ], }); }); - -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(), - scanModel: getScanModel(), - healthModel: getHealthModel(), - }); -}); - -app.get('/api/plants', async (request, response) => { - try { - const query = typeof request.query.q === 'string' ? request.query.q : ''; - const category = typeof request.query.category === 'string' ? request.query.category : ''; - const limit = request.query.limit; - const results = await getPlants(db, { - query, - category, - limit: typeof limit === 'string' ? Number(limit) : undefined, - }); - response.json(results); - } catch (error) { - const payload = toImportErrorPayload(error); - response.status(payload.status).json(payload.body); - } -}); - -app.get('/api/plants/diagnostics', async (_request, response) => { - try { - const diagnostics = await getPlantDiagnostics(db); - response.json(diagnostics); - } catch (error) { - const payload = toImportErrorPayload(error); - response.status(payload.status).json(payload.body); - } -}); - -app.post('/api/plants/rebuild', async (request, response) => { - if (!isAuthorizedImport(request)) { - response.status(401).json({ - code: 'UNAUTHORIZED', - message: 'Invalid or missing x-admin-key.', - }); - return; - } - - const payloadEntries = Array.isArray(request.body) - ? request.body - : request.body?.entries; - const source = typeof request.body?.source === 'string' && request.body.source.trim() - ? request.body.source.trim() - : 'api_rebuild'; - const preserveExistingIds = parseBoolean(request.body?.preserveExistingIds, true); - const enforceUniqueImages = parseBoolean(request.body?.enforceUniqueImages, true); - - try { - const summary = await rebuildPlantsCatalog(db, payloadEntries, { - source, - preserveExistingIds, - enforceUniqueImages, - }); - response.status(200).json(summary); - } catch (error) { - const payload = toImportErrorPayload(error); - response.status(payload.status).json(payload.body); - } -}); - -app.post('/api/payment-sheet', async (request, response) => { - try { - const amount = Number(request.body?.amount || 500); - const currency = request.body?.currency || 'usd'; - - const paymentIntent = await stripe.paymentIntents.create({ - amount, - currency, - automatic_payment_methods: { enabled: true }, - }); - - const customer = await stripe.customers.create(); - const ephemeralKey = await stripe.ephemeralKeys.create( - { customer: customer.id }, - { apiVersion: '2023-10-16' }, - ); - - response.json({ - paymentIntent: paymentIntent.client_secret, - ephemeralKey: ephemeralKey.secret, - customer: customer.id, - publishableKey: process.env.STRIPE_PUBLISHABLE_KEY || process.env.EXPO_PUBLIC_STRIPE_PUBLISHABLE_KEY || 'pk_test_mock_key', - }); - } catch (error) { - response.status(400).json({ - code: 'PAYMENT_SHEET_ERROR', - message: error instanceof Error ? error.message : String(error), - }); - } -}); - + +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(), + scanModel: getScanModel(), + healthModel: getHealthModel(), + }); +}); + +app.get('/api/plants', async (request, response) => { + try { + const query = typeof request.query.q === 'string' ? request.query.q : ''; + const category = typeof request.query.category === 'string' ? request.query.category : ''; + const limit = request.query.limit; + const results = await getPlants(db, { + query, + category, + limit: typeof limit === 'string' ? Number(limit) : undefined, + }); + response.json(results); + } catch (error) { + const payload = toImportErrorPayload(error); + response.status(payload.status).json(payload.body); + } +}); + +app.get('/api/plants/diagnostics', async (_request, response) => { + try { + const diagnostics = await getPlantDiagnostics(db); + response.json(diagnostics); + } catch (error) { + const payload = toImportErrorPayload(error); + response.status(payload.status).json(payload.body); + } +}); + +app.post('/api/plants/rebuild', async (request, response) => { + if (!isAuthorizedImport(request)) { + response.status(401).json({ + code: 'UNAUTHORIZED', + message: 'Invalid or missing x-admin-key.', + }); + return; + } + + const payloadEntries = Array.isArray(request.body) + ? request.body + : request.body?.entries; + const source = typeof request.body?.source === 'string' && request.body.source.trim() + ? request.body.source.trim() + : 'api_rebuild'; + const preserveExistingIds = parseBoolean(request.body?.preserveExistingIds, true); + const enforceUniqueImages = parseBoolean(request.body?.enforceUniqueImages, true); + + try { + const summary = await rebuildPlantsCatalog(db, payloadEntries, { + source, + preserveExistingIds, + enforceUniqueImages, + }); + response.status(200).json(summary); + } catch (error) { + const payload = toImportErrorPayload(error); + response.status(payload.status).json(payload.body); + } +}); + +app.post('/api/payment-sheet', async (request, response) => { + try { + const amount = Number(request.body?.amount || 500); + const currency = request.body?.currency || 'usd'; + + const paymentIntent = await stripe.paymentIntents.create({ + amount, + currency, + automatic_payment_methods: { enabled: true }, + }); + + const customer = await stripe.customers.create(); + const ephemeralKey = await stripe.ephemeralKeys.create( + { customer: customer.id }, + { apiVersion: '2023-10-16' }, + ); + + response.json({ + paymentIntent: paymentIntent.client_secret, + ephemeralKey: ephemeralKey.secret, + customer: customer.id, + publishableKey: process.env.STRIPE_PUBLISHABLE_KEY || process.env.EXPO_PUBLIC_STRIPE_PUBLISHABLE_KEY || 'pk_test_mock_key', + }); + } catch (error) { + response.status(400).json({ + code: 'PAYMENT_SHEET_ERROR', + message: error instanceof Error ? error.message : String(error), + }); + } +}); + 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 summary = await getBillingSummary(db, userId); + response.status(200).json(summary); + } catch (error) { + const payload = toApiErrorPayload(error); + response.status(payload.status).json(payload.body); + } +}); + +app.post('/v1/billing/sync-revenuecat', 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.' }); - } + if (userId === 'guest') { + return response.status(400).json({ code: 'BAD_REQUEST', message: 'Guest users cannot sync RevenueCat state.' }); } - const summary = await getBillingSummary(db, userId); - response.status(200).json(summary); + const customerInfo = request.body?.customerInfo; + 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); + response.status(200).json(payload); } catch (error) { const payload = toApiErrorPayload(error); response.status(payload.status).json(payload.body); @@ -489,397 +534,397 @@ app.get('/v1/billing/summary', async (request, response) => { }); app.post('/v1/scan', async (request, response) => { - let userId = 'unknown'; - try { - userId = ensureRequestAuth(request); - const idempotencyKey = ensureNonEmptyString(resolveIdempotencyKey(request), 'Idempotency-Key header'); - const imageUri = ensureNonEmptyString(request.body?.imageUri, 'imageUri'); - const language = normalizeLanguage(request.body?.language); - const endpointId = endpointKey('scan', userId, idempotencyKey); - - const cached = await getEndpointResponse(db, endpointId); - if (cached) { - response.status(200).json(cached); - return; - } - - let creditsCharged = 0; - const modelPath = []; - let modelUsed = null; - let modelFallbackCount = 0; - - if (!isGuest(userId)) { - creditsCharged += await consumeCreditsWithIdempotency( - db, - userId, - chargeKey('scan-primary', userId, idempotencyKey), - SCAN_PRIMARY_COST, - ); - } - - const accountSnapshot = await getAccountSnapshot(db, userId); - const scanPlan = accountSnapshot.plan === 'pro' ? 'pro' : 'free'; - const catalogEntries = await getPlants(db, { limit: 500 }); - let result = pickCatalogFallback(catalogEntries, imageUri, false); - let usedOpenAi = false; - - if (isOpenAiConfigured()) { - console.log(`Starting OpenAI identification for user ${userId} using model ${getScanModel(scanPlan)} (plan: ${scanPlan})`); - const openAiPrimary = await identifyPlant({ - imageUri, - language, - mode: 'primary', - plan: scanPlan, - }); - modelFallbackCount = Math.max( - modelFallbackCount, - Math.max((openAiPrimary?.attemptedModels?.length || 0) - 1, 0), - ); - if (openAiPrimary?.result) { - console.log(`OpenAI primary identification successful for user ${userId}: ${openAiPrimary.result.name} (${openAiPrimary.result.confidence}) using ${openAiPrimary.modelUsed}`); - const grounded = applyCatalogGrounding(openAiPrimary.result, catalogEntries, language); - result = grounded.result; - if (!grounded.grounded) result = { ...result, confidence: clamp(Math.max(result.confidence || 0.6, 0.72), 0.05, 0.99) }; - usedOpenAi = true; - modelUsed = openAiPrimary.modelUsed || modelUsed; - modelPath.push('openai-primary'); - if (grounded.grounded) modelPath.push('catalog-grounded-primary'); - } else { - console.warn(`OpenAI primary identification returned null for user ${userId}`); - modelPath.push('openai-primary-failed'); - modelPath.push('catalog-primary-fallback'); - } - } else { - console.log(`OpenAI not configured, using catalog fallback for user ${userId}`); - modelPath.push('openai-not-configured'); - modelPath.push('catalog-primary-fallback'); - } - - if (!result) { - const error = new Error('Plant catalog is empty. Unable to produce identification fallback.'); - error.code = 'PROVIDER_ERROR'; - throw error; - } - - const shouldReview = result.confidence < LOW_CONFIDENCE_REVIEW_THRESHOLD; - if (shouldReview && accountSnapshot.plan === 'pro') { - console.log(`Starting AI review for user ${userId} (confidence ${result.confidence} < ${LOW_CONFIDENCE_REVIEW_THRESHOLD})`); - try { - if (!isGuest(userId)) { - creditsCharged += await consumeCreditsWithIdempotency( - db, - userId, - chargeKey('scan-review', userId, idempotencyKey), - SCAN_REVIEW_COST, - ); - } - - if (usedOpenAi) { - const openAiReview = await identifyPlant({ - imageUri, - language, - mode: 'review', - plan: scanPlan, - }); - modelFallbackCount = Math.max( - modelFallbackCount, - Math.max((openAiReview?.attemptedModels?.length || 0) - 1, 0), - ); - if (openAiReview?.result) { - console.log(`OpenAI review identification successful for user ${userId}: ${openAiReview.result.name} (${openAiReview.result.confidence}) using ${openAiReview.modelUsed}`); - const grounded = applyCatalogGrounding(openAiReview.result, catalogEntries, language); - result = grounded.result; - if (!grounded.grounded) result = { ...result, confidence: clamp(Math.max(result.confidence || 0.6, 0.72), 0.05, 0.99) }; - modelUsed = openAiReview.modelUsed || modelUsed; - modelPath.push('openai-review'); - if (grounded.grounded) modelPath.push('catalog-grounded-review'); - } else { - console.warn(`OpenAI review identification returned null for user ${userId}`); - modelPath.push('openai-review-failed'); - } - } else { - const reviewFallback = pickCatalogFallback(catalogEntries, `${imageUri}|review`, true); - if (reviewFallback) { - result = reviewFallback; - } - modelPath.push('catalog-review-fallback'); - } - } catch (error) { - if (isInsufficientCreditsError(error)) { - console.log(`Review skipped for user ${userId} due to insufficient credits`); - modelPath.push('review-skipped-insufficient-credits'); - } else { - throw error; - } - } - } else if (shouldReview) { - console.log(`Review skipped for user ${userId} (plan: ${accountSnapshot.plan})`); - modelPath.push('review-skipped-free-plan'); - } - - const payload = { - result, - creditsCharged, - modelPath, - modelUsed, - modelFallbackCount, - billing: await getBillingSummary(db, userId), - }; - - await storeEndpointResponse(db, endpointId, payload); - response.status(200).json(payload); - } catch (error) { - console.error(`Scan error for user ${userId}:`, error); - const payload = toApiErrorPayload(error); - response.status(payload.status).json(payload.body); - } -}); - -app.post('/v1/search/semantic', async (request, response) => { - try { - const userId = ensureRequestAuth(request); - const idempotencyKey = ensureNonEmptyString(resolveIdempotencyKey(request), 'Idempotency-Key header'); - const query = typeof request.body?.query === 'string' ? request.body.query.trim() : ''; - const endpointId = endpointKey('semantic-search', userId, idempotencyKey); - - const cached = await getEndpointResponse(db, endpointId); - if (cached) { - response.status(200).json(cached); - return; - } - - if (!query) { - const payload = { - status: 'no_results', - results: [], - creditsCharged: 0, - billing: await getBillingSummary(db, userId), - }; - await storeEndpointResponse(db, endpointId, payload); - response.status(200).json(payload); - return; - } - - const creditsCharged = await consumeCreditsWithIdempotency( - db, - userId, - chargeKey('semantic-search', userId, idempotencyKey), - SEMANTIC_SEARCH_COST, - ); - - const results = await getPlants(db, { query, limit: 18 }); - const payload = { - status: results.length > 0 ? 'success' : 'no_results', - results, - creditsCharged, - billing: await getBillingSummary(db, userId), - }; - - await storeEndpointResponse(db, endpointId, payload); - response.status(200).json(payload); - } catch (error) { - const payload = toApiErrorPayload(error); - response.status(payload.status).json(payload.body); - } -}); - -app.post('/v1/health-check', async (request, response) => { - try { - const userId = ensureRequestAuth(request); - const idempotencyKey = ensureNonEmptyString(resolveIdempotencyKey(request), 'Idempotency-Key header'); - const imageUri = ensureNonEmptyString(request.body?.imageUri, 'imageUri'); - const language = normalizeLanguage(request.body?.language); - const endpointId = endpointKey('health-check', userId, idempotencyKey); - - const cached = await getEndpointResponse(db, endpointId); - if (cached) { - response.status(200).json(cached); - return; - } - - if (!isOpenAiConfigured()) { - const error = new Error('OpenAI health check is unavailable. Please configure OPENAI_API_KEY.'); - error.code = 'PROVIDER_ERROR'; - throw error; - } - - const analysisResponse = await analyzePlantHealth({ - imageUri, - language, - plantContext: request.body?.plantContext, - }); - const analysis = analysisResponse?.analysis; - if (!analysis) { - const error = new Error('OpenAI health check failed. Please verify API key, model, and network access.'); - error.code = 'PROVIDER_ERROR'; - throw error; - } - - let creditsCharged = 0; - if (!isGuest(userId)) { - creditsCharged = await consumeCreditsWithIdempotency( - db, - userId, - chargeKey('health-check', userId, idempotencyKey), - HEALTH_CHECK_COST, - ); - } - - const healthCheck = { - generatedAt: nowIso(), - overallHealthScore: analysis.overallHealthScore, - status: analysis.status, - likelyIssues: analysis.likelyIssues, - actionsNow: analysis.actionsNow, - plan7Days: analysis.plan7Days, - creditsCharged, - imageUri, - }; - - const payload = { - healthCheck, - creditsCharged, - modelUsed: analysisResponse?.modelUsed || null, - modelFallbackCount: Math.max((analysisResponse?.attemptedModels?.length || 0) - 1, 0), - billing: await getBillingSummary(db, userId), - }; - - await storeEndpointResponse(db, endpointId, payload); - response.status(200).json(payload); - } catch (error) { - const payload = toApiErrorPayload(error); - response.status(payload.status).json(payload.body); - } -}); - -app.post('/v1/billing/simulate-purchase', async (request, response) => { - try { - const userId = ensureRequestAuth(request); - const idempotencyKey = ensureNonEmptyString(resolveIdempotencyKey(request), 'Idempotency-Key header'); - const productId = ensureNonEmptyString(request.body?.productId, 'productId'); - const payload = await simulatePurchase(db, userId, idempotencyKey, productId); - response.status(200).json(payload); - } catch (error) { - const payload = toApiErrorPayload(error); - response.status(payload.status).json(payload.body); - } -}); - -app.post('/v1/billing/simulate-webhook', async (request, response) => { - try { - const userId = ensureRequestAuth(request); - const idempotencyKey = ensureNonEmptyString(resolveIdempotencyKey(request), 'Idempotency-Key header'); - const event = ensureNonEmptyString(request.body?.event, 'event'); - const payload = await simulateWebhook(db, userId, idempotencyKey, event, request.body?.payload || {}); - response.status(200).json(payload); - } catch (error) { - const payload = toApiErrorPayload(error); - response.status(payload.status).json(payload.body); - } -}); - -// ─── Image Upload ────────────────────────────────────────────────────────── - -app.post('/v1/upload/image', async (request, response) => { - try { - ensureRequestAuth(request); - - if (!isStorageConfigured()) { - return response.status(503).json({ - code: 'STORAGE_NOT_CONFIGURED', - message: 'Image storage is not configured.', - }); - } - - const { imageBase64, contentType = 'image/jpeg' } = request.body || {}; - if (!imageBase64 || typeof imageBase64 !== 'string') { - return response.status(400).json({ - code: 'BAD_REQUEST', - message: 'imageBase64 is required.', - }); - } - - const { url } = await uploadImage(imageBase64, contentType); - response.status(200).json({ url }); - } catch (error) { - const payload = toApiErrorPayload(error); - response.status(payload.status).json(payload.body); - } -}); - -// ─── Auth endpoints ──────────────────────────────────────────────────────── - -app.post('/auth/signup', async (request, response) => { - try { - const { email, name, password } = request.body || {}; - if (!email || !name || !password) { - return response.status(400).json({ code: 'BAD_REQUEST', message: 'email, name and password are required.' }); - } - const user = await authSignUp(db, email, name, password); - const token = issueToken(user.id, user.email, user.name); - response.status(201).json({ userId: user.id, email: user.email, name: user.name, token }); - } catch (error) { - const status = error.status || 500; - response.status(status).json({ code: error.code || 'SERVER_ERROR', message: error.message }); - } -}); - -app.post('/auth/login', async (request, response) => { - try { - const { email, password } = request.body || {}; - if (!email || !password) { - return response.status(400).json({ code: 'BAD_REQUEST', message: 'email and password are required.' }); - } - const user = await authLogin(db, email, password); - const token = issueToken(user.id, user.email, user.name); - response.status(200).json({ userId: user.id, email: user.email, name: user.name, token }); - } catch (error) { - const status = error.status || 500; - response.status(status).json({ code: error.code || 'SERVER_ERROR', message: error.message }); - } -}); - -// ─── Startup ─────────────────────────────────────────────────────────────── - -const start = async () => { - db = await openDatabase(); - await ensurePlantSchema(db); - await ensureBillingSchema(db); - await ensureAuthSchema(db); - await seedBootstrapCatalogIfNeeded(); - if (isStorageConfigured()) { - await ensureStorageBucket().catch((err) => console.warn('MinIO bucket setup failed:', err.message)); - } - - const stripeMode = getStripeSecretMode(); - const stripePublishableMode = getStripePublishableMode(); - const maskKey = (key) => { - const k = String(key || '').trim(); - if (k.length < 12) return k ? '(too short to mask)' : '(not set)'; - return `${k.slice(0, 7)}...${k.slice(-4)}`; - }; - console.log(`Stripe Mode: ${stripeMode} | Secret: ${maskKey(process.env.STRIPE_SECRET_KEY)}`); - console.log(`Stripe Publishable Mode: ${stripePublishableMode} | Key: ${maskKey(process.env.STRIPE_PUBLISHABLE_KEY || process.env.EXPO_PUBLIC_STRIPE_PUBLISHABLE_KEY)}`); - - const server = app.listen(port, () => { - console.log(`GreenLens server listening at http://localhost:${port}`); - }); - - const gracefulShutdown = async () => { - try { - await closeDatabase(db); - } catch (error) { - console.error('Failed to close database', error); - } finally { - server.close(() => process.exit(0)); - } - }; - - process.on('SIGINT', gracefulShutdown); - process.on('SIGTERM', gracefulShutdown); -}; - -start().catch((error) => { - console.error('Failed to start GreenLens server', error); - process.exit(1); -}); + let userId = 'unknown'; + try { + userId = ensureRequestAuth(request); + const idempotencyKey = ensureNonEmptyString(resolveIdempotencyKey(request), 'Idempotency-Key header'); + const imageUri = ensureNonEmptyString(request.body?.imageUri, 'imageUri'); + const language = normalizeLanguage(request.body?.language); + const endpointId = endpointKey('scan', userId, idempotencyKey); + + const cached = await getEndpointResponse(db, endpointId); + if (cached) { + response.status(200).json(cached); + return; + } + + let creditsCharged = 0; + const modelPath = []; + let modelUsed = null; + let modelFallbackCount = 0; + + if (!isGuest(userId)) { + creditsCharged += await consumeCreditsWithIdempotency( + db, + userId, + chargeKey('scan-primary', userId, idempotencyKey), + SCAN_PRIMARY_COST, + ); + } + + const accountSnapshot = await getAccountSnapshot(db, userId); + const scanPlan = accountSnapshot.plan === 'pro' ? 'pro' : 'free'; + const catalogEntries = await getPlants(db, { limit: 500 }); + let result = pickCatalogFallback(catalogEntries, imageUri, false); + let usedOpenAi = false; + + if (isOpenAiConfigured()) { + console.log(`Starting OpenAI identification for user ${userId} using model ${getScanModel(scanPlan)} (plan: ${scanPlan})`); + const openAiPrimary = await identifyPlant({ + imageUri, + language, + mode: 'primary', + plan: scanPlan, + }); + modelFallbackCount = Math.max( + modelFallbackCount, + Math.max((openAiPrimary?.attemptedModels?.length || 0) - 1, 0), + ); + if (openAiPrimary?.result) { + console.log(`OpenAI primary identification successful for user ${userId}: ${openAiPrimary.result.name} (${openAiPrimary.result.confidence}) using ${openAiPrimary.modelUsed}`); + const grounded = applyCatalogGrounding(openAiPrimary.result, catalogEntries, language); + result = grounded.result; + if (!grounded.grounded) result = { ...result, confidence: clamp(Math.max(result.confidence || 0.6, 0.72), 0.05, 0.99) }; + usedOpenAi = true; + modelUsed = openAiPrimary.modelUsed || modelUsed; + modelPath.push('openai-primary'); + if (grounded.grounded) modelPath.push('catalog-grounded-primary'); + } else { + console.warn(`OpenAI primary identification returned null for user ${userId}`); + modelPath.push('openai-primary-failed'); + modelPath.push('catalog-primary-fallback'); + } + } else { + console.log(`OpenAI not configured, using catalog fallback for user ${userId}`); + modelPath.push('openai-not-configured'); + modelPath.push('catalog-primary-fallback'); + } + + if (!result) { + const error = new Error('Plant catalog is empty. Unable to produce identification fallback.'); + error.code = 'PROVIDER_ERROR'; + throw error; + } + + const shouldReview = result.confidence < LOW_CONFIDENCE_REVIEW_THRESHOLD; + if (shouldReview && accountSnapshot.plan === 'pro') { + console.log(`Starting AI review for user ${userId} (confidence ${result.confidence} < ${LOW_CONFIDENCE_REVIEW_THRESHOLD})`); + try { + if (!isGuest(userId)) { + creditsCharged += await consumeCreditsWithIdempotency( + db, + userId, + chargeKey('scan-review', userId, idempotencyKey), + SCAN_REVIEW_COST, + ); + } + + if (usedOpenAi) { + const openAiReview = await identifyPlant({ + imageUri, + language, + mode: 'review', + plan: scanPlan, + }); + modelFallbackCount = Math.max( + modelFallbackCount, + Math.max((openAiReview?.attemptedModels?.length || 0) - 1, 0), + ); + if (openAiReview?.result) { + console.log(`OpenAI review identification successful for user ${userId}: ${openAiReview.result.name} (${openAiReview.result.confidence}) using ${openAiReview.modelUsed}`); + const grounded = applyCatalogGrounding(openAiReview.result, catalogEntries, language); + result = grounded.result; + if (!grounded.grounded) result = { ...result, confidence: clamp(Math.max(result.confidence || 0.6, 0.72), 0.05, 0.99) }; + modelUsed = openAiReview.modelUsed || modelUsed; + modelPath.push('openai-review'); + if (grounded.grounded) modelPath.push('catalog-grounded-review'); + } else { + console.warn(`OpenAI review identification returned null for user ${userId}`); + modelPath.push('openai-review-failed'); + } + } else { + const reviewFallback = pickCatalogFallback(catalogEntries, `${imageUri}|review`, true); + if (reviewFallback) { + result = reviewFallback; + } + modelPath.push('catalog-review-fallback'); + } + } catch (error) { + if (isInsufficientCreditsError(error)) { + console.log(`Review skipped for user ${userId} due to insufficient credits`); + modelPath.push('review-skipped-insufficient-credits'); + } else { + throw error; + } + } + } else if (shouldReview) { + console.log(`Review skipped for user ${userId} (plan: ${accountSnapshot.plan})`); + modelPath.push('review-skipped-free-plan'); + } + + const payload = { + result, + creditsCharged, + modelPath, + modelUsed, + modelFallbackCount, + billing: await getBillingSummary(db, userId), + }; + + await storeEndpointResponse(db, endpointId, payload); + response.status(200).json(payload); + } catch (error) { + console.error(`Scan error for user ${userId}:`, error); + const payload = toApiErrorPayload(error); + response.status(payload.status).json(payload.body); + } +}); + +app.post('/v1/search/semantic', async (request, response) => { + try { + const userId = ensureRequestAuth(request); + const idempotencyKey = ensureNonEmptyString(resolveIdempotencyKey(request), 'Idempotency-Key header'); + const query = typeof request.body?.query === 'string' ? request.body.query.trim() : ''; + const endpointId = endpointKey('semantic-search', userId, idempotencyKey); + + const cached = await getEndpointResponse(db, endpointId); + if (cached) { + response.status(200).json(cached); + return; + } + + if (!query) { + const payload = { + status: 'no_results', + results: [], + creditsCharged: 0, + billing: await getBillingSummary(db, userId), + }; + await storeEndpointResponse(db, endpointId, payload); + response.status(200).json(payload); + return; + } + + const creditsCharged = await consumeCreditsWithIdempotency( + db, + userId, + chargeKey('semantic-search', userId, idempotencyKey), + SEMANTIC_SEARCH_COST, + ); + + const results = await getPlants(db, { query, limit: 18 }); + const payload = { + status: results.length > 0 ? 'success' : 'no_results', + results, + creditsCharged, + billing: await getBillingSummary(db, userId), + }; + + await storeEndpointResponse(db, endpointId, payload); + response.status(200).json(payload); + } catch (error) { + const payload = toApiErrorPayload(error); + response.status(payload.status).json(payload.body); + } +}); + +app.post('/v1/health-check', async (request, response) => { + try { + const userId = ensureRequestAuth(request); + const idempotencyKey = ensureNonEmptyString(resolveIdempotencyKey(request), 'Idempotency-Key header'); + const imageUri = ensureNonEmptyString(request.body?.imageUri, 'imageUri'); + const language = normalizeLanguage(request.body?.language); + const endpointId = endpointKey('health-check', userId, idempotencyKey); + + const cached = await getEndpointResponse(db, endpointId); + if (cached) { + response.status(200).json(cached); + return; + } + + if (!isOpenAiConfigured()) { + const error = new Error('OpenAI health check is unavailable. Please configure OPENAI_API_KEY.'); + error.code = 'PROVIDER_ERROR'; + throw error; + } + + const analysisResponse = await analyzePlantHealth({ + imageUri, + language, + plantContext: request.body?.plantContext, + }); + const analysis = analysisResponse?.analysis; + if (!analysis) { + const error = new Error('OpenAI health check failed. Please verify API key, model, and network access.'); + error.code = 'PROVIDER_ERROR'; + throw error; + } + + let creditsCharged = 0; + if (!isGuest(userId)) { + creditsCharged = await consumeCreditsWithIdempotency( + db, + userId, + chargeKey('health-check', userId, idempotencyKey), + HEALTH_CHECK_COST, + ); + } + + const healthCheck = { + generatedAt: nowIso(), + overallHealthScore: analysis.overallHealthScore, + status: analysis.status, + likelyIssues: analysis.likelyIssues, + actionsNow: analysis.actionsNow, + plan7Days: analysis.plan7Days, + creditsCharged, + imageUri, + }; + + const payload = { + healthCheck, + creditsCharged, + modelUsed: analysisResponse?.modelUsed || null, + modelFallbackCount: Math.max((analysisResponse?.attemptedModels?.length || 0) - 1, 0), + billing: await getBillingSummary(db, userId), + }; + + await storeEndpointResponse(db, endpointId, payload); + response.status(200).json(payload); + } catch (error) { + const payload = toApiErrorPayload(error); + response.status(payload.status).json(payload.body); + } +}); + +app.post('/v1/billing/simulate-purchase', async (request, response) => { + try { + const userId = ensureRequestAuth(request); + const idempotencyKey = ensureNonEmptyString(resolveIdempotencyKey(request), 'Idempotency-Key header'); + const productId = ensureNonEmptyString(request.body?.productId, 'productId'); + const payload = await simulatePurchase(db, userId, idempotencyKey, productId); + response.status(200).json(payload); + } catch (error) { + const payload = toApiErrorPayload(error); + response.status(payload.status).json(payload.body); + } +}); + +app.post('/v1/billing/simulate-webhook', async (request, response) => { + try { + const userId = ensureRequestAuth(request); + const idempotencyKey = ensureNonEmptyString(resolveIdempotencyKey(request), 'Idempotency-Key header'); + const event = ensureNonEmptyString(request.body?.event, 'event'); + const payload = await simulateWebhook(db, userId, idempotencyKey, event, request.body?.payload || {}); + response.status(200).json(payload); + } catch (error) { + const payload = toApiErrorPayload(error); + response.status(payload.status).json(payload.body); + } +}); + +// ─── Image Upload ────────────────────────────────────────────────────────── + +app.post('/v1/upload/image', async (request, response) => { + try { + ensureRequestAuth(request); + + if (!isStorageConfigured()) { + return response.status(503).json({ + code: 'STORAGE_NOT_CONFIGURED', + message: 'Image storage is not configured.', + }); + } + + const { imageBase64, contentType = 'image/jpeg' } = request.body || {}; + if (!imageBase64 || typeof imageBase64 !== 'string') { + return response.status(400).json({ + code: 'BAD_REQUEST', + message: 'imageBase64 is required.', + }); + } + + const { url } = await uploadImage(imageBase64, contentType); + response.status(200).json({ url }); + } catch (error) { + const payload = toApiErrorPayload(error); + response.status(payload.status).json(payload.body); + } +}); + +// ─── Auth endpoints ──────────────────────────────────────────────────────── + +app.post('/auth/signup', async (request, response) => { + try { + const { email, name, password } = request.body || {}; + if (!email || !name || !password) { + return response.status(400).json({ code: 'BAD_REQUEST', message: 'email, name and password are required.' }); + } + const user = await authSignUp(db, email, name, password); + const token = issueToken(user.id, user.email, user.name); + response.status(201).json({ userId: user.id, email: user.email, name: user.name, token }); + } catch (error) { + const status = error.status || 500; + response.status(status).json({ code: error.code || 'SERVER_ERROR', message: error.message }); + } +}); + +app.post('/auth/login', async (request, response) => { + try { + const { email, password } = request.body || {}; + if (!email || !password) { + return response.status(400).json({ code: 'BAD_REQUEST', message: 'email and password are required.' }); + } + const user = await authLogin(db, email, password); + const token = issueToken(user.id, user.email, user.name); + response.status(200).json({ userId: user.id, email: user.email, name: user.name, token }); + } catch (error) { + const status = error.status || 500; + response.status(status).json({ code: error.code || 'SERVER_ERROR', message: error.message }); + } +}); + +// ─── Startup ─────────────────────────────────────────────────────────────── + +const start = async () => { + db = await openDatabase(); + await ensurePlantSchema(db); + await ensureBillingSchema(db); + await ensureAuthSchema(db); + await seedBootstrapCatalogIfNeeded(); + if (isStorageConfigured()) { + await ensureStorageBucket().catch((err) => console.warn('MinIO bucket setup failed:', err.message)); + } + + const stripeMode = getStripeSecretMode(); + const stripePublishableMode = getStripePublishableMode(); + const maskKey = (key) => { + const k = String(key || '').trim(); + if (k.length < 12) return k ? '(too short to mask)' : '(not set)'; + return `${k.slice(0, 7)}...${k.slice(-4)}`; + }; + console.log(`Stripe Mode: ${stripeMode} | Secret: ${maskKey(process.env.STRIPE_SECRET_KEY)}`); + console.log(`Stripe Publishable Mode: ${stripePublishableMode} | Key: ${maskKey(process.env.STRIPE_PUBLISHABLE_KEY || process.env.EXPO_PUBLIC_STRIPE_PUBLISHABLE_KEY)}`); + + const server = app.listen(port, () => { + console.log(`GreenLens server listening at http://localhost:${port}`); + }); + + const gracefulShutdown = async () => { + try { + await closeDatabase(db); + } catch (error) { + console.error('Failed to close database', error); + } finally { + server.close(() => process.exit(0)); + } + }; + + process.on('SIGINT', gracefulShutdown); + process.on('SIGTERM', gracefulShutdown); +}; + +start().catch((error) => { + console.error('Failed to start GreenLens server', error); + process.exit(1); +}); diff --git a/server/lib/auth.js b/server/lib/auth.js index 53907b3..e1a03a1 100644 --- a/server/lib/auth.js +++ b/server/lib/auth.js @@ -1,107 +1,107 @@ -const crypto = require('crypto'); -const { get, run } = require('./sqlite'); - -const JWT_SECRET = process.env.JWT_SECRET || 'greenlens-dev-secret-change-in-prod'; -const TOKEN_EXPIRY_SECONDS = 365 * 24 * 3600; // 1 year - -// ─── Minimal JWT (HS256, no external deps) ───────────────────────────────── - -const b64url = (input) => { - const str = typeof input === 'string' ? input : JSON.stringify(input); - return Buffer.from(str).toString('base64url'); -}; - -const b64urlDecode = (str) => Buffer.from(str, 'base64url').toString(); - -const signJwt = (payload) => { - const header = b64url({ alg: 'HS256', typ: 'JWT' }); - const body = b64url(payload); - const sig = crypto.createHmac('sha256', JWT_SECRET).update(`${header}.${body}`).digest('base64url'); - return `${header}.${body}.${sig}`; -}; - -const verifyJwt = (token) => { - if (!token || typeof token !== 'string') return null; - const parts = token.split('.'); - if (parts.length !== 3) return null; - const [header, body, sig] = parts; - const expected = crypto.createHmac('sha256', JWT_SECRET).update(`${header}.${body}`).digest('base64url'); - if (sig !== expected) return null; - try { - const payload = JSON.parse(b64urlDecode(body)); - if (payload.exp && Math.floor(Date.now() / 1000) > payload.exp) return null; - return payload; - } catch { - return null; - } -}; - -const issueToken = (userId, email, name) => - signJwt({ - sub: userId, - email, - name, - iat: Math.floor(Date.now() / 1000), - exp: Math.floor(Date.now() / 1000) + TOKEN_EXPIRY_SECONDS, - }); - -// ─── Password hashing ────────────────────────────────────────────────────── - -const hashPassword = (password) => - crypto.createHmac('sha256', JWT_SECRET).update(password).digest('hex'); - -// ─── 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')) - )`, - ); -}; - -// ─── 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), - ]); - 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; - throw err; - } - if (user.password_hash !== hashPassword(password)) { - const err = new Error('Wrong password.'); - err.code = 'WRONG_PASSWORD'; - err.status = 401; - throw err; - } - return { id: user.id, email: user.email, name: user.name }; -}; - -module.exports = { ensureAuthSchema, signUp, login, issueToken, verifyJwt }; +const crypto = require('crypto'); +const { get, run } = require('./sqlite'); + +const JWT_SECRET = process.env.JWT_SECRET || 'greenlens-dev-secret-change-in-prod'; +const TOKEN_EXPIRY_SECONDS = 365 * 24 * 3600; // 1 year + +// ─── Minimal JWT (HS256, no external deps) ───────────────────────────────── + +const b64url = (input) => { + const str = typeof input === 'string' ? input : JSON.stringify(input); + return Buffer.from(str).toString('base64url'); +}; + +const b64urlDecode = (str) => Buffer.from(str, 'base64url').toString(); + +const signJwt = (payload) => { + const header = b64url({ alg: 'HS256', typ: 'JWT' }); + const body = b64url(payload); + const sig = crypto.createHmac('sha256', JWT_SECRET).update(`${header}.${body}`).digest('base64url'); + return `${header}.${body}.${sig}`; +}; + +const verifyJwt = (token) => { + if (!token || typeof token !== 'string') return null; + const parts = token.split('.'); + if (parts.length !== 3) return null; + const [header, body, sig] = parts; + const expected = crypto.createHmac('sha256', JWT_SECRET).update(`${header}.${body}`).digest('base64url'); + if (sig !== expected) return null; + try { + const payload = JSON.parse(b64urlDecode(body)); + if (payload.exp && Math.floor(Date.now() / 1000) > payload.exp) return null; + return payload; + } catch { + return null; + } +}; + +const issueToken = (userId, email, name) => + signJwt({ + sub: userId, + email, + name, + iat: Math.floor(Date.now() / 1000), + exp: Math.floor(Date.now() / 1000) + TOKEN_EXPIRY_SECONDS, + }); + +// ─── Password hashing ────────────────────────────────────────────────────── + +const hashPassword = (password) => + crypto.createHmac('sha256', JWT_SECRET).update(password).digest('hex'); + +// ─── 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')) + )`, + ); +}; + +// ─── 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), + ]); + 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; + throw err; + } + if (user.password_hash !== hashPassword(password)) { + const err = new Error('Wrong password.'); + err.code = 'WRONG_PASSWORD'; + err.status = 401; + throw err; + } + return { id: user.id, email: user.email, name: user.name }; +}; + +module.exports = { ensureAuthSchema, signUp, login, issueToken, verifyJwt }; diff --git a/server/lib/billing.js b/server/lib/billing.js index 7b5c680..796462a 100644 --- a/server/lib/billing.js +++ b/server/lib/billing.js @@ -1,518 +1,679 @@ -const { get, run } = require('./sqlite'); - -const FREE_MONTHLY_CREDITS = 15; -const PRO_MONTHLY_CREDITS = 250; +const { get, run } = require('./sqlite'); + +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']); const TOPUP_CREDITS_BY_PRODUCT = { - pro_monthly: 0, + monthly_pro: 0, + yearly_pro: 0, topup_small: 25, 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) => { + 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 buildBillingSummary = (account) => { return { entitlement: { plan: account.plan, provider: account.provider, - status: 'active', + 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, }; }; -const consumeCredits = (account, cost) => { - if (cost <= 0) return 0; - - const available = getAvailableCredits(account); - if (available < cost) { - throw createInsufficientCreditsError(cost, available); +const asIsoDate = (value) => { + if (value == null || value === '') return null; + if (typeof value === 'number' && Number.isFinite(value)) { + return new Date(value).toISOString(); } - - 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 (typeof value === 'string') { + const trimmed = value.trim(); + if (!trimmed) return null; + if (/^\d+$/.test(trimmed)) { + return new Date(Number(trimmed)).toISOString(); + } + const parsed = new Date(trimmed); + if (!Number.isNaN(parsed.getTime())) { + return parsed.toISOString(); + } } - - if (remaining > 0 && account.topupBalance > 0) { - const topupUsage = Math.min(account.topupBalance, remaining); - account.topupBalance -= topupUsage; - remaining -= topupUsage; - } - - return cost; + return null; }; -const parseStoredJson = (raw) => { - if (!raw || typeof raw !== 'string') return null; - try { - return JSON.parse(raw); - } catch { - return null; +const isSupportedTopupProduct = (productId) => { + 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 : []); +}; + +const applyRevenueCatEntitlementState = (account, options) => { + const now = new Date(); + const nextPlan = options.active ? 'pro' : 'free'; + const planChanged = account.plan !== nextPlan; + account.plan = nextPlan; + account.provider = 'revenuecat'; + account.monthlyAllowance = getMonthlyAllowanceForPlan(account.plan); + account.renewsAt = options.active ? options.renewsAt || account.renewsAt || addDays(now, 30).toISOString() : null; + + if (planChanged) { + const { cycleStartedAt, cycleEndsAt } = getCycleBounds(now); + account.cycleStartedAt = cycleStartedAt.toISOString(); + account.cycleEndsAt = cycleEndsAt.toISOString(); + account.usedThisCycle = 0; } }; -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, - }; +const grantRevenueCatTopupIfNeeded = async (db, account, transactionId, productId) => { + if (!transactionId || !isSupportedTopupProduct(productId)) { + return false; } + const idempotencyId = `revenuecat-topup:${transactionId}`; + const existing = await readIdempotentValue(db, idempotencyId); + if (existing) return false; + account.topupBalance += TOPUP_CREDITS_BY_PRODUCT[productId]; + await writeIdempotentValue(db, idempotencyId, { transactionId, productId, creditedAt: nowIso() }); + return true; +}; + +const syncRevenueCatCustomerInfo = async (db, userId, customerInfo) => { return runInTransaction(db, async () => { const account = await getOrCreateAccount(db, userId); - account.updatedAt = nowIso(); - await upsertAccount(db, account); - return buildBillingSummary(account); - }); -}; + const activeEntitlements = customerInfo?.entitlements?.active || {}; + const proEntitlement = activeEntitlements[REVENUECAT_PRO_ENTITLEMENT_ID]; -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; - }); -}; + applyRevenueCatEntitlementState(account, { + active: Boolean(proEntitlement), + renewsAt: asIsoDate(proEntitlement?.expirationDate || proEntitlement?.expiresDate), + }); -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; + const transactions = normalizeRevenueCatTransactions(customerInfo); + for (const transaction of transactions) { + await grantRevenueCatTopupIfNeeded( + db, + account, + transaction?.transactionIdentifier || transaction?.transactionId, + transaction?.productIdentifier, + ); } account.updatedAt = nowIso(); await upsertAccount(db, account); - - const payload = { - appliedProduct: productId, + return { billing: buildBillingSummary(account), + syncedAt: nowIso(), }; - 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 shouldGrantRevenueCatSubscription = (eventType) => { + return new Set([ + 'INITIAL_PURCHASE', + 'RENEWAL', + 'PRODUCT_CHANGE', + 'UNCANCELLATION', + 'TEMPORARY_ENTITLEMENT_GRANT', + ]).has(String(eventType || '').toUpperCase()); +}; - const response = await runInTransaction(db, async () => { - const existingInsideTx = await readIdempotentValue(db, endpointId); - if (existingInsideTx) return existingInsideTx; +const shouldRevokeRevenueCatSubscription = (eventType) => { + return new Set([ + 'EXPIRATION', + 'SUBSCRIPTION_PAUSED', + ]).has(String(eventType || '').toUpperCase()); +}; - const account = await getOrCreateAccount(db, userId); +const syncRevenueCatWebhookEvent = async (db, eventPayload) => { + const appUserId = String( + 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.'); + error.code = 'BAD_REQUEST'; + error.status = 400; + throw error; + } - 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; + return runInTransaction(db, async () => { + const account = await getOrCreateAccount(db, 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); + + if (affectsProEntitlement && shouldGrantRevenueCatSubscription(eventType)) { + applyRevenueCatEntitlementState(account, { + active: true, + renewsAt: asIsoDate(eventPayload?.expiration_at_ms || eventPayload?.expiration_at), + }); + } else if (affectsProEntitlement && shouldRevokeRevenueCatSubscription(eventType)) { + applyRevenueCatEntitlementState(account, { + active: false, + renewsAt: null, + }); + } + + if (isSupportedTopupProduct(productId)) { + await grantRevenueCatTopupIfNeeded( + db, + account, + eventPayload?.transaction_id || eventPayload?.store_transaction_id || eventPayload?.id, + productId, + ); } account.updatedAt = nowIso(); await upsertAccount(db, account); - - const payloadResponse = { - event, + return { billing: buildBillingSummary(account), + syncedAt: nowIso(), }; - 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 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, runInTransaction, simulatePurchase, simulateWebhook, + syncRevenueCatCustomerInfo, + syncRevenueCatWebhookEvent, storeEndpointResponse, }; diff --git a/server/lib/hybridSearch.js b/server/lib/hybridSearch.js index 2bce8d0..8502bae 100644 --- a/server/lib/hybridSearch.js +++ b/server/lib/hybridSearch.js @@ -1,193 +1,193 @@ -const { SEARCH_INTENT_CONFIG } = require('./searchIntentConfig'); - -const normalizeSearchText = (value) => { - return String(value || '') - .toLowerCase() - .normalize('NFD') - .replace(/[\u0300-\u036f]/g, '') - .trim() - .replace(/[^a-z0-9\s_-]+/g, ' ') - .replace(/[_-]+/g, ' ') - .replace(/\s+/g, ' '); -}; - -const tokenize = (normalizedValue) => normalizedValue.split(' ').filter(Boolean); - -const normalizeArray = (values) => { - return [...new Set((values || []).map((value) => normalizeSearchText(value)).filter(Boolean))]; -}; - -const tokenSetFromQuery = (normalizedQuery) => { - const noise = new Set(SEARCH_INTENT_CONFIG.noiseTokens.map((token) => normalizeSearchText(token))); - return new Set(tokenize(normalizedQuery).filter((token) => !noise.has(token))); -}; - -const includesPhrase = (normalizedQuery, normalizedAlias, queryTokens) => { - if (!normalizedAlias) return false; - if (normalizedQuery.includes(normalizedAlias)) return true; - - const aliasTokens = tokenize(normalizedAlias); - if (aliasTokens.length <= 1) return queryTokens.has(normalizedAlias); - return aliasTokens.every((token) => queryTokens.has(token)); -}; - -const detectQueryIntents = (normalizedQuery) => { - const queryTokens = tokenSetFromQuery(normalizedQuery); - return Object.entries(SEARCH_INTENT_CONFIG.intents) - .filter(([, value]) => - (value.aliases || []).some((alias) => includesPhrase(normalizedQuery, normalizeSearchText(alias), queryTokens))) - .map(([intentId]) => intentId); -}; - -const getLevenshteinDistance = (left, right) => { - const rows = left.length + 1; - const cols = right.length + 1; - const matrix = Array.from({ length: rows }, (_, rowIndex) => [rowIndex]); - - for (let col = 0; col < cols; col += 1) { - matrix[0][col] = col; - } - - for (let row = 1; row < rows; row += 1) { - for (let col = 1; col < cols; col += 1) { - const cost = left[row - 1] === right[col - 1] ? 0 : 1; - matrix[row][col] = Math.min( - matrix[row - 1][col] + 1, - matrix[row][col - 1] + 1, - matrix[row - 1][col - 1] + cost, - ); - } - } - - return matrix[left.length][right.length]; -}; - -const fuzzyBonus = (normalizedQuery, candidates) => { - if (normalizedQuery.length < 3 || normalizedQuery.length > 32) return 0; - - let best = Number.POSITIVE_INFINITY; - (candidates || []).forEach((candidate) => { - if (!candidate) return; - tokenize(candidate).forEach((token) => { - best = Math.min(best, getLevenshteinDistance(normalizedQuery, token)); - }); - best = Math.min(best, getLevenshteinDistance(normalizedQuery, candidate)); - }); - - if (best === 1) return 14; - if (best === 2) return 8; - return 0; -}; - -const scoreTextMatch = (normalizedQuery, normalizedTarget, exact, prefix, contains) => { - if (!normalizedQuery || !normalizedTarget) return 0; - if (normalizedTarget === normalizedQuery) return exact; - if (normalizedTarget.startsWith(normalizedQuery)) return prefix; - if (normalizedTarget.includes(normalizedQuery)) return contains; - return 0; -}; - -const buildDerivedIntentSignals = (entry) => { - const normalizedDescription = normalizeSearchText(entry.description || ''); - const normalizedLight = normalizeSearchText(entry.careInfo && entry.careInfo.light ? entry.careInfo.light : ''); - const derivedSignals = new Set((entry.categories || []).map((category) => normalizeSearchText(category))); - - Object.entries(SEARCH_INTENT_CONFIG.intents).forEach(([intentId, intentConfig]) => { - const entryHints = normalizeArray(intentConfig.entryHints || []); - if (entryHints.some((hint) => normalizedDescription.includes(hint))) { - derivedSignals.add(intentId); - } - - const lightHints = normalizeArray(intentConfig.lightHints || []); - if (lightHints.some((hint) => normalizedLight.includes(hint))) { - derivedSignals.add(intentId); - } - }); - - return [...derivedSignals]; -}; - -const scoreHybridEntry = (entry, query) => { - const normalizedQuery = normalizeSearchText(query); - if (!normalizedQuery) return 0; - - const normalizedName = normalizeSearchText(entry.name || ''); - const normalizedBotanical = normalizeSearchText(entry.botanicalName || ''); - const normalizedDescription = normalizeSearchText(entry.description || ''); - const normalizedCategories = (entry.categories || []).map((category) => normalizeSearchText(category)); - const derivedSignals = buildDerivedIntentSignals(entry); - const requestedIntents = detectQueryIntents(normalizedQuery); - - let score = 0; - score += Math.max( - scoreTextMatch(normalizedQuery, normalizedName, 140, 100, 64), - scoreTextMatch(normalizedQuery, normalizedBotanical, 130, 96, 58), - ); - - if (normalizedDescription.includes(normalizedQuery)) { - score += 24; - } - - score += fuzzyBonus(normalizedQuery, [normalizedName, normalizedBotanical, ...normalizedCategories]); - - let matchedIntentCount = 0; - requestedIntents.forEach((intentId) => { - const categoryHit = normalizedCategories.includes(intentId); - const derivedHit = derivedSignals.includes(intentId); - if (categoryHit) { - score += 92; - matchedIntentCount += 1; - return; - } - if (derivedHit) { - score += 56; - matchedIntentCount += 1; - } - }); - - if (matchedIntentCount >= 2) { - score += 38 * matchedIntentCount; - } else if (matchedIntentCount === 1) { - score += 10; - } - - const queryTokens = [...tokenSetFromQuery(normalizedQuery)]; - if (queryTokens.length > 1) { - const searchableText = [ - normalizedName, - normalizedBotanical, - normalizedDescription, - ...normalizedCategories, - ...derivedSignals, - ].join(' '); - const tokenHits = queryTokens.filter((token) => searchableText.includes(token)).length; - score += tokenHits * 8; - if (tokenHits === queryTokens.length) { - score += 16; - } - } - - return score; -}; - -const rankHybridEntries = (entries, query, limit = 30) => { - const normalizedQuery = normalizeSearchText(query); - if (!normalizedQuery) { - return entries.slice(0, limit).map((entry) => ({ entry, score: 0 })); - } - - return entries - .map((entry) => ({ entry, score: scoreHybridEntry(entry, normalizedQuery) })) - .filter((candidate) => candidate.score > 0) - .sort((left, right) => - right.score - left.score || - left.entry.name.length - right.entry.name.length || - left.entry.name.localeCompare(right.entry.name)) - .slice(0, limit); -}; - -module.exports = { - normalizeSearchText, - rankHybridEntries, - scoreHybridEntry, -}; +const { SEARCH_INTENT_CONFIG } = require('./searchIntentConfig'); + +const normalizeSearchText = (value) => { + return String(value || '') + .toLowerCase() + .normalize('NFD') + .replace(/[\u0300-\u036f]/g, '') + .trim() + .replace(/[^a-z0-9\s_-]+/g, ' ') + .replace(/[_-]+/g, ' ') + .replace(/\s+/g, ' '); +}; + +const tokenize = (normalizedValue) => normalizedValue.split(' ').filter(Boolean); + +const normalizeArray = (values) => { + return [...new Set((values || []).map((value) => normalizeSearchText(value)).filter(Boolean))]; +}; + +const tokenSetFromQuery = (normalizedQuery) => { + const noise = new Set(SEARCH_INTENT_CONFIG.noiseTokens.map((token) => normalizeSearchText(token))); + return new Set(tokenize(normalizedQuery).filter((token) => !noise.has(token))); +}; + +const includesPhrase = (normalizedQuery, normalizedAlias, queryTokens) => { + if (!normalizedAlias) return false; + if (normalizedQuery.includes(normalizedAlias)) return true; + + const aliasTokens = tokenize(normalizedAlias); + if (aliasTokens.length <= 1) return queryTokens.has(normalizedAlias); + return aliasTokens.every((token) => queryTokens.has(token)); +}; + +const detectQueryIntents = (normalizedQuery) => { + const queryTokens = tokenSetFromQuery(normalizedQuery); + return Object.entries(SEARCH_INTENT_CONFIG.intents) + .filter(([, value]) => + (value.aliases || []).some((alias) => includesPhrase(normalizedQuery, normalizeSearchText(alias), queryTokens))) + .map(([intentId]) => intentId); +}; + +const getLevenshteinDistance = (left, right) => { + const rows = left.length + 1; + const cols = right.length + 1; + const matrix = Array.from({ length: rows }, (_, rowIndex) => [rowIndex]); + + for (let col = 0; col < cols; col += 1) { + matrix[0][col] = col; + } + + for (let row = 1; row < rows; row += 1) { + for (let col = 1; col < cols; col += 1) { + const cost = left[row - 1] === right[col - 1] ? 0 : 1; + matrix[row][col] = Math.min( + matrix[row - 1][col] + 1, + matrix[row][col - 1] + 1, + matrix[row - 1][col - 1] + cost, + ); + } + } + + return matrix[left.length][right.length]; +}; + +const fuzzyBonus = (normalizedQuery, candidates) => { + if (normalizedQuery.length < 3 || normalizedQuery.length > 32) return 0; + + let best = Number.POSITIVE_INFINITY; + (candidates || []).forEach((candidate) => { + if (!candidate) return; + tokenize(candidate).forEach((token) => { + best = Math.min(best, getLevenshteinDistance(normalizedQuery, token)); + }); + best = Math.min(best, getLevenshteinDistance(normalizedQuery, candidate)); + }); + + if (best === 1) return 14; + if (best === 2) return 8; + return 0; +}; + +const scoreTextMatch = (normalizedQuery, normalizedTarget, exact, prefix, contains) => { + if (!normalizedQuery || !normalizedTarget) return 0; + if (normalizedTarget === normalizedQuery) return exact; + if (normalizedTarget.startsWith(normalizedQuery)) return prefix; + if (normalizedTarget.includes(normalizedQuery)) return contains; + return 0; +}; + +const buildDerivedIntentSignals = (entry) => { + const normalizedDescription = normalizeSearchText(entry.description || ''); + const normalizedLight = normalizeSearchText(entry.careInfo && entry.careInfo.light ? entry.careInfo.light : ''); + const derivedSignals = new Set((entry.categories || []).map((category) => normalizeSearchText(category))); + + Object.entries(SEARCH_INTENT_CONFIG.intents).forEach(([intentId, intentConfig]) => { + const entryHints = normalizeArray(intentConfig.entryHints || []); + if (entryHints.some((hint) => normalizedDescription.includes(hint))) { + derivedSignals.add(intentId); + } + + const lightHints = normalizeArray(intentConfig.lightHints || []); + if (lightHints.some((hint) => normalizedLight.includes(hint))) { + derivedSignals.add(intentId); + } + }); + + return [...derivedSignals]; +}; + +const scoreHybridEntry = (entry, query) => { + const normalizedQuery = normalizeSearchText(query); + if (!normalizedQuery) return 0; + + const normalizedName = normalizeSearchText(entry.name || ''); + const normalizedBotanical = normalizeSearchText(entry.botanicalName || ''); + const normalizedDescription = normalizeSearchText(entry.description || ''); + const normalizedCategories = (entry.categories || []).map((category) => normalizeSearchText(category)); + const derivedSignals = buildDerivedIntentSignals(entry); + const requestedIntents = detectQueryIntents(normalizedQuery); + + let score = 0; + score += Math.max( + scoreTextMatch(normalizedQuery, normalizedName, 140, 100, 64), + scoreTextMatch(normalizedQuery, normalizedBotanical, 130, 96, 58), + ); + + if (normalizedDescription.includes(normalizedQuery)) { + score += 24; + } + + score += fuzzyBonus(normalizedQuery, [normalizedName, normalizedBotanical, ...normalizedCategories]); + + let matchedIntentCount = 0; + requestedIntents.forEach((intentId) => { + const categoryHit = normalizedCategories.includes(intentId); + const derivedHit = derivedSignals.includes(intentId); + if (categoryHit) { + score += 92; + matchedIntentCount += 1; + return; + } + if (derivedHit) { + score += 56; + matchedIntentCount += 1; + } + }); + + if (matchedIntentCount >= 2) { + score += 38 * matchedIntentCount; + } else if (matchedIntentCount === 1) { + score += 10; + } + + const queryTokens = [...tokenSetFromQuery(normalizedQuery)]; + if (queryTokens.length > 1) { + const searchableText = [ + normalizedName, + normalizedBotanical, + normalizedDescription, + ...normalizedCategories, + ...derivedSignals, + ].join(' '); + const tokenHits = queryTokens.filter((token) => searchableText.includes(token)).length; + score += tokenHits * 8; + if (tokenHits === queryTokens.length) { + score += 16; + } + } + + return score; +}; + +const rankHybridEntries = (entries, query, limit = 30) => { + const normalizedQuery = normalizeSearchText(query); + if (!normalizedQuery) { + return entries.slice(0, limit).map((entry) => ({ entry, score: 0 })); + } + + return entries + .map((entry) => ({ entry, score: scoreHybridEntry(entry, normalizedQuery) })) + .filter((candidate) => candidate.score > 0) + .sort((left, right) => + right.score - left.score || + left.entry.name.length - right.entry.name.length || + left.entry.name.localeCompare(right.entry.name)) + .slice(0, limit); +}; + +module.exports = { + normalizeSearchText, + rankHybridEntries, + scoreHybridEntry, +}; diff --git a/server/lib/openai.js b/server/lib/openai.js index cdf563f..0b64a75 100644 --- a/server/lib/openai.js +++ b/server/lib/openai.js @@ -1,461 +1,461 @@ -const OPENAI_API_KEY = (process.env.OPENAI_API_KEY || process.env.EXPO_PUBLIC_OPENAI_API_KEY || '').trim(); -const OPENAI_SCAN_MODEL = (process.env.OPENAI_SCAN_MODEL || process.env.EXPO_PUBLIC_OPENAI_SCAN_MODEL || 'gpt-5-mini').trim(); -const OPENAI_SCAN_MODEL_PRO = (process.env.OPENAI_SCAN_MODEL_PRO || process.env.EXPO_PUBLIC_OPENAI_SCAN_MODEL_PRO || OPENAI_SCAN_MODEL).trim(); -const OPENAI_HEALTH_MODEL = (process.env.OPENAI_HEALTH_MODEL || process.env.EXPO_PUBLIC_OPENAI_HEALTH_MODEL || OPENAI_SCAN_MODEL).trim(); -const OPENAI_SCAN_FALLBACK_MODELS = (process.env.OPENAI_SCAN_FALLBACK_MODELS || process.env.EXPO_PUBLIC_OPENAI_SCAN_FALLBACK_MODELS || 'gpt-5-mini,gpt-4.1-mini').trim(); -const OPENAI_SCAN_FALLBACK_MODELS_PRO = (process.env.OPENAI_SCAN_FALLBACK_MODELS_PRO || process.env.EXPO_PUBLIC_OPENAI_SCAN_FALLBACK_MODELS_PRO || OPENAI_SCAN_FALLBACK_MODELS).trim(); -const OPENAI_HEALTH_FALLBACK_MODELS = (process.env.OPENAI_HEALTH_FALLBACK_MODELS || process.env.EXPO_PUBLIC_OPENAI_HEALTH_FALLBACK_MODELS || OPENAI_SCAN_FALLBACK_MODELS).trim(); -const OPENAI_CHAT_COMPLETIONS_URL = (process.env.OPENAI_CHAT_COMPLETIONS_URL || 'https://api.openai.com/v1/chat/completions').trim(); -const OPENAI_TIMEOUT_MS = (() => { - const raw = (process.env.OPENAI_TIMEOUT_MS || process.env.EXPO_PUBLIC_OPENAI_TIMEOUT_MS || '45000').trim(); - const parsed = Number.parseInt(raw, 10); - if (Number.isFinite(parsed) && parsed >= 10000) return parsed; - return 45000; -})(); - -const parseModelChain = (primaryModel, fallbackModels) => { - const models = [primaryModel]; - for (const model of String(fallbackModels || '').split(',')) { - const normalized = model.trim(); - if (!normalized) continue; - models.push(normalized); - } - return [...new Set(models.filter(Boolean))]; -}; - -const OPENAI_SCAN_MODEL_CHAIN = parseModelChain(OPENAI_SCAN_MODEL, OPENAI_SCAN_FALLBACK_MODELS); -const OPENAI_SCAN_MODEL_CHAIN_PRO = parseModelChain(OPENAI_SCAN_MODEL_PRO, OPENAI_SCAN_FALLBACK_MODELS_PRO); -const OPENAI_HEALTH_MODEL_CHAIN = parseModelChain(OPENAI_HEALTH_MODEL, OPENAI_HEALTH_FALLBACK_MODELS); - -const getScanModelChain = (plan) => { - return plan === 'pro' ? OPENAI_SCAN_MODEL_CHAIN_PRO : OPENAI_SCAN_MODEL_CHAIN; -}; - -const clamp = (value, min, max) => { - return Math.min(max, Math.max(min, value)); -}; - -const toErrorMessage = (error) => { - if (error instanceof Error) return error.message; - return String(error); -}; - -const summarizeImageUri = (imageUri) => { - const trimmed = typeof imageUri === 'string' ? imageUri.trim() : ''; - if (!trimmed) return 'empty'; - if (trimmed.startsWith('data:image')) return `data-uri(${Math.round(trimmed.length / 1024)}kb)`; - return trimmed.length > 120 ? `${trimmed.slice(0, 120)}...` : trimmed; -}; - -const toJsonString = (content) => { - const trimmed = typeof content === 'string' ? content.trim() : ''; - if (!trimmed) return ''; - const fenced = trimmed.match(/^```(?:json)?\s*([\s\S]*?)\s*```$/i); - if (fenced && fenced[1]) return fenced[1].trim(); - return trimmed; -}; - -const parseContentToJson = (content) => { - try { - const parsed = JSON.parse(toJsonString(content)); - if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) { - return parsed; - } - return null; - } catch { - return null; - } -}; - -const getString = (value) => { - return typeof value === 'string' ? value.trim() : ''; -}; - -const getNumber = (value) => { - if (typeof value === 'number' && Number.isFinite(value)) return value; - if (typeof value === 'string' && value.trim()) { - const parsed = Number(value); - if (Number.isFinite(parsed)) return parsed; - } - return null; -}; - -const getStringArray = (value) => { - if (!Array.isArray(value)) return []; - return value - .map((item) => (typeof item === 'string' ? item.trim() : '')) - .filter(Boolean); -}; - -const getLanguageLabel = (language) => { - if (language === 'de') return 'German'; - if (language === 'es') return 'Spanish'; - return 'English'; -}; - -const normalizeIdentifyResult = (raw, language) => { - const name = getString(raw.name); - const botanicalName = getString(raw.botanicalName); - const description = getString(raw.description); - const confidenceRaw = getNumber(raw.confidence); - const careInfoRaw = raw.careInfo; - - if (!name || !botanicalName || !careInfoRaw || typeof careInfoRaw !== 'object' || Array.isArray(careInfoRaw)) { - return null; - } - - const waterIntervalRaw = getNumber(careInfoRaw.waterIntervalDays); - const light = getString(careInfoRaw.light); - const temp = getString(careInfoRaw.temp); - if (waterIntervalRaw == null || !light || !temp) { - return null; - } - - const fallbackDescription = language === 'de' - ? `${name} wurde per KI erkannt. Pflegehinweise sind unten aufgefuehrt.` - : language === 'es' - ? `${name} se detecto con IA. Debajo veras recomendaciones de cuidado.` - : `${name} was identified with AI. Care guidance is shown below.`; - - return { - name, - botanicalName, - confidence: clamp(confidenceRaw == null ? 0.72 : confidenceRaw, 0.05, 0.99), - description: description || fallbackDescription, - careInfo: { - waterIntervalDays: Math.round(clamp(waterIntervalRaw, 1, 45)), - light, - temp, - }, - }; -}; - -const normalizeHealthAnalysis = (raw, language) => { - const scoreRaw = getNumber(raw.overallHealthScore); - const statusRaw = getString(raw.status); - const issuesRaw = raw.likelyIssues; - const actionsNowRaw = getStringArray(raw.actionsNow).slice(0, 8); - const plan7DaysRaw = getStringArray(raw.plan7Days).slice(0, 10); - - if (scoreRaw == null || !statusRaw || !Array.isArray(issuesRaw)) { - return null; - } - - const status = statusRaw === 'healthy' || statusRaw === 'watch' || statusRaw === 'critical' - ? statusRaw - : 'watch'; - - const likelyIssues = issuesRaw - .map((entry) => { - if (!entry || typeof entry !== 'object' || Array.isArray(entry)) return null; - const title = getString(entry.title); - const details = getString(entry.details); - const confidenceRaw = getNumber(entry.confidence); - if (!title || !details || confidenceRaw == null) return null; - return { - title, - details, - confidence: clamp(confidenceRaw, 0.05, 0.99), - }; - }) - .filter(Boolean) - .slice(0, 4); - - if (likelyIssues.length === 0 || actionsNowRaw.length < 2 || plan7DaysRaw.length < 2) { - const fallbackIssue = language === 'de' - ? 'Die KI konnte keine stabilen Gesundheitsmerkmale extrahieren.' - : language === 'es' - ? 'La IA no pudo extraer senales de salud estables.' - : 'AI could not extract stable health signals.'; - return { - overallHealthScore: Math.round(clamp(scoreRaw, 0, 100)), - status, - likelyIssues: [ - { - title: language === 'de' - ? 'Analyse unsicher' - : language === 'es' - ? 'Analisis incierto' - : 'Uncertain analysis', - confidence: 0.35, - details: fallbackIssue, - }, - ], - actionsNow: actionsNowRaw.length > 0 - ? actionsNowRaw - : [language === 'de' ? 'Neues, schaerferes Foto aufnehmen.' : language === 'es' ? 'Tomar una foto nueva y mas nitida.' : 'Capture a new, sharper photo.'], - plan7Days: plan7DaysRaw.length > 0 - ? plan7DaysRaw - : [language === 'de' ? 'In 2 Tagen erneut pruefen.' : language === 'es' ? 'Volver a revisar en 2 dias.' : 'Re-check in 2 days.'], - }; - } - - return { - overallHealthScore: Math.round(clamp(scoreRaw, 0, 100)), - status, - likelyIssues, - actionsNow: actionsNowRaw, - plan7Days: plan7DaysRaw, - }; -}; - -const buildIdentifyPrompt = (language, mode) => { - const reviewInstruction = mode === 'review' - ? 'Re-check your first hypothesis with stricter botanical accuracy and correct any mismatch.' - : 'Identify the most likely houseplant species from this image with conservative confidence.'; - - const nameLanguageInstruction = language === 'en' - ? '- "name" must be an English common name only. Never return a German or other non-English common name. If no reliable English common name is known, use "botanicalName" as "name" instead of inventing or translating.' - : `- "name" must be strictly written in ${getLanguageLabel(language)}. If a reliable common name in that language is not known, use "botanicalName" as "name" instead of inventing a localized name.`; - - return [ - `${reviewInstruction}`, - 'Return strict JSON only in this shape:', - '{"name":"...","botanicalName":"...","confidence":0.0,"description":"...","careInfo":{"waterIntervalDays":7,"light":"...","temp":"..."}}', - 'Rules:', - nameLanguageInstruction, - `- "description" and "careInfo.light" must be written in ${getLanguageLabel(language)}.`, - '- "botanicalName" must use accepted Latin scientific naming and must not be invented or misspelled.', - '- If species is uncertain, prefer genus-level naming (for example: "Calathea sp.").', - '- "confidence" must be between 0 and 1.', - '- Keep confidence <= 0.55 when the image is ambiguous, blurred, or partially visible.', - '- "waterIntervalDays" must be an integer between 1 and 45.', - '- Do not include markdown, explanations, or extra keys.', - ].join('\n'); -}; - -const buildHealthPrompt = (language, plantContext) => { - const contextLines = plantContext - ? [ - 'Plant context:', - `- name: ${plantContext.name || 'n/a'}`, - `- botanicalName: ${plantContext.botanicalName || 'n/a'}`, - `- care.light: ${plantContext.careInfo?.light || 'n/a'}`, - `- care.temp: ${plantContext.careInfo?.temp || 'n/a'}`, - `- care.waterIntervalDays: ${plantContext.careInfo?.waterIntervalDays || 'n/a'}`, - `- description: ${plantContext.description || 'n/a'}`, - ] - : ['Plant context: not provided']; - - return [ - `You are an expert botanist and plant health diagnostician. Carefully examine every visible detail of this plant photo and produce a thorough, professional health assessment written in ${getLanguageLabel(language)}.`, - '', - 'Inspect the following in detail: leaf color (yellowing, browning, bleaching, dark spots, necrosis), leaf texture (wilting, crispy edges, curling, drooping), stem condition (rot, soft spots, discoloration), soil surface (dry cracks, mold, pests, waterlogging signs), visible pests (spider mites, fungus gnats, scale insects, aphids, mealybugs), root health (if visible), pot size and drainage.', - '', - 'Return strict JSON only in this exact shape:', - '{"overallHealthScore":72,"status":"watch","likelyIssues":[{"title":"...","confidence":0.64,"details":"..."}],"actionsNow":["..."],"plan7Days":["..."]}', - '', - 'Rules:', - '- "overallHealthScore": integer 0–100. 100=perfect health, 80–99=minor cosmetic only, 60–79=noticeable issues needing attention, 40–59=significant stress, below 40=severe/critical.', - '- "status": exactly one of "healthy" (score>=80, no active threats), "watch" (score 50–79, needs monitoring), "critical" (score<50, urgent action needed).', - '- "likelyIssues": 2 to 4 items, sorted by confidence descending. Each item:', - ' - "title": concise issue name (e.g. "Overwatering / Root Rot Risk")', - ' - "confidence": float 0.05–0.99 reflecting visual certainty', - ' - "details": 2–4 sentence detailed explanation of what you observe visually, what causes it, and what happens if untreated. Be specific — mention leaf color, location, pattern.', - `- "actionsNow": 5 to 8 specific, actionable steps for the next 24–48 hours. Each step must be a complete sentence with concrete instructions (e.g. amounts, durations, techniques). Written in ${getLanguageLabel(language)}.`, - `- "plan7Days": 7 to 10 day-by-day or milestone care steps for the coming week. Each step should specify timing and expected outcome. Written in ${getLanguageLabel(language)}.`, - '- All text fields must be written in the specified language. No markdown, no extra keys.', - ...contextLines, - ].join('\n'); -}; - -const extractMessageContent = (payload) => { - const content = payload?.choices?.[0]?.message?.content; - if (typeof content === 'string') return content; - if (Array.isArray(content)) { - return content - .map((chunk) => (chunk && chunk.type === 'text' ? chunk.text || '' : '')) - .join('') - .trim(); - } - return ''; -}; - -const postChatCompletion = async ({ modelChain, messages, imageUri, temperature }) => { - if (!OPENAI_API_KEY) return null; - if (typeof fetch !== 'function') { - throw new Error('Global fetch is not available in this Node runtime.'); - } - - const attemptedModels = []; - - for (const model of modelChain) { - attemptedModels.push(model); - - const controller = new AbortController(); - const timeout = setTimeout(() => controller.abort(), OPENAI_TIMEOUT_MS); - - try { - const body = { - model, - response_format: { type: 'json_object' }, - messages, - }; - if (typeof temperature === 'number') body.temperature = temperature; - - const response = await fetch(OPENAI_CHAT_COMPLETIONS_URL, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - Authorization: `Bearer ${OPENAI_API_KEY}`, - }, - body: JSON.stringify(body), - signal: controller.signal, - }); - - if (!response.ok) { - const body = await response.text(); - console.warn('OpenAI request HTTP error.', { - status: response.status, - model, - endpoint: OPENAI_CHAT_COMPLETIONS_URL, - image: summarizeImageUri(imageUri), - bodyPreview: body.slice(0, 300), - }); - continue; - } - - const payload = await response.json(); - return { payload, modelUsed: model, attemptedModels }; - } catch (error) { - const isTimeoutAbort = error instanceof Error && error.name === 'AbortError'; - console.warn('OpenAI request failed.', { - model, - endpoint: OPENAI_CHAT_COMPLETIONS_URL, - timeoutMs: OPENAI_TIMEOUT_MS, - aborted: isTimeoutAbort, - error: toErrorMessage(error), - image: summarizeImageUri(imageUri), - }); - continue; - } finally { - clearTimeout(timeout); - } - } - - return { payload: null, modelUsed: null, attemptedModels }; -}; - -const identifyPlant = async ({ imageUri, language, mode = 'primary', plan = 'free' }) => { - if (!OPENAI_API_KEY) return { result: null, modelUsed: null, attemptedModels: [] }; - const modelChain = getScanModelChain(plan); - const completion = await postChatCompletion({ - modelChain, - imageUri, - messages: [ - { - role: 'system', - content: 'You are a plant identification assistant. Return strict JSON only.', - }, - { - role: 'user', - content: [ - { type: 'text', text: buildIdentifyPrompt(language, mode) }, - { type: 'image_url', image_url: { url: imageUri } }, - ], - }, - ], - }); - - if (!completion?.payload) { - return { - result: null, - modelUsed: completion?.modelUsed || null, - attemptedModels: completion?.attemptedModels || [], - }; - } - - const content = extractMessageContent(completion.payload); - if (!content) { - console.warn('OpenAI identify returned empty content.', { - model: completion.modelUsed || modelChain[0], - mode, - image: summarizeImageUri(imageUri), - }); - return { result: null, modelUsed: completion.modelUsed, attemptedModels: completion.attemptedModels }; - } - - const parsed = parseContentToJson(content); - if (!parsed) { - console.warn('OpenAI identify returned non-JSON content.', { - model: completion.modelUsed || modelChain[0], - mode, - preview: content.slice(0, 220), - }); - return { result: null, modelUsed: completion.modelUsed, attemptedModels: completion.attemptedModels }; - } - - const normalized = normalizeIdentifyResult(parsed, language); - if (!normalized) { - console.warn('OpenAI identify JSON did not match schema.', { - model: completion.modelUsed || modelChain[0], - mode, - keys: Object.keys(parsed), - }); - } - return { result: normalized, modelUsed: completion.modelUsed, attemptedModels: completion.attemptedModels }; -}; - -const analyzePlantHealth = async ({ imageUri, language, plantContext }) => { - if (!OPENAI_API_KEY) return { analysis: null, modelUsed: null, attemptedModels: [] }; - const completion = await postChatCompletion({ - modelChain: OPENAI_HEALTH_MODEL_CHAIN, - imageUri, - temperature: 0, - messages: [ - { - role: 'system', - content: 'You are a plant health diagnosis assistant. Return strict JSON only.', - }, - { - role: 'user', - content: [ - { type: 'text', text: buildHealthPrompt(language, plantContext) }, - { type: 'image_url', image_url: { url: imageUri } }, - ], - }, - ], - }); - - if (!completion?.payload) { - return { - analysis: null, - modelUsed: completion?.modelUsed || null, - attemptedModels: completion?.attemptedModels || [], - }; - } - - const content = extractMessageContent(completion.payload); - if (!content) { - console.warn('OpenAI health returned empty content.', { - model: completion.modelUsed || OPENAI_HEALTH_MODEL_CHAIN[0], - image: summarizeImageUri(imageUri), - }); - return { analysis: null, modelUsed: completion.modelUsed, attemptedModels: completion.attemptedModels }; - } - - const parsed = parseContentToJson(content); - if (!parsed) { - console.warn('OpenAI health returned non-JSON content.', { - model: completion.modelUsed || OPENAI_HEALTH_MODEL_CHAIN[0], - preview: content.slice(0, 220), - }); - return { analysis: null, modelUsed: completion.modelUsed, attemptedModels: completion.attemptedModels }; - } - - return { - analysis: normalizeHealthAnalysis(parsed, language), - modelUsed: completion.modelUsed, - attemptedModels: completion.attemptedModels, - }; -}; - -module.exports = { - analyzePlantHealth, - buildIdentifyPrompt, - getHealthModel: () => OPENAI_HEALTH_MODEL_CHAIN[0], - getScanModel: (plan = 'free') => getScanModelChain(plan)[0], - identifyPlant, - isConfigured: () => Boolean(OPENAI_API_KEY), - normalizeIdentifyResult, -}; +const OPENAI_API_KEY = (process.env.OPENAI_API_KEY || process.env.EXPO_PUBLIC_OPENAI_API_KEY || '').trim(); +const OPENAI_SCAN_MODEL = (process.env.OPENAI_SCAN_MODEL || process.env.EXPO_PUBLIC_OPENAI_SCAN_MODEL || 'gpt-5-mini').trim(); +const OPENAI_SCAN_MODEL_PRO = (process.env.OPENAI_SCAN_MODEL_PRO || process.env.EXPO_PUBLIC_OPENAI_SCAN_MODEL_PRO || OPENAI_SCAN_MODEL).trim(); +const OPENAI_HEALTH_MODEL = (process.env.OPENAI_HEALTH_MODEL || process.env.EXPO_PUBLIC_OPENAI_HEALTH_MODEL || OPENAI_SCAN_MODEL).trim(); +const OPENAI_SCAN_FALLBACK_MODELS = (process.env.OPENAI_SCAN_FALLBACK_MODELS || process.env.EXPO_PUBLIC_OPENAI_SCAN_FALLBACK_MODELS || 'gpt-5-mini,gpt-4.1-mini').trim(); +const OPENAI_SCAN_FALLBACK_MODELS_PRO = (process.env.OPENAI_SCAN_FALLBACK_MODELS_PRO || process.env.EXPO_PUBLIC_OPENAI_SCAN_FALLBACK_MODELS_PRO || OPENAI_SCAN_FALLBACK_MODELS).trim(); +const OPENAI_HEALTH_FALLBACK_MODELS = (process.env.OPENAI_HEALTH_FALLBACK_MODELS || process.env.EXPO_PUBLIC_OPENAI_HEALTH_FALLBACK_MODELS || OPENAI_SCAN_FALLBACK_MODELS).trim(); +const OPENAI_CHAT_COMPLETIONS_URL = (process.env.OPENAI_CHAT_COMPLETIONS_URL || 'https://api.openai.com/v1/chat/completions').trim(); +const OPENAI_TIMEOUT_MS = (() => { + const raw = (process.env.OPENAI_TIMEOUT_MS || process.env.EXPO_PUBLIC_OPENAI_TIMEOUT_MS || '45000').trim(); + const parsed = Number.parseInt(raw, 10); + if (Number.isFinite(parsed) && parsed >= 10000) return parsed; + return 45000; +})(); + +const parseModelChain = (primaryModel, fallbackModels) => { + const models = [primaryModel]; + for (const model of String(fallbackModels || '').split(',')) { + const normalized = model.trim(); + if (!normalized) continue; + models.push(normalized); + } + return [...new Set(models.filter(Boolean))]; +}; + +const OPENAI_SCAN_MODEL_CHAIN = parseModelChain(OPENAI_SCAN_MODEL, OPENAI_SCAN_FALLBACK_MODELS); +const OPENAI_SCAN_MODEL_CHAIN_PRO = parseModelChain(OPENAI_SCAN_MODEL_PRO, OPENAI_SCAN_FALLBACK_MODELS_PRO); +const OPENAI_HEALTH_MODEL_CHAIN = parseModelChain(OPENAI_HEALTH_MODEL, OPENAI_HEALTH_FALLBACK_MODELS); + +const getScanModelChain = (plan) => { + return plan === 'pro' ? OPENAI_SCAN_MODEL_CHAIN_PRO : OPENAI_SCAN_MODEL_CHAIN; +}; + +const clamp = (value, min, max) => { + return Math.min(max, Math.max(min, value)); +}; + +const toErrorMessage = (error) => { + if (error instanceof Error) return error.message; + return String(error); +}; + +const summarizeImageUri = (imageUri) => { + const trimmed = typeof imageUri === 'string' ? imageUri.trim() : ''; + if (!trimmed) return 'empty'; + if (trimmed.startsWith('data:image')) return `data-uri(${Math.round(trimmed.length / 1024)}kb)`; + return trimmed.length > 120 ? `${trimmed.slice(0, 120)}...` : trimmed; +}; + +const toJsonString = (content) => { + const trimmed = typeof content === 'string' ? content.trim() : ''; + if (!trimmed) return ''; + const fenced = trimmed.match(/^```(?:json)?\s*([\s\S]*?)\s*```$/i); + if (fenced && fenced[1]) return fenced[1].trim(); + return trimmed; +}; + +const parseContentToJson = (content) => { + try { + const parsed = JSON.parse(toJsonString(content)); + if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) { + return parsed; + } + return null; + } catch { + return null; + } +}; + +const getString = (value) => { + return typeof value === 'string' ? value.trim() : ''; +}; + +const getNumber = (value) => { + if (typeof value === 'number' && Number.isFinite(value)) return value; + if (typeof value === 'string' && value.trim()) { + const parsed = Number(value); + if (Number.isFinite(parsed)) return parsed; + } + return null; +}; + +const getStringArray = (value) => { + if (!Array.isArray(value)) return []; + return value + .map((item) => (typeof item === 'string' ? item.trim() : '')) + .filter(Boolean); +}; + +const getLanguageLabel = (language) => { + if (language === 'de') return 'German'; + if (language === 'es') return 'Spanish'; + return 'English'; +}; + +const normalizeIdentifyResult = (raw, language) => { + const name = getString(raw.name); + const botanicalName = getString(raw.botanicalName); + const description = getString(raw.description); + const confidenceRaw = getNumber(raw.confidence); + const careInfoRaw = raw.careInfo; + + if (!name || !botanicalName || !careInfoRaw || typeof careInfoRaw !== 'object' || Array.isArray(careInfoRaw)) { + return null; + } + + const waterIntervalRaw = getNumber(careInfoRaw.waterIntervalDays); + const light = getString(careInfoRaw.light); + const temp = getString(careInfoRaw.temp); + if (waterIntervalRaw == null || !light || !temp) { + return null; + } + + const fallbackDescription = language === 'de' + ? `${name} wurde per KI erkannt. Pflegehinweise sind unten aufgefuehrt.` + : language === 'es' + ? `${name} se detecto con IA. Debajo veras recomendaciones de cuidado.` + : `${name} was identified with AI. Care guidance is shown below.`; + + return { + name, + botanicalName, + confidence: clamp(confidenceRaw == null ? 0.72 : confidenceRaw, 0.05, 0.99), + description: description || fallbackDescription, + careInfo: { + waterIntervalDays: Math.round(clamp(waterIntervalRaw, 1, 45)), + light, + temp, + }, + }; +}; + +const normalizeHealthAnalysis = (raw, language) => { + const scoreRaw = getNumber(raw.overallHealthScore); + const statusRaw = getString(raw.status); + const issuesRaw = raw.likelyIssues; + const actionsNowRaw = getStringArray(raw.actionsNow).slice(0, 8); + const plan7DaysRaw = getStringArray(raw.plan7Days).slice(0, 10); + + if (scoreRaw == null || !statusRaw || !Array.isArray(issuesRaw)) { + return null; + } + + const status = statusRaw === 'healthy' || statusRaw === 'watch' || statusRaw === 'critical' + ? statusRaw + : 'watch'; + + const likelyIssues = issuesRaw + .map((entry) => { + if (!entry || typeof entry !== 'object' || Array.isArray(entry)) return null; + const title = getString(entry.title); + const details = getString(entry.details); + const confidenceRaw = getNumber(entry.confidence); + if (!title || !details || confidenceRaw == null) return null; + return { + title, + details, + confidence: clamp(confidenceRaw, 0.05, 0.99), + }; + }) + .filter(Boolean) + .slice(0, 4); + + if (likelyIssues.length === 0 || actionsNowRaw.length < 2 || plan7DaysRaw.length < 2) { + const fallbackIssue = language === 'de' + ? 'Die KI konnte keine stabilen Gesundheitsmerkmale extrahieren.' + : language === 'es' + ? 'La IA no pudo extraer senales de salud estables.' + : 'AI could not extract stable health signals.'; + return { + overallHealthScore: Math.round(clamp(scoreRaw, 0, 100)), + status, + likelyIssues: [ + { + title: language === 'de' + ? 'Analyse unsicher' + : language === 'es' + ? 'Analisis incierto' + : 'Uncertain analysis', + confidence: 0.35, + details: fallbackIssue, + }, + ], + actionsNow: actionsNowRaw.length > 0 + ? actionsNowRaw + : [language === 'de' ? 'Neues, schaerferes Foto aufnehmen.' : language === 'es' ? 'Tomar una foto nueva y mas nitida.' : 'Capture a new, sharper photo.'], + plan7Days: plan7DaysRaw.length > 0 + ? plan7DaysRaw + : [language === 'de' ? 'In 2 Tagen erneut pruefen.' : language === 'es' ? 'Volver a revisar en 2 dias.' : 'Re-check in 2 days.'], + }; + } + + return { + overallHealthScore: Math.round(clamp(scoreRaw, 0, 100)), + status, + likelyIssues, + actionsNow: actionsNowRaw, + plan7Days: plan7DaysRaw, + }; +}; + +const buildIdentifyPrompt = (language, mode) => { + const reviewInstruction = mode === 'review' + ? 'Re-check your first hypothesis with stricter botanical accuracy and correct any mismatch.' + : 'Identify the most likely houseplant species from this image with conservative confidence.'; + + const nameLanguageInstruction = language === 'en' + ? '- "name" must be an English common name only. Never return a German or other non-English common name. If no reliable English common name is known, use "botanicalName" as "name" instead of inventing or translating.' + : `- "name" must be strictly written in ${getLanguageLabel(language)}. If a reliable common name in that language is not known, use "botanicalName" as "name" instead of inventing a localized name.`; + + return [ + `${reviewInstruction}`, + 'Return strict JSON only in this shape:', + '{"name":"...","botanicalName":"...","confidence":0.0,"description":"...","careInfo":{"waterIntervalDays":7,"light":"...","temp":"..."}}', + 'Rules:', + nameLanguageInstruction, + `- "description" and "careInfo.light" must be written in ${getLanguageLabel(language)}.`, + '- "botanicalName" must use accepted Latin scientific naming and must not be invented or misspelled.', + '- If species is uncertain, prefer genus-level naming (for example: "Calathea sp.").', + '- "confidence" must be between 0 and 1.', + '- Keep confidence <= 0.55 when the image is ambiguous, blurred, or partially visible.', + '- "waterIntervalDays" must be an integer between 1 and 45.', + '- Do not include markdown, explanations, or extra keys.', + ].join('\n'); +}; + +const buildHealthPrompt = (language, plantContext) => { + const contextLines = plantContext + ? [ + 'Plant context:', + `- name: ${plantContext.name || 'n/a'}`, + `- botanicalName: ${plantContext.botanicalName || 'n/a'}`, + `- care.light: ${plantContext.careInfo?.light || 'n/a'}`, + `- care.temp: ${plantContext.careInfo?.temp || 'n/a'}`, + `- care.waterIntervalDays: ${plantContext.careInfo?.waterIntervalDays || 'n/a'}`, + `- description: ${plantContext.description || 'n/a'}`, + ] + : ['Plant context: not provided']; + + return [ + `You are an expert botanist and plant health diagnostician. Carefully examine every visible detail of this plant photo and produce a thorough, professional health assessment written in ${getLanguageLabel(language)}.`, + '', + 'Inspect the following in detail: leaf color (yellowing, browning, bleaching, dark spots, necrosis), leaf texture (wilting, crispy edges, curling, drooping), stem condition (rot, soft spots, discoloration), soil surface (dry cracks, mold, pests, waterlogging signs), visible pests (spider mites, fungus gnats, scale insects, aphids, mealybugs), root health (if visible), pot size and drainage.', + '', + 'Return strict JSON only in this exact shape:', + '{"overallHealthScore":72,"status":"watch","likelyIssues":[{"title":"...","confidence":0.64,"details":"..."}],"actionsNow":["..."],"plan7Days":["..."]}', + '', + 'Rules:', + '- "overallHealthScore": integer 0–100. 100=perfect health, 80–99=minor cosmetic only, 60–79=noticeable issues needing attention, 40–59=significant stress, below 40=severe/critical.', + '- "status": exactly one of "healthy" (score>=80, no active threats), "watch" (score 50–79, needs monitoring), "critical" (score<50, urgent action needed).', + '- "likelyIssues": 2 to 4 items, sorted by confidence descending. Each item:', + ' - "title": concise issue name (e.g. "Overwatering / Root Rot Risk")', + ' - "confidence": float 0.05–0.99 reflecting visual certainty', + ' - "details": 2–4 sentence detailed explanation of what you observe visually, what causes it, and what happens if untreated. Be specific — mention leaf color, location, pattern.', + `- "actionsNow": 5 to 8 specific, actionable steps for the next 24–48 hours. Each step must be a complete sentence with concrete instructions (e.g. amounts, durations, techniques). Written in ${getLanguageLabel(language)}.`, + `- "plan7Days": 7 to 10 day-by-day or milestone care steps for the coming week. Each step should specify timing and expected outcome. Written in ${getLanguageLabel(language)}.`, + '- All text fields must be written in the specified language. No markdown, no extra keys.', + ...contextLines, + ].join('\n'); +}; + +const extractMessageContent = (payload) => { + const content = payload?.choices?.[0]?.message?.content; + if (typeof content === 'string') return content; + if (Array.isArray(content)) { + return content + .map((chunk) => (chunk && chunk.type === 'text' ? chunk.text || '' : '')) + .join('') + .trim(); + } + return ''; +}; + +const postChatCompletion = async ({ modelChain, messages, imageUri, temperature }) => { + if (!OPENAI_API_KEY) return null; + if (typeof fetch !== 'function') { + throw new Error('Global fetch is not available in this Node runtime.'); + } + + const attemptedModels = []; + + for (const model of modelChain) { + attemptedModels.push(model); + + const controller = new AbortController(); + const timeout = setTimeout(() => controller.abort(), OPENAI_TIMEOUT_MS); + + try { + const body = { + model, + response_format: { type: 'json_object' }, + messages, + }; + if (typeof temperature === 'number') body.temperature = temperature; + + const response = await fetch(OPENAI_CHAT_COMPLETIONS_URL, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${OPENAI_API_KEY}`, + }, + body: JSON.stringify(body), + signal: controller.signal, + }); + + if (!response.ok) { + const body = await response.text(); + console.warn('OpenAI request HTTP error.', { + status: response.status, + model, + endpoint: OPENAI_CHAT_COMPLETIONS_URL, + image: summarizeImageUri(imageUri), + bodyPreview: body.slice(0, 300), + }); + continue; + } + + const payload = await response.json(); + return { payload, modelUsed: model, attemptedModels }; + } catch (error) { + const isTimeoutAbort = error instanceof Error && error.name === 'AbortError'; + console.warn('OpenAI request failed.', { + model, + endpoint: OPENAI_CHAT_COMPLETIONS_URL, + timeoutMs: OPENAI_TIMEOUT_MS, + aborted: isTimeoutAbort, + error: toErrorMessage(error), + image: summarizeImageUri(imageUri), + }); + continue; + } finally { + clearTimeout(timeout); + } + } + + return { payload: null, modelUsed: null, attemptedModels }; +}; + +const identifyPlant = async ({ imageUri, language, mode = 'primary', plan = 'free' }) => { + if (!OPENAI_API_KEY) return { result: null, modelUsed: null, attemptedModels: [] }; + const modelChain = getScanModelChain(plan); + const completion = await postChatCompletion({ + modelChain, + imageUri, + messages: [ + { + role: 'system', + content: 'You are a plant identification assistant. Return strict JSON only.', + }, + { + role: 'user', + content: [ + { type: 'text', text: buildIdentifyPrompt(language, mode) }, + { type: 'image_url', image_url: { url: imageUri } }, + ], + }, + ], + }); + + if (!completion?.payload) { + return { + result: null, + modelUsed: completion?.modelUsed || null, + attemptedModels: completion?.attemptedModels || [], + }; + } + + const content = extractMessageContent(completion.payload); + if (!content) { + console.warn('OpenAI identify returned empty content.', { + model: completion.modelUsed || modelChain[0], + mode, + image: summarizeImageUri(imageUri), + }); + return { result: null, modelUsed: completion.modelUsed, attemptedModels: completion.attemptedModels }; + } + + const parsed = parseContentToJson(content); + if (!parsed) { + console.warn('OpenAI identify returned non-JSON content.', { + model: completion.modelUsed || modelChain[0], + mode, + preview: content.slice(0, 220), + }); + return { result: null, modelUsed: completion.modelUsed, attemptedModels: completion.attemptedModels }; + } + + const normalized = normalizeIdentifyResult(parsed, language); + if (!normalized) { + console.warn('OpenAI identify JSON did not match schema.', { + model: completion.modelUsed || modelChain[0], + mode, + keys: Object.keys(parsed), + }); + } + return { result: normalized, modelUsed: completion.modelUsed, attemptedModels: completion.attemptedModels }; +}; + +const analyzePlantHealth = async ({ imageUri, language, plantContext }) => { + if (!OPENAI_API_KEY) return { analysis: null, modelUsed: null, attemptedModels: [] }; + const completion = await postChatCompletion({ + modelChain: OPENAI_HEALTH_MODEL_CHAIN, + imageUri, + temperature: 0, + messages: [ + { + role: 'system', + content: 'You are a plant health diagnosis assistant. Return strict JSON only.', + }, + { + role: 'user', + content: [ + { type: 'text', text: buildHealthPrompt(language, plantContext) }, + { type: 'image_url', image_url: { url: imageUri } }, + ], + }, + ], + }); + + if (!completion?.payload) { + return { + analysis: null, + modelUsed: completion?.modelUsed || null, + attemptedModels: completion?.attemptedModels || [], + }; + } + + const content = extractMessageContent(completion.payload); + if (!content) { + console.warn('OpenAI health returned empty content.', { + model: completion.modelUsed || OPENAI_HEALTH_MODEL_CHAIN[0], + image: summarizeImageUri(imageUri), + }); + return { analysis: null, modelUsed: completion.modelUsed, attemptedModels: completion.attemptedModels }; + } + + const parsed = parseContentToJson(content); + if (!parsed) { + console.warn('OpenAI health returned non-JSON content.', { + model: completion.modelUsed || OPENAI_HEALTH_MODEL_CHAIN[0], + preview: content.slice(0, 220), + }); + return { analysis: null, modelUsed: completion.modelUsed, attemptedModels: completion.attemptedModels }; + } + + return { + analysis: normalizeHealthAnalysis(parsed, language), + modelUsed: completion.modelUsed, + attemptedModels: completion.attemptedModels, + }; +}; + +module.exports = { + analyzePlantHealth, + buildIdentifyPrompt, + getHealthModel: () => OPENAI_HEALTH_MODEL_CHAIN[0], + getScanModel: (plan = 'free') => getScanModelChain(plan)[0], + identifyPlant, + isConfigured: () => Boolean(OPENAI_API_KEY), + normalizeIdentifyResult, +}; diff --git a/server/lib/plants.js b/server/lib/plants.js index d288a48..1d42385 100644 --- a/server/lib/plants.js +++ b/server/lib/plants.js @@ -1,724 +1,724 @@ -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('./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, +}; diff --git a/server/lib/scanGrounding.js b/server/lib/scanGrounding.js index 4491ed6..87cab0e 100644 --- a/server/lib/scanGrounding.js +++ b/server/lib/scanGrounding.js @@ -1,131 +1,131 @@ -const clamp = (value, min, max) => { - return Math.min(max, Math.max(min, value)); -}; - -const normalizeText = (value) => { - return String(value || '') - .toLowerCase() - .normalize('NFD') - .replace(/[\u0300-\u036f]/g, '') - .replace(/\s+/g, ' ') - .trim(); -}; - -const GERMAN_COMMON_NAME_HINTS = [ - 'weihnachtsstern', - 'weinachtsstern', - 'einblatt', - 'fensterblatt', - 'korbmarante', - 'glucksfeder', - 'gluecksfeder', - 'efeutute', - 'drachenbaum', - 'gummibaum', - 'geigenfeige', - 'bogenhanf', - 'yucca palme', - 'gluckskastanie', - 'glueckskastanie', -]; - -const isLikelyGermanCommonName = (value) => { - const raw = String(value || '').trim(); - if (!raw) return false; - if (/[äöüß]/i.test(raw)) return true; - - const normalized = normalizeText(raw).replace(/[^a-z0-9 ]+/g, ' '); - if (!normalized) return false; - if (/\b(der|die|das|ein|eine)\b/.test(normalized)) return true; - - return GERMAN_COMMON_NAME_HINTS.some((hint) => normalized.includes(hint)); -}; - -const isLikelyBotanicalName = (value, botanicalName) => { - const raw = String(value || '').trim(); - const botanicalRaw = String(botanicalName || '').trim(); - if (!raw) return false; - - if (normalizeText(raw) === normalizeText(botanicalRaw)) return true; - - return /^[A-Z][a-z-]+(?:\s[a-z.-]+){1,2}$/.test(raw); -}; - -const findCatalogMatch = (aiResult, entries) => { - if (!aiResult || !Array.isArray(entries) || entries.length === 0) return null; - const aiBotanical = normalizeText(aiResult.botanicalName); - const aiName = normalizeText(aiResult.name); - if (!aiBotanical && !aiName) return null; - - const byExactBotanical = entries.find((entry) => normalizeText(entry.botanicalName) === aiBotanical); - if (byExactBotanical) return byExactBotanical; - - const byExactName = entries.find((entry) => normalizeText(entry.name) === aiName); - if (byExactName) return byExactName; - - if (aiBotanical) { - const aiGenus = aiBotanical.split(' ')[0]; - if (aiGenus) { - const byGenus = entries.find((entry) => normalizeText(entry.botanicalName).startsWith(`${aiGenus} `)); - if (byGenus) return byGenus; - } - } - - const byContains = entries.find((entry) => { - const plantName = normalizeText(entry.name); - const botanical = normalizeText(entry.botanicalName); - return (aiName && (plantName.includes(aiName) || aiName.includes(plantName))) - || (aiBotanical && (botanical.includes(aiBotanical) || aiBotanical.includes(botanical))); - }); - if (byContains) return byContains; - - return null; -}; - -const shouldUseCatalogNameOverride = ({ language, aiResult, matchedEntry }) => { - const catalogName = String(matchedEntry?.name || '').trim(); - if (!catalogName) return false; - if (language !== 'en') return true; - - if (isLikelyBotanicalName(catalogName, matchedEntry?.botanicalName || aiResult?.botanicalName)) { - return true; - } - - if (isLikelyGermanCommonName(catalogName)) { - return false; - } - - return true; -}; - -const applyCatalogGrounding = (aiResult, catalogEntries, language = 'en') => { - const matchedEntry = findCatalogMatch(aiResult, catalogEntries); - if (!matchedEntry) { - return { grounded: false, result: aiResult }; - } - - const useCatalogName = shouldUseCatalogNameOverride({ language, aiResult, matchedEntry }); - - return { - grounded: true, - result: { - name: useCatalogName ? matchedEntry.name || aiResult.name : aiResult.name, - botanicalName: matchedEntry.botanicalName || aiResult.botanicalName, - confidence: clamp(Math.max(aiResult.confidence || 0.6, 0.78), 0.05, 0.99), - description: aiResult.description || matchedEntry.description || '', - careInfo: { - waterIntervalDays: Math.max(1, Number(matchedEntry.careInfo?.waterIntervalDays) || Number(aiResult.careInfo?.waterIntervalDays) || 7), - light: matchedEntry.careInfo?.light || aiResult.careInfo?.light || 'Unknown', - temp: matchedEntry.careInfo?.temp || aiResult.careInfo?.temp || 'Unknown', - }, - }, - }; -}; - -module.exports = { - applyCatalogGrounding, - findCatalogMatch, - isLikelyGermanCommonName, - normalizeText, - shouldUseCatalogNameOverride, -}; +const clamp = (value, min, max) => { + return Math.min(max, Math.max(min, value)); +}; + +const normalizeText = (value) => { + return String(value || '') + .toLowerCase() + .normalize('NFD') + .replace(/[\u0300-\u036f]/g, '') + .replace(/\s+/g, ' ') + .trim(); +}; + +const GERMAN_COMMON_NAME_HINTS = [ + 'weihnachtsstern', + 'weinachtsstern', + 'einblatt', + 'fensterblatt', + 'korbmarante', + 'glucksfeder', + 'gluecksfeder', + 'efeutute', + 'drachenbaum', + 'gummibaum', + 'geigenfeige', + 'bogenhanf', + 'yucca palme', + 'gluckskastanie', + 'glueckskastanie', +]; + +const isLikelyGermanCommonName = (value) => { + const raw = String(value || '').trim(); + if (!raw) return false; + if (/[äöüß]/i.test(raw)) return true; + + const normalized = normalizeText(raw).replace(/[^a-z0-9 ]+/g, ' '); + if (!normalized) return false; + if (/\b(der|die|das|ein|eine)\b/.test(normalized)) return true; + + return GERMAN_COMMON_NAME_HINTS.some((hint) => normalized.includes(hint)); +}; + +const isLikelyBotanicalName = (value, botanicalName) => { + const raw = String(value || '').trim(); + const botanicalRaw = String(botanicalName || '').trim(); + if (!raw) return false; + + if (normalizeText(raw) === normalizeText(botanicalRaw)) return true; + + return /^[A-Z][a-z-]+(?:\s[a-z.-]+){1,2}$/.test(raw); +}; + +const findCatalogMatch = (aiResult, entries) => { + if (!aiResult || !Array.isArray(entries) || entries.length === 0) return null; + const aiBotanical = normalizeText(aiResult.botanicalName); + const aiName = normalizeText(aiResult.name); + if (!aiBotanical && !aiName) return null; + + const byExactBotanical = entries.find((entry) => normalizeText(entry.botanicalName) === aiBotanical); + if (byExactBotanical) return byExactBotanical; + + const byExactName = entries.find((entry) => normalizeText(entry.name) === aiName); + if (byExactName) return byExactName; + + if (aiBotanical) { + const aiGenus = aiBotanical.split(' ')[0]; + if (aiGenus) { + const byGenus = entries.find((entry) => normalizeText(entry.botanicalName).startsWith(`${aiGenus} `)); + if (byGenus) return byGenus; + } + } + + const byContains = entries.find((entry) => { + const plantName = normalizeText(entry.name); + const botanical = normalizeText(entry.botanicalName); + return (aiName && (plantName.includes(aiName) || aiName.includes(plantName))) + || (aiBotanical && (botanical.includes(aiBotanical) || aiBotanical.includes(botanical))); + }); + if (byContains) return byContains; + + return null; +}; + +const shouldUseCatalogNameOverride = ({ language, aiResult, matchedEntry }) => { + const catalogName = String(matchedEntry?.name || '').trim(); + if (!catalogName) return false; + if (language !== 'en') return true; + + if (isLikelyBotanicalName(catalogName, matchedEntry?.botanicalName || aiResult?.botanicalName)) { + return true; + } + + if (isLikelyGermanCommonName(catalogName)) { + return false; + } + + return true; +}; + +const applyCatalogGrounding = (aiResult, catalogEntries, language = 'en') => { + const matchedEntry = findCatalogMatch(aiResult, catalogEntries); + if (!matchedEntry) { + return { grounded: false, result: aiResult }; + } + + const useCatalogName = shouldUseCatalogNameOverride({ language, aiResult, matchedEntry }); + + return { + grounded: true, + result: { + name: useCatalogName ? matchedEntry.name || aiResult.name : aiResult.name, + botanicalName: matchedEntry.botanicalName || aiResult.botanicalName, + confidence: clamp(Math.max(aiResult.confidence || 0.6, 0.78), 0.05, 0.99), + description: aiResult.description || matchedEntry.description || '', + careInfo: { + waterIntervalDays: Math.max(1, Number(matchedEntry.careInfo?.waterIntervalDays) || Number(aiResult.careInfo?.waterIntervalDays) || 7), + light: matchedEntry.careInfo?.light || aiResult.careInfo?.light || 'Unknown', + temp: matchedEntry.careInfo?.temp || aiResult.careInfo?.temp || 'Unknown', + }, + }, + }; +}; + +module.exports = { + applyCatalogGrounding, + findCatalogMatch, + isLikelyGermanCommonName, + normalizeText, + shouldUseCatalogNameOverride, +}; diff --git a/server/lib/searchIntentConfig.js b/server/lib/searchIntentConfig.js index 7c36f60..90df06a 100644 --- a/server/lib/searchIntentConfig.js +++ b/server/lib/searchIntentConfig.js @@ -1,402 +1,402 @@ -const SEARCH_INTENT_CONFIG = { - intents: { - easy: { - aliases: [ - 'easy', - 'easy care', - 'easy plant', - 'easy plants', - 'easy to care', - 'beginner', - 'beginner plant', - 'beginner plants', - 'low maintenance', - 'hard to kill', - 'starter plant', - 'starter plants', - 'pflegearm', - 'pflegeleicht', - 'anfanger', - 'anfangerpflanze', - 'anfangerpflanzen', - 'einfach', - 'unkompliziert', - 'facil cuidado', - 'facil', - 'principiante', - 'planta facil', - 'planta resistente', - ], - entryHints: [ - 'easy', - 'pflegeleicht', - 'robust', - 'resilient', - 'hardy', - 'low maintenance', - 'beginner', - 'facil', - 'resistente', - 'uncomplicated', - ], - }, - low_light: { - aliases: [ - 'low light', - 'dark corner', - 'dark room', - 'office plant', - 'office', - 'windowless room', - 'shade', - 'shady', - 'indirect light', - 'little light', - 'wenig licht', - 'dunkle ecke', - 'buero', - 'buro', - 'dunkel', - 'schatten', - 'halbschatten', - 'poca luz', - 'oficina', - 'rincon oscuro', - 'sombra', - ], - lightHints: [ - 'low light', - 'low to full light', - 'shade', - 'partial shade', - 'indirect', - 'indirect bright', - 'bright indirect', - 'wenig licht', - 'schatten', - 'halbschatten', - 'indirekt', - 'poca luz', - 'sombra', - 'luz indirecta', - ], - }, - pet_friendly: { - aliases: [ - 'pet friendly', - 'pet-safe', - 'pet safe', - 'safe for cats', - 'safe for dogs', - 'cat safe', - 'dog safe', - 'non toxic', - 'non-toxic', - 'haustierfreundlich', - 'tierfreundlich', - 'katzensicher', - 'hundefreundlich', - 'mascota', - 'pet friendly plant', - 'segura para gatos', - 'segura para perros', - 'no toxica', - 'no tóxica', - ], - entryHints: [ - 'pet friendly', - 'safe for pets', - 'safe for cats', - 'safe for dogs', - 'tierfreundlich', - 'haustierfreundlich', - 'mascota', - ], - }, - air_purifier: { - aliases: [ - 'air purifier', - 'air purifying', - 'clean air', - 'cleaner air', - 'air cleaning', - 'air freshening', - 'luftreiniger', - 'luftreinigend', - 'reinigt luft', - 'purificador', - 'aire limpio', - 'purifica aire', - ], - entryHints: [ - 'air purifier', - 'air purifying', - 'clean air', - 'luftreiniger', - 'purificador', - ], - }, - flowering: { - aliases: [ - 'flowering', - 'flowers', - 'blooms', - 'in bloom', - 'bluhend', - 'bluht', - 'blumen', - 'con flores', - 'floracion', - ], - entryHints: [ - 'flowering', - 'blooms', - 'flower', - 'bluh', - 'flor', - ], - }, - succulent: { - aliases: [ - 'succulent', - 'succulents', - 'cactus', - 'cactus-like', - 'drought tolerant', - 'sukkulente', - 'sukkulenten', - 'trockenheitsvertraglich', - 'trockenheitsvertraeglich', - 'suculenta', - 'suculentas', - ], - entryHints: [ - 'succulent', - 'cactus', - 'drought tolerant', - 'sukkulent', - 'suculenta', - ], - }, - bright_light: { - aliases: [ - 'bright light', - 'bright room', - 'bright spot', - 'east window', - 'west window', - 'sunny room', - 'helles licht', - 'hell', - 'lichtreich', - 'fensterplatz', - 'mucha luz', - 'luz brillante', - ], - lightHints: [ - 'bright light', - 'bright indirect', - 'bright', - 'helles licht', - 'helles indirektes licht', - 'luz brillante', - ], - }, - sun: { - aliases: [ - 'full sun', - 'sun', - 'sunny window', - 'direct sun', - 'south window', - 'south facing window', - 'volle sonne', - 'sonnig', - 'direkte sonne', - 'fenster sud', - 'fenster sued', - 'fenster süd', - 'ventana soleada', - 'sol directo', - ], - lightHints: [ - 'full sun', - 'sunny', - 'direct sun', - 'volles sonnenlicht', - 'sonnig', - 'sol directo', - ], - }, - high_humidity: { - aliases: [ - 'high humidity', - 'humid', - 'bathroom plant', - 'bathroom', - 'shower room', - 'humid room', - 'tropical humidity', - 'hohe luftfeuchtigkeit', - 'feucht', - 'badezimmer', - 'dusche', - 'luftfeucht', - 'humedad alta', - 'bano', - 'baño', - ], - entryHints: [ - 'high humidity', - 'humidity', - 'humid', - 'hohe luftfeuchtigkeit', - 'luftfeuchtigkeit', - 'humedad alta', - ], - }, - hanging: { - aliases: [ - 'hanging', - 'trailing', - 'hanging basket', - 'shelf plant', - 'vine plant', - 'cascading', - 'hangend', - 'ampel', - 'rankend', - 'colgante', - 'planta colgante', - ], - entryHints: [ - 'hanging', - 'trailing', - 'vine', - 'hang', - 'colgante', - ], - }, - patterned: { - aliases: [ - 'patterned', - 'patterned leaves', - 'striped', - 'variegated', - 'spotted', - 'decorative leaves', - 'fancy leaves', - 'gemustert', - 'muster', - 'gestreift', - 'bunt', - 'variegada', - 'rayada', - ], - entryHints: [ - 'patterned', - 'striped', - 'variegated', - 'spotted', - 'gemustert', - 'gestreift', - ], - }, - tree: { - aliases: [ - 'tree', - 'indoor tree', - 'small tree', - 'floor tree', - 'zimmerbaum', - 'baum', - 'arbol', - 'árbol', - ], - entryHints: [ - 'tree', - 'baum', - 'arbol', - ], - }, - large: { - aliases: [ - 'large', - 'big plant', - 'tall plant', - 'statement plant', - 'floor plant', - 'oversized plant', - 'gross', - 'groß', - 'grosse pflanze', - 'hohe pflanze', - 'planta grande', - 'planta alta', - ], - entryHints: [ - 'large', - 'big', - 'tall', - 'gross', - 'groß', - 'grande', - ], - }, - medicinal: { - aliases: [ - 'medicinal', - 'healing plant', - 'herb', - 'kitchen herb', - 'tea herb', - 'apothecary plant', - 'heilpflanze', - 'heilkraut', - 'kraut', - 'medicinal plant', - 'medicinal herb', - 'medicinales', - 'hierba', - 'hierba medicinal', - ], - entryHints: [ - 'medicinal', - 'herb', - 'heil', - 'kraut', - 'hierba', - ], - }, - }, - noiseTokens: [ - 'plant', - 'plants', - 'pflanze', - 'pflanzen', - 'planta', - 'plantas', - 'for', - 'fur', - 'fuer', - 'para', - 'mit', - 'with', - 'and', - 'und', - 'y', - 'the', - 'der', - 'die', - 'das', - 'el', - 'la', - 'de', - 'a', - 'an', - ], -}; - -module.exports = { - SEARCH_INTENT_CONFIG, -}; +const SEARCH_INTENT_CONFIG = { + intents: { + easy: { + aliases: [ + 'easy', + 'easy care', + 'easy plant', + 'easy plants', + 'easy to care', + 'beginner', + 'beginner plant', + 'beginner plants', + 'low maintenance', + 'hard to kill', + 'starter plant', + 'starter plants', + 'pflegearm', + 'pflegeleicht', + 'anfanger', + 'anfangerpflanze', + 'anfangerpflanzen', + 'einfach', + 'unkompliziert', + 'facil cuidado', + 'facil', + 'principiante', + 'planta facil', + 'planta resistente', + ], + entryHints: [ + 'easy', + 'pflegeleicht', + 'robust', + 'resilient', + 'hardy', + 'low maintenance', + 'beginner', + 'facil', + 'resistente', + 'uncomplicated', + ], + }, + low_light: { + aliases: [ + 'low light', + 'dark corner', + 'dark room', + 'office plant', + 'office', + 'windowless room', + 'shade', + 'shady', + 'indirect light', + 'little light', + 'wenig licht', + 'dunkle ecke', + 'buero', + 'buro', + 'dunkel', + 'schatten', + 'halbschatten', + 'poca luz', + 'oficina', + 'rincon oscuro', + 'sombra', + ], + lightHints: [ + 'low light', + 'low to full light', + 'shade', + 'partial shade', + 'indirect', + 'indirect bright', + 'bright indirect', + 'wenig licht', + 'schatten', + 'halbschatten', + 'indirekt', + 'poca luz', + 'sombra', + 'luz indirecta', + ], + }, + pet_friendly: { + aliases: [ + 'pet friendly', + 'pet-safe', + 'pet safe', + 'safe for cats', + 'safe for dogs', + 'cat safe', + 'dog safe', + 'non toxic', + 'non-toxic', + 'haustierfreundlich', + 'tierfreundlich', + 'katzensicher', + 'hundefreundlich', + 'mascota', + 'pet friendly plant', + 'segura para gatos', + 'segura para perros', + 'no toxica', + 'no tóxica', + ], + entryHints: [ + 'pet friendly', + 'safe for pets', + 'safe for cats', + 'safe for dogs', + 'tierfreundlich', + 'haustierfreundlich', + 'mascota', + ], + }, + air_purifier: { + aliases: [ + 'air purifier', + 'air purifying', + 'clean air', + 'cleaner air', + 'air cleaning', + 'air freshening', + 'luftreiniger', + 'luftreinigend', + 'reinigt luft', + 'purificador', + 'aire limpio', + 'purifica aire', + ], + entryHints: [ + 'air purifier', + 'air purifying', + 'clean air', + 'luftreiniger', + 'purificador', + ], + }, + flowering: { + aliases: [ + 'flowering', + 'flowers', + 'blooms', + 'in bloom', + 'bluhend', + 'bluht', + 'blumen', + 'con flores', + 'floracion', + ], + entryHints: [ + 'flowering', + 'blooms', + 'flower', + 'bluh', + 'flor', + ], + }, + succulent: { + aliases: [ + 'succulent', + 'succulents', + 'cactus', + 'cactus-like', + 'drought tolerant', + 'sukkulente', + 'sukkulenten', + 'trockenheitsvertraglich', + 'trockenheitsvertraeglich', + 'suculenta', + 'suculentas', + ], + entryHints: [ + 'succulent', + 'cactus', + 'drought tolerant', + 'sukkulent', + 'suculenta', + ], + }, + bright_light: { + aliases: [ + 'bright light', + 'bright room', + 'bright spot', + 'east window', + 'west window', + 'sunny room', + 'helles licht', + 'hell', + 'lichtreich', + 'fensterplatz', + 'mucha luz', + 'luz brillante', + ], + lightHints: [ + 'bright light', + 'bright indirect', + 'bright', + 'helles licht', + 'helles indirektes licht', + 'luz brillante', + ], + }, + sun: { + aliases: [ + 'full sun', + 'sun', + 'sunny window', + 'direct sun', + 'south window', + 'south facing window', + 'volle sonne', + 'sonnig', + 'direkte sonne', + 'fenster sud', + 'fenster sued', + 'fenster süd', + 'ventana soleada', + 'sol directo', + ], + lightHints: [ + 'full sun', + 'sunny', + 'direct sun', + 'volles sonnenlicht', + 'sonnig', + 'sol directo', + ], + }, + high_humidity: { + aliases: [ + 'high humidity', + 'humid', + 'bathroom plant', + 'bathroom', + 'shower room', + 'humid room', + 'tropical humidity', + 'hohe luftfeuchtigkeit', + 'feucht', + 'badezimmer', + 'dusche', + 'luftfeucht', + 'humedad alta', + 'bano', + 'baño', + ], + entryHints: [ + 'high humidity', + 'humidity', + 'humid', + 'hohe luftfeuchtigkeit', + 'luftfeuchtigkeit', + 'humedad alta', + ], + }, + hanging: { + aliases: [ + 'hanging', + 'trailing', + 'hanging basket', + 'shelf plant', + 'vine plant', + 'cascading', + 'hangend', + 'ampel', + 'rankend', + 'colgante', + 'planta colgante', + ], + entryHints: [ + 'hanging', + 'trailing', + 'vine', + 'hang', + 'colgante', + ], + }, + patterned: { + aliases: [ + 'patterned', + 'patterned leaves', + 'striped', + 'variegated', + 'spotted', + 'decorative leaves', + 'fancy leaves', + 'gemustert', + 'muster', + 'gestreift', + 'bunt', + 'variegada', + 'rayada', + ], + entryHints: [ + 'patterned', + 'striped', + 'variegated', + 'spotted', + 'gemustert', + 'gestreift', + ], + }, + tree: { + aliases: [ + 'tree', + 'indoor tree', + 'small tree', + 'floor tree', + 'zimmerbaum', + 'baum', + 'arbol', + 'árbol', + ], + entryHints: [ + 'tree', + 'baum', + 'arbol', + ], + }, + large: { + aliases: [ + 'large', + 'big plant', + 'tall plant', + 'statement plant', + 'floor plant', + 'oversized plant', + 'gross', + 'groß', + 'grosse pflanze', + 'hohe pflanze', + 'planta grande', + 'planta alta', + ], + entryHints: [ + 'large', + 'big', + 'tall', + 'gross', + 'groß', + 'grande', + ], + }, + medicinal: { + aliases: [ + 'medicinal', + 'healing plant', + 'herb', + 'kitchen herb', + 'tea herb', + 'apothecary plant', + 'heilpflanze', + 'heilkraut', + 'kraut', + 'medicinal plant', + 'medicinal herb', + 'medicinales', + 'hierba', + 'hierba medicinal', + ], + entryHints: [ + 'medicinal', + 'herb', + 'heil', + 'kraut', + 'hierba', + ], + }, + }, + noiseTokens: [ + 'plant', + 'plants', + 'pflanze', + 'pflanzen', + 'planta', + 'plantas', + 'for', + 'fur', + 'fuer', + 'para', + 'mit', + 'with', + 'and', + 'und', + 'y', + 'the', + 'der', + 'die', + 'das', + 'el', + 'la', + 'de', + 'a', + 'an', + ], +}; + +module.exports = { + SEARCH_INTENT_CONFIG, +}; diff --git a/server/lib/sqlite.js b/server/lib/sqlite.js index 9d7013f..8e25645 100644 --- a/server/lib/sqlite.js +++ b/server/lib/sqlite.js @@ -1,86 +1,86 @@ -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, -}; +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, +}; diff --git a/server/lib/storage.js b/server/lib/storage.js index f8f320a..8e23db9 100644 --- a/server/lib/storage.js +++ b/server/lib/storage.js @@ -1,72 +1,72 @@ -const Minio = require('minio'); -const crypto = require('crypto'); - -const getTrimmedEnv = (name, fallback = '') => String(process.env[name] ?? fallback).trim(); - -const MINIO_ENDPOINT = getTrimmedEnv('MINIO_ENDPOINT'); -const MINIO_PORT = Number(process.env.MINIO_PORT || 9000); -const MINIO_USE_SSL = process.env.MINIO_USE_SSL === 'true'; -const MINIO_ACCESS_KEY = getTrimmedEnv('MINIO_ACCESS_KEY'); -const MINIO_SECRET_KEY = getTrimmedEnv('MINIO_SECRET_KEY'); -const MINIO_BUCKET = getTrimmedEnv('MINIO_BUCKET', 'plant-images') || 'plant-images'; - -const isStorageConfigured = () => Boolean(MINIO_ENDPOINT && MINIO_ACCESS_KEY && MINIO_SECRET_KEY); - -const getMinioPublicUrl = () => - getTrimmedEnv('MINIO_PUBLIC_URL', `http://${MINIO_ENDPOINT}:${MINIO_PORT}`).replace(/\/$/, ''); - -const getClient = () => { - if (!isStorageConfigured()) { - throw new Error('Image storage is not configured.'); - } - - return new Minio.Client({ - endPoint: MINIO_ENDPOINT, - port: MINIO_PORT, - useSSL: MINIO_USE_SSL, - accessKey: MINIO_ACCESS_KEY, - secretKey: MINIO_SECRET_KEY, - }); -}; - -const ensureStorageBucket = async () => { - const client = getClient(); - const exists = await client.bucketExists(MINIO_BUCKET); - if (!exists) { - await client.makeBucket(MINIO_BUCKET); - const policy = JSON.stringify({ - Version: '2012-10-17', - Statement: [ - { - Effect: 'Allow', - Principal: { AWS: ['*'] }, - Action: ['s3:GetObject'], - Resource: [`arn:aws:s3:::${MINIO_BUCKET}/*`], - }, - ], - }); - await client.setBucketPolicy(MINIO_BUCKET, policy); - console.log(`MinIO bucket '${MINIO_BUCKET}' created with public read policy.`); - } -}; - -const uploadImage = async (base64Data, contentType = 'image/jpeg') => { - const client = getClient(); - const rawExtension = contentType.split('/')[1] || 'jpg'; - const extension = rawExtension === 'jpeg' ? 'jpg' : rawExtension; - const filename = `${Date.now()}-${crypto.randomBytes(8).toString('hex')}.${extension}`; - const buffer = Buffer.from(base64Data, 'base64'); - - await client.putObject(MINIO_BUCKET, filename, buffer, buffer.length, { - 'Content-Type': contentType, - }); - - const url = `${getMinioPublicUrl()}/${MINIO_BUCKET}/${filename}`; - return { url, filename }; -}; - -module.exports = { - ensureStorageBucket, - uploadImage, - isStorageConfigured, -}; +const Minio = require('minio'); +const crypto = require('crypto'); + +const getTrimmedEnv = (name, fallback = '') => String(process.env[name] ?? fallback).trim(); + +const MINIO_ENDPOINT = getTrimmedEnv('MINIO_ENDPOINT'); +const MINIO_PORT = Number(process.env.MINIO_PORT || 9000); +const MINIO_USE_SSL = process.env.MINIO_USE_SSL === 'true'; +const MINIO_ACCESS_KEY = getTrimmedEnv('MINIO_ACCESS_KEY'); +const MINIO_SECRET_KEY = getTrimmedEnv('MINIO_SECRET_KEY'); +const MINIO_BUCKET = getTrimmedEnv('MINIO_BUCKET', 'plant-images') || 'plant-images'; + +const isStorageConfigured = () => Boolean(MINIO_ENDPOINT && MINIO_ACCESS_KEY && MINIO_SECRET_KEY); + +const getMinioPublicUrl = () => + getTrimmedEnv('MINIO_PUBLIC_URL', `http://${MINIO_ENDPOINT}:${MINIO_PORT}`).replace(/\/$/, ''); + +const getClient = () => { + if (!isStorageConfigured()) { + throw new Error('Image storage is not configured.'); + } + + return new Minio.Client({ + endPoint: MINIO_ENDPOINT, + port: MINIO_PORT, + useSSL: MINIO_USE_SSL, + accessKey: MINIO_ACCESS_KEY, + secretKey: MINIO_SECRET_KEY, + }); +}; + +const ensureStorageBucket = async () => { + const client = getClient(); + const exists = await client.bucketExists(MINIO_BUCKET); + if (!exists) { + await client.makeBucket(MINIO_BUCKET); + const policy = JSON.stringify({ + Version: '2012-10-17', + Statement: [ + { + Effect: 'Allow', + Principal: { AWS: ['*'] }, + Action: ['s3:GetObject'], + Resource: [`arn:aws:s3:::${MINIO_BUCKET}/*`], + }, + ], + }); + await client.setBucketPolicy(MINIO_BUCKET, policy); + console.log(`MinIO bucket '${MINIO_BUCKET}' created with public read policy.`); + } +}; + +const uploadImage = async (base64Data, contentType = 'image/jpeg') => { + const client = getClient(); + const rawExtension = contentType.split('/')[1] || 'jpg'; + const extension = rawExtension === 'jpeg' ? 'jpg' : rawExtension; + const filename = `${Date.now()}-${crypto.randomBytes(8).toString('hex')}.${extension}`; + const buffer = Buffer.from(base64Data, 'base64'); + + await client.putObject(MINIO_BUCKET, filename, buffer, buffer.length, { + 'Content-Type': contentType, + }); + + const url = `${getMinioPublicUrl()}/${MINIO_BUCKET}/${filename}`; + return { url, filename }; +}; + +module.exports = { + ensureStorageBucket, + uploadImage, + isStorageConfigured, +}; diff --git a/server/package-lock.json b/server/package-lock.json index 043fb07..a9dd7bc 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -1,3049 +1,3049 @@ -{ - "name": "server", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "server", - "version": "1.0.0", - "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" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", - "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", - "license": "MIT", - "optional": true, - "dependencies": { - "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", - "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@img/sharp-darwin-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", - "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.2.4" - } - }, - "node_modules/@img/sharp-darwin-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", - "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.2.4" - } - }, - "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", - "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", - "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", - "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", - "cpu": [ - "arm" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", - "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-ppc64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", - "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", - "cpu": [ - "ppc64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-riscv64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", - "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", - "cpu": [ - "riscv64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", - "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", - "cpu": [ - "s390x" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", - "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", - "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", - "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-linux-arm": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", - "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", - "cpu": [ - "arm" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", - "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-ppc64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", - "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", - "cpu": [ - "ppc64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-ppc64": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-riscv64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", - "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", - "cpu": [ - "riscv64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-riscv64": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-s390x": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", - "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", - "cpu": [ - "s390x" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", - "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.2.4" - } - }, - "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", - "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" - } - }, - "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", - "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.2.4" - } - }, - "node_modules/@img/sharp-wasm32": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", - "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", - "cpu": [ - "wasm32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", - "optional": true, - "dependencies": { - "@emnapi/runtime": "^1.7.0" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", - "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-ia32": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", - "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", - "cpu": [ - "ia32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", - "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "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", - "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", - "license": "MIT", - "dependencies": { - "mime-types": "^3.0.0", - "negotiator": "^1.0.0" - }, - "engines": { - "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", - "integrity": "sha512-suhjmLI57Ewpmq00qaygS8UgEq2ly2PCItenIyhMqVjo4t4pGzqMvfgJuX8iWTeSDdfSSqS6j38fL4ToNL7Pfg==", - "license": "MIT", - "dependencies": { - "readable-stream": "^3.4.0" - } - }, - "node_modules/body-parser": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", - "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", - "license": "MIT", - "dependencies": { - "bytes": "^3.1.2", - "content-type": "^1.0.5", - "debug": "^4.4.3", - "http-errors": "^2.0.0", - "iconv-lite": "^0.7.0", - "on-finished": "^2.4.1", - "qs": "^6.14.1", - "raw-body": "^3.0.1", - "type-is": "^2.0.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "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", - "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", - "engines": { - "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", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "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", - "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", - "license": "MIT", - "engines": { - "node": ">=6.6.0" - } - }, - "node_modules/cors": { - "version": "2.8.6", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", - "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", - "license": "MIT", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decode-uri-component": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", - "license": "MIT", - "engines": { - "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", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/dotenv": { - "version": "17.3.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.3.1.tgz", - "integrity": "sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "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", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "license": "MIT", - "engines": { - "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", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT" - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/eventemitter3": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", - "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", - "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", - "license": "MIT", - "dependencies": { - "accepts": "^2.0.0", - "body-parser": "^2.2.1", - "content-disposition": "^1.0.0", - "content-type": "^1.0.5", - "cookie": "^0.7.1", - "cookie-signature": "^1.2.1", - "debug": "^4.4.0", - "depd": "^2.0.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "finalhandler": "^2.1.0", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "merge-descriptors": "^2.0.0", - "mime-types": "^3.0.0", - "on-finished": "^2.4.1", - "once": "^1.4.0", - "parseurl": "^1.3.3", - "proxy-addr": "^2.0.7", - "qs": "^6.14.0", - "range-parser": "^1.2.1", - "router": "^2.2.0", - "send": "^1.1.0", - "serve-static": "^2.2.0", - "statuses": "^2.0.1", - "type-is": "^2.0.1", - "vary": "^1.1.2" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/fast-xml-builder": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.0.0.tgz", - "integrity": "sha512-fpZuDogrAgnyt9oDDz+5DBz0zgPdPZz6D4IR7iESxRXElrlGTRkHJ9eEt+SACRJwT0FNFrt71DFQIUFBJfX/uQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT" - }, - "node_modules/fast-xml-parser": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.4.2.tgz", - "integrity": "sha512-pw/6pIl4k0CSpElPEJhDppLzaixDEuWui2CUQQBH/ECDf7+y6YwA4Gf7Tyb0Rfe4DIMuZipYj4AEL0nACKglvQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "dependencies": { - "fast-xml-builder": "^1.0.0", - "strnum": "^2.1.2" - }, - "bin": { - "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", - "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/finalhandler": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", - "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "on-finished": "^2.4.1", - "parseurl": "^1.3.3", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", - "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", - "license": "MIT", - "engines": { - "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", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "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", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "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", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "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", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "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", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "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", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", - "license": "MIT", - "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "type": "opencollective", - "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", - "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "type": "opencollective", - "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", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "license": "MIT", - "engines": { - "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", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/merge-descriptors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", - "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "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", - "integrity": "sha512-E737MgufW8CeQAsTAtnEMrxZ9scMSf29kkhZoXzDTKj/Jszzo2SfeZUH9wbDQH2Rsq6TCtl/yQL0+XdVKZansQ==", - "license": "Apache-2.0", - "dependencies": { - "async": "^3.2.4", - "block-stream2": "^2.1.0", - "browser-or-node": "^2.1.1", - "buffer-crc32": "^1.0.0", - "eventemitter3": "^5.0.1", - "fast-xml-parser": "^5.3.4", - "ipaddr.js": "^2.0.1", - "lodash": "^4.17.21", - "mime-types": "^2.1.35", - "query-string": "^7.1.3", - "stream-json": "^1.8.0", - "through2": "^4.0.2", - "xml2js": "^0.5.0 || ^0.6.2" - }, - "engines": { - "node": "^16 || ^18 || >=20" - } - }, - "node_modules/minio/node_modules/ipaddr.js": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.3.0.tgz", - "integrity": "sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==", - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/minio/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minio/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "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", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", - "license": "MIT", - "engines": { - "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", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", - "dependencies": { - "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", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "license": "MIT", - "engines": { - "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", - "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", - "license": "MIT", - "funding": { - "type": "opencollective", - "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.", - "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" - }, - "engines": { - "node": ">=10" - } - }, - "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", - "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==", - "license": "MIT", - "optional": true, - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "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", - "integrity": "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/query-string": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.1.3.tgz", - "integrity": "sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==", - "license": "MIT", - "dependencies": { - "decode-uri-component": "^0.2.2", - "filter-obj": "^1.1.0", - "split-on-first": "^1.0.0", - "strict-uri-encode": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", - "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", - "license": "MIT", - "dependencies": { - "bytes": "~3.1.2", - "http-errors": "~2.0.1", - "iconv-lite": "~0.7.0", - "unpipe": "~1.0.0" - }, - "engines": { - "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", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "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", - "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "depd": "^2.0.0", - "is-promise": "^4.0.0", - "parseurl": "^1.3.3", - "path-to-regexp": "^8.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "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/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/sax": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.5.0.tgz", - "integrity": "sha512-21IYA3Q5cQf089Z6tgaUTr7lDAyzoTPx5HRtbhsME8Udispad8dC/+sziTNugOEx54ilvatQ9YCzl4KQLPcRHA==", - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=11.0.0" - } - }, - "node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/send": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", - "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.3", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "fresh": "^2.0.0", - "http-errors": "^2.0.1", - "mime-types": "^3.0.2", - "ms": "^2.1.3", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "statuses": "^2.0.2" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/serve-static": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", - "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", - "license": "MIT", - "dependencies": { - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "parseurl": "^1.3.3", - "send": "^1.2.0" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "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", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" - }, - "node_modules/sharp": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", - "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "@img/colour": "^1.0.0", - "detect-libc": "^2.1.2", - "semver": "^7.7.3" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.34.5", - "@img/sharp-darwin-x64": "0.34.5", - "@img/sharp-libvips-darwin-arm64": "1.2.4", - "@img/sharp-libvips-darwin-x64": "1.2.4", - "@img/sharp-libvips-linux-arm": "1.2.4", - "@img/sharp-libvips-linux-arm64": "1.2.4", - "@img/sharp-libvips-linux-ppc64": "1.2.4", - "@img/sharp-libvips-linux-riscv64": "1.2.4", - "@img/sharp-libvips-linux-s390x": "1.2.4", - "@img/sharp-libvips-linux-x64": "1.2.4", - "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", - "@img/sharp-libvips-linuxmusl-x64": "1.2.4", - "@img/sharp-linux-arm": "0.34.5", - "@img/sharp-linux-arm64": "0.34.5", - "@img/sharp-linux-ppc64": "0.34.5", - "@img/sharp-linux-riscv64": "0.34.5", - "@img/sharp-linux-s390x": "0.34.5", - "@img/sharp-linux-x64": "0.34.5", - "@img/sharp-linuxmusl-arm64": "0.34.5", - "@img/sharp-linuxmusl-x64": "0.34.5", - "@img/sharp-wasm32": "0.34.5", - "@img/sharp-win32-arm64": "0.34.5", - "@img/sharp-win32-ia32": "0.34.5", - "@img/sharp-win32-x64": "0.34.5" - } - }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "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", - "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", - "license": "MIT", - "engines": { - "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==", - "license": "ISC", - "optional": true, - "dependencies": { - "minipass": "^3.1.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/stream-chain": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/stream-chain/-/stream-chain-2.2.5.tgz", - "integrity": "sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==", - "license": "BSD-3-Clause" - }, - "node_modules/stream-json": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/stream-json/-/stream-json-1.9.1.tgz", - "integrity": "sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==", - "license": "BSD-3-Clause", - "dependencies": { - "stream-chain": "^2.2.5" - } - }, - "node_modules/strict-uri-encode": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", - "integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "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", - "integrity": "sha512-k990yOT5G5rhX3XluRPw5Y8RLdJDW4dzQ29wWT66piHrbnM2KyamJ1dKgPsw4HzGHRWjDiSSdcI2WdxQUPV3aQ==", - "license": "MIT", - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "@types/node": ">=16" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/strnum": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.2.0.tgz", - "integrity": "sha512-Y7Bj8XyJxnPAORMZj/xltsfo55uOiyHcU2tnAVzHUnSJR/KsEX+9RoDeXEnsXtl/CX4fAcrt64gZ13aGaWPeBg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "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", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "license": "MIT", - "dependencies": { - "readable-stream": "3" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "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", - "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", - "license": "MIT", - "dependencies": { - "content-type": "^1.0.5", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" - }, - "engines": { - "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", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "license": "MIT", - "engines": { - "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", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" - }, - "node_modules/xml2js": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", - "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", - "license": "MIT", - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "license": "MIT", - "engines": { - "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" - } - } -} +{ + "name": "server", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "server", + "version": "1.0.0", + "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" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", + "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", + "license": "MIT", + "optional": true, + "dependencies": { + "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", + "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "cpu": [ + "ppc64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "cpu": [ + "riscv64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "cpu": [ + "riscv64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.7.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "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", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "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", + "integrity": "sha512-suhjmLI57Ewpmq00qaygS8UgEq2ly2PCItenIyhMqVjo4t4pGzqMvfgJuX8iWTeSDdfSSqS6j38fL4ToNL7Pfg==", + "license": "MIT", + "dependencies": { + "readable-stream": "^3.4.0" + } + }, + "node_modules/body-parser": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", + "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.3", + "http-errors": "^2.0.0", + "iconv-lite": "^0.7.0", + "on-finished": "^2.4.1", + "qs": "^6.14.1", + "raw-body": "^3.0.1", + "type-is": "^2.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "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", + "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "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", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "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", + "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/cors": { + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", + "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "license": "MIT", + "engines": { + "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", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.3.1.tgz", + "integrity": "sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "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", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "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", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "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", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.1", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "depd": "^2.0.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/fast-xml-builder": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.0.0.tgz", + "integrity": "sha512-fpZuDogrAgnyt9oDDz+5DBz0zgPdPZz6D4IR7iESxRXElrlGTRkHJ9eEt+SACRJwT0FNFrt71DFQIUFBJfX/uQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, + "node_modules/fast-xml-parser": { + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.4.2.tgz", + "integrity": "sha512-pw/6pIl4k0CSpElPEJhDppLzaixDEuWui2CUQQBH/ECDf7+y6YwA4Gf7Tyb0Rfe4DIMuZipYj4AEL0nACKglvQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "fast-xml-builder": "^1.0.0", + "strnum": "^2.1.2" + }, + "bin": { + "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", + "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/finalhandler": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", + "engines": { + "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", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "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", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "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", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "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", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "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", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "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", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "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", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "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", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "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", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "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", + "integrity": "sha512-E737MgufW8CeQAsTAtnEMrxZ9scMSf29kkhZoXzDTKj/Jszzo2SfeZUH9wbDQH2Rsq6TCtl/yQL0+XdVKZansQ==", + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.4", + "block-stream2": "^2.1.0", + "browser-or-node": "^2.1.1", + "buffer-crc32": "^1.0.0", + "eventemitter3": "^5.0.1", + "fast-xml-parser": "^5.3.4", + "ipaddr.js": "^2.0.1", + "lodash": "^4.17.21", + "mime-types": "^2.1.35", + "query-string": "^7.1.3", + "stream-json": "^1.8.0", + "through2": "^4.0.2", + "xml2js": "^0.5.0 || ^0.6.2" + }, + "engines": { + "node": "^16 || ^18 || >=20" + } + }, + "node_modules/minio/node_modules/ipaddr.js": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.3.0.tgz", + "integrity": "sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/minio/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minio/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "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", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", + "engines": { + "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", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "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", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "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", + "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "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.", + "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" + }, + "engines": { + "node": ">=10" + } + }, + "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", + "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==", + "license": "MIT", + "optional": true, + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "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", + "integrity": "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/query-string": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.1.3.tgz", + "integrity": "sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==", + "license": "MIT", + "dependencies": { + "decode-uri-component": "^0.2.2", + "filter-obj": "^1.1.0", + "split-on-first": "^1.0.0", + "strict-uri-encode": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" + }, + "engines": { + "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", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "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", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "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/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/sax": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.5.0.tgz", + "integrity": "sha512-21IYA3Q5cQf089Z6tgaUTr7lDAyzoTPx5HRtbhsME8Udispad8dC/+sziTNugOEx54ilvatQ9YCzl4KQLPcRHA==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/serve-static": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "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", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/sharp": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "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", + "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", + "license": "MIT", + "engines": { + "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==", + "license": "ISC", + "optional": true, + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stream-chain": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/stream-chain/-/stream-chain-2.2.5.tgz", + "integrity": "sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==", + "license": "BSD-3-Clause" + }, + "node_modules/stream-json": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/stream-json/-/stream-json-1.9.1.tgz", + "integrity": "sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==", + "license": "BSD-3-Clause", + "dependencies": { + "stream-chain": "^2.2.5" + } + }, + "node_modules/strict-uri-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", + "integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "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", + "integrity": "sha512-k990yOT5G5rhX3XluRPw5Y8RLdJDW4dzQ29wWT66piHrbnM2KyamJ1dKgPsw4HzGHRWjDiSSdcI2WdxQUPV3aQ==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "@types/node": ">=16" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/strnum": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.2.0.tgz", + "integrity": "sha512-Y7Bj8XyJxnPAORMZj/xltsfo55uOiyHcU2tnAVzHUnSJR/KsEX+9RoDeXEnsXtl/CX4fAcrt64gZ13aGaWPeBg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "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", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "license": "MIT", + "dependencies": { + "readable-stream": "3" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "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", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "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", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "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", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/xml2js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", + "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", + "license": "MIT", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "license": "MIT", + "engines": { + "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" + } + } +} diff --git a/server/package.json b/server/package.json index a0dd331..4f61142 100644 --- a/server/package.json +++ b/server/package.json @@ -1,25 +1,25 @@ -{ - "name": "server", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "start": "node index.js", - "rebuild:batches": "node scripts/rebuild-from-batches.js", - "diagnostics": "node scripts/plant-diagnostics.js", - "images:download": "node scripts/download-plant-images.js", - "test": "echo \"Error: no test specified\" && exit 1" - }, - "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" - } -} +{ + "name": "server", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "start": "node index.js", + "rebuild:batches": "node scripts/rebuild-from-batches.js", + "diagnostics": "node scripts/plant-diagnostics.js", + "images:download": "node scripts/download-plant-images.js", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "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" + } +} diff --git a/server/public/plants/.gitkeep b/server/public/plants/.gitkeep index 8b13789..d3f5a12 100644 --- a/server/public/plants/.gitkeep +++ b/server/public/plants/.gitkeep @@ -1 +1 @@ - + diff --git a/server/public/plants/manifest.json b/server/public/plants/manifest.json index 9992ad2..1f8e621 100644 --- a/server/public/plants/manifest.json +++ b/server/public/plants/manifest.json @@ -1,2877 +1,2877 @@ -{ - "generatedAt": "2026-03-12T09:19:24.727Z", - "summary": { - "totalPlants": 358, - "downloadedCount": 0, - "existingCount": 358, - "skippedCount": 0, - "failureCount": 0 - }, - "failures": [], - "items": [ - { - "id": "plant_8bfe537a28c86289", - "botanicalName": "Stapelia grandiflora", - "name": "Aasblume", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/98/Stapelia_grandiflora_22102013_1_%2810606394434%29.jpg/500px-Stapelia_grandiflora_22102013_1_%2810606394434%29.jpg", - "localImageUri": "/plants/stapelia-grandiflora--aasblume--b87af483.webp", - "status": "existing" - }, - { - "id": "plant_3e0a9ac0f2e3487e", - "botanicalName": "Adromischus cristatus", - "name": "Adromischus", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/15/Adromischus_cristatus_-_Gaiser_Conservatory_%28Manito_Park%29_-_IMG_7008.JPG/500px-Adromischus_cristatus_-_Gaiser_Conservatory_%28Manito_Park%29_-_IMG_7008.JPG", - "localImageUri": "/plants/adromischus-cristatus--adromischus--9b24b9fc.webp", - "status": "existing" - }, - { - "id": "plant_b149587ebd02e88b", - "botanicalName": "Saintpaulia ionantha", - "name": "Afrikanisches Veilchen", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/57/Streptocarpus_ionanthus_%28as_Saintpaulia_ionantha%29_-_Curtis%27_121_%28Ser._3_no._51%29_pl._7408_%281895%29.jpg/500px-Streptocarpus_ionanthus_%28as_Saintpaulia_ionantha%29_-_Curtis%27_121_%28Ser._3_no._51%29_pl._7408_%281895%29.jpg", - "localImageUri": "/plants/saintpaulia-ionantha--afrikanisches-veilchen--bc75f4a8.webp", - "status": "existing" - }, - { - "id": "plant_163ec12a26b24198", - "botanicalName": "Agave americana", - "name": "Agave", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/3b/Agave_July_2011-1.jpg/500px-Agave_July_2011-1.jpg", - "localImageUri": "/plants/agave-americana--agave--3b197a68.webp", - "status": "existing" - }, - { - "id": "plant_f35722f0d85fcbf0", - "botanicalName": "Aglaonema commutatum", - "name": "Aglaoneme", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c7/Aglaonema_commutatum_kz1.jpg/500px-Aglaonema_commutatum_kz1.jpg", - "localImageUri": "/plants/aglaonema-commutatum--aglaoneme--7928abe4.webp", - "status": "existing" - }, - { - "id": "plant_480b93349eb97dce", - "botanicalName": "Alocasia zebrina", - "name": "Alocasia zebrina", - "sourceUri": "wikimedia-search:Alocasia%20zebrina", - "localImageUri": "/plants/alocasia-zebrina--525caa90.webp", - "status": "existing" - }, - { - "id": "plant_521cc31a3ab2a5b1", - "botanicalName": "Cyclamen persicum", - "name": "Alpenveilchen", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/68/Yagur_%E2%80%93_Nesher%2C_the_Green_Path_%E2%80%93_Mount_Carmel_016.JPG/500px-Yagur_%E2%80%93_Nesher%2C_the_Green_Path_%E2%80%93_Mount_Carmel_016.JPG", - "localImageUri": "/plants/cyclamen-persicum--alpenveilchen--42e9e354.webp", - "status": "existing" - }, - { - "id": "plant_7a47f2728dced1a4", - "botanicalName": "Pilea cadierei", - "name": "Aluminium-Pflanze", - "sourceUri": "wikimedia-search:Pilea%20cadierei", - "localImageUri": "/plants/pilea-cadierei--aluminium-pflanze--3e1e1bd9.webp", - "status": "existing" - }, - { - "id": "plant_c623dbd931826123", - "botanicalName": "Alocasia amazonica", - "name": "Amazona-Taro", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/cf/Alocasia_x_amazonica_a1.jpg/500px-Alocasia_x_amazonica_a1.jpg", - "localImageUri": "/plants/alocasia-amazonica--amazona-taro--e1c87d71.webp", - "status": "existing" - }, - { - "id": "plant_28d349e6f67fe99a", - "botanicalName": "Anemone coronaria", - "name": "Anemone", - "sourceUri": "wikimedia-search:Anemone%20coronaria", - "localImageUri": "/plants/anemone-coronaria--anemone--8a7fda1c.webp", - "status": "existing" - }, - { - "id": "plant_7079ed3283a094f9", - "botanicalName": "Jasminum sambac", - "name": "Arabischer Jasmin", - "sourceUri": "wikimedia-search:Jasminum%20sambac", - "localImageUri": "/plants/jasminum-sambac--arabischer-jasmin--5be39aae.webp", - "status": "existing" - }, - { - "id": "plant_c2890f36d8fc9da0", - "botanicalName": "Arnica montana", - "name": "Arnika", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/17/Arnica_montana_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-015.jpg/500px-Arnica_montana_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-015.jpg", - "localImageUri": "/plants/arnica-montana--arnika--285e6ea8.webp", - "status": "existing" - }, - { - "id": "plant_fdadaf062de2c567", - "botanicalName": "Solanum melongena", - "name": "Aubergine", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/76/Solanum_melongena_24_08_2012_%281%29.JPG/500px-Solanum_melongena_24_08_2012_%281%29.JPG", - "localImageUri": "/plants/solanum-melongena--aubergine--5f3bad2f.webp", - "status": "existing" - }, - { - "id": "plant_480619fefb890692", - "botanicalName": "Valeriana officinalis", - "name": "Baldrian", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/af/Valeriana_officinalis_inflorescence_-_Niitv%C3%A4lja.jpg/500px-Valeriana_officinalis_inflorescence_-_Niitv%C3%A4lja.jpg", - "localImageUri": "/plants/valeriana-officinalis--baldrian--7bc7a2ae.webp", - "status": "existing" - }, - { - "id": "plant_b73b967c062264fa", - "botanicalName": "Bambusa vulgaris", - "name": "Bambusrohr", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/10/Golden_Bamboo%28Bambusa_vulgaris%29_in_Hong_Kong.jpg/500px-Golden_Bamboo%28Bambusa_vulgaris%29_in_Hong_Kong.jpg", - "localImageUri": "/plants/bambusa-vulgaris--bambusrohr--620e47a2.webp", - "status": "existing" - }, - { - "id": "plant_1b52f8bc38189420", - "botanicalName": "Musa acuminata", - "name": "Bananenpflanze", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/7d/Musa_acuminata_in_india01.jpg/500px-Musa_acuminata_in_india01.jpg", - "localImageUri": "/plants/musa-acuminata--bananenpflanze--0a6a2ad8.webp", - "status": "existing" - }, - { - "id": "plant_1f420e53ba82d27e", - "botanicalName": "Iris germanica", - "name": "Bart-Iris", - "sourceUri": "wikimedia-search:Iris%20germanica", - "localImageUri": "/plants/iris-germanica--bart-iris--f0e4d8d1.webp", - "status": "existing" - }, - { - "id": "plant_2c5e541195cb3797", - "botanicalName": "Dianthus barbatus", - "name": "Bartnelke", - "sourceUri": "wikimedia-search:Dianthus%20barbatus", - "localImageUri": "/plants/dianthus-barbatus--bartnelke--e1f96804.webp", - "status": "existing" - }, - { - "id": "plant_65672e0cb49ca62d", - "botanicalName": "Ocimum basilicum", - "name": "Basilikum", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/97/Ocimum_basilicum_8zz.jpg/500px-Ocimum_basilicum_8zz.jpg", - "localImageUri": "/plants/ocimum-basilicum--basilikum--cdc33445.webp", - "status": "existing" - }, - { - "id": "plant_c804e440aeb95635", - "botanicalName": "Lavatera trimestris", - "name": "Bechermalve", - "sourceUri": "wikimedia-search:Lavatera%20trimestris", - "localImageUri": "/plants/lavatera-trimestris--bechermalve--96fa8526.webp", - "status": "existing" - }, - { - "id": "plant_11f9d18d047193e4", - "botanicalName": "Chamaedorea elegans", - "name": "Bergpalme", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/64/Chamaedorea_elegans_Mart.JPG/500px-Chamaedorea_elegans_Mart.JPG", - "localImageUri": "/plants/chamaedorea-elegans--bergpalme--05a6cf35.webp", - "status": "existing" - }, - { - "id": "plant_519742b7ea9df158", - "botanicalName": "Billbergia nutans", - "name": "Billbergia", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/9/9e/Billbergia_nutans1SHSU.jpg", - "localImageUri": "/plants/billbergia-nutans--billbergia--a659ab7f.webp", - "status": "existing" - }, - { - "id": "plant_2347cc2289a2ef8b", - "botanicalName": "Ficus benjamina", - "name": "Birkenfeige", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/19/Starr-080608-7576-Ficus_benjamina-habit_with_Laysan_albatross-Gym_Sand_Island-Midway_Atoll_%2824823189861%29.jpg/500px-Starr-080608-7576-Ficus_benjamina-habit_with_Laysan_albatross-Gym_Sand_Island-Midway_Atoll_%2824823189861%29.jpg", - "localImageUri": "/plants/ficus-benjamina--birkenfeige--399b661c.webp", - "status": "existing" - }, - { - "id": "plant_4be713bff78ae299", - "botanicalName": "Senecio serpens", - "name": "Blauer Kreuzkraut", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/57/Senecio_serpens_04.jpg/500px-Senecio_serpens_04.jpg", - "localImageUri": "/plants/senecio-serpens--blauer-kreuzkraut--4ec1f347.webp", - "status": "existing" - }, - { - "id": "plant_51da778adc3d568f", - "botanicalName": "Phlebodium aureum", - "name": "Blaues Kanaelfarn", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/2d/Starr_050107-2831_Phlebodium_aureum.jpg/500px-Starr_050107-2831_Phlebodium_aureum.jpg", - "localImageUri": "/plants/phlebodium-aureum--blaues-kanaelfarn--a630296a.webp", - "status": "existing" - }, - { - "id": "plant_f696d8640ac1e58b", - "botanicalName": "Euphorbia tirucalli", - "name": "Bleistiftkaktus", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/22/Euphorbia_tirucalli_in_the_wild_by_tonrulkens.jpg/500px-Euphorbia_tirucalli_in_the_wild_by_tonrulkens.jpg", - "localImageUri": "/plants/euphorbia-tirucalli--bleistiftkaktus--2760cacf.webp", - "status": "existing" - }, - { - "id": "plant_fcfdae786a599215", - "botanicalName": "Plumbago auriculata", - "name": "Bleiwurz", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e1/Plumbago_auriculata_2718.jpg/500px-Plumbago_auriculata_2718.jpg", - "localImageUri": "/plants/plumbago-auriculata--bleiwurz--a1ea78f5.webp", - "status": "existing" - }, - { - "id": "plant_2778ede47b41928b", - "botanicalName": "Canna indica", - "name": "Blumenschilfrohr", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/1c/Cinnamon-bellied_flowerpiercer_%28Diglossa_baritula%29_male_on_Indian_shot_%28Canna_indica%29_Finca_El_Pilar.jpg/500px-Cinnamon-bellied_flowerpiercer_%28Diglossa_baritula%29_male_on_Indian_shot_%28Canna_indica%29_Finca_El_Pilar.jpg", - "localImageUri": "/plants/canna-indica--blumenschilfrohr--adfa9705.webp", - "status": "existing" - }, - { - "id": "plant_7b30624e5b0b4c89", - "botanicalName": "Geranium sanguineum", - "name": "Blutroter Storchschnabel", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/8c/2012-07-03_Bloody_Crane%27s-bill%2C_Hauxley%2C_Northumberland_1.jpg/500px-2012-07-03_Bloody_Crane%27s-bill%2C_Hauxley%2C_Northumberland_1.jpg", - "localImageUri": "/plants/geranium-sanguineum--blutroter-storchschnabel--9d8300fb.webp", - "status": "existing" - }, - { - "id": "plant_02e3ea2f54fa9fcb", - "botanicalName": "Satureja hortensis", - "name": "Bohnenkraut", - "sourceUri": "wikimedia-search:Satureja%20hortensis", - "localImageUri": "/plants/satureja-hortensis--bohnenkraut--b5b822ab.webp", - "status": "existing" - }, - { - "id": "plant_c71619cd9a02cef2", - "botanicalName": "Ficus retusa", - "name": "Bonsai-Feige", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/cf/Ficus_retusa_herbarium_sheet.jpg/500px-Ficus_retusa_herbarium_sheet.jpg", - "localImageUri": "/plants/ficus-retusa--bonsai-feige--dff4fbd3.webp", - "status": "existing" - }, - { - "id": "plant_fb10011bdfcaeb73", - "botanicalName": "Borago officinalis", - "name": "Borretsch", - "sourceUri": "wikimedia-search:Borago%20officinalis", - "localImageUri": "/plants/borago-officinalis--borretsch--0d13299a.webp", - "status": "existing" - }, - { - "id": "plant_a65e5c9dedb9cd6f", - "botanicalName": "Bougainvillea spectabilis", - "name": "Bougainvillea", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/ae/Starr_030418-0061_Bougainvillea_spectabilis.jpg/500px-Starr_030418-0061_Bougainvillea_spectabilis.jpg", - "localImageUri": "/plants/bougainvillea-spectabilis--bougainvillea--0d84eedd.webp", - "status": "existing" - }, - { - "id": "plant_34a9a605f91a0e38", - "botanicalName": "Kalanchoe daigremontiana", - "name": "Brutblatt", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/fc/Vivipary_in_Kalanchoe_daigremontiana.jpg/500px-Vivipary_in_Kalanchoe_daigremontiana.jpg", - "localImageUri": "/plants/kalanchoe-daigremontiana--brutblatt--5b643bf7.webp", - "status": "existing" - }, - { - "id": "plant_7d5148b82570ac03", - "botanicalName": "Soleirolia soleirolii", - "name": "Bubikopf", - "sourceUri": "wikimedia-search:Soleirolia%20soleirolii", - "localImageUri": "/plants/soleirolia-soleirolii--bubikopf--b1b13e0f.webp", - "status": "existing" - }, - { - "id": "plant_a4cf51a5e4359d1d", - "botanicalName": "Buxus sempervirens", - "name": "Buchsbaum", - "sourceUri": "wikimedia-search:Buxus%20sempervirens", - "localImageUri": "/plants/buxus-sempervirens--buchsbaum--598f8440.webp", - "status": "existing" - }, - { - "id": "plant_ca3703f121432723", - "botanicalName": "Caladium bicolor", - "name": "Buntblatt", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/f8/Caladium_bicolor_2.jpg/500px-Caladium_bicolor_2.jpg", - "localImageUri": "/plants/caladium-bicolor--buntblatt--d052df1e.webp", - "status": "existing" - }, - { - "id": "plant_99ba7fe9e23a07d2", - "botanicalName": "Plectranthus scutellarioides", - "name": "Buntnessel", - "sourceUri": "wikimedia-search:Plectranthus%20scutellarioides", - "localImageUri": "/plants/plectranthus-scutellarioides--buntnessel--7e6c3a78.webp", - "status": "existing" - }, - { - "id": "plant_d13f1280e602ce42", - "botanicalName": "Goeppertia insignis", - "name": "Calathea lancifolia", - "sourceUri": "wikimedia-search:Goeppertia%20insignis", - "localImageUri": "/plants/goeppertia-insignis--calathea-lancifolia--f77abcca.webp", - "status": "existing" - }, - { - "id": "plant_d1a2562fb13fc53a", - "botanicalName": "Goeppertia ornata", - "name": "Calathea ornata", - "sourceUri": "wikimedia-search:Goeppertia%20ornata", - "localImageUri": "/plants/goeppertia-ornata--calathea-ornata--e7f67cad.webp", - "status": "existing" - }, - { - "id": "plant_de32e74f5d2e4f07", - "botanicalName": "Calibrachoa hybrida", - "name": "Calibrachoa", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/fb/Calibrachoa_flower_red.jpg/500px-Calibrachoa_flower_red.jpg", - "localImageUri": "/plants/calibrachoa-hybrida--calibrachoa--18b44d0e.webp", - "status": "existing" - }, - { - "id": "plant_df8b72684a52d16d", - "botanicalName": "Zantedeschia aethiopica", - "name": "Calla", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a2/Zantedeschia_aethiopica_-1.jpg/500px-Zantedeschia_aethiopica_-1.jpg", - "localImageUri": "/plants/zantedeschia-aethiopica--calla--c739da85.webp", - "status": "existing" - }, - { - "id": "plant_c1e5518101af0660", - "botanicalName": "Callisia repens", - "name": "Callisia", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/7c/Callisia_repens_starr.jpg/500px-Callisia_repens_starr.jpg", - "localImageUri": "/plants/callisia-repens--callisia--65401a5e.webp", - "status": "existing" - }, - { - "id": "plant_e98319d5942ee47b", - "botanicalName": "Cattleya labiata", - "name": "Cattleya-Orchidee", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e6/Labiata.jpg/500px-Labiata.jpg", - "localImageUri": "/plants/cattleya-labiata--cattleya-orchidee--91962802.webp", - "status": "existing" - }, - { - "id": "plant_f5fef1b22db032e8", - "botanicalName": "Capsicum annuum", - "name": "Chili", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/d2/Capsicum_annuum_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-027.jpg/500px-Capsicum_annuum_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-027.jpg", - "localImageUri": "/plants/capsicum-annuum--chili--dabf0f0e.webp", - "status": "existing" - }, - { - "id": "plant_282d1b42588a5121", - "botanicalName": "Livistona chinensis", - "name": "Chinesische Fächerpalme", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/f6/Livistona-chinensis.jpg/500px-Livistona-chinensis.jpg", - "localImageUri": "/plants/livistona-chinensis--chinesische-facherpalme--773e43a2.webp", - "status": "existing" - }, - { - "id": "plant_beef88438a4a5a77", - "botanicalName": "Rosa chinensis", - "name": "Chinesische Rose", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/2a/Rosa_chinensis.jpg/500px-Rosa_chinensis.jpg", - "localImageUri": "/plants/rosa-chinensis--chinesische-rose--2c0514b0.webp", - "status": "existing" - }, - { - "id": "plant_3062bd4ee2363d81", - "botanicalName": "Wisteria sinensis", - "name": "Chinesischer Blauregen", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/7a/Chinesischer_Blauregen_Detail_Bl%C3%BCtentraube.JPG/500px-Chinesischer_Blauregen_Detail_Bl%C3%BCtentraube.JPG", - "localImageUri": "/plants/wisteria-sinensis--chinesischer-blauregen--8887793e.webp", - "status": "existing" - }, - { - "id": "plant_552c1df47769e60a", - "botanicalName": "Euphorbia milii", - "name": "Christusdorn", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/77/Euphorbia_Milii_flowers.jpg/500px-Euphorbia_Milii_flowers.jpg", - "localImageUri": "/plants/euphorbia-milii--christusdorn--f647812e.webp", - "status": "existing" - }, - { - "id": "plant_d726e9204f2d2353", - "botanicalName": "Chrysanthemum indicum", - "name": "Chrysantheme", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/d6/Chrysanthemum_indicum1.jpg/500px-Chrysanthemum_indicum1.jpg", - "localImageUri": "/plants/chrysanthemum-indicum--chrysantheme--f3f1b7ad.webp", - "status": "existing" - }, - { - "id": "plant_ca9d5a83cf397269", - "botanicalName": "Clematis viticella", - "name": "Clematis", - "sourceUri": "wikimedia-search:Clematis%20viticella", - "localImageUri": "/plants/clematis-viticella--clematis--7c06c3b1.webp", - "status": "existing" - }, - { - "id": "plant_79e87c68ecaf5082", - "botanicalName": "Columnea gloriosa", - "name": "Columnea", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/32/Columnea_gloriosa_%2849470911201%29.jpg/500px-Columnea_gloriosa_%2849470911201%29.jpg", - "localImageUri": "/plants/columnea-gloriosa--columnea--3fd247d6.webp", - "status": "existing" - }, - { - "id": "plant_5136b27d56c24f26", - "botanicalName": "Cryptanthus bivittatus", - "name": "Cryptanthus", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/d1/CryptanthusBivittatus.jpg/500px-CryptanthusBivittatus.jpg", - "localImageUri": "/plants/cryptanthus-bivittatus--cryptanthus--0300865d.webp", - "status": "existing" - }, - { - "id": "plant_177a5dd7d3237533", - "botanicalName": "Ctenanthe burle-marxii", - "name": "Ctenanthe", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/7d/Ctenanthe_burle-marxii.jpg/500px-Ctenanthe_burle-marxii.jpg", - "localImageUri": "/plants/ctenanthe-burle-marxii--ctenanthe--aaacfef1.webp", - "status": "existing" - }, - { - "id": "plant_4698cb973868e2ea", - "botanicalName": "Helichrysum italicum", - "name": "Currykraut", - "sourceUri": "wikimedia-search:Helichrysum%20italicum", - "localImageUri": "/plants/helichrysum-italicum--currykraut--9f84755c.webp", - "status": "existing" - }, - { - "id": "plant_d38f9fdbd2fc0128", - "botanicalName": "Dahlia pinnata", - "name": "Dahlie", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/60/Borboletas_em_Mini-D%C3%A1lias.JPG/500px-Borboletas_em_Mini-D%C3%A1lias.JPG", - "localImageUri": "/plants/dahlia-pinnata--dahlie--34a69e35.webp", - "status": "existing" - }, - { - "id": "plant_0f54f9b5c4726b7c", - "botanicalName": "Dendrobium nobile", - "name": "Dendrobium", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/bb/Dendrobium_nobile_-_flower_view_01.jpg/500px-Dendrobium_nobile_-_flower_view_01.jpg", - "localImageUri": "/plants/dendrobium-nobile--dendrobium--a29be123.webp", - "status": "existing" - }, - { - "id": "plant_4a40e184dc1158af", - "botanicalName": "Dieffenbachia seguine", - "name": "Dieffenbachie", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/80/Dieffenbachia_seguine1FKST.jpg/500px-Dieffenbachia_seguine1FKST.jpg", - "localImageUri": "/plants/dieffenbachia-seguine--dieffenbachie--755822dd.webp", - "status": "existing" - }, - { - "id": "plant_e2d789d2529ac262", - "botanicalName": "Anethum graveolens", - "name": "Dill", - "sourceUri": "wikimedia-search:Anethum%20graveolens", - "localImageUri": "/plants/anethum-graveolens--dill--b93ab119.webp", - "status": "existing" - }, - { - "id": "plant_5a0f781f2fbe33a1", - "botanicalName": "Dischidia ruscifolia", - "name": "Dischidia", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/ec/%E7%99%BE%E8%90%AC%E5%BF%83_Dischidia_ruscifolia_-%E9%A6%99%E6%B8%AF%E5%8B%95%E6%A4%8D%E7%89%A9%E5%85%AC%E5%9C%92_Hong_Kong_Botanical_Garden-_%289240152650%29.jpg/500px-%E7%99%BE%E8%90%AC%E5%BF%83_Dischidia_ruscifolia_-%E9%A6%99%E6%B8%AF%E5%8B%95%E6%A4%8D%E7%89%A9%E5%85%AC%E5%9C%92_Hong_Kong_Botanical_Garden-_%289240152650%29.jpg", - "localImageUri": "/plants/dischidia-ruscifolia--dischidia--962061db.webp", - "status": "existing" - }, - { - "id": "plant_d888afa045930bba", - "botanicalName": "Dracaena marginata", - "name": "Drachenbaum", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/61/Dracaena_reflexa.JPG/500px-Dracaena_reflexa.JPG", - "localImageUri": "/plants/dracaena-marginata--drachenbaum--ae46a13c.webp", - "status": "existing" - }, - { - "id": "plant_03f2e14e6adb42c5", - "botanicalName": "Streptocarpus hybridus", - "name": "Drehfrucht", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/ee/2007-03-20Streptocarpus03.jpg/500px-2007-03-20Streptocarpus03.jpg", - "localImageUri": "/plants/streptocarpus-hybridus--drehfrucht--d30e3476.webp", - "status": "existing" - }, - { - "id": "plant_3c9b2546fb073192", - "botanicalName": "Dudleya brittonii", - "name": "Dudleya", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/10/Dudleya_Brittonii.jpg/500px-Dudleya_Brittonii.jpg", - "localImageUri": "/plants/dudleya-brittonii--dudleya--be6042d1.webp", - "status": "existing" - }, - { - "id": "plant_db00b284aaf5553b", - "botanicalName": "Lobularia maritima", - "name": "Duftsteinrich", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a0/Smagliczka_nadmorska_1.jpg/500px-Smagliczka_nadmorska_1.jpg", - "localImageUri": "/plants/lobularia-maritima--duftsteinrich--309e832f.webp", - "status": "existing" - }, - { - "id": "plant_ded5f50a41d943e2", - "botanicalName": "Lathyrus odoratus", - "name": "Duftwicke", - "sourceUri": "wikimedia-search:Lathyrus%20odoratus", - "localImageUri": "/plants/lathyrus-odoratus--duftwicke--029de58d.webp", - "status": "existing" - }, - { - "id": "plant_1c5e1673e5c8084d", - "botanicalName": "Sorbus aucuparia", - "name": "Eberesche", - "sourceUri": "wikimedia-search:Sorbus%20aucuparia", - "localImageUri": "/plants/sorbus-aucuparia--eberesche--8ebfe649.webp", - "status": "existing" - }, - { - "id": "plant_19ba49fd14de0fd2", - "botanicalName": "Echeveria elegans", - "name": "Echeverie", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/5d/Echeveria_elegans_-_1.png/500px-Echeveria_elegans_-_1.png", - "localImageUri": "/plants/echeveria-elegans--echeverie--71f5556f.webp", - "status": "existing" - }, - { - "id": "plant_adc9e050aeb462c7", - "botanicalName": "Lavandula angustifolia", - "name": "Echter Lavendel", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/4/40/Lavandula_angustifolia_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-087.jpg", - "localImageUri": "/plants/lavandula-angustifolia--echter-lavendel--cfd090c5.webp", - "status": "existing" - }, - { - "id": "plant_2f9ab7e162ca10e4", - "botanicalName": "Hedera helix", - "name": "Efeu", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/5a/Hedera_helix_Dover.jpg/500px-Hedera_helix_Dover.jpg", - "localImageUri": "/plants/hedera-helix--efeu--cebdfbf1.webp", - "status": "existing" - }, - { - "id": "plant_81cfa08a34c49816", - "botanicalName": "Pelargonium peltatum", - "name": "Efeu-Geranie", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/98/Pelargonium_peltatum_flower.jpg/500px-Pelargonium_peltatum_flower.jpg", - "localImageUri": "/plants/pelargonium-peltatum--efeu-geranie--8cd609cc.webp", - "status": "existing" - }, - { - "id": "plant_1401620498ee85ea", - "botanicalName": "Quercus robur", - "name": "Eiche", - "sourceUri": "wikimedia-search:Quercus%20robur", - "localImageUri": "/plants/quercus-robur--eiche--ea94af29.webp", - "status": "existing" - }, - { - "id": "plant_9c1fe0b19dc69115", - "botanicalName": "Begonia semperflorens-cultorum", - "name": "Eisbegonie", - "sourceUri": "wikimedia-search:Begonia%20semperflorens-cultorum", - "localImageUri": "/plants/begonia-semperflorens-cultorum--eisbegonie--7d66e22f.webp", - "status": "existing" - }, - { - "id": "plant_80dcaefb7e942ba2", - "botanicalName": "Verbena bonariensis", - "name": "Eisenkraut", - "sourceUri": "wikimedia-search:Verbena%20bonariensis", - "localImageUri": "/plants/verbena-bonariensis--eisenkraut--486982ce.webp", - "status": "existing" - }, - { - "id": "plant_dc1a3a410bf856da", - "botanicalName": "Fragaria ananassa", - "name": "Erdbeere", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/4c/Garden_strawberry_%28Fragaria_%C3%97_ananassa%29_single2.jpg/500px-Garden_strawberry_%28Fragaria_%C3%97_ananassa%29_single2.jpg", - "localImageUri": "/plants/fragaria-ananassa--erdbeere--4a97a911.webp", - "status": "existing" - }, - { - "id": "plant_3900a4af2d8f685c", - "botanicalName": "Sedum morganianum", - "name": "Eselschwanz", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e5/Donkey%27s_tail_in_bloom_March_06.jpg/500px-Donkey%27s_tail_in_bloom_March_06.jpg", - "localImageUri": "/plants/sedum-morganianum--eselschwanz--f6256abc.webp", - "status": "existing" - }, - { - "id": "plant_441bffa80236bad9", - "botanicalName": "Artemisia dracunculus", - "name": "Estragon", - "sourceUri": "wikimedia-search:Artemisia%20dracunculus", - "localImageUri": "/plants/artemisia-dracunculus--estragon--68c643ad.webp", - "status": "existing" - }, - { - "id": "plant_ef61030c75921bec", - "botanicalName": "Eucalyptus globulus", - "name": "Eukalyptus", - "sourceUri": "wikimedia-search:Eucalyptus%20globulus", - "localImageUri": "/plants/eucalyptus-globulus--eukalyptus--48f49df6.webp", - "status": "existing" - }, - { - "id": "plant_bcda607d5ebeba6e", - "botanicalName": "Acer palmatum", - "name": "Faecherahorn", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/d6/Acer_palmatum0.jpg/500px-Acer_palmatum0.jpg", - "localImageUri": "/plants/acer-palmatum--faecherahorn--388b6858.webp", - "status": "existing" - }, - { - "id": "plant_44ed48e3379766d4", - "botanicalName": "Schefflera elegantissima", - "name": "Falsche Aralie", - "sourceUri": "wikimedia-search:Schefflera%20elegantissima", - "localImageUri": "/plants/schefflera-elegantissima--falsche-aralie--ff7f753e.webp", - "status": "existing" - }, - { - "id": "plant_f8e84be57621f80c", - "botanicalName": "Ferocactus cylindraceus", - "name": "Fass-Kaktus", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/05/Ferocactus-cylindraceus.jpg/500px-Ferocactus-cylindraceus.jpg", - "localImageUri": "/plants/ferocactus-cylindraceus--fass-kaktus--ef5c90b1.webp", - "status": "existing" - }, - { - "id": "plant_502fa49e2138d4e5", - "botanicalName": "Fatsia japonica", - "name": "Fatsia", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/f4/Old_Fatsia_japonica_with_blosems.jpg/500px-Old_Fatsia_japonica_with_blosems.jpg", - "localImageUri": "/plants/fatsia-japonica--fatsia--425270ac.webp", - "status": "existing" - }, - { - "id": "plant_4d2d5509b4c55176", - "botanicalName": "Pinguicula grandiflora", - "name": "Fettkraut", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b2/Pinguicula_grandiflora_001.jpg/500px-Pinguicula_grandiflora_001.jpg", - "localImageUri": "/plants/pinguicula-grandiflora--fettkraut--8ec9dead.webp", - "status": "existing" - }, - { - "id": "plant_133e475a45d4a204", - "botanicalName": "Salvia splendens", - "name": "Feuersalbei", - "sourceUri": "wikimedia-search:Salvia%20splendens", - "localImageUri": "/plants/salvia-splendens--feuersalbei--09913571.webp", - "status": "existing" - }, - { - "id": "plant_982eaf3da780eb59", - "botanicalName": "Picea abies", - "name": "Fichte", - "sourceUri": "wikimedia-search:Picea%20abies", - "localImageUri": "/plants/picea-abies--fichte--400d9dc4.webp", - "status": "existing" - }, - { - "id": "plant_04676d4c182b8d1f", - "botanicalName": "Ficus altissima", - "name": "Ficus altissima", - "sourceUri": "wikimedia-search:Ficus%20altissima", - "localImageUri": "/plants/ficus-altissima--76a13dda.webp", - "status": "existing" - }, - { - "id": "plant_ea41ca92364af519", - "botanicalName": "Ficus microcarpa", - "name": "Ficus microcarpa", - "sourceUri": "wikimedia-search:Ficus%20microcarpa", - "localImageUri": "/plants/ficus-microcarpa--ca033402.webp", - "status": "existing" - }, - { - "id": "plant_a45983ad9bacfbd3", - "botanicalName": "Vriesea splendens", - "name": "Flammen-Bromelie", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b6/Bromelia1.jpg/500px-Bromelia1.jpg", - "localImageUri": "/plants/vriesea-splendens--flammen-bromelie--debc6faa.webp", - "status": "existing" - }, - { - "id": "plant_370e9f24edf68a0c", - "botanicalName": "Delonix regia", - "name": "Flammenbaum", - "sourceUri": "wikimedia-search:Delonix%20regia", - "localImageUri": "/plants/delonix-regia--flammenbaum--efa632a4.webp", - "status": "existing" - }, - { - "id": "plant_47552862396b817d", - "botanicalName": "Phlox paniculata", - "name": "Flammenblume", - "sourceUri": "wikimedia-search:Phlox%20paniculata", - "localImageUri": "/plants/phlox-paniculata--flammenblume--0bbdd41e.webp", - "status": "existing" - }, - { - "id": "plant_4385d6c520bf6b30", - "botanicalName": "Impatiens walleriana", - "name": "Fleissiges Lieschen", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/28/Impatienswalleriana.jpg/500px-Impatienswalleriana.jpg", - "localImageUri": "/plants/impatiens-walleriana--fleissiges-lieschen--5816f930.webp", - "status": "existing" - }, - { - "id": "plant_11018f19eabb8229", - "botanicalName": "Syringa vulgaris", - "name": "Flieder", - "sourceUri": "wikimedia-search:Syringa%20vulgaris", - "localImageUri": "/plants/syringa-vulgaris--flieder--7e22429d.webp", - "status": "existing" - }, - { - "id": "plant_a1224f40826b5089", - "botanicalName": "Begonia maculata", - "name": "Forellen-Begonie", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/df/Begonia_maculata3073316230.jpg/500px-Begonia_maculata3073316230.jpg", - "localImageUri": "/plants/begonia-maculata--forellen-begonie--5cce47c8.webp", - "status": "existing" - }, - { - "id": "plant_30b30e6adcb6e218", - "botanicalName": "Forsythia x intermedia", - "name": "Forsythie", - "sourceUri": "wikimedia-search:Forsythia%20x%20intermedia", - "localImageUri": "/plants/forsythia-x-intermedia--forsythie--390c28f1.webp", - "status": "existing" - }, - { - "id": "plant_fbe673c97a27643c", - "botanicalName": "Adiantum raddianum", - "name": "Frauenhaarfarn", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/45/Starr_030807-0143_Adiantum_raddianum.jpg/500px-Starr_030807-0143_Adiantum_raddianum.jpg", - "localImageUri": "/plants/adiantum-raddianum--frauenhaarfarn--d47cef0b.webp", - "status": "existing" - }, - { - "id": "plant_2c359b2ed2eeb763", - "botanicalName": "Freesia refracta", - "name": "Freesie", - "sourceUri": "wikimedia-search:Freesia%20refracta", - "localImageUri": "/plants/freesia-refracta--freesie--9dafaec2.webp", - "status": "existing" - }, - { - "id": "plant_253febdb6b4c4860", - "botanicalName": "Fuchsia hybrida", - "name": "Fuchsie", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/bf/Brincos_De_Princesa.jpg/500px-Brincos_De_Princesa.jpg", - "localImageUri": "/plants/fuchsia-hybrida--fuchsie--93ef43c2.webp", - "status": "existing" - }, - { - "id": "plant_416995465e65262d", - "botanicalName": "Amaranthus caudatus", - "name": "Fuchsschwanz", - "sourceUri": "wikimedia-search:Amaranthus%20caudatus", - "localImageUri": "/plants/amaranthus-caudatus--fuchsschwanz--ae0190ae.webp", - "status": "existing" - }, - { - "id": "plant_45589064f63546e7", - "botanicalName": "Bellis perennis", - "name": "Gaensebluemchen", - "sourceUri": "wikimedia-search:Bellis%20perennis", - "localImageUri": "/plants/bellis-perennis--gaensebluemchen--324d3eb0.webp", - "status": "existing" - }, - { - "id": "plant_7e81c1b15627e3d7", - "botanicalName": "Gardenia jasminoides", - "name": "Gardenie", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/54/Gardenia_jasminoides_flower_Argentina.jpg/500px-Gardenia_jasminoides_flower_Argentina.jpg", - "localImageUri": "/plants/gardenia-jasminoides--gardenie--f8284265.webp", - "status": "existing" - }, - { - "id": "plant_78a6ccea1e54390f", - "botanicalName": "Impatiens balsamina", - "name": "Gartenbalsamine", - "sourceUri": "wikimedia-search:Impatiens%20balsamina", - "localImageUri": "/plants/impatiens-balsamina--gartenbalsamine--4e1447e8.webp", - "status": "existing" - }, - { - "id": "plant_6e54d649a0c3c691", - "botanicalName": "Hibiscus syriacus", - "name": "Gartenhibiskus", - "sourceUri": "wikimedia-search:Hibiscus%20syriacus", - "localImageUri": "/plants/hibiscus-syriacus--gartenhibiskus--4701a393.webp", - "status": "existing" - }, - { - "id": "plant_c63e701e278fa8ae", - "botanicalName": "Gasteria carinata", - "name": "Gasteria", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/91/2_Gasteria_carinata_var_carinata.jpg/500px-2_Gasteria_carinata_var_carinata.jpg", - "localImageUri": "/plants/gasteria-carinata--gasteria--b27de8c8.webp", - "status": "existing" - }, - { - "id": "plant_fa2afbb2eb4500a7", - "botanicalName": "Maranta leuconeura", - "name": "Gebet-Pflanze", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/4a/Maranta_leuconeura3.jpg/500px-Maranta_leuconeura3.jpg", - "localImageUri": "/plants/maranta-leuconeura--gebet-pflanze--e50f6916.webp", - "status": "existing" - }, - { - "id": "plant_16c869313cd292ca", - "botanicalName": "Ficus lyrata", - "name": "Geigenfeige", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/84/Starr_031108-0130_Ficus_lyrata.jpg/500px-Starr_031108-0130_Ficus_lyrata.jpg", - "localImageUri": "/plants/ficus-lyrata--geigenfeige--c025bb04.webp", - "status": "existing" - }, - { - "id": "plant_cfd64439fa554689", - "botanicalName": "Lonicera japonica", - "name": "Geissblatt", - "sourceUri": "wikimedia-search:Lonicera%20japonica", - "localImageUri": "/plants/lonicera-japonica--geissblatt--4b2c6fdb.webp", - "status": "existing" - }, - { - "id": "plant_25cb30720168c488", - "botanicalName": "Graptopetalum paraguayense", - "name": "Geisterpflanze", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/59/%28MHNT%29_Graptopetalum_paraguayense_-_leaves.jpg/500px-%28MHNT%29_Graptopetalum_paraguayense_-_leaves.jpg", - "localImageUri": "/plants/graptopetalum-paraguayense--geisterpflanze--9584de97.webp", - "status": "existing" - }, - { - "id": "plant_87b1168e48dec833", - "botanicalName": "Gerbera jamesonii", - "name": "Gerbera", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/0b/Gerbera_jamesonii_%28Asteraceae%29.jpg/500px-Gerbera_jamesonii_%28Asteraceae%29.jpg", - "localImageUri": "/plants/gerbera-jamesonii--gerbera--f17eec14.webp", - "status": "existing" - }, - { - "id": "plant_b93632ad7bfff83a", - "botanicalName": "Platycerium bifurcatum", - "name": "Geweihfarn", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/5a/Platycerium_bifurcatum_kz01.jpg/500px-Platycerium_bifurcatum_kz01.jpg", - "localImageUri": "/plants/platycerium-bifurcatum--geweihfarn--991495f9.webp", - "status": "existing" - }, - { - "id": "plant_d8cefda760f89a55", - "botanicalName": "Ginkgo biloba", - "name": "Ginkgo", - "sourceUri": "wikimedia-search:Ginkgo%20biloba", - "localImageUri": "/plants/ginkgo-biloba--ginkgo--8d8c3f3f.webp", - "status": "existing" - }, - { - "id": "plant_5037ed9b79cd8298", - "botanicalName": "Gladiolus hortulanus", - "name": "Gladiole", - "sourceUri": "wikimedia-search:Gladiolus%20hortulanus", - "localImageUri": "/plants/gladiolus-hortulanus--gladiole--e2a2d34f.webp", - "status": "existing" - }, - { - "id": "plant_7e449dc7aefa50dc", - "botanicalName": "Gloxinia speciosa", - "name": "Gloxinie", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/13/Florada_da_Glox%C3%ADnia.jpg/500px-Florada_da_Glox%C3%ADnia.jpg", - "localImageUri": "/plants/gloxinia-speciosa--gloxinie--8a73752c.webp", - "status": "existing" - }, - { - "id": "plant_ef8440900dc6f48a", - "botanicalName": "Pachira aquatica", - "name": "Glueckskastanie", - "sourceUri": "wikimedia-search:Pachira%20aquatica", - "localImageUri": "/plants/pachira-aquatica--glueckskastanie--8e9a0935.webp", - "status": "existing" - }, - { - "id": "plant_d77c5e78b5a6cd52", - "botanicalName": "Echinocactus grusonii", - "name": "Goldene Tonne", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/25/Echinocactus_grusonii_%28aka%29.jpg/500px-Echinocactus_grusonii_%28aka%29.jpg", - "localImageUri": "/plants/echinocactus-grusonii--goldene-tonne--d5268f53.webp", - "status": "existing" - }, - { - "id": "plant_86b6774738a97ccf", - "botanicalName": "Phyllostachys aurea", - "name": "Goldener Bambus", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/3b/Phyllostachys_aurea0.jpg/500px-Phyllostachys_aurea0.jpg", - "localImageUri": "/plants/phyllostachys-aurea--goldener-bambus--e05d0c9f.webp", - "status": "existing" - }, - { - "id": "plant_cd5e679bdf1106fa", - "botanicalName": "Dypsis lutescens", - "name": "Goldfruchtpalme", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/22/%E6%95%A3%E5%B0%BE%E8%91%B5Dypsis_lutescens_20210511145013_05.jpg/500px-%E6%95%A3%E5%B0%BE%E8%91%B5Dypsis_lutescens_20210511145013_05.jpg", - "localImageUri": "/plants/dypsis-lutescens--goldfruchtpalme--890812c2.webp", - "status": "existing" - }, - { - "id": "plant_64ff12d55ec3e694", - "botanicalName": "Punica granatum", - "name": "Granatapfelbaum", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/6a/Pomegranate_Juice_%282019%29.jpg/500px-Pomegranate_Juice_%282019%29.jpg", - "localImageUri": "/plants/punica-granatum--granatapfelbaum--facf4f0c.webp", - "status": "existing" - }, - { - "id": "plant_6979e7e4cf35ae8e", - "botanicalName": "Urtica dioica", - "name": "Grosse Brennessel", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/6f/Fen_nettle_%28Urtica_dioica_ssp._galeopsifolia%29_-_geograph.org.uk_-_5423125.jpg/500px-Fen_nettle_%28Urtica_dioica_ssp._galeopsifolia%29_-_geograph.org.uk_-_5423125.jpg", - "localImageUri": "/plants/urtica-dioica--grosse-brennessel--b2ed905e.webp", - "status": "existing" - }, - { - "id": "plant_e4804808615a29be", - "botanicalName": "Schefflera actinophylla", - "name": "Grosse Strahlenaralie", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/b/bc/Octopus_Tree_%28Schefflera_actinophylla%29_at_Hyderabad%2C_AP_W_283.jpg", - "localImageUri": "/plants/schefflera-actinophylla--grosse-strahlenaralie--a69cdd16.webp", - "status": "existing" - }, - { - "id": "plant_0ee7b22313a79a28", - "botanicalName": "Mentha spicata", - "name": "Gruene Minze", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/05/Minze.jpg/500px-Minze.jpg", - "localImageUri": "/plants/mentha-spicata--gruene-minze--7cb727ef.webp", - "status": "existing" - }, - { - "id": "plant_730c6fc12cf97511", - "botanicalName": "Psidium guajava", - "name": "Guave", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/3a/Psidium_guajava_fruit.jpg/500px-Psidium_guajava_fruit.jpg", - "localImageUri": "/plants/psidium-guajava--guave--5d507482.webp", - "status": "existing" - }, - { - "id": "plant_39c58604790693b9", - "botanicalName": "Ficus elastica", - "name": "Gummibaum", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/16/Ficus_elastica_leaves_02.JPG/500px-Ficus_elastica_leaves_02.JPG", - "localImageUri": "/plants/ficus-elastica--gummibaum--925b35e7.webp", - "status": "existing" - }, - { - "id": "plant_aa6664ed7adebcb5", - "botanicalName": "Cucumis sativus", - "name": "Gurke", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/96/ARS_cucumber.jpg/500px-ARS_cucumber.jpg", - "localImageUri": "/plants/cucumis-sativus--gurke--3b96fd46.webp", - "status": "existing" - }, - { - "id": "plant_46b49e1b0e69fa64", - "botanicalName": "Guzmania lingulata", - "name": "Guzmania", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/84/Bromeliaceae03.jpg/500px-Bromeliaceae03.jpg", - "localImageUri": "/plants/guzmania-lingulata--guzmania--63fafdcb.webp", - "status": "existing" - }, - { - "id": "plant_81cd86630aca39e5", - "botanicalName": "Betula pendula", - "name": "Hange-Birke", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/8a/Betula_pendula_Finland.jpg/500px-Betula_pendula_Finland.jpg", - "localImageUri": "/plants/betula-pendula--hange-birke--aff0bb68.webp", - "status": "existing" - }, - { - "id": "plant_00e33defbd0b49c5", - "botanicalName": "Hyacinthoides non-scripta", - "name": "Hasengloeckchen", - "sourceUri": "wikimedia-search:Hyacinthoides%20non-scripta", - "localImageUri": "/plants/hyacinthoides-non-scripta--hasengloeckchen--cda24b58.webp", - "status": "existing" - }, - { - "id": "plant_f94ccafdbc6c519d", - "botanicalName": "Opuntia microdasys", - "name": "Hasenohren-Kaktus", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/36/Opuntia_microdasys_3.jpg/500px-Opuntia_microdasys_3.jpg", - "localImageUri": "/plants/opuntia-microdasys--hasenohren-kaktus--de2a7439.webp", - "status": "existing" - }, - { - "id": "plant_f297c0da1221e6d4", - "botanicalName": "Heliamphora nutans", - "name": "Heliamphora", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/f9/Roraima_Heliamphora_nutans1.JPG/500px-Roraima_Heliamphora_nutans1.JPG", - "localImageUri": "/plants/heliamphora-nutans--heliamphora--16977b41.webp", - "status": "existing" - }, - { - "id": "plant_39436f8620e13b0e", - "botanicalName": "Heliconia psittacorum", - "name": "Heliconia", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/6f/Parrot_heliconia_%28Heliconia_psittacorum%29.jpg/500px-Parrot_heliconia_%28Heliconia_psittacorum%29.jpg", - "localImageUri": "/plants/heliconia-psittacorum--heliconia--15bad812.webp", - "status": "existing" - }, - { - "id": "plant_530216d88dff6849", - "botanicalName": "Heliotropium arborescens", - "name": "Heliotrop", - "sourceUri": "wikimedia-search:Heliotropium%20arborescens", - "localImageUri": "/plants/heliotropium-arborescens--heliotrop--73a11073.webp", - "status": "existing" - }, - { - "id": "plant_588b544697087860", - "botanicalName": "Symphyotrichum novi-belgii", - "name": "Herbstaster", - "sourceUri": "wikimedia-search:Symphyotrichum%20novi-belgii", - "localImageUri": "/plants/symphyotrichum-novi-belgii--herbstaster--615b51bf.webp", - "status": "existing" - }, - { - "id": "plant_b246d39c63f29a40", - "botanicalName": "Philodendron hederaceum", - "name": "Herzblatt-Philodendron", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/bb/Philodendron_scandens_subsp_oxycardium2.jpg/500px-Philodendron_scandens_subsp_oxycardium2.jpg", - "localImageUri": "/plants/philodendron-hederaceum--herzblatt-philodendron--54360959.webp", - "status": "existing" - }, - { - "id": "plant_3de588912c04dc7f", - "botanicalName": "Ceropegia woodii", - "name": "Herzkette", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/5/55/Ceropegia_linearis_subsp_woodii.jpg", - "localImageUri": "/plants/ceropegia-woodii--herzkette--b51fb231.webp", - "status": "existing" - }, - { - "id": "plant_8b5798718a1dc5c6", - "botanicalName": "Hibiscus rosa-sinensis", - "name": "Hibiskus", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/21/Hibiscus_Brilliant.jpg/500px-Hibiscus_Brilliant.jpg", - "localImageUri": "/plants/hibiscus-rosa-sinensis--hibiskus--9e6d8b54.webp", - "status": "existing" - }, - { - "id": "plant_59744831808b8fd7", - "botanicalName": "Viola cornuta", - "name": "Hornveilchen", - "sourceUri": "wikimedia-search:Viola%20cornuta", - "localImageUri": "/plants/viola-cornuta--hornveilchen--d2abebd6.webp", - "status": "existing" - }, - { - "id": "plant_38a5122c0bea580a", - "botanicalName": "Hydrangea macrophylla", - "name": "Hortensie", - "sourceUri": "wikimedia-search:Hydrangea%20macrophylla", - "localImageUri": "/plants/hydrangea-macrophylla--hortensie--78d76f22.webp", - "status": "existing" - }, - { - "id": "plant_0306abe03e6d7296", - "botanicalName": "Hyacinthus orientalis", - "name": "Hyazinthe", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/82/Hyacinth_flower.jpg/500px-Hyacinth_flower.jpg", - "localImageUri": "/plants/hyacinthus-orientalis--hyazinthe--2c07af5d.webp", - "status": "existing" - }, - { - "id": "plant_be65cacf4e579727", - "botanicalName": "Monarda didyma", - "name": "Indianernessel", - "sourceUri": "wikimedia-search:Monarda%20didyma", - "localImageUri": "/plants/monarda-didyma--indianernessel--309858d1.webp", - "status": "existing" - }, - { - "id": "plant_4e66095e06f32cf4", - "botanicalName": "Azalea indica", - "name": "Indische Azalee", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/de/Rhododendron_indicum1.jpg/500px-Rhododendron_indicum1.jpg", - "localImageUri": "/plants/azalea-indica--indische-azalee--fe6e49a3.webp", - "status": "existing" - }, - { - "id": "plant_902876241a0c1f6f", - "botanicalName": "Zingiber officinale", - "name": "Ingwer", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/18/Koeh-146-no_text.jpg/500px-Koeh-146-no_text.jpg", - "localImageUri": "/plants/zingiber-officinale--ingwer--597975c9.webp", - "status": "existing" - }, - { - "id": "plant_202d5c1a3f83e307", - "botanicalName": "Jacaranda mimosifolia", - "name": "Jacaranda", - "sourceUri": "wikimedia-search:Jacaranda%20mimosifolia", - "localImageUri": "/plants/jacaranda-mimosifolia--jacaranda--324b12c5.webp", - "status": "existing" - }, - { - "id": "plant_2f9ba405e4cbd7de", - "botanicalName": "Crassula ovata", - "name": "Jadepflanze", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/5a/Crassula_ovata_700.jpg/500px-Crassula_ovata_700.jpg", - "localImageUri": "/plants/crassula-ovata--jadepflanze--3ac94122.webp", - "status": "existing" - }, - { - "id": "plant_192fc2d6932b5621", - "botanicalName": "Aucuba japonica", - "name": "Japanische Aucube", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c6/Aucuba_japonica_Gold_Dust_NBG_LR.jpg/500px-Aucuba_japonica_Gold_Dust_NBG_LR.jpg", - "localImageUri": "/plants/aucuba-japonica--japanische-aucube--c4bcd588.webp", - "status": "existing" - }, - { - "id": "plant_a0c9b297c07374b5", - "botanicalName": "Rhododendron simsii", - "name": "Japanische Azalee", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/67/Rhododendron_simsii-bunga_2-Lany_pirna.jpg/500px-Rhododendron_simsii-bunga_2-Lany_pirna.jpg", - "localImageUri": "/plants/rhododendron-simsii--japanische-azalee--ef16f2c0.webp", - "status": "existing" - }, - { - "id": "plant_28ae5636958be358", - "botanicalName": "Jasminum polyanthum", - "name": "Jasmin", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/2d/%28MHNT%29_Jasminum_polyanthum_%E2%80%93_flowers_and_buds.jpg/500px-%28MHNT%29_Jasminum_polyanthum_%E2%80%93_flowers_and_buds.jpg", - "localImageUri": "/plants/jasminum-polyanthum--jasmin--14162cf1.webp", - "status": "existing" - }, - { - "id": "plant_8fea9248ff0c7bb5", - "botanicalName": "Hypericum perforatum", - "name": "Johanniskraut", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/cf/%28MHNT%29_Hypericum_perforatum_flower_and_buttons.jpg/500px-%28MHNT%29_Hypericum_perforatum_flower_and_buttons.jpg", - "localImageUri": "/plants/hypericum-perforatum--johanniskraut--9bdb2ebc.webp", - "status": "existing" - }, - { - "id": "plant_9e91885abb04cb86", - "botanicalName": "Coffea arabica Nana", - "name": "Kaffeepflanze arabica nana", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/13/Starr-121108-1098-Coffea_arabica-Philippine_dwarf_habit_with_Forest_and_Angela-Pali_o_Waipio-Maui_%2825102146741%29.jpg/1280px-Starr-121108-1098-Coffea_arabica-Philippine_dwarf_habit_with_Forest_and_Angela-Pali_o_Waipio-Maui_%2825102146741%29.jpg", - "localImageUri": "/plants/coffea-arabica-nana--kaffeepflanze-arabica-nana--3dab6209.webp", - "status": "existing" - }, - { - "id": "plant_c2b3a25e00acf3e2", - "botanicalName": "Coffea arabica", - "name": "Kaffeestrauch", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c7/Coffee_Flowers.JPG/500px-Coffee_Flowers.JPG", - "localImageUri": "/plants/coffea-arabica--kaffeestrauch--a5ffdda3.webp", - "status": "existing" - }, - { - "id": "plant_7597db1c1b395452", - "botanicalName": "Kalanchoe blossfeldiana", - "name": "Kalanchoe", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/8d/Kalanchoe_blossfeldiana_3.jpg/500px-Kalanchoe_blossfeldiana_3.jpg", - "localImageUri": "/plants/kalanchoe-blossfeldiana--kalanchoe--e040640f.webp", - "status": "existing" - }, - { - "id": "plant_78775c3119a08f01", - "botanicalName": "Eschscholzia californica", - "name": "Kalifornischer Mohn", - "sourceUri": "wikimedia-search:Eschscholzia%20californica", - "localImageUri": "/plants/eschscholzia-californica--kalifornischer-mohn--da7d0f79.webp", - "status": "existing" - }, - { - "id": "plant_735b19d4a6efe5c0", - "botanicalName": "Camellia japonica", - "name": "Kamelie", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e9/Camellia_japonica_NBG.jpg/500px-Camellia_japonica_NBG.jpg", - "localImageUri": "/plants/camellia-japonica--kamelie--6a23eb3f.webp", - "status": "existing" - }, - { - "id": "plant_e0432335ee4f0033", - "botanicalName": "Chamomilla recutita", - "name": "Kamille", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c8/Matricaria_February_2008-1.jpg/500px-Matricaria_February_2008-1.jpg", - "localImageUri": "/plants/chamomilla-recutita--kamille--0bffdb72.webp", - "status": "existing" - }, - { - "id": "plant_de21871ad8dcaefd", - "botanicalName": "Kalanchoe tomentosa", - "name": "Kaninchen-Ohren", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/04/Kalanchoe_tomentosa_01.jpg/500px-Kalanchoe_tomentosa_01.jpg", - "localImageUri": "/plants/kalanchoe-tomentosa--kaninchen-ohren--2c3b1e90.webp", - "status": "existing" - }, - { - "id": "plant_cb7817f551f6c73e", - "botanicalName": "Nepenthes alata", - "name": "Kannenpflanze", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/7/77/Nepenthes_alata_ASR_062007_mt_ambucao_luzon.jpg", - "localImageUri": "/plants/nepenthes-alata--kannenpflanze--30016442.webp", - "status": "existing" - }, - { - "id": "plant_325a00f384ac1a15", - "botanicalName": "Aloe arborescens", - "name": "Kap-Aloe", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b9/Aloe_arborescens_Compton.JPG/500px-Aloe_arborescens_Compton.JPG", - "localImageUri": "/plants/aloe-arborescens--kap-aloe--2c4f60ef.webp", - "status": "existing" - }, - { - "id": "plant_bb4dea2113550a88", - "botanicalName": "Aloe ferox", - "name": "Kap-Aloe (ferox)", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/9/9e/Aloe_Ferox_between_Cofimvaba_and_Ngcobo.jpg", - "localImageUri": "/plants/aloe-ferox--kap-aloe-ferox--e78c3f65.webp", - "status": "existing" - }, - { - "id": "plant_d32498f051c71256", - "botanicalName": "Osteospermum ecklonis", - "name": "Kapmargerite", - "sourceUri": "wikimedia-search:Osteospermum%20ecklonis", - "localImageUri": "/plants/osteospermum-ecklonis--kapmargerite--7d0ac9d6.webp", - "status": "existing" - }, - { - "id": "plant_f0348c48dc721bb9", - "botanicalName": "Tropaeolum majus", - "name": "Kapuzinerkresse", - "sourceUri": "wikimedia-search:Tropaeolum%20majus", - "localImageUri": "/plants/tropaeolum-majus--kapuzinerkresse--c007c761.webp", - "status": "existing" - }, - { - "id": "plant_f8c518688fd2d49b", - "botanicalName": "Daucus carota", - "name": "Karotte", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/23/Daucus_carota_May_2008-1_edit.jpg/500px-Daucus_carota_May_2008-1_edit.jpg", - "localImageUri": "/plants/daucus-carota--karotte--85d90d33.webp", - "status": "existing" - }, - { - "id": "plant_dc535ae68a36c48c", - "botanicalName": "Nepeta cataria", - "name": "Katzenminze", - "sourceUri": "wikimedia-search:Nepeta%20cataria", - "localImageUri": "/plants/nepeta-cataria--katzenminze--7935cfe0.webp", - "status": "existing" - }, - { - "id": "plant_c605a83dcbce1a97", - "botanicalName": "Howea forsteriana", - "name": "Kentia-Palme", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/99/Howea_forsteriana_Lord_Howe_Island.jpg/500px-Howea_forsteriana_Lord_Howe_Island.jpg", - "localImageUri": "/plants/howea-forsteriana--kentia-palme--f2c205ea.webp", - "status": "existing" - }, - { - "id": "plant_8927d794f67ea97c", - "botanicalName": "Anthriscus cerefolium", - "name": "Kerbel", - "sourceUri": "wikimedia-search:Anthriscus%20cerefolium", - "localImageUri": "/plants/anthriscus-cerefolium--kerbel--eb8bf3ab.webp", - "status": "existing" - }, - { - "id": "plant_bf13d931fa5427de", - "botanicalName": "Cordyline australis", - "name": "Keulenlilie", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/f7/CabbageTreeKaihoka.jpg/500px-CabbageTreeKaihoka.jpg", - "localImageUri": "/plants/cordyline-australis--keulenlilie--31be351b.webp", - "status": "existing" - }, - { - "id": "plant_d47591d55ee11f4c", - "botanicalName": "Pinus sylvestris", - "name": "Kiefer", - "sourceUri": "wikimedia-search:Pinus%20sylvestris", - "localImageUri": "/plants/pinus-sylvestris--kiefer--6db5e3c6.webp", - "status": "existing" - }, - { - "id": "plant_3cc71b10ff1d5d6e", - "botanicalName": "Prunus laurocerasus", - "name": "Kirschlorbeer", - "sourceUri": "wikimedia-search:Prunus%20laurocerasus", - "localImageUri": "/plants/prunus-laurocerasus--kirschlorbeer--9291015b.webp", - "status": "existing" - }, - { - "id": "plant_205589ef30c6f380", - "botanicalName": "Oxalis triangularis", - "name": "Kleeblume", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/15/Oxalis_triangularis6.jpg/500px-Oxalis_triangularis6.jpg", - "localImageUri": "/plants/oxalis-triangularis--kleeblume--9080763b.webp", - "status": "existing" - }, - { - "id": "plant_e1f0a5c763e6f721", - "botanicalName": "Hoya bella", - "name": "Kleine Wachsblume", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/d1/%E7%BE%8E%E9%BA%97%E6%AF%AC%E8%98%AD_Hoya_bella_-%E9%A6%99%E6%B8%AF%E5%85%AC%E5%9C%92_Hong_Kong_Park-_%289240227808%29.jpg/500px-%E7%BE%8E%E9%BA%97%E6%AF%AC%E8%98%AD_Hoya_bella_-%E9%A6%99%E6%B8%AF%E5%85%AC%E5%9C%92_Hong_Kong_Park-_%289240227808%29.jpg", - "localImageUri": "/plants/hoya-bella--kleine-wachsblume--db73dcff.webp", - "status": "existing" - }, - { - "id": "plant_156a82fb0d4e7201", - "botanicalName": "Begonia tuberhybrida", - "name": "Knollen-Begonie", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b7/Begonia-tuberhybride_Red.jpg/500px-Begonia-tuberhybride_Red.jpg", - "localImageUri": "/plants/begonia-tuberhybrida--knollen-begonie--7d9dfd00.webp", - "status": "existing" - }, - { - "id": "plant_6fdbc0c3fc6d0820", - "botanicalName": "Epiphyllum oxypetalum", - "name": "Koenigin der Nacht", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/6e/Epiphyllum_oxypetalum_flower.JPG/500px-Epiphyllum_oxypetalum_flower.JPG", - "localImageUri": "/plants/epiphyllum-oxypetalum--koenigin-der-nacht--7ecd1979.webp", - "status": "existing" - }, - { - "id": "plant_fb262dee6cb22325", - "botanicalName": "Protea cynaroides", - "name": "Koenigs-Protea", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/3d/Protea_cynaroides_3.jpg/500px-Protea_cynaroides_3.jpg", - "localImageUri": "/plants/protea-cynaroides--koenigs-protea--2186e16d.webp", - "status": "existing" - }, - { - "id": "plant_c18b4430b4dfeef8", - "botanicalName": "Begonia rex", - "name": "Koenigsbegonie", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/62/Painted_Leaved_Begonia._Begonia_rex_Putz._Flore_des_serres_et_des_jardins_de_l%27Europe_v.12_%281857%29.jpg/500px-Painted_Leaved_Begonia._Begonia_rex_Putz._Flore_des_serres_et_des_jardins_de_l%27Europe_v.12_%281857%29.jpg", - "localImageUri": "/plants/begonia-rex--koenigsbegonie--b6083f44.webp", - "status": "existing" - }, - { - "id": "plant_6579aa953da5beea", - "botanicalName": "Verbascum thapsus", - "name": "Koenigskerze", - "sourceUri": "wikimedia-search:Verbascum%20thapsus", - "localImageUri": "/plants/verbascum-thapsus--koenigskerze--26f01a84.webp", - "status": "existing" - }, - { - "id": "plant_24e5004efcd91423", - "botanicalName": "Gaillardia aristata", - "name": "Kokardenblume", - "sourceUri": "wikimedia-search:Gaillardia%20aristata", - "localImageUri": "/plants/gaillardia-aristata--kokardenblume--050cf2e5.webp", - "status": "existing" - }, - { - "id": "plant_71f244d60e9fb18d", - "botanicalName": "Conophytum calculus", - "name": "Konophytum", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b0/1_Conophytum_calculus_-_RSA_3.jpg/500px-1_Conophytum_calculus_-_RSA_3.jpg", - "localImageUri": "/plants/conophytum-calculus--konophytum--4c3a116e.webp", - "status": "existing" - }, - { - "id": "plant_5f6dd525e28bd218", - "botanicalName": "Rhipsalis baccifera", - "name": "Korallenkaktus", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/ba/Rhipsalis_baccifera_01_ies.jpg/500px-Rhipsalis_baccifera_01_ies.jpg", - "localImageUri": "/plants/rhipsalis-baccifera--korallenkaktus--3097b146.webp", - "status": "existing" - }, - { - "id": "plant_589a537d2b599299", - "botanicalName": "Coriandrum sativum", - "name": "Koriander", - "sourceUri": "wikimedia-search:Coriandrum%20sativum", - "localImageUri": "/plants/coriandrum-sativum--koriander--c1d3ccee.webp", - "status": "existing" - }, - { - "id": "plant_9a590a40395f4882", - "botanicalName": "Centaurea cyanus", - "name": "Kornblume", - "sourceUri": "wikimedia-search:Centaurea%20cyanus", - "localImageUri": "/plants/centaurea-cyanus--kornblume--ff8efded.webp", - "status": "existing" - }, - { - "id": "plant_a6e9bf1a9c4162fb", - "botanicalName": "Cosmos bipinnatus", - "name": "Kosmee", - "sourceUri": "wikimedia-search:Cosmos%20bipinnatus", - "localImageUri": "/plants/cosmos-bipinnatus--kosmee--5a231205.webp", - "status": "existing" - }, - { - "id": "plant_612f629e95b2c540", - "botanicalName": "Cotyledon orbiculata", - "name": "Kotyledon", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/90/Cotyledon_orbiculata_-_pigs_ear_-_Cape_Point_-_South_Africa_2.JPG/500px-Cotyledon_orbiculata_-_pigs_ear_-_Cape_Point_-_South_Africa_2.JPG", - "localImageUri": "/plants/cotyledon-orbiculata--kotyledon--e61a1c1a.webp", - "status": "existing" - }, - { - "id": "plant_f6cb2e28c94b0f3c", - "botanicalName": "Anthurium crystallinum", - "name": "Kristall-Anthurie", - "sourceUri": "wikimedia-search:Anthurium%20crystallinum", - "localImageUri": "/plants/anthurium-crystallinum--kristall-anthurie--2d5ec8d4.webp", - "status": "existing" - }, - { - "id": "plant_adce82fe150c9814", - "botanicalName": "Crocus vernus", - "name": "Krokus", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e2/Crocus_vernus_with_bee.jpg/500px-Crocus_vernus_with_bee.jpg", - "localImageUri": "/plants/crocus-vernus--krokus--31f51b70.webp", - "status": "existing" - }, - { - "id": "plant_830ccd232b784d9e", - "botanicalName": "Codiaeum variegatum", - "name": "Kroton", - "sourceUri": "wikimedia-search:Garden%20croton", - "localImageUri": "/plants/codiaeum-variegatum--kroton--fceb7491.webp", - "status": "existing" - }, - { - "id": "plant_64ba168636b5e8a3", - "botanicalName": "Curcuma longa", - "name": "Kurkuma", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/ab/Turmeric_inflorescence.jpg/500px-Turmeric_inflorescence.jpg", - "localImageUri": "/plants/curcuma-longa--kurkuma--cb270150.webp", - "status": "existing" - }, - { - "id": "plant_bb51efcb52023c48", - "botanicalName": "Lithops julii", - "name": "Lebende Steine", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/0f/Lithops_julii_fulleri.jpg/500px-Lithops_julii_fulleri.jpg", - "localImageUri": "/plants/lithops-julii--lebende-steine--939c0d2c.webp", - "status": "existing" - }, - { - "id": "plant_93f2cc182268c96a", - "botanicalName": "Helleborus orientalis", - "name": "Lenzrose", - "sourceUri": "wikimedia-search:Helleborus%20orientalis", - "localImageUri": "/plants/helleborus-orientalis--lenzrose--f7df56b8.webp", - "status": "existing" - }, - { - "id": "plant_e969375587d68477", - "botanicalName": "Levisticum officinale", - "name": "Liebstoeckel", - "sourceUri": "wikimedia-search:Levisticum%20officinale", - "localImageUri": "/plants/levisticum-officinale--liebstoeckel--649f0af1.webp", - "status": "existing" - }, - { - "id": "plant_0a16a89a9de52d5c", - "botanicalName": "Tradescantia pallida", - "name": "Lila Tradescantia", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/5a/Tradescantia_pallida_kz03.jpg/500px-Tradescantia_pallida_kz03.jpg", - "localImageUri": "/plants/tradescantia-pallida--lila-tradescantia--fa444b81.webp", - "status": "existing" - }, - { - "id": "plant_a34bdd68ffb97e12", - "botanicalName": "Aeschynanthus radicans", - "name": "Lippenstiftpflanze", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/52/Aeschynanthus_radicans.jpg/500px-Aeschynanthus_radicans.jpg", - "localImageUri": "/plants/aeschynanthus-radicans--lippenstiftpflanze--c0f3a18c.webp", - "status": "existing" - }, - { - "id": "plant_fe714a89f340dc8c", - "botanicalName": "Antirrhinum majus", - "name": "Loewenmaeulchen", - "sourceUri": "wikimedia-search:Antirrhinum%20majus", - "localImageUri": "/plants/antirrhinum-majus--loewenmaeulchen--ee99a45e.webp", - "status": "existing" - }, - { - "id": "plant_061cff94e10bff7a", - "botanicalName": "Laurus nobilis", - "name": "Lorbeer", - "sourceUri": "wikimedia-search:Laurus%20nobilis", - "localImageUri": "/plants/laurus-nobilis--lorbeer--7fb425a5.webp", - "status": "existing" - }, - { - "id": "plant_db7b7c883a5fb716", - "botanicalName": "Tillandsia ionantha", - "name": "Luftpflanze", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b5/Purple_sky_plant_-_Andrey_Zharkikh.jpg/500px-Purple_sky_plant_-_Andrey_Zharkikh.jpg", - "localImageUri": "/plants/tillandsia-ionantha--luftpflanze--c221d48d.webp", - "status": "existing" - }, - { - "id": "plant_15527732e9ae75b4", - "botanicalName": "Lupinus polyphyllus", - "name": "Lupine", - "sourceUri": "wikimedia-search:Lupinus%20polyphyllus", - "localImageUri": "/plants/lupinus-polyphyllus--lupine--d528d819.webp", - "status": "existing" - }, - { - "id": "plant_fafb81415756f893", - "botanicalName": "Stephanotis floribunda", - "name": "Madagaskar-Jasmin", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/31/Stephanotis_floribunda3L._Marie.jpg/500px-Stephanotis_floribunda3L._Marie.jpg", - "localImageUri": "/plants/stephanotis-floribunda--madagaskar-jasmin--f5b3e914.webp", - "status": "existing" - }, - { - "id": "plant_b9e7bf04918e8547", - "botanicalName": "Coreopsis tinctoria", - "name": "Maedchenauge", - "sourceUri": "wikimedia-search:Coreopsis%20tinctoria", - "localImageUri": "/plants/coreopsis-tinctoria--maedchenauge--64a5d938.webp", - "status": "existing" - }, - { - "id": "plant_7a9e8ffc731ea60b", - "botanicalName": "Magnolia grandiflora", - "name": "Magnolie", - "sourceUri": "wikimedia-search:Magnolia%20grandiflora", - "localImageUri": "/plants/magnolia-grandiflora--magnolie--5eaff200.webp", - "status": "existing" - }, - { - "id": "plant_0e1ce38a0405df52", - "botanicalName": "Convallaria majalis", - "name": "Maigloeckchen", - "sourceUri": "wikimedia-search:Convallaria%20majalis", - "localImageUri": "/plants/convallaria-majalis--maigloeckchen--d7acb648.webp", - "status": "existing" - }, - { - "id": "plant_cabb9c3df66307ba", - "botanicalName": "Dracaena fragrans", - "name": "Maisstrauch", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/db/Dracaena_fragrans_%282%29.jpg/500px-Dracaena_fragrans_%282%29.jpg", - "localImageUri": "/plants/dracaena-fragrans--maisstrauch--107c7d0f.webp", - "status": "existing" - }, - { - "id": "plant_b89779554bd0233f", - "botanicalName": "Origanum majorana", - "name": "Majoran", - "sourceUri": "wikimedia-search:Origanum%20majorana", - "localImageUri": "/plants/origanum-majorana--majoran--d0d23e9f.webp", - "status": "existing" - }, - { - "id": "plant_d52a80feceba729c", - "botanicalName": "Mammillaria zeilmanniana", - "name": "Mammillaria", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/af/Mammillaria_zeilmanniana.jpg/500px-Mammillaria_zeilmanniana.jpg", - "localImageUri": "/plants/mammillaria-zeilmanniana--mammillaria--ee6d834e.webp", - "status": "existing" - }, - { - "id": "plant_9406fa4ffbef305b", - "botanicalName": "Beta vulgaris", - "name": "Mangold", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/f/ff/Beta_vulgaris_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-167.jpg", - "localImageUri": "/plants/beta-vulgaris--mangold--7fb88006.webp", - "status": "existing" - }, - { - "id": "plant_39d8c8f7dced6c59", - "botanicalName": "Leucanthemum vulgare", - "name": "Margerite", - "sourceUri": "wikimedia-search:Leucanthemum%20vulgare", - "localImageUri": "/plants/leucanthemum-vulgare--margerite--f583d6a2.webp", - "status": "existing" - }, - { - "id": "plant_ca9b1576aab12566", - "botanicalName": "Epipremnum aureum Marble Queen", - "name": "Marmor-Efeutute", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/ca/Epipremnum_aureum_Marble_Queen.jpg/500px-Epipremnum_aureum_Marble_Queen.jpg", - "localImageUri": "/plants/epipremnum-aureum-marble-queen--marmor-efeutute--1d6745d9.webp", - "status": "existing" - }, - { - "id": "plant_e66a57622e22d994", - "botanicalName": "Salvia farinacea", - "name": "Mehlsalbei", - "sourceUri": "wikimedia-search:Salvia%20farinacea", - "localImageUri": "/plants/salvia-farinacea--mehlsalbei--a046f0ea.webp", - "status": "existing" - }, - { - "id": "plant_95de7815c2f690ce", - "botanicalName": "Washingtonia robusta", - "name": "Mexikanische Fächerpalme", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b8/Arecales_-_Washingtonia_robusta_-_1.jpg/500px-Arecales_-_Washingtonia_robusta_-_1.jpg", - "localImageUri": "/plants/washingtonia-robusta--mexikanische-facherpalme--ced2cfe1.webp", - "status": "existing" - }, - { - "id": "plant_01ed2f643e7d5d8e", - "botanicalName": "Rhaphidophora tetrasperma", - "name": "Mini-Monstera", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/db/Rhaphidophora_tetrasperma.jpg/500px-Rhaphidophora_tetrasperma.jpg", - "localImageUri": "/plants/rhaphidophora-tetrasperma--mini-monstera--8698ef03.webp", - "status": "existing" - }, - { - "id": "plant_6448079452dd9eb8", - "botanicalName": "Gazania rigens", - "name": "Mittagsgold", - "sourceUri": "wikimedia-search:Gazania%20rigens", - "localImageUri": "/plants/gazania-rigens--mittagsgold--cc595e45.webp", - "status": "existing" - }, - { - "id": "plant_8d0ea0639b4e5136", - "botanicalName": "Papaver rhoeas", - "name": "Mohn", - "sourceUri": "wikimedia-search:Papaver%20rhoeas", - "localImageUri": "/plants/papaver-rhoeas--mohn--32fb9e83.webp", - "status": "existing" - }, - { - "id": "plant_8e8b8bf4c4f7bdb6", - "botanicalName": "Gymnocalycium mihanovichii", - "name": "Mond-Kaktus", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/51/Gymnocalycium_mihanovichii_4.JPG/500px-Gymnocalycium_mihanovichii_4.JPG", - "localImageUri": "/plants/gymnocalycium-mihanovichii--mond-kaktus--c7e6e78b.webp", - "status": "existing" - }, - { - "id": "plant_e8ab689f2d26d8b2", - "botanicalName": "Pachyphytum oviferum", - "name": "Mondstein-Pflanze", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/8f/%28MHNT%29_Pachyphytum_oviferum_-_Habitus.jpg/500px-%28MHNT%29_Pachyphytum_oviferum_-_Habitus.jpg", - "localImageUri": "/plants/pachyphytum-oviferum--mondstein-pflanze--66cf2adc.webp", - "status": "existing" - }, - { - "id": "plant_b843de18953d2232", - "botanicalName": "Monstera adansonii", - "name": "Monstera adansonii", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/fb/Monstera_adansonii_79319231.jpg/500px-Monstera_adansonii_79319231.jpg", - "localImageUri": "/plants/monstera-adansonii--911eb5ba.webp", - "status": "existing" - }, - { - "id": "plant_44c152d886d0b190", - "botanicalName": "Monstera obliqua", - "name": "Monstera obliqua", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/4d/Obiqula.jpg/500px-Obiqula.jpg", - "localImageUri": "/plants/monstera-obliqua--8ab6f307.webp", - "status": "existing" - }, - { - "id": "plant_da8adeffa961a540", - "botanicalName": "Crassula muscosa", - "name": "Moos-Crassula", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/5e/Crassula_muscosa_Grubosz_2006-05-03_01.jpg/500px-Crassula_muscosa_Grubosz_2006-05-03_01.jpg", - "localImageUri": "/plants/crassula-muscosa--moos-crassula--41420e37.webp", - "status": "existing" - }, - { - "id": "plant_917a7775d4ada0c1", - "botanicalName": "Alpinia zerumbet", - "name": "Muschelingwer", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/1e/200410_Alpinia_zerumbet_1.JPG/500px-200410_Alpinia_zerumbet_1.JPG", - "localImageUri": "/plants/alpinia-zerumbet--muschelingwer--f0c5c11e.webp", - "status": "existing" - }, - { - "id": "plant_eff2ecdef8205cc1", - "botanicalName": "Dianthus caryophyllus", - "name": "Nelke", - "sourceUri": "wikimedia-search:Dianthus%20caryophyllus", - "localImageUri": "/plants/dianthus-caryophyllus--nelke--1ccf57de.webp", - "status": "existing" - }, - { - "id": "plant_5358cd292660e315", - "botanicalName": "Nemesia strumosa", - "name": "Nemesie", - "sourceUri": "wikimedia-search:Nemesia%20strumosa", - "localImageUri": "/plants/nemesia-strumosa--nemesie--90e80dd2.webp", - "status": "existing" - }, - { - "id": "plant_de18a22fc81062c9", - "botanicalName": "Epipremnum pinnatum Neon", - "name": "Neon-Efeutute", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/de/Epipremnum_pinnatum_%27Neon%27%2C_Longwood_Gardens_01.jpg/500px-Epipremnum_pinnatum_%27Neon%27%2C_Longwood_Gardens_01.jpg", - "localImageUri": "/plants/epipremnum-pinnatum-neon--neon-efeutute--3e91b575.webp", - "status": "existing" - }, - { - "id": "plant_3d4bc95e6500e9fc", - "botanicalName": "Neoregelia carolinae", - "name": "Neoregelia", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/27/Neoregelia_carolinae_BotGardBln310505a.jpg/500px-Neoregelia_carolinae_BotGardBln310505a.jpg", - "localImageUri": "/plants/neoregelia-carolinae--neoregelia--454c3c96.webp", - "status": "existing" - }, - { - "id": "plant_ac3f55a2073b1427", - "botanicalName": "Fittonia albivenis", - "name": "Nervenpflanze", - "sourceUri": "wikimedia-search:Fittonia%20albivenis", - "localImageUri": "/plants/fittonia-albivenis--nervenpflanze--b674f5e6.webp", - "status": "existing" - }, - { - "id": "plant_c62ac934518110bb", - "botanicalName": "Impatiens hawkeri", - "name": "Neuguinea-Balsamine", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/f7/Impatiens_hawkeri%2C_beijo-pintado_%28flores_vermelhas%29_07.jpg/500px-Impatiens_hawkeri%2C_beijo-pintado_%28flores_vermelhas%29_07.jpg", - "localImageUri": "/plants/impatiens-hawkeri--neuguinea-balsamine--4e5c7c8f.webp", - "status": "existing" - }, - { - "id": "plant_8fe9abf012241581", - "botanicalName": "Araucaria heterophylla", - "name": "Norfolk-Tanne", - "sourceUri": "wikimedia-search:Araucaria%20heterophylla", - "localImageUri": "/plants/araucaria-heterophylla--norfolk-tanne--56ef2a36.webp", - "status": "existing" - }, - { - "id": "plant_3dec7298828d7d5b", - "botanicalName": "Nerium oleander", - "name": "Oleander", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/cc/Nerium_oleander_flowers_leaves.jpg/500px-Nerium_oleander_flowers_leaves.jpg", - "localImageUri": "/plants/nerium-oleander--oleander--87c4b966.webp", - "status": "existing" - }, - { - "id": "plant_8915ad2e41841f3d", - "botanicalName": "Citrus sinensis", - "name": "Orangenbaum", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b0/OrangeBloss_wb.jpg/500px-OrangeBloss_wb.jpg", - "localImageUri": "/plants/citrus-sinensis--orangenbaum--294e1722.webp", - "status": "existing" - }, - { - "id": "plant_d61f0c50e94b917d", - "botanicalName": "Origanum vulgare", - "name": "Oregano", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/14/Origanum_vulgare_-_harilik_pune.jpg/500px-Origanum_vulgare_-_harilik_pune.jpg", - "localImageUri": "/plants/origanum-vulgare--oregano--33c6269c.webp", - "status": "existing" - }, - { - "id": "plant_a62147e5f0805622", - "botanicalName": "Narcissus pseudonarcissus", - "name": "Osterglocke", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a4/Narcissus_pseudonarcissus_flower_300303.jpg/500px-Narcissus_pseudonarcissus_flower_300303.jpg", - "localImageUri": "/plants/narcissus-pseudonarcissus--osterglocke--32e917c0.webp", - "status": "existing" - }, - { - "id": "plant_f66ecda188a5efad", - "botanicalName": "Lilium longiflorum", - "name": "Ostertrompete", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Lilium_longiflorum_%28Easter_Lily%29.JPG/500px-Lilium_longiflorum_%28Easter_Lily%29.JPG", - "localImageUri": "/plants/lilium-longiflorum--ostertrompete--4b791484.webp", - "status": "existing" - }, - { - "id": "plant_8b92e803087c2f97", - "botanicalName": "Cycas revoluta", - "name": "Palmfarn", - "sourceUri": "wikimedia-search:Cycas%20revoluta", - "localImageUri": "/plants/cycas-revoluta--palmfarn--71371c45.webp", - "status": "existing" - }, - { - "id": "plant_e4f082a4e9f3a8c5", - "botanicalName": "Carica papaya", - "name": "Papaya", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/84/Carica_papaya_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-029.jpg/500px-Carica_papaya_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-029.jpg", - "localImageUri": "/plants/carica-papaya--papaya--240dc331.webp", - "status": "existing" - }, - { - "id": "plant_612cf58237a77a91", - "botanicalName": "Strelitzia reginae", - "name": "Paradiesvogelblume", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/55/Bird_of_Paradise_flower.JPG/500px-Bird_of_Paradise_flower.JPG", - "localImageUri": "/plants/strelitzia-reginae--paradiesvogelblume--3ee1f013.webp", - "status": "existing" - }, - { - "id": "plant_61ec02f0a706b922", - "botanicalName": "Cyperus alternifolius", - "name": "Paragraphenpflanze", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/7/76/Cyperus_alternifolius_2.jpg", - "localImageUri": "/plants/cyperus-alternifolius--paragraphenpflanze--986a54bf.webp", - "status": "existing" - }, - { - "id": "plant_13543a8abb8f50c8", - "botanicalName": "Passiflora caerulea", - "name": "Passionsblume", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/9a/Passiflora_caerulea_%282019-06-24%29_frontal-view.jpg/500px-Passiflora_caerulea_%282019-06-24%29_frontal-view.jpg", - "localImageUri": "/plants/passiflora-caerulea--passionsblume--b8effb5e.webp", - "status": "existing" - }, - { - "id": "plant_b9a0c1910297e2cb", - "botanicalName": "Senecio rowleyanus", - "name": "Perlenschnur-Pflanze", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/fd/Senecio_rowleyanus_leaves.jpg/500px-Senecio_rowleyanus_leaves.jpg", - "localImageUri": "/plants/senecio-rowleyanus--perlenschnur-pflanze--803d2b22.webp", - "status": "existing" - }, - { - "id": "plant_ab8fc977bd930772", - "botanicalName": "Cereus peruvianus", - "name": "Peruanischer Fackelkaktus", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/53/Cereus_repandus_in_Aruba_-_on_the_way_back_from_Altovista_chapel_%282896840490%29.jpg/500px-Cereus_repandus_in_Aruba_-_on_the_way_back_from_Altovista_chapel_%282896840490%29.jpg", - "localImageUri": "/plants/cereus-peruvianus--peruanischer-fackelkaktus--b087b5cf.webp", - "status": "existing" - }, - { - "id": "plant_f57319d9209a678f", - "botanicalName": "Petroselinum crispum", - "name": "Petersilie", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e4/Petroselinum.jpg/500px-Petroselinum.jpg", - "localImageUri": "/plants/petroselinum-crispum--petersilie--23a7cb86.webp", - "status": "existing" - }, - { - "id": "plant_d859b55b599f2742", - "botanicalName": "Petunia hybrida", - "name": "Petunie", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/55/PetuniaFlower.JPG/500px-PetuniaFlower.JPG", - "localImageUri": "/plants/petunia-hybrida--petunie--af7deb4f.webp", - "status": "existing" - }, - { - "id": "plant_9f46ccdc5b9b10f3", - "botanicalName": "Syngonium podophyllum", - "name": "Pfeilblatt", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/58/Zingiber_malaysianum.jpg/500px-Zingiber_malaysianum.jpg", - "localImageUri": "/plants/syngonium-podophyllum--pfeilblatt--ca7b7b9f.webp", - "status": "existing" - }, - { - "id": "plant_c7b763cec4d30529", - "botanicalName": "Beaucarnea recurvata", - "name": "Pferdeschwanzpalme", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/7e/Beaucarnea_recurvata%2C_Ocampo%2C_Tamaulipas%2C_Mexico_1.jpg/500px-Beaucarnea_recurvata%2C_Ocampo%2C_Tamaulipas%2C_Mexico_1.jpg", - "localImageUri": "/plants/beaucarnea-recurvata--pferdeschwanzpalme--31691c81.webp", - "status": "existing" - }, - { - "id": "plant_0c3f812b6186ea56", - "botanicalName": "Paeonia lactiflora", - "name": "Pfingstrose", - "sourceUri": "wikimedia-search:Paeonia%20lactiflora", - "localImageUri": "/plants/paeonia-lactiflora--pfingstrose--c81e92ef.webp", - "status": "existing" - }, - { - "id": "plant_418e4442c57e9974", - "botanicalName": "Philodendron bipinnatifidum", - "name": "Philodendron bipinnatifidum", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c1/Tree1.JPG/500px-Tree1.JPG", - "localImageUri": "/plants/philodendron-bipinnatifidum--f7a662b8.webp", - "status": "existing" - }, - { - "id": "plant_d1c45583a39e702e", - "botanicalName": "Philodendron hederaceum Brasil", - "name": "Philodendron Brasil", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/0/0b/Philodendron_hederaceum_hederaceum_Brasil_0zz.jpg", - "localImageUri": "/plants/philodendron-hederaceum-brasil--philodendron-brasil--993a964b.webp", - "status": "existing" - }, - { - "id": "plant_64223543ba5ff673", - "botanicalName": "Philodendron gloriosum", - "name": "Philodendron gloriosum", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e1/Philodendron_gloriosum_%2829587099650%29.jpg/500px-Philodendron_gloriosum_%2829587099650%29.jpg", - "localImageUri": "/plants/philodendron-gloriosum--059733a1.webp", - "status": "existing" - }, - { - "id": "plant_deca5dabffc8f210", - "botanicalName": "Philodendron erubescens Pink Princess", - "name": "Philodendron Pink Princess", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/8/89/Philodendron_Pink_Princess.jpg", - "localImageUri": "/plants/philodendron-erubescens-pink-princess--philodendron-pink-princess--b027e5d1.webp", - "status": "existing" - }, - { - "id": "plant_c5bbd24975a2d56e", - "botanicalName": "Thaumatophyllum xanadu", - "name": "Philodendron Xanadu", - "sourceUri": "wikimedia-search:Thaumatophyllum%20xanadu", - "localImageUri": "/plants/thaumatophyllum-xanadu--philodendron-xanadu--dda107bf.webp", - "status": "existing" - }, - { - "id": "plant_6a5d7ac021669bb4", - "botanicalName": "Primula vulgaris", - "name": "Primel", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/ad/Prole%C4%87no_cve%C4%87e_3.JPG/500px-Prole%C4%87no_cve%C4%87e_3.JPG", - "localImageUri": "/plants/primula-vulgaris--primel--038312ee.webp", - "status": "existing" - }, - { - "id": "plant_dbd06a3bc479c493", - "botanicalName": "Ipomoea purpurea", - "name": "Prunkwinde", - "sourceUri": "wikimedia-search:Ipomoea%20purpurea", - "localImageUri": "/plants/ipomoea-purpurea--prunkwinde--a9c61099.webp", - "status": "existing" - }, - { - "id": "plant_b82556f9406de287", - "botanicalName": "Hypoestes phyllostachya", - "name": "Punktblatt", - "sourceUri": "wikimedia-search:Hypoestes%20phyllostachya", - "localImageUri": "/plants/hypoestes-phyllostachya--punktblatt--08034897.webp", - "status": "existing" - }, - { - "id": "plant_045dd35819e8793f", - "botanicalName": "Sarracenia purpurea", - "name": "Purpursonnentau", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/7c/Sarracenia_purpurea_Flowers.JPG/500px-Sarracenia_purpurea_Flowers.JPG", - "localImageUri": "/plants/sarracenia-purpurea--purpursonnentau--38d9e604.webp", - "status": "existing" - }, - { - "id": "plant_1feebf3d053224a9", - "botanicalName": "Raphanus sativus", - "name": "Radieschen", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/0c/Radish_3371103037_4ab07db0bf_o.jpg/500px-Radish_3371103037_4ab07db0bf_o.jpg", - "localImageUri": "/plants/raphanus-sativus--radieschen--797f22e6.webp", - "status": "existing" - }, - { - "id": "plant_af46a07c444780ca", - "botanicalName": "Peperomia polybotrya", - "name": "Raindrop-Peperomie", - "sourceUri": "wikimedia-search:Peperomia%20polybotrya", - "localImageUri": "/plants/peperomia-polybotrya--raindrop-peperomie--12a71756.webp", - "status": "existing" - }, - { - "id": "plant_ab8cfe05f8183d2c", - "botanicalName": "Ranunculus asiaticus", - "name": "Ranunkel", - "sourceUri": "wikimedia-search:Ranunculus%20asiaticus", - "localImageUri": "/plants/ranunculus-asiaticus--ranunkel--accafde4.webp", - "status": "existing" - }, - { - "id": "plant_563226faba183e0d", - "botanicalName": "Selaginella uncinata", - "name": "Regenbogenmoos", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/34/Selaginella_uncinata_-_Berlin_Botanical_Garden_-_IMG_8722.JPG/500px-Selaginella_uncinata_-_Berlin_Botanical_Garden_-_IMG_8722.JPG", - "localImageUri": "/plants/selaginella-uncinata--regenbogenmoos--fac3dec7.webp", - "status": "existing" - }, - { - "id": "plant_8fd28228f90cb02c", - "botanicalName": "Rhododendron catawbiense", - "name": "Rhododendron", - "sourceUri": "wikimedia-search:Rhododendron%20catawbiense", - "localImageUri": "/plants/rhododendron-catawbiense--rhododendron--b7977ab9.webp", - "status": "existing" - }, - { - "id": "plant_a6883747d701df71", - "botanicalName": "Clivia miniata", - "name": "Riemenblatt", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c2/Clivia_miniata%2C_blomme_en_vrugte%2C_Manie_van_der_Schijff_BT%2C_a.jpg/500px-Clivia_miniata%2C_blomme_en_vrugte%2C_Manie_van_der_Schijff_BT%2C_a.jpg", - "localImageUri": "/plants/clivia-miniata--riemenblatt--29bc76f5.webp", - "status": "existing" - }, - { - "id": "plant_c6e77cf5ecbf70cb", - "botanicalName": "Calendula officinalis", - "name": "Ringelblume", - "sourceUri": "wikimedia-search:Calendula%20officinalis", - "localImageUri": "/plants/calendula-officinalis--ringelblume--03f33ce8.webp", - "status": "existing" - }, - { - "id": "plant_5e0e0211b3e815d1", - "botanicalName": "Peperomia caperata", - "name": "Rippenpeperomie", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/14/Peperomia_caperata_1-OB9.jpg/500px-Peperomia_caperata_1-OB9.jpg", - "localImageUri": "/plants/peperomia-caperata--rippenpeperomie--b3a48151.webp", - "status": "existing" - }, - { - "id": "plant_47384e6f56f96010", - "botanicalName": "Delphinium elatum", - "name": "Rittersporn", - "sourceUri": "wikimedia-search:Delphinium%20elatum", - "localImageUri": "/plants/delphinium-elatum--rittersporn--d7df6211.webp", - "status": "existing" - }, - { - "id": "plant_f3c4aea00446ce7d", - "botanicalName": "Hippeastrum hybrid", - "name": "Ritterstern", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/fc/Hippeastrum_hybrid_1.jpg/500px-Hippeastrum_hybrid_1.jpg", - "localImageUri": "/plants/hippeastrum-hybrid--ritterstern--82bc6dc8.webp", - "status": "existing" - }, - { - "id": "plant_cdba57900c250b2a", - "botanicalName": "Robinia pseudoacacia", - "name": "Robinie", - "sourceUri": "wikimedia-search:Robinia%20pseudoacacia", - "localImageUri": "/plants/robinia-pseudoacacia--robinie--a3887565.webp", - "status": "existing" - }, - { - "id": "plant_354a445932988de3", - "botanicalName": "Chamaemelum nobile", - "name": "Roemische Kamille", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/f/f2/Chamaemelum_nobile_kz02.jpg", - "localImageUri": "/plants/chamaemelum-nobile--roemische-kamille--9235aca6.webp", - "status": "existing" - }, - { - "id": "plant_2b5acacfe6dbc6dd", - "botanicalName": "Rosa x hybrida", - "name": "Rose", - "sourceUri": "wikimedia-search:Rosa%20x%20hybrida", - "localImageUri": "/plants/rosa-x-hybrida--rose--7375780c.webp", - "status": "existing" - }, - { - "id": "plant_ce9ff96b95f4fe81", - "botanicalName": "Pelargonium graveolens", - "name": "Rosengeranie", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b7/%28MHNT%29_Pelargonium_graveolens_flower_and_leaves.jpg/500px-%28MHNT%29_Pelargonium_graveolens_flower_and_leaves.jpg", - "localImageUri": "/plants/pelargonium-graveolens--rosengeranie--d7f8a481.webp", - "status": "existing" - }, - { - "id": "plant_bc06c3ee948f7ba7", - "botanicalName": "Rosmarinus officinalis", - "name": "Rosmarin", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a3/Rosemary_in_bloom.JPG/500px-Rosemary_in_bloom.JPG", - "localImageUri": "/plants/rosmarinus-officinalis--rosmarin--2791f58d.webp", - "status": "existing" - }, - { - "id": "plant_a50df676efef7b7d", - "botanicalName": "Digitalis purpurea", - "name": "Roter Fingerhut", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/ba/Digitalis_purpurea_LC0101.jpg/500px-Digitalis_purpurea_LC0101.jpg", - "localImageUri": "/plants/digitalis-purpurea--roter-fingerhut--be177092.webp", - "status": "existing" - }, - { - "id": "plant_4f9c3ae955d4b1b0", - "botanicalName": "Philodendron erubescens", - "name": "Roter Philodendron", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c7/Philodendron_erubescens_-_Leaves.jpg/500px-Philodendron_erubescens_-_Leaves.jpg", - "localImageUri": "/plants/philodendron-erubescens--roter-philodendron--5d917978.webp", - "status": "existing" - }, - { - "id": "plant_0790565aca23f0a8", - "botanicalName": "Rudbeckia hirta", - "name": "Rudbeckie", - "sourceUri": "wikimedia-search:Rudbeckia%20hirta", - "localImageUri": "/plants/rudbeckia-hirta--rudbeckie--e1dd8170.webp", - "status": "existing" - }, - { - "id": "plant_b6887f02c51a178f", - "botanicalName": "Lactuca sativa", - "name": "Salat", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/da/Iceberg_lettuce_in_SB.jpg/500px-Iceberg_lettuce_in_SB.jpg", - "localImageUri": "/plants/lactuca-sativa--salat--7cd31564.webp", - "status": "existing" - }, - { - "id": "plant_e3f7fa02342527b0", - "botanicalName": "Salvia officinalis", - "name": "Salbei", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/5a/Salvia_officinalis0.jpg/500px-Salvia_officinalis0.jpg", - "localImageUri": "/plants/salvia-officinalis--salbei--9fe3bf8f.webp", - "status": "existing" - }, - { - "id": "plant_8ab2cdddfd49ca3a", - "botanicalName": "Anthurium clarinervium", - "name": "Samt-Anthurie", - "sourceUri": "wikimedia-search:Anthurium%20clarinervium", - "localImageUri": "/plants/anthurium-clarinervium--samt-anthurie--dd38d7fa.webp", - "status": "existing" - }, - { - "id": "plant_5ce8d8944fd3edc3", - "botanicalName": "Echinopsis pachanoi", - "name": "San-Pedro-Kaktus", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/62/Starr_070320-5799_Echinopsis_pachanoi.jpg/500px-Starr_070320-5799_Echinopsis_pachanoi.jpg", - "localImageUri": "/plants/echinopsis-pachanoi--san-pedro-kaktus--7f1085bc.webp", - "status": "existing" - }, - { - "id": "plant_d30b54367d7c0ccc", - "botanicalName": "Scindapsus pictus", - "name": "Satinpothos", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/ca/Scindapsus_pictus_01.jpg/500px-Scindapsus_pictus_01.jpg", - "localImageUri": "/plants/scindapsus-pictus--satinpothos--8991b0e9.webp", - "status": "existing" - }, - { - "id": "plant_5ed455617815911c", - "botanicalName": "Rumex acetosa", - "name": "Sauerampfer", - "sourceUri": "wikimedia-search:Rumex%20acetosa", - "localImageUri": "/plants/rumex-acetosa--sauerampfer--8078fc90.webp", - "status": "existing" - }, - { - "id": "plant_cbc9b35001d4f2fa", - "botanicalName": "Achillea millefolium", - "name": "Schafgarbe", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/1a/Achillea_millefolium_%28bright%29.jpg/500px-Achillea_millefolium_%28bright%29.jpg", - "localImageUri": "/plants/achillea-millefolium--schafgarbe--a945b3a0.webp", - "status": "existing" - }, - { - "id": "plant_ceea5c9d9b527cea", - "botanicalName": "Mimosa pudica", - "name": "Schamkraut", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/26/Mimosa_pudica_in_September_month.jpg/500px-Mimosa_pudica_in_September_month.jpg", - "localImageUri": "/plants/mimosa-pudica--schamkraut--89ce823f.webp", - "status": "existing" - }, - { - "id": "plant_0bbd3af303fd64ab", - "botanicalName": "Buddleja davidii", - "name": "Schmetterlingsflieder", - "sourceUri": "wikimedia-search:Buddleja%20davidii", - "localImageUri": "/plants/buddleja-davidii--schmetterlingsflieder--c6785fa7.webp", - "status": "existing" - }, - { - "id": "plant_f02576d98e962040", - "botanicalName": "Phalaenopsis amabilis", - "name": "Schmetterlingsorchidee", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/59/Phalaenopsis_amabilis_Orchi_198.jpg/500px-Phalaenopsis_amabilis_Orchi_198.jpg", - "localImageUri": "/plants/phalaenopsis-amabilis--schmetterlingsorchidee--3c14cbf2.webp", - "status": "existing" - }, - { - "id": "plant_a346ee92e571923a", - "botanicalName": "Allium tuberosum", - "name": "Schnittknoblauch", - "sourceUri": "wikimedia-search:Allium%20tuberosum", - "localImageUri": "/plants/allium-tuberosum--schnittknoblauch--3904b032.webp", - "status": "existing" - }, - { - "id": "plant_1b8072d12aee4246", - "botanicalName": "Allium schoenoprasum", - "name": "Schnittlauch", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/49/Allium_schoenoprasum_-_Bombus_lapidarius_-_Tootsi.jpg/500px-Allium_schoenoprasum_-_Bombus_lapidarius_-_Tootsi.jpg", - "localImageUri": "/plants/allium-schoenoprasum--schnittlauch--d820fe95.webp", - "status": "existing" - }, - { - "id": "plant_2dcb1ec9ac8b968f", - "botanicalName": "Pandanus veitchii", - "name": "Schraubenbaum", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/fb/Pandanus_tectorius.jpg/500px-Pandanus_tectorius.jpg", - "localImageUri": "/plants/pandanus-veitchii--schraubenbaum--36aa501d.webp", - "status": "existing" - }, - { - "id": "plant_40f7fbbd6ef0e3ba", - "botanicalName": "Aspidistra elatior", - "name": "Schusterpflanze", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/fc/Aspidistra_elatior1.jpg/500px-Aspidistra_elatior1.jpg", - "localImageUri": "/plants/aspidistra-elatior--schusterpflanze--27471002.webp", - "status": "existing" - }, - { - "id": "plant_fb7db49b3c127f71", - "botanicalName": "Aeonium arboreum", - "name": "Schwarze Rose (Aeonium)", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/28/Madeira%2C_Palheiro_Gardens_-_Aeonium_arboreum_%28Marokko%29_IMG_2310.JPG/500px-Madeira%2C_Palheiro_Gardens_-_Aeonium_arboreum_%28Marokko%29_IMG_2310.JPG", - "localImageUri": "/plants/aeonium-arboreum--schwarze-rose-aeonium--2fa8210f.webp", - "status": "existing" - }, - { - "id": "plant_183e544c5601be51", - "botanicalName": "Sambucus nigra", - "name": "Schwarzer Holunder", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/61/Sambucus_nigra_004.jpg/500px-Sambucus_nigra_004.jpg", - "localImageUri": "/plants/sambucus-nigra--schwarzer-holunder--fd1fe0a5.webp", - "status": "existing" - }, - { - "id": "plant_6f49714ec9e1191f", - "botanicalName": "Asclepias tuberosa", - "name": "Seidenpflanze", - "sourceUri": "wikimedia-search:Asclepias%20tuberosa", - "localImageUri": "/plants/asclepias-tuberosa--seidenpflanze--d082aa6e.webp", - "status": "existing" - }, - { - "id": "plant_269c939743f4674a", - "botanicalName": "Leucanthemum x superbum", - "name": "Shasta-Margerite", - "sourceUri": "wikimedia-search:Leucanthemum%20x%20superbum", - "localImageUri": "/plants/leucanthemum-x-superbum--shasta-margerite--519d56a9.webp", - "status": "existing" - }, - { - "id": "plant_a44a902f4af980ef", - "botanicalName": "Perilla frutescens", - "name": "Shiso", - "sourceUri": "wikimedia-search:Perilla%20frutescens", - "localImageUri": "/plants/perilla-frutescens--shiso--c065ca09.webp", - "status": "existing" - }, - { - "id": "plant_3c6961985d686c33", - "botanicalName": "Salix alba", - "name": "Silber-Weide", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/f8/Salix_alba_leaves.jpg/500px-Salix_alba_leaves.jpg", - "localImageUri": "/plants/salix-alba--silber-weide--407a5b47.webp", - "status": "existing" - }, - { - "id": "plant_4d4483c9e8f98e94", - "botanicalName": "Aechmea fasciata", - "name": "Silbervase", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/23/Aechmea_fasciata2.jpg/500px-Aechmea_fasciata2.jpg", - "localImageUri": "/plants/aechmea-fasciata--silbervase--04efba01.webp", - "status": "existing" - }, - { - "id": "plant_24c71b67fe2ed42a", - "botanicalName": "Adenium socotranum", - "name": "Socotra-Wuestenrose", - "sourceUri": "wikimedia-search:Adenium%20socotranum", - "localImageUri": "/plants/adenium-socotranum--socotra-wuestenrose--0118195c.webp", - "status": "existing" - }, - { - "id": "plant_d9407787d1cc720e", - "botanicalName": "Helianthus annuus", - "name": "Sonnenblume", - "sourceUri": "wikimedia-search:Helianthus%20annuus", - "localImageUri": "/plants/helianthus-annuus--sonnenblume--d26f9031.webp", - "status": "existing" - }, - { - "id": "plant_a91db7a3318f3302", - "botanicalName": "Echinacea purpurea", - "name": "Sonnenhut", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/8e/Echinacea_purpurea_Grandview_Prairie.jpg/500px-Echinacea_purpurea_Grandview_Prairie.jpg", - "localImageUri": "/plants/echinacea-purpurea--sonnenhut--cd110eab.webp", - "status": "existing" - }, - { - "id": "plant_0aa802b967afc69a", - "botanicalName": "Drosera capensis", - "name": "Sonnentau", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/0f/Drosera_capensis_bend.JPG/500px-Drosera_capensis_bend.JPG", - "localImageUri": "/plants/drosera-capensis--sonnentau--7122f48c.webp", - "status": "existing" - }, - { - "id": "plant_db7dd5c2bff6c42d", - "botanicalName": "Tillandsia usneoides", - "name": "Spanisches Moos", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/13/Spanish_moss_at_the_Mcbryde_Garden_in_hawaii.jpg/500px-Spanish_moss_at_the_Mcbryde_Garden_in_hawaii.jpg", - "localImageUri": "/plants/tillandsia-usneoides--spanisches-moos--80677975.webp", - "status": "existing" - }, - { - "id": "plant_ac11d9bd0c391e9d", - "botanicalName": "Portulacaria afra", - "name": "Speckbaum", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/46/Portulacaria_afra_02.JPG/500px-Portulacaria_afra_02.JPG", - "localImageUri": "/plants/portulacaria-afra--speckbaum--b630ec3c.webp", - "status": "existing" - }, - { - "id": "plant_477dc83da2cd56cb", - "botanicalName": "Peperomia obtusifolia", - "name": "Spiegelpeperomie", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/19/Peperomia_obtusifolia_3-OB9.jpg/500px-Peperomia_obtusifolia_3-OB9.jpg", - "localImageUri": "/plants/peperomia-obtusifolia--spiegelpeperomie--fffbf481.webp", - "status": "existing" - }, - { - "id": "plant_4e6527efa4ab752f", - "botanicalName": "Spiraea japonica", - "name": "Spierstrauch", - "sourceUri": "wikimedia-search:Spiraea%20japonica", - "localImageUri": "/plants/spiraea-japonica--spierstrauch--2fce09a7.webp", - "status": "existing" - }, - { - "id": "plant_4f624a47f15a976c", - "botanicalName": "Spinacia oleracea", - "name": "Spinat", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/37/Spinacia_oleracea_Spinazie_bloeiend.jpg/500px-Spinacia_oleracea_Spinazie_bloeiend.jpg", - "localImageUri": "/plants/spinacia-oleracea--spinat--67379554.webp", - "status": "existing" - }, - { - "id": "plant_3c3e9d84b343cb19", - "botanicalName": "Acer platanoides", - "name": "Spitzahorn", - "sourceUri": "wikimedia-search:Acer%20platanoides", - "localImageUri": "/plants/acer-platanoides--spitzahorn--dc2fbf6a.webp", - "status": "existing" - }, - { - "id": "plant_c3b438f135460578", - "botanicalName": "Rhapis excelsa", - "name": "Stab-Palme", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/0c/Arya_-_Rhapis_excelsa_at_hotel_citradream_Cirebon_2019_0.jpg/500px-Arya_-_Rhapis_excelsa_at_hotel_citradream_Cirebon_2019_0.jpg", - "localImageUri": "/plants/rhapis-excelsa--stab-palme--3f2eded0.webp", - "status": "existing" - }, - { - "id": "plant_ec4cfefb4784d583", - "botanicalName": "Ilex aquifolium", - "name": "Stechpalme", - "sourceUri": "wikimedia-search:Ilex%20aquifolium", - "localImageUri": "/plants/ilex-aquifolium--stechpalme--19cff9ae.webp", - "status": "existing" - }, - { - "id": "plant_0bff1afe77c852a9", - "botanicalName": "Pelargonium zonale", - "name": "Stehende Geranie", - "sourceUri": "wikimedia-search:Pelargonium%20zonale", - "localImageUri": "/plants/pelargonium-zonale--stehende-geranie--2854b148.webp", - "status": "existing" - }, - { - "id": "plant_dfd8a974072ccdde", - "botanicalName": "Stevia rebaudiana", - "name": "Stevia", - "sourceUri": "wikimedia-search:Stevia%20rebaudiana", - "localImageUri": "/plants/stevia-rebaudiana--stevia--423f53ff.webp", - "status": "existing" - }, - { - "id": "plant_e6998b94b6aa9483", - "botanicalName": "Viola wittrockiana", - "name": "Stiefmuetterchen", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b8/PansyScan_%28cropped%29.jpg/500px-PansyScan_%28cropped%29.jpg", - "localImageUri": "/plants/viola-wittrockiana--stiefmuetterchen--d2cb587c.webp", - "status": "existing" - }, - { - "id": "plant_4e7aa106c2e0dbed", - "botanicalName": "Miltoniopsis roezlii", - "name": "Stiefmuetterchen-Orchidee", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/bd/Miltoniopsis_roezlii_%28as_Odontoglossum_roezlii%29_-_pl._30_-_Bateman%2C_Monogr.Odont.jpg/500px-Miltoniopsis_roezlii_%28as_Odontoglossum_roezlii%29_-_pl._30_-_Bateman%2C_Monogr.Odont.jpg", - "localImageUri": "/plants/miltoniopsis-roezlii--stiefmuetterchen-orchidee--87379182.webp", - "status": "existing" - }, - { - "id": "plant_b608fca2dcc684e2", - "botanicalName": "Alcea rosea", - "name": "Stockrose", - "sourceUri": "wikimedia-search:Alcea%20rosea", - "localImageUri": "/plants/alcea-rosea--stockrose--4b6ec327.webp", - "status": "existing" - }, - { - "id": "plant_67521f8578f80480", - "botanicalName": "Schefflera arboricola", - "name": "Strahlenaralie", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/82/Schefflera_arboricola%2C_vrugte%2C_a%2C_Pretoria.jpg/500px-Schefflera_arboricola%2C_vrugte%2C_a%2C_Pretoria.jpg", - "localImageUri": "/plants/schefflera-arboricola--strahlenaralie--b445fcbb.webp", - "status": "existing" - }, - { - "id": "plant_29784101db6f97ac", - "botanicalName": "Curio radicans", - "name": "String of Bananas", - "sourceUri": "wikimedia-search:Curio%20radicans", - "localImageUri": "/plants/curio-radicans--string-of-bananas--cee5c6f3.webp", - "status": "existing" - }, - { - "id": "plant_a765276379bdfc03", - "botanicalName": "Curio x peregrinus", - "name": "String of Dolphins", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/0/00/Dolphinplant.jpg", - "localImageUri": "/plants/curio-x-peregrinus--string-of-dolphins--167250ea.webp", - "status": "existing" - }, - { - "id": "plant_15d0205868b79470", - "botanicalName": "Stromanthe sanguinea", - "name": "Stromanthe", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/38/Stromanthe_sanguinea_in_garden_in_Manaus%2C_Brazil.jpg/500px-Stromanthe_sanguinea_in_garden_in_Manaus%2C_Brazil.jpg", - "localImageUri": "/plants/stromanthe-sanguinea--stromanthe--a9ffe5b3.webp", - "status": "existing" - }, - { - "id": "plant_9d6e62be0b1cb281", - "botanicalName": "Tagetes patula", - "name": "Studentenblume", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e7/French_marigold_Tagetes_patula.jpg/500px-French_marigold_Tagetes_patula.jpg", - "localImageUri": "/plants/tagetes-patula--studentenblume--0da7d656.webp", - "status": "existing" - }, - { - "id": "plant_4b198e1fefa08544", - "botanicalName": "Ipomoea batatas", - "name": "Suesskartoffel", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/58/Ipomoea_batatas_006.JPG/500px-Ipomoea_batatas_006.JPG", - "localImageUri": "/plants/ipomoea-batatas--suesskartoffel--09695c9f.webp", - "status": "existing" - }, - { - "id": "plant_592490afaac6a7aa", - "botanicalName": "Hemerocallis fulva", - "name": "Taglilie", - "sourceUri": "wikimedia-search:Hemerocallis%20fulva", - "localImageUri": "/plants/hemerocallis-fulva--taglilie--de9c4c6c.webp", - "status": "existing" - }, - { - "id": "plant_876974955b59c59e", - "botanicalName": "Oncidium sphacelatum", - "name": "Tanzerinnen-Orchidee", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/37/Oncidium_sphacelatum03.jpg/500px-Oncidium_sphacelatum03.jpg", - "localImageUri": "/plants/oncidium-sphacelatum--tanzerinnen-orchidee--79ae7545.webp", - "status": "existing" - }, - { - "id": "plant_2ee0814c52ec43e5", - "botanicalName": "Colocasia esculenta", - "name": "Taro", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/30/Songe-R%C3%A9union.JPG/500px-Songe-R%C3%A9union.JPG", - "localImageUri": "/plants/colocasia-esculenta--taro--d23c3d35.webp", - "status": "existing" - }, - { - "id": "plant_8860c603977b7048", - "botanicalName": "Camellia sinensis", - "name": "Teestrauch", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/71/Csinensis.jpg/500px-Csinensis.jpg", - "localImageUri": "/plants/camellia-sinensis--teestrauch--2c1d14da.webp", - "status": "existing" - }, - { - "id": "plant_716160bf88dd9d13", - "botanicalName": "Plumeria rubra", - "name": "Tempel-Baum", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/aa/Champa_tree_with_pink_flowers_in_Islamabad%2C_Pakistan.jpg/500px-Champa_tree_with_pink_flowers_in_Islamabad%2C_Pakistan.jpg", - "localImageUri": "/plants/plumeria-rubra--tempel-baum--657d110b.webp", - "status": "existing" - }, - { - "id": "plant_9b35df06e64f0898", - "botanicalName": "Thymus vulgaris", - "name": "Thymian", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/4f/Thymus_vulgaris1.JPG/500px-Thymus_vulgaris1.JPG", - "localImageUri": "/plants/thymus-vulgaris--thymian--64a6471c.webp", - "status": "existing" - }, - { - "id": "plant_4318ad8d02f7a1e3", - "botanicalName": "Cordyline fruticosa", - "name": "Tiroler Keulenlilie", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/2d/Cordyline_fruticosa_%2820262433874%29.jpg/500px-Cordyline_fruticosa_%2820262433874%29.jpg", - "localImageUri": "/plants/cordyline-fruticosa--tiroler-keulenlilie--4a44ec99.webp", - "status": "existing" - }, - { - "id": "plant_6209cff29d20de9d", - "botanicalName": "Solanum lycopersicum", - "name": "Tomate", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/89/Tomato_je.jpg/500px-Tomato_je.jpg", - "localImageUri": "/plants/solanum-lycopersicum--tomate--e68be402.webp", - "status": "existing" - }, - { - "id": "plant_ca4a549c5f190565", - "botanicalName": "Lamprocapnos spectabilis", - "name": "Traenendes Herz", - "sourceUri": "wikimedia-search:Lamprocapnos%20spectabilis", - "localImageUri": "/plants/lamprocapnos-spectabilis--traenendes-herz--ab9054da.webp", - "status": "existing" - }, - { - "id": "plant_5b5d63d3d16734c3", - "botanicalName": "Muscari armeniacum", - "name": "Traubenhyazinthe", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/1a/Muscari_armeniacum_4.jpg/500px-Muscari_armeniacum_4.jpg", - "localImageUri": "/plants/muscari-armeniacum--traubenhyazinthe--bc818bf4.webp", - "status": "existing" - }, - { - "id": "plant_79692a800f05a5e6", - "botanicalName": "Fuchsia triphylla", - "name": "Triphylla-Fuchsie", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/90/Fuchsia_triphylla_kz01.jpg/500px-Fuchsia_triphylla_kz01.jpg", - "localImageUri": "/plants/fuchsia-triphylla--triphylla-fuchsie--822e8e3b.webp", - "status": "existing" - }, - { - "id": "plant_31af49a80e8b525f", - "botanicalName": "Catalpa bignonioides", - "name": "Trompetenbaum", - "sourceUri": "wikimedia-search:Catalpa%20bignonioides", - "localImageUri": "/plants/catalpa-bignonioides--trompetenbaum--b3b0e8b4.webp", - "status": "existing" - }, - { - "id": "plant_b62179d49d13e958", - "botanicalName": "Campsis radicans", - "name": "Trompetenwinde", - "sourceUri": "wikimedia-search:Campsis%20radicans", - "localImageUri": "/plants/campsis-radicans--trompetenwinde--7ed75a41.webp", - "status": "existing" - }, - { - "id": "plant_6ad4ada285b323dd", - "botanicalName": "Polypodium vulgare", - "name": "Tueipelfarn", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/56/T%C3%BCpfelfarn_%28Polypodium_vulgare%29.jpg/500px-T%C3%BCpfelfarn_%28Polypodium_vulgare%29.jpg", - "localImageUri": "/plants/polypodium-vulgare--tueipelfarn--2e4f5046.webp", - "status": "existing" - }, - { - "id": "plant_f03bc24e17022dd9", - "botanicalName": "Microsorum punctatum", - "name": "Tueipelfarn (Microsorum)", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/9f/Microsorum_punctatum.jpg/500px-Microsorum_punctatum.jpg", - "localImageUri": "/plants/microsorum-punctatum--tueipelfarn-microsorum--77fa4bea.webp", - "status": "existing" - }, - { - "id": "plant_a90c8b9c4cddc806", - "botanicalName": "Tulipa gesneriana", - "name": "Tulpe", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/9e/%D7%A6%D7%91%D7%A2%D7%95%D7%A0%D7%99%D7%9D.JPG/500px-%D7%A6%D7%91%D7%A2%D7%95%D7%A0%D7%99%D7%9D.JPG", - "localImageUri": "/plants/tulipa-gesneriana--tulpe--373bf645.webp", - "status": "existing" - }, - { - "id": "plant_ea198ff58c8805c6", - "botanicalName": "Pilea peperomioides", - "name": "Ufopflanze", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/6d/Pilea_peperomioides_Chinese_money_plant.jpg/500px-Pilea_peperomioides_Chinese_money_plant.jpg", - "localImageUri": "/plants/pilea-peperomioides--ufopflanze--6b60c68b.webp", - "status": "existing" - }, - { - "id": "plant_40fc59a7783f4dbd", - "botanicalName": "Vanda coerulea", - "name": "Vanda-Orchidee", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b3/An_orchid_%28Vanda_caerulea%29%3B_flowering_stem._Watercolour._Wellcome_V0043303.jpg/500px-An_orchid_%28Vanda_caerulea%29%3B_flowering_stem._Watercolour._Wellcome_V0043303.jpg", - "localImageUri": "/plants/vanda-coerulea--vanda-orchidee--d3b6fab1.webp", - "status": "existing" - }, - { - "id": "plant_ec96801b21f4b888", - "botanicalName": "Vanilla planifolia", - "name": "Vanille", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e6/Vanilla_planifolia_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-278.jpg/500px-Vanilla_planifolia_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-278.jpg", - "localImageUri": "/plants/vanilla-planifolia--vanille--39790d8a.webp", - "status": "existing" - }, - { - "id": "plant_e0c02d30e9553083", - "botanicalName": "Dionaea muscipula", - "name": "Venusfliegenfalle", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/37/Venus_Flytrap_showing_trigger_hairs.jpg/500px-Venus_Flytrap_showing_trigger_hairs.jpg", - "localImageUri": "/plants/dionaea-muscipula--venusfliegenfalle--fbcebf61.webp", - "status": "existing" - }, - { - "id": "plant_78ed61e5bca062af", - "botanicalName": "Myosotis sylvatica", - "name": "Vergissmeinnicht", - "sourceUri": "wikimedia-search:Myosotis%20sylvatica", - "localImageUri": "/plants/myosotis-sylvatica--vergissmeinnicht--0d817fb7.webp", - "status": "existing" - }, - { - "id": "plant_621534b573f3fbd1", - "botanicalName": "Asplenium nidus", - "name": "Vogelnest-Farn", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/84/Asplenium_nidus_%28Bukidnon%2C_Philippines%29_02.jpg/500px-Asplenium_nidus_%28Bukidnon%2C_Philippines%29_02.jpg", - "localImageUri": "/plants/asplenium-nidus--vogelnest-farn--c9fbbb3c.webp", - "status": "existing" - }, - { - "id": "plant_b109c47be52f9ec8", - "botanicalName": "Hoya carnosa", - "name": "Wachsblume", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/ea/NKN-2007-06-13_114250_Hoya_Carnosa_%28Yvan_Leduc_author_for_Wikipedia%29.jpg/500px-NKN-2007-06-13_114250_Hoya_Carnosa_%28Yvan_Leduc_author_for_Wikipedia%29.jpg", - "localImageUri": "/plants/hoya-carnosa--wachsblume--4da8fed5.webp", - "status": "existing" - }, - { - "id": "plant_632f108725deeafe", - "botanicalName": "Lantana camara", - "name": "Wandelroeschen", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/52/LantanaFlowerLeaves.jpg/500px-LantanaFlowerLeaves.jpg", - "localImageUri": "/plants/lantana-camara--wandelroeschen--b8fc5640.webp", - "status": "existing" - }, - { - "id": "plant_57f737231af6effa", - "botanicalName": "Eutrema japonicum", - "name": "Wasabi", - "sourceUri": "wikimedia-search:Eutrema%20japonicum", - "localImageUri": "/plants/eutrema-japonicum--wasabi--0ea8f701.webp", - "status": "existing" - }, - { - "id": "plant_75007016cfcc5200", - "botanicalName": "Peperomia argyreia", - "name": "Wassermelonen-Peperomie", - "sourceUri": "wikimedia-search:Peperomia%20argyreia", - "localImageUri": "/plants/peperomia-argyreia--wassermelonen-peperomie--1f013dee.webp", - "status": "existing" - }, - { - "id": "plant_c64390ca3c3743fe", - "botanicalName": "Utricularia gibba", - "name": "Wasserschlauch", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/bd/Utricularia_gibba_flower_01.jpg/500px-Utricularia_gibba_flower_01.jpg", - "localImageUri": "/plants/utricularia-gibba--wasserschlauch--13643b06.webp", - "status": "existing" - }, - { - "id": "plant_bd3c4350600627fd", - "botanicalName": "Weigela florida", - "name": "Weigelie", - "sourceUri": "wikimedia-search:Weigela%20florida", - "localImageUri": "/plants/weigela-florida--weigelie--0bf98f7f.webp", - "status": "existing" - }, - { - "id": "plant_33f62ca8680da000", - "botanicalName": "Schlumbergera truncata", - "name": "Weihnachtskaktus", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/f1/Schlumbergera_truncata_%28Exotic_Flora_Plate_20%29.jpg/500px-Schlumbergera_truncata_%28Exotic_Flora_Plate_20%29.jpg", - "localImageUri": "/plants/schlumbergera-truncata--weihnachtskaktus--c8f10c80.webp", - "status": "existing" - }, - { - "id": "plant_8218a6240dd4a406", - "botanicalName": "Euphorbia pulcherrima", - "name": "Weihnachtsstern", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e1/Weihnachtsstern_-_gro%C3%9F.jpg/500px-Weihnachtsstern_-_gro%C3%9F.jpg", - "localImageUri": "/plants/euphorbia-pulcherrima--weihnachtsstern--ce82aeac.webp", - "status": "existing" - }, - { - "id": "plant_4275140824142c04", - "botanicalName": "Strelitzia nicolai", - "name": "Weisse Strelitzie", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/ba/Strelitzia_nicolai_3.jpg/500px-Strelitzia_nicolai_3.jpg", - "localImageUri": "/plants/strelitzia-nicolai--weisse-strelitzie--30b92c65.webp", - "status": "existing" - }, - { - "id": "plant_0a06480067428b83", - "botanicalName": "Tradescantia fluminensis", - "name": "Weisse Tradescantia", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/ef/Tradescantia_fluminensis_%28Flowers%29.jpg/500px-Tradescantia_fluminensis_%28Flowers%29.jpg", - "localImageUri": "/plants/tradescantia-fluminensis--weisse-tradescantia--ed8ecd20.webp", - "status": "existing" - }, - { - "id": "plant_316228d023b525c1", - "botanicalName": "Artemisia absinthium", - "name": "Wermut", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/eb/Artemisia_absinthium_P1210748.jpg/500px-Artemisia_absinthium_P1210748.jpg", - "localImageUri": "/plants/artemisia-absinthium--wermut--26709c63.webp", - "status": "existing" - }, - { - "id": "plant_77608bbef47bdc04", - "botanicalName": "Adenium obesum", - "name": "Wuestenrose", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/4a/Adenium_Obesum_Flower_Side_Macro_Mar22_D72_23052-58_ZS_P.jpg/500px-Adenium_Obesum_Flower_Side_Macro_Mar22_D72_23052-58_ZS_P.jpg", - "localImageUri": "/plants/adenium-obesum--wuestenrose--18b1b800.webp", - "status": "existing" - }, - { - "id": "plant_31c096c7b1717c86", - "botanicalName": "Hyssopus officinalis", - "name": "Ysop", - "sourceUri": "wikimedia-search:Hyssopus%20officinalis", - "localImageUri": "/plants/hyssopus-officinalis--ysop--d3df148e.webp", - "status": "existing" - }, - { - "id": "plant_247330481dff3519", - "botanicalName": "Yucca aloifolia", - "name": "Yucca aloifolia", - "sourceUri": "wikimedia-search:Yucca%20aloifolia", - "localImageUri": "/plants/yucca-aloifolia--ce8ca7a3.webp", - "status": "existing" - }, - { - "id": "plant_a0e4e7fa68bbad41", - "botanicalName": "Yucca elephantipes", - "name": "Yucca-Palme", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/bd/Yucca_gigantea_-_Jard%C3%ADn_Bot%C3%A1nico_Canario_Viera_y_Clavijo_-_Gran_Canaria.jpg/500px-Yucca_gigantea_-_Jard%C3%ADn_Bot%C3%A1nico_Canario_Viera_y_Clavijo_-_Gran_Canaria.jpg", - "localImageUri": "/plants/yucca-elephantipes--yucca-palme--1e34e66e.webp", - "status": "existing" - }, - { - "id": "plant_28107fe5558dfaa3", - "botanicalName": "Hamamelis mollis", - "name": "Zaubernuss", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/ce/Hamamelis_mollis0.jpg/500px-Hamamelis_mollis0.jpg", - "localImageUri": "/plants/hamamelis-mollis--zaubernuss--7ef3c16c.webp", - "status": "existing" - }, - { - "id": "plant_75abff461b3d9bf8", - "botanicalName": "Haworthia fasciata", - "name": "Zebra-Haworthie", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/5c/1_Haworthia_fasciata_-MBB_Kabeljouws_River.jpg/500px-1_Haworthia_fasciata_-MBB_Kabeljouws_River.jpg", - "localImageUri": "/plants/haworthia-fasciata--zebra-haworthie--e4e7e4db.webp", - "status": "existing" - }, - { - "id": "plant_f7d0af5f2c284fff", - "botanicalName": "Tradescantia zebrina", - "name": "Zebrakraut", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/fd/Zebrina_pendula_20060521_2_closer.jpg/500px-Zebrina_pendula_20060521_2_closer.jpg", - "localImageUri": "/plants/tradescantia-zebrina--zebrakraut--1e9a096a.webp", - "status": "existing" - }, - { - "id": "plant_54030db3ff0bde0a", - "botanicalName": "Cedrus libani", - "name": "Zeder", - "sourceUri": "wikimedia-search:Cedrus%20libani", - "localImageUri": "/plants/cedrus-libani--zeder--6af4a3dd.webp", - "status": "existing" - }, - { - "id": "plant_998c8c4ed16286d8", - "botanicalName": "Nicotiana alata", - "name": "Ziertabak", - "sourceUri": "wikimedia-search:Nicotiana%20alata", - "localImageUri": "/plants/nicotiana-alata--ziertabak--e83c441c.webp", - "status": "existing" - }, - { - "id": "plant_ec8a05c334d66976", - "botanicalName": "Zinnia elegans", - "name": "Zinnie", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/6e/Zinnienbl%C3%BCte_Zinnia_elegans_stack15_20190722-RM-7222254.jpg/500px-Zinnienbl%C3%BCte_Zinnia_elegans_stack15_20190722-RM-7222254.jpg", - "localImageUri": "/plants/zinnia-elegans--zinnie--6d666757.webp", - "status": "existing" - }, - { - "id": "plant_29250eba0cf2291f", - "botanicalName": "Citrus limon", - "name": "Zitronenbaum", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e4/P1030323.JPG/500px-P1030323.JPG", - "localImageUri": "/plants/citrus-limon--zitronenbaum--100d9901.webp", - "status": "existing" - }, - { - "id": "plant_3e605c281bb361cc", - "botanicalName": "Cymbopogon citratus", - "name": "Zitronengras", - "sourceUri": "wikimedia-search:Cymbopogon%20citratus", - "localImageUri": "/plants/cymbopogon-citratus--zitronengras--671a6414.webp", - "status": "existing" - }, - { - "id": "plant_8febd56fe7368d57", - "botanicalName": "Melissa officinalis", - "name": "Zitronenmelisse", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/70/Lemon_balm_plant.jpg/500px-Lemon_balm_plant.jpg", - "localImageUri": "/plants/melissa-officinalis--zitronenmelisse--79ec1828.webp", - "status": "existing" - }, - { - "id": "plant_dc96f296e8d0e517", - "botanicalName": "Aloysia citrodora", - "name": "Zitronenverbene", - "sourceUri": "wikimedia-search:Aloysia%20citrodora", - "localImageUri": "/plants/aloysia-citrodora--zitronenverbene--92460709.webp", - "status": "existing" - }, - { - "id": "plant_3a3d31c9d818021b", - "botanicalName": "Phoenix roebelenii", - "name": "Zwergdattelpalme", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/1d/Starr_070124-3839_Phoenix_roebelenii.jpg/500px-Starr_070124-3839_Phoenix_roebelenii.jpg", - "localImageUri": "/plants/phoenix-roebelenii--zwergdattelpalme--f83a8f6a.webp", - "status": "existing" - }, - { - "id": "plant_5c8f76b2c7d187f1", - "botanicalName": "Sansevieria cylindrica", - "name": "Zylindrischer Bogenhanf", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c8/Sansevieria_cylindrica_flowers_7.jpg/500px-Sansevieria_cylindrica_flowers_7.jpg", - "localImageUri": "/plants/sansevieria-cylindrica--zylindrischer-bogenhanf--5b3a59b5.webp", - "status": "existing" - }, - { - "id": "plant_7fe204e226887efa", - "botanicalName": "Cymbidium lowianum", - "name": "Zymbidium", - "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/b/b7/Cymbidium_lowianum_-_Bot-DSCF1035.jpg", - "localImageUri": "/plants/cymbidium-lowianum--zymbidium--3ee7a3d5.webp", - "status": "existing" - }, - { - "id": "plant_d138e647d3e19b04", - "botanicalName": "Cupressus sempervirens", - "name": "Zypresse", - "sourceUri": "wikimedia-search:Cupressus%20sempervirens", - "localImageUri": "/plants/cupressus-sempervirens--zypresse--fece2137.webp", - "status": "existing" - } - ] +{ + "generatedAt": "2026-03-12T09:19:24.727Z", + "summary": { + "totalPlants": 358, + "downloadedCount": 0, + "existingCount": 358, + "skippedCount": 0, + "failureCount": 0 + }, + "failures": [], + "items": [ + { + "id": "plant_8bfe537a28c86289", + "botanicalName": "Stapelia grandiflora", + "name": "Aasblume", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/98/Stapelia_grandiflora_22102013_1_%2810606394434%29.jpg/500px-Stapelia_grandiflora_22102013_1_%2810606394434%29.jpg", + "localImageUri": "/plants/stapelia-grandiflora--aasblume--b87af483.webp", + "status": "existing" + }, + { + "id": "plant_3e0a9ac0f2e3487e", + "botanicalName": "Adromischus cristatus", + "name": "Adromischus", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/15/Adromischus_cristatus_-_Gaiser_Conservatory_%28Manito_Park%29_-_IMG_7008.JPG/500px-Adromischus_cristatus_-_Gaiser_Conservatory_%28Manito_Park%29_-_IMG_7008.JPG", + "localImageUri": "/plants/adromischus-cristatus--adromischus--9b24b9fc.webp", + "status": "existing" + }, + { + "id": "plant_b149587ebd02e88b", + "botanicalName": "Saintpaulia ionantha", + "name": "Afrikanisches Veilchen", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/57/Streptocarpus_ionanthus_%28as_Saintpaulia_ionantha%29_-_Curtis%27_121_%28Ser._3_no._51%29_pl._7408_%281895%29.jpg/500px-Streptocarpus_ionanthus_%28as_Saintpaulia_ionantha%29_-_Curtis%27_121_%28Ser._3_no._51%29_pl._7408_%281895%29.jpg", + "localImageUri": "/plants/saintpaulia-ionantha--afrikanisches-veilchen--bc75f4a8.webp", + "status": "existing" + }, + { + "id": "plant_163ec12a26b24198", + "botanicalName": "Agave americana", + "name": "Agave", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/3b/Agave_July_2011-1.jpg/500px-Agave_July_2011-1.jpg", + "localImageUri": "/plants/agave-americana--agave--3b197a68.webp", + "status": "existing" + }, + { + "id": "plant_f35722f0d85fcbf0", + "botanicalName": "Aglaonema commutatum", + "name": "Aglaoneme", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c7/Aglaonema_commutatum_kz1.jpg/500px-Aglaonema_commutatum_kz1.jpg", + "localImageUri": "/plants/aglaonema-commutatum--aglaoneme--7928abe4.webp", + "status": "existing" + }, + { + "id": "plant_480b93349eb97dce", + "botanicalName": "Alocasia zebrina", + "name": "Alocasia zebrina", + "sourceUri": "wikimedia-search:Alocasia%20zebrina", + "localImageUri": "/plants/alocasia-zebrina--525caa90.webp", + "status": "existing" + }, + { + "id": "plant_521cc31a3ab2a5b1", + "botanicalName": "Cyclamen persicum", + "name": "Alpenveilchen", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/68/Yagur_%E2%80%93_Nesher%2C_the_Green_Path_%E2%80%93_Mount_Carmel_016.JPG/500px-Yagur_%E2%80%93_Nesher%2C_the_Green_Path_%E2%80%93_Mount_Carmel_016.JPG", + "localImageUri": "/plants/cyclamen-persicum--alpenveilchen--42e9e354.webp", + "status": "existing" + }, + { + "id": "plant_7a47f2728dced1a4", + "botanicalName": "Pilea cadierei", + "name": "Aluminium-Pflanze", + "sourceUri": "wikimedia-search:Pilea%20cadierei", + "localImageUri": "/plants/pilea-cadierei--aluminium-pflanze--3e1e1bd9.webp", + "status": "existing" + }, + { + "id": "plant_c623dbd931826123", + "botanicalName": "Alocasia amazonica", + "name": "Amazona-Taro", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/cf/Alocasia_x_amazonica_a1.jpg/500px-Alocasia_x_amazonica_a1.jpg", + "localImageUri": "/plants/alocasia-amazonica--amazona-taro--e1c87d71.webp", + "status": "existing" + }, + { + "id": "plant_28d349e6f67fe99a", + "botanicalName": "Anemone coronaria", + "name": "Anemone", + "sourceUri": "wikimedia-search:Anemone%20coronaria", + "localImageUri": "/plants/anemone-coronaria--anemone--8a7fda1c.webp", + "status": "existing" + }, + { + "id": "plant_7079ed3283a094f9", + "botanicalName": "Jasminum sambac", + "name": "Arabischer Jasmin", + "sourceUri": "wikimedia-search:Jasminum%20sambac", + "localImageUri": "/plants/jasminum-sambac--arabischer-jasmin--5be39aae.webp", + "status": "existing" + }, + { + "id": "plant_c2890f36d8fc9da0", + "botanicalName": "Arnica montana", + "name": "Arnika", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/17/Arnica_montana_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-015.jpg/500px-Arnica_montana_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-015.jpg", + "localImageUri": "/plants/arnica-montana--arnika--285e6ea8.webp", + "status": "existing" + }, + { + "id": "plant_fdadaf062de2c567", + "botanicalName": "Solanum melongena", + "name": "Aubergine", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/76/Solanum_melongena_24_08_2012_%281%29.JPG/500px-Solanum_melongena_24_08_2012_%281%29.JPG", + "localImageUri": "/plants/solanum-melongena--aubergine--5f3bad2f.webp", + "status": "existing" + }, + { + "id": "plant_480619fefb890692", + "botanicalName": "Valeriana officinalis", + "name": "Baldrian", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/af/Valeriana_officinalis_inflorescence_-_Niitv%C3%A4lja.jpg/500px-Valeriana_officinalis_inflorescence_-_Niitv%C3%A4lja.jpg", + "localImageUri": "/plants/valeriana-officinalis--baldrian--7bc7a2ae.webp", + "status": "existing" + }, + { + "id": "plant_b73b967c062264fa", + "botanicalName": "Bambusa vulgaris", + "name": "Bambusrohr", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/10/Golden_Bamboo%28Bambusa_vulgaris%29_in_Hong_Kong.jpg/500px-Golden_Bamboo%28Bambusa_vulgaris%29_in_Hong_Kong.jpg", + "localImageUri": "/plants/bambusa-vulgaris--bambusrohr--620e47a2.webp", + "status": "existing" + }, + { + "id": "plant_1b52f8bc38189420", + "botanicalName": "Musa acuminata", + "name": "Bananenpflanze", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/7d/Musa_acuminata_in_india01.jpg/500px-Musa_acuminata_in_india01.jpg", + "localImageUri": "/plants/musa-acuminata--bananenpflanze--0a6a2ad8.webp", + "status": "existing" + }, + { + "id": "plant_1f420e53ba82d27e", + "botanicalName": "Iris germanica", + "name": "Bart-Iris", + "sourceUri": "wikimedia-search:Iris%20germanica", + "localImageUri": "/plants/iris-germanica--bart-iris--f0e4d8d1.webp", + "status": "existing" + }, + { + "id": "plant_2c5e541195cb3797", + "botanicalName": "Dianthus barbatus", + "name": "Bartnelke", + "sourceUri": "wikimedia-search:Dianthus%20barbatus", + "localImageUri": "/plants/dianthus-barbatus--bartnelke--e1f96804.webp", + "status": "existing" + }, + { + "id": "plant_65672e0cb49ca62d", + "botanicalName": "Ocimum basilicum", + "name": "Basilikum", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/97/Ocimum_basilicum_8zz.jpg/500px-Ocimum_basilicum_8zz.jpg", + "localImageUri": "/plants/ocimum-basilicum--basilikum--cdc33445.webp", + "status": "existing" + }, + { + "id": "plant_c804e440aeb95635", + "botanicalName": "Lavatera trimestris", + "name": "Bechermalve", + "sourceUri": "wikimedia-search:Lavatera%20trimestris", + "localImageUri": "/plants/lavatera-trimestris--bechermalve--96fa8526.webp", + "status": "existing" + }, + { + "id": "plant_11f9d18d047193e4", + "botanicalName": "Chamaedorea elegans", + "name": "Bergpalme", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/64/Chamaedorea_elegans_Mart.JPG/500px-Chamaedorea_elegans_Mart.JPG", + "localImageUri": "/plants/chamaedorea-elegans--bergpalme--05a6cf35.webp", + "status": "existing" + }, + { + "id": "plant_519742b7ea9df158", + "botanicalName": "Billbergia nutans", + "name": "Billbergia", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/9/9e/Billbergia_nutans1SHSU.jpg", + "localImageUri": "/plants/billbergia-nutans--billbergia--a659ab7f.webp", + "status": "existing" + }, + { + "id": "plant_2347cc2289a2ef8b", + "botanicalName": "Ficus benjamina", + "name": "Birkenfeige", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/19/Starr-080608-7576-Ficus_benjamina-habit_with_Laysan_albatross-Gym_Sand_Island-Midway_Atoll_%2824823189861%29.jpg/500px-Starr-080608-7576-Ficus_benjamina-habit_with_Laysan_albatross-Gym_Sand_Island-Midway_Atoll_%2824823189861%29.jpg", + "localImageUri": "/plants/ficus-benjamina--birkenfeige--399b661c.webp", + "status": "existing" + }, + { + "id": "plant_4be713bff78ae299", + "botanicalName": "Senecio serpens", + "name": "Blauer Kreuzkraut", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/57/Senecio_serpens_04.jpg/500px-Senecio_serpens_04.jpg", + "localImageUri": "/plants/senecio-serpens--blauer-kreuzkraut--4ec1f347.webp", + "status": "existing" + }, + { + "id": "plant_51da778adc3d568f", + "botanicalName": "Phlebodium aureum", + "name": "Blaues Kanaelfarn", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/2d/Starr_050107-2831_Phlebodium_aureum.jpg/500px-Starr_050107-2831_Phlebodium_aureum.jpg", + "localImageUri": "/plants/phlebodium-aureum--blaues-kanaelfarn--a630296a.webp", + "status": "existing" + }, + { + "id": "plant_f696d8640ac1e58b", + "botanicalName": "Euphorbia tirucalli", + "name": "Bleistiftkaktus", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/22/Euphorbia_tirucalli_in_the_wild_by_tonrulkens.jpg/500px-Euphorbia_tirucalli_in_the_wild_by_tonrulkens.jpg", + "localImageUri": "/plants/euphorbia-tirucalli--bleistiftkaktus--2760cacf.webp", + "status": "existing" + }, + { + "id": "plant_fcfdae786a599215", + "botanicalName": "Plumbago auriculata", + "name": "Bleiwurz", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e1/Plumbago_auriculata_2718.jpg/500px-Plumbago_auriculata_2718.jpg", + "localImageUri": "/plants/plumbago-auriculata--bleiwurz--a1ea78f5.webp", + "status": "existing" + }, + { + "id": "plant_2778ede47b41928b", + "botanicalName": "Canna indica", + "name": "Blumenschilfrohr", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/1c/Cinnamon-bellied_flowerpiercer_%28Diglossa_baritula%29_male_on_Indian_shot_%28Canna_indica%29_Finca_El_Pilar.jpg/500px-Cinnamon-bellied_flowerpiercer_%28Diglossa_baritula%29_male_on_Indian_shot_%28Canna_indica%29_Finca_El_Pilar.jpg", + "localImageUri": "/plants/canna-indica--blumenschilfrohr--adfa9705.webp", + "status": "existing" + }, + { + "id": "plant_7b30624e5b0b4c89", + "botanicalName": "Geranium sanguineum", + "name": "Blutroter Storchschnabel", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/8c/2012-07-03_Bloody_Crane%27s-bill%2C_Hauxley%2C_Northumberland_1.jpg/500px-2012-07-03_Bloody_Crane%27s-bill%2C_Hauxley%2C_Northumberland_1.jpg", + "localImageUri": "/plants/geranium-sanguineum--blutroter-storchschnabel--9d8300fb.webp", + "status": "existing" + }, + { + "id": "plant_02e3ea2f54fa9fcb", + "botanicalName": "Satureja hortensis", + "name": "Bohnenkraut", + "sourceUri": "wikimedia-search:Satureja%20hortensis", + "localImageUri": "/plants/satureja-hortensis--bohnenkraut--b5b822ab.webp", + "status": "existing" + }, + { + "id": "plant_c71619cd9a02cef2", + "botanicalName": "Ficus retusa", + "name": "Bonsai-Feige", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/cf/Ficus_retusa_herbarium_sheet.jpg/500px-Ficus_retusa_herbarium_sheet.jpg", + "localImageUri": "/plants/ficus-retusa--bonsai-feige--dff4fbd3.webp", + "status": "existing" + }, + { + "id": "plant_fb10011bdfcaeb73", + "botanicalName": "Borago officinalis", + "name": "Borretsch", + "sourceUri": "wikimedia-search:Borago%20officinalis", + "localImageUri": "/plants/borago-officinalis--borretsch--0d13299a.webp", + "status": "existing" + }, + { + "id": "plant_a65e5c9dedb9cd6f", + "botanicalName": "Bougainvillea spectabilis", + "name": "Bougainvillea", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/ae/Starr_030418-0061_Bougainvillea_spectabilis.jpg/500px-Starr_030418-0061_Bougainvillea_spectabilis.jpg", + "localImageUri": "/plants/bougainvillea-spectabilis--bougainvillea--0d84eedd.webp", + "status": "existing" + }, + { + "id": "plant_34a9a605f91a0e38", + "botanicalName": "Kalanchoe daigremontiana", + "name": "Brutblatt", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/fc/Vivipary_in_Kalanchoe_daigremontiana.jpg/500px-Vivipary_in_Kalanchoe_daigremontiana.jpg", + "localImageUri": "/plants/kalanchoe-daigremontiana--brutblatt--5b643bf7.webp", + "status": "existing" + }, + { + "id": "plant_7d5148b82570ac03", + "botanicalName": "Soleirolia soleirolii", + "name": "Bubikopf", + "sourceUri": "wikimedia-search:Soleirolia%20soleirolii", + "localImageUri": "/plants/soleirolia-soleirolii--bubikopf--b1b13e0f.webp", + "status": "existing" + }, + { + "id": "plant_a4cf51a5e4359d1d", + "botanicalName": "Buxus sempervirens", + "name": "Buchsbaum", + "sourceUri": "wikimedia-search:Buxus%20sempervirens", + "localImageUri": "/plants/buxus-sempervirens--buchsbaum--598f8440.webp", + "status": "existing" + }, + { + "id": "plant_ca3703f121432723", + "botanicalName": "Caladium bicolor", + "name": "Buntblatt", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/f8/Caladium_bicolor_2.jpg/500px-Caladium_bicolor_2.jpg", + "localImageUri": "/plants/caladium-bicolor--buntblatt--d052df1e.webp", + "status": "existing" + }, + { + "id": "plant_99ba7fe9e23a07d2", + "botanicalName": "Plectranthus scutellarioides", + "name": "Buntnessel", + "sourceUri": "wikimedia-search:Plectranthus%20scutellarioides", + "localImageUri": "/plants/plectranthus-scutellarioides--buntnessel--7e6c3a78.webp", + "status": "existing" + }, + { + "id": "plant_d13f1280e602ce42", + "botanicalName": "Goeppertia insignis", + "name": "Calathea lancifolia", + "sourceUri": "wikimedia-search:Goeppertia%20insignis", + "localImageUri": "/plants/goeppertia-insignis--calathea-lancifolia--f77abcca.webp", + "status": "existing" + }, + { + "id": "plant_d1a2562fb13fc53a", + "botanicalName": "Goeppertia ornata", + "name": "Calathea ornata", + "sourceUri": "wikimedia-search:Goeppertia%20ornata", + "localImageUri": "/plants/goeppertia-ornata--calathea-ornata--e7f67cad.webp", + "status": "existing" + }, + { + "id": "plant_de32e74f5d2e4f07", + "botanicalName": "Calibrachoa hybrida", + "name": "Calibrachoa", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/fb/Calibrachoa_flower_red.jpg/500px-Calibrachoa_flower_red.jpg", + "localImageUri": "/plants/calibrachoa-hybrida--calibrachoa--18b44d0e.webp", + "status": "existing" + }, + { + "id": "plant_df8b72684a52d16d", + "botanicalName": "Zantedeschia aethiopica", + "name": "Calla", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a2/Zantedeschia_aethiopica_-1.jpg/500px-Zantedeschia_aethiopica_-1.jpg", + "localImageUri": "/plants/zantedeschia-aethiopica--calla--c739da85.webp", + "status": "existing" + }, + { + "id": "plant_c1e5518101af0660", + "botanicalName": "Callisia repens", + "name": "Callisia", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/7c/Callisia_repens_starr.jpg/500px-Callisia_repens_starr.jpg", + "localImageUri": "/plants/callisia-repens--callisia--65401a5e.webp", + "status": "existing" + }, + { + "id": "plant_e98319d5942ee47b", + "botanicalName": "Cattleya labiata", + "name": "Cattleya-Orchidee", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e6/Labiata.jpg/500px-Labiata.jpg", + "localImageUri": "/plants/cattleya-labiata--cattleya-orchidee--91962802.webp", + "status": "existing" + }, + { + "id": "plant_f5fef1b22db032e8", + "botanicalName": "Capsicum annuum", + "name": "Chili", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/d2/Capsicum_annuum_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-027.jpg/500px-Capsicum_annuum_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-027.jpg", + "localImageUri": "/plants/capsicum-annuum--chili--dabf0f0e.webp", + "status": "existing" + }, + { + "id": "plant_282d1b42588a5121", + "botanicalName": "Livistona chinensis", + "name": "Chinesische Fächerpalme", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/f6/Livistona-chinensis.jpg/500px-Livistona-chinensis.jpg", + "localImageUri": "/plants/livistona-chinensis--chinesische-facherpalme--773e43a2.webp", + "status": "existing" + }, + { + "id": "plant_beef88438a4a5a77", + "botanicalName": "Rosa chinensis", + "name": "Chinesische Rose", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/2a/Rosa_chinensis.jpg/500px-Rosa_chinensis.jpg", + "localImageUri": "/plants/rosa-chinensis--chinesische-rose--2c0514b0.webp", + "status": "existing" + }, + { + "id": "plant_3062bd4ee2363d81", + "botanicalName": "Wisteria sinensis", + "name": "Chinesischer Blauregen", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/7a/Chinesischer_Blauregen_Detail_Bl%C3%BCtentraube.JPG/500px-Chinesischer_Blauregen_Detail_Bl%C3%BCtentraube.JPG", + "localImageUri": "/plants/wisteria-sinensis--chinesischer-blauregen--8887793e.webp", + "status": "existing" + }, + { + "id": "plant_552c1df47769e60a", + "botanicalName": "Euphorbia milii", + "name": "Christusdorn", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/77/Euphorbia_Milii_flowers.jpg/500px-Euphorbia_Milii_flowers.jpg", + "localImageUri": "/plants/euphorbia-milii--christusdorn--f647812e.webp", + "status": "existing" + }, + { + "id": "plant_d726e9204f2d2353", + "botanicalName": "Chrysanthemum indicum", + "name": "Chrysantheme", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/d6/Chrysanthemum_indicum1.jpg/500px-Chrysanthemum_indicum1.jpg", + "localImageUri": "/plants/chrysanthemum-indicum--chrysantheme--f3f1b7ad.webp", + "status": "existing" + }, + { + "id": "plant_ca9d5a83cf397269", + "botanicalName": "Clematis viticella", + "name": "Clematis", + "sourceUri": "wikimedia-search:Clematis%20viticella", + "localImageUri": "/plants/clematis-viticella--clematis--7c06c3b1.webp", + "status": "existing" + }, + { + "id": "plant_79e87c68ecaf5082", + "botanicalName": "Columnea gloriosa", + "name": "Columnea", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/32/Columnea_gloriosa_%2849470911201%29.jpg/500px-Columnea_gloriosa_%2849470911201%29.jpg", + "localImageUri": "/plants/columnea-gloriosa--columnea--3fd247d6.webp", + "status": "existing" + }, + { + "id": "plant_5136b27d56c24f26", + "botanicalName": "Cryptanthus bivittatus", + "name": "Cryptanthus", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/d1/CryptanthusBivittatus.jpg/500px-CryptanthusBivittatus.jpg", + "localImageUri": "/plants/cryptanthus-bivittatus--cryptanthus--0300865d.webp", + "status": "existing" + }, + { + "id": "plant_177a5dd7d3237533", + "botanicalName": "Ctenanthe burle-marxii", + "name": "Ctenanthe", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/7d/Ctenanthe_burle-marxii.jpg/500px-Ctenanthe_burle-marxii.jpg", + "localImageUri": "/plants/ctenanthe-burle-marxii--ctenanthe--aaacfef1.webp", + "status": "existing" + }, + { + "id": "plant_4698cb973868e2ea", + "botanicalName": "Helichrysum italicum", + "name": "Currykraut", + "sourceUri": "wikimedia-search:Helichrysum%20italicum", + "localImageUri": "/plants/helichrysum-italicum--currykraut--9f84755c.webp", + "status": "existing" + }, + { + "id": "plant_d38f9fdbd2fc0128", + "botanicalName": "Dahlia pinnata", + "name": "Dahlie", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/60/Borboletas_em_Mini-D%C3%A1lias.JPG/500px-Borboletas_em_Mini-D%C3%A1lias.JPG", + "localImageUri": "/plants/dahlia-pinnata--dahlie--34a69e35.webp", + "status": "existing" + }, + { + "id": "plant_0f54f9b5c4726b7c", + "botanicalName": "Dendrobium nobile", + "name": "Dendrobium", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/bb/Dendrobium_nobile_-_flower_view_01.jpg/500px-Dendrobium_nobile_-_flower_view_01.jpg", + "localImageUri": "/plants/dendrobium-nobile--dendrobium--a29be123.webp", + "status": "existing" + }, + { + "id": "plant_4a40e184dc1158af", + "botanicalName": "Dieffenbachia seguine", + "name": "Dieffenbachie", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/80/Dieffenbachia_seguine1FKST.jpg/500px-Dieffenbachia_seguine1FKST.jpg", + "localImageUri": "/plants/dieffenbachia-seguine--dieffenbachie--755822dd.webp", + "status": "existing" + }, + { + "id": "plant_e2d789d2529ac262", + "botanicalName": "Anethum graveolens", + "name": "Dill", + "sourceUri": "wikimedia-search:Anethum%20graveolens", + "localImageUri": "/plants/anethum-graveolens--dill--b93ab119.webp", + "status": "existing" + }, + { + "id": "plant_5a0f781f2fbe33a1", + "botanicalName": "Dischidia ruscifolia", + "name": "Dischidia", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/ec/%E7%99%BE%E8%90%AC%E5%BF%83_Dischidia_ruscifolia_-%E9%A6%99%E6%B8%AF%E5%8B%95%E6%A4%8D%E7%89%A9%E5%85%AC%E5%9C%92_Hong_Kong_Botanical_Garden-_%289240152650%29.jpg/500px-%E7%99%BE%E8%90%AC%E5%BF%83_Dischidia_ruscifolia_-%E9%A6%99%E6%B8%AF%E5%8B%95%E6%A4%8D%E7%89%A9%E5%85%AC%E5%9C%92_Hong_Kong_Botanical_Garden-_%289240152650%29.jpg", + "localImageUri": "/plants/dischidia-ruscifolia--dischidia--962061db.webp", + "status": "existing" + }, + { + "id": "plant_d888afa045930bba", + "botanicalName": "Dracaena marginata", + "name": "Drachenbaum", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/61/Dracaena_reflexa.JPG/500px-Dracaena_reflexa.JPG", + "localImageUri": "/plants/dracaena-marginata--drachenbaum--ae46a13c.webp", + "status": "existing" + }, + { + "id": "plant_03f2e14e6adb42c5", + "botanicalName": "Streptocarpus hybridus", + "name": "Drehfrucht", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/ee/2007-03-20Streptocarpus03.jpg/500px-2007-03-20Streptocarpus03.jpg", + "localImageUri": "/plants/streptocarpus-hybridus--drehfrucht--d30e3476.webp", + "status": "existing" + }, + { + "id": "plant_3c9b2546fb073192", + "botanicalName": "Dudleya brittonii", + "name": "Dudleya", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/10/Dudleya_Brittonii.jpg/500px-Dudleya_Brittonii.jpg", + "localImageUri": "/plants/dudleya-brittonii--dudleya--be6042d1.webp", + "status": "existing" + }, + { + "id": "plant_db00b284aaf5553b", + "botanicalName": "Lobularia maritima", + "name": "Duftsteinrich", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a0/Smagliczka_nadmorska_1.jpg/500px-Smagliczka_nadmorska_1.jpg", + "localImageUri": "/plants/lobularia-maritima--duftsteinrich--309e832f.webp", + "status": "existing" + }, + { + "id": "plant_ded5f50a41d943e2", + "botanicalName": "Lathyrus odoratus", + "name": "Duftwicke", + "sourceUri": "wikimedia-search:Lathyrus%20odoratus", + "localImageUri": "/plants/lathyrus-odoratus--duftwicke--029de58d.webp", + "status": "existing" + }, + { + "id": "plant_1c5e1673e5c8084d", + "botanicalName": "Sorbus aucuparia", + "name": "Eberesche", + "sourceUri": "wikimedia-search:Sorbus%20aucuparia", + "localImageUri": "/plants/sorbus-aucuparia--eberesche--8ebfe649.webp", + "status": "existing" + }, + { + "id": "plant_19ba49fd14de0fd2", + "botanicalName": "Echeveria elegans", + "name": "Echeverie", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/5d/Echeveria_elegans_-_1.png/500px-Echeveria_elegans_-_1.png", + "localImageUri": "/plants/echeveria-elegans--echeverie--71f5556f.webp", + "status": "existing" + }, + { + "id": "plant_adc9e050aeb462c7", + "botanicalName": "Lavandula angustifolia", + "name": "Echter Lavendel", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/4/40/Lavandula_angustifolia_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-087.jpg", + "localImageUri": "/plants/lavandula-angustifolia--echter-lavendel--cfd090c5.webp", + "status": "existing" + }, + { + "id": "plant_2f9ab7e162ca10e4", + "botanicalName": "Hedera helix", + "name": "Efeu", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/5a/Hedera_helix_Dover.jpg/500px-Hedera_helix_Dover.jpg", + "localImageUri": "/plants/hedera-helix--efeu--cebdfbf1.webp", + "status": "existing" + }, + { + "id": "plant_81cfa08a34c49816", + "botanicalName": "Pelargonium peltatum", + "name": "Efeu-Geranie", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/98/Pelargonium_peltatum_flower.jpg/500px-Pelargonium_peltatum_flower.jpg", + "localImageUri": "/plants/pelargonium-peltatum--efeu-geranie--8cd609cc.webp", + "status": "existing" + }, + { + "id": "plant_1401620498ee85ea", + "botanicalName": "Quercus robur", + "name": "Eiche", + "sourceUri": "wikimedia-search:Quercus%20robur", + "localImageUri": "/plants/quercus-robur--eiche--ea94af29.webp", + "status": "existing" + }, + { + "id": "plant_9c1fe0b19dc69115", + "botanicalName": "Begonia semperflorens-cultorum", + "name": "Eisbegonie", + "sourceUri": "wikimedia-search:Begonia%20semperflorens-cultorum", + "localImageUri": "/plants/begonia-semperflorens-cultorum--eisbegonie--7d66e22f.webp", + "status": "existing" + }, + { + "id": "plant_80dcaefb7e942ba2", + "botanicalName": "Verbena bonariensis", + "name": "Eisenkraut", + "sourceUri": "wikimedia-search:Verbena%20bonariensis", + "localImageUri": "/plants/verbena-bonariensis--eisenkraut--486982ce.webp", + "status": "existing" + }, + { + "id": "plant_dc1a3a410bf856da", + "botanicalName": "Fragaria ananassa", + "name": "Erdbeere", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/4c/Garden_strawberry_%28Fragaria_%C3%97_ananassa%29_single2.jpg/500px-Garden_strawberry_%28Fragaria_%C3%97_ananassa%29_single2.jpg", + "localImageUri": "/plants/fragaria-ananassa--erdbeere--4a97a911.webp", + "status": "existing" + }, + { + "id": "plant_3900a4af2d8f685c", + "botanicalName": "Sedum morganianum", + "name": "Eselschwanz", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e5/Donkey%27s_tail_in_bloom_March_06.jpg/500px-Donkey%27s_tail_in_bloom_March_06.jpg", + "localImageUri": "/plants/sedum-morganianum--eselschwanz--f6256abc.webp", + "status": "existing" + }, + { + "id": "plant_441bffa80236bad9", + "botanicalName": "Artemisia dracunculus", + "name": "Estragon", + "sourceUri": "wikimedia-search:Artemisia%20dracunculus", + "localImageUri": "/plants/artemisia-dracunculus--estragon--68c643ad.webp", + "status": "existing" + }, + { + "id": "plant_ef61030c75921bec", + "botanicalName": "Eucalyptus globulus", + "name": "Eukalyptus", + "sourceUri": "wikimedia-search:Eucalyptus%20globulus", + "localImageUri": "/plants/eucalyptus-globulus--eukalyptus--48f49df6.webp", + "status": "existing" + }, + { + "id": "plant_bcda607d5ebeba6e", + "botanicalName": "Acer palmatum", + "name": "Faecherahorn", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/d6/Acer_palmatum0.jpg/500px-Acer_palmatum0.jpg", + "localImageUri": "/plants/acer-palmatum--faecherahorn--388b6858.webp", + "status": "existing" + }, + { + "id": "plant_44ed48e3379766d4", + "botanicalName": "Schefflera elegantissima", + "name": "Falsche Aralie", + "sourceUri": "wikimedia-search:Schefflera%20elegantissima", + "localImageUri": "/plants/schefflera-elegantissima--falsche-aralie--ff7f753e.webp", + "status": "existing" + }, + { + "id": "plant_f8e84be57621f80c", + "botanicalName": "Ferocactus cylindraceus", + "name": "Fass-Kaktus", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/05/Ferocactus-cylindraceus.jpg/500px-Ferocactus-cylindraceus.jpg", + "localImageUri": "/plants/ferocactus-cylindraceus--fass-kaktus--ef5c90b1.webp", + "status": "existing" + }, + { + "id": "plant_502fa49e2138d4e5", + "botanicalName": "Fatsia japonica", + "name": "Fatsia", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/f4/Old_Fatsia_japonica_with_blosems.jpg/500px-Old_Fatsia_japonica_with_blosems.jpg", + "localImageUri": "/plants/fatsia-japonica--fatsia--425270ac.webp", + "status": "existing" + }, + { + "id": "plant_4d2d5509b4c55176", + "botanicalName": "Pinguicula grandiflora", + "name": "Fettkraut", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b2/Pinguicula_grandiflora_001.jpg/500px-Pinguicula_grandiflora_001.jpg", + "localImageUri": "/plants/pinguicula-grandiflora--fettkraut--8ec9dead.webp", + "status": "existing" + }, + { + "id": "plant_133e475a45d4a204", + "botanicalName": "Salvia splendens", + "name": "Feuersalbei", + "sourceUri": "wikimedia-search:Salvia%20splendens", + "localImageUri": "/plants/salvia-splendens--feuersalbei--09913571.webp", + "status": "existing" + }, + { + "id": "plant_982eaf3da780eb59", + "botanicalName": "Picea abies", + "name": "Fichte", + "sourceUri": "wikimedia-search:Picea%20abies", + "localImageUri": "/plants/picea-abies--fichte--400d9dc4.webp", + "status": "existing" + }, + { + "id": "plant_04676d4c182b8d1f", + "botanicalName": "Ficus altissima", + "name": "Ficus altissima", + "sourceUri": "wikimedia-search:Ficus%20altissima", + "localImageUri": "/plants/ficus-altissima--76a13dda.webp", + "status": "existing" + }, + { + "id": "plant_ea41ca92364af519", + "botanicalName": "Ficus microcarpa", + "name": "Ficus microcarpa", + "sourceUri": "wikimedia-search:Ficus%20microcarpa", + "localImageUri": "/plants/ficus-microcarpa--ca033402.webp", + "status": "existing" + }, + { + "id": "plant_a45983ad9bacfbd3", + "botanicalName": "Vriesea splendens", + "name": "Flammen-Bromelie", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b6/Bromelia1.jpg/500px-Bromelia1.jpg", + "localImageUri": "/plants/vriesea-splendens--flammen-bromelie--debc6faa.webp", + "status": "existing" + }, + { + "id": "plant_370e9f24edf68a0c", + "botanicalName": "Delonix regia", + "name": "Flammenbaum", + "sourceUri": "wikimedia-search:Delonix%20regia", + "localImageUri": "/plants/delonix-regia--flammenbaum--efa632a4.webp", + "status": "existing" + }, + { + "id": "plant_47552862396b817d", + "botanicalName": "Phlox paniculata", + "name": "Flammenblume", + "sourceUri": "wikimedia-search:Phlox%20paniculata", + "localImageUri": "/plants/phlox-paniculata--flammenblume--0bbdd41e.webp", + "status": "existing" + }, + { + "id": "plant_4385d6c520bf6b30", + "botanicalName": "Impatiens walleriana", + "name": "Fleissiges Lieschen", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/28/Impatienswalleriana.jpg/500px-Impatienswalleriana.jpg", + "localImageUri": "/plants/impatiens-walleriana--fleissiges-lieschen--5816f930.webp", + "status": "existing" + }, + { + "id": "plant_11018f19eabb8229", + "botanicalName": "Syringa vulgaris", + "name": "Flieder", + "sourceUri": "wikimedia-search:Syringa%20vulgaris", + "localImageUri": "/plants/syringa-vulgaris--flieder--7e22429d.webp", + "status": "existing" + }, + { + "id": "plant_a1224f40826b5089", + "botanicalName": "Begonia maculata", + "name": "Forellen-Begonie", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/df/Begonia_maculata3073316230.jpg/500px-Begonia_maculata3073316230.jpg", + "localImageUri": "/plants/begonia-maculata--forellen-begonie--5cce47c8.webp", + "status": "existing" + }, + { + "id": "plant_30b30e6adcb6e218", + "botanicalName": "Forsythia x intermedia", + "name": "Forsythie", + "sourceUri": "wikimedia-search:Forsythia%20x%20intermedia", + "localImageUri": "/plants/forsythia-x-intermedia--forsythie--390c28f1.webp", + "status": "existing" + }, + { + "id": "plant_fbe673c97a27643c", + "botanicalName": "Adiantum raddianum", + "name": "Frauenhaarfarn", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/45/Starr_030807-0143_Adiantum_raddianum.jpg/500px-Starr_030807-0143_Adiantum_raddianum.jpg", + "localImageUri": "/plants/adiantum-raddianum--frauenhaarfarn--d47cef0b.webp", + "status": "existing" + }, + { + "id": "plant_2c359b2ed2eeb763", + "botanicalName": "Freesia refracta", + "name": "Freesie", + "sourceUri": "wikimedia-search:Freesia%20refracta", + "localImageUri": "/plants/freesia-refracta--freesie--9dafaec2.webp", + "status": "existing" + }, + { + "id": "plant_253febdb6b4c4860", + "botanicalName": "Fuchsia hybrida", + "name": "Fuchsie", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/bf/Brincos_De_Princesa.jpg/500px-Brincos_De_Princesa.jpg", + "localImageUri": "/plants/fuchsia-hybrida--fuchsie--93ef43c2.webp", + "status": "existing" + }, + { + "id": "plant_416995465e65262d", + "botanicalName": "Amaranthus caudatus", + "name": "Fuchsschwanz", + "sourceUri": "wikimedia-search:Amaranthus%20caudatus", + "localImageUri": "/plants/amaranthus-caudatus--fuchsschwanz--ae0190ae.webp", + "status": "existing" + }, + { + "id": "plant_45589064f63546e7", + "botanicalName": "Bellis perennis", + "name": "Gaensebluemchen", + "sourceUri": "wikimedia-search:Bellis%20perennis", + "localImageUri": "/plants/bellis-perennis--gaensebluemchen--324d3eb0.webp", + "status": "existing" + }, + { + "id": "plant_7e81c1b15627e3d7", + "botanicalName": "Gardenia jasminoides", + "name": "Gardenie", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/54/Gardenia_jasminoides_flower_Argentina.jpg/500px-Gardenia_jasminoides_flower_Argentina.jpg", + "localImageUri": "/plants/gardenia-jasminoides--gardenie--f8284265.webp", + "status": "existing" + }, + { + "id": "plant_78a6ccea1e54390f", + "botanicalName": "Impatiens balsamina", + "name": "Gartenbalsamine", + "sourceUri": "wikimedia-search:Impatiens%20balsamina", + "localImageUri": "/plants/impatiens-balsamina--gartenbalsamine--4e1447e8.webp", + "status": "existing" + }, + { + "id": "plant_6e54d649a0c3c691", + "botanicalName": "Hibiscus syriacus", + "name": "Gartenhibiskus", + "sourceUri": "wikimedia-search:Hibiscus%20syriacus", + "localImageUri": "/plants/hibiscus-syriacus--gartenhibiskus--4701a393.webp", + "status": "existing" + }, + { + "id": "plant_c63e701e278fa8ae", + "botanicalName": "Gasteria carinata", + "name": "Gasteria", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/91/2_Gasteria_carinata_var_carinata.jpg/500px-2_Gasteria_carinata_var_carinata.jpg", + "localImageUri": "/plants/gasteria-carinata--gasteria--b27de8c8.webp", + "status": "existing" + }, + { + "id": "plant_fa2afbb2eb4500a7", + "botanicalName": "Maranta leuconeura", + "name": "Gebet-Pflanze", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/4a/Maranta_leuconeura3.jpg/500px-Maranta_leuconeura3.jpg", + "localImageUri": "/plants/maranta-leuconeura--gebet-pflanze--e50f6916.webp", + "status": "existing" + }, + { + "id": "plant_16c869313cd292ca", + "botanicalName": "Ficus lyrata", + "name": "Geigenfeige", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/84/Starr_031108-0130_Ficus_lyrata.jpg/500px-Starr_031108-0130_Ficus_lyrata.jpg", + "localImageUri": "/plants/ficus-lyrata--geigenfeige--c025bb04.webp", + "status": "existing" + }, + { + "id": "plant_cfd64439fa554689", + "botanicalName": "Lonicera japonica", + "name": "Geissblatt", + "sourceUri": "wikimedia-search:Lonicera%20japonica", + "localImageUri": "/plants/lonicera-japonica--geissblatt--4b2c6fdb.webp", + "status": "existing" + }, + { + "id": "plant_25cb30720168c488", + "botanicalName": "Graptopetalum paraguayense", + "name": "Geisterpflanze", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/59/%28MHNT%29_Graptopetalum_paraguayense_-_leaves.jpg/500px-%28MHNT%29_Graptopetalum_paraguayense_-_leaves.jpg", + "localImageUri": "/plants/graptopetalum-paraguayense--geisterpflanze--9584de97.webp", + "status": "existing" + }, + { + "id": "plant_87b1168e48dec833", + "botanicalName": "Gerbera jamesonii", + "name": "Gerbera", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/0b/Gerbera_jamesonii_%28Asteraceae%29.jpg/500px-Gerbera_jamesonii_%28Asteraceae%29.jpg", + "localImageUri": "/plants/gerbera-jamesonii--gerbera--f17eec14.webp", + "status": "existing" + }, + { + "id": "plant_b93632ad7bfff83a", + "botanicalName": "Platycerium bifurcatum", + "name": "Geweihfarn", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/5a/Platycerium_bifurcatum_kz01.jpg/500px-Platycerium_bifurcatum_kz01.jpg", + "localImageUri": "/plants/platycerium-bifurcatum--geweihfarn--991495f9.webp", + "status": "existing" + }, + { + "id": "plant_d8cefda760f89a55", + "botanicalName": "Ginkgo biloba", + "name": "Ginkgo", + "sourceUri": "wikimedia-search:Ginkgo%20biloba", + "localImageUri": "/plants/ginkgo-biloba--ginkgo--8d8c3f3f.webp", + "status": "existing" + }, + { + "id": "plant_5037ed9b79cd8298", + "botanicalName": "Gladiolus hortulanus", + "name": "Gladiole", + "sourceUri": "wikimedia-search:Gladiolus%20hortulanus", + "localImageUri": "/plants/gladiolus-hortulanus--gladiole--e2a2d34f.webp", + "status": "existing" + }, + { + "id": "plant_7e449dc7aefa50dc", + "botanicalName": "Gloxinia speciosa", + "name": "Gloxinie", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/13/Florada_da_Glox%C3%ADnia.jpg/500px-Florada_da_Glox%C3%ADnia.jpg", + "localImageUri": "/plants/gloxinia-speciosa--gloxinie--8a73752c.webp", + "status": "existing" + }, + { + "id": "plant_ef8440900dc6f48a", + "botanicalName": "Pachira aquatica", + "name": "Glueckskastanie", + "sourceUri": "wikimedia-search:Pachira%20aquatica", + "localImageUri": "/plants/pachira-aquatica--glueckskastanie--8e9a0935.webp", + "status": "existing" + }, + { + "id": "plant_d77c5e78b5a6cd52", + "botanicalName": "Echinocactus grusonii", + "name": "Goldene Tonne", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/25/Echinocactus_grusonii_%28aka%29.jpg/500px-Echinocactus_grusonii_%28aka%29.jpg", + "localImageUri": "/plants/echinocactus-grusonii--goldene-tonne--d5268f53.webp", + "status": "existing" + }, + { + "id": "plant_86b6774738a97ccf", + "botanicalName": "Phyllostachys aurea", + "name": "Goldener Bambus", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/3b/Phyllostachys_aurea0.jpg/500px-Phyllostachys_aurea0.jpg", + "localImageUri": "/plants/phyllostachys-aurea--goldener-bambus--e05d0c9f.webp", + "status": "existing" + }, + { + "id": "plant_cd5e679bdf1106fa", + "botanicalName": "Dypsis lutescens", + "name": "Goldfruchtpalme", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/22/%E6%95%A3%E5%B0%BE%E8%91%B5Dypsis_lutescens_20210511145013_05.jpg/500px-%E6%95%A3%E5%B0%BE%E8%91%B5Dypsis_lutescens_20210511145013_05.jpg", + "localImageUri": "/plants/dypsis-lutescens--goldfruchtpalme--890812c2.webp", + "status": "existing" + }, + { + "id": "plant_64ff12d55ec3e694", + "botanicalName": "Punica granatum", + "name": "Granatapfelbaum", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/6a/Pomegranate_Juice_%282019%29.jpg/500px-Pomegranate_Juice_%282019%29.jpg", + "localImageUri": "/plants/punica-granatum--granatapfelbaum--facf4f0c.webp", + "status": "existing" + }, + { + "id": "plant_6979e7e4cf35ae8e", + "botanicalName": "Urtica dioica", + "name": "Grosse Brennessel", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/6f/Fen_nettle_%28Urtica_dioica_ssp._galeopsifolia%29_-_geograph.org.uk_-_5423125.jpg/500px-Fen_nettle_%28Urtica_dioica_ssp._galeopsifolia%29_-_geograph.org.uk_-_5423125.jpg", + "localImageUri": "/plants/urtica-dioica--grosse-brennessel--b2ed905e.webp", + "status": "existing" + }, + { + "id": "plant_e4804808615a29be", + "botanicalName": "Schefflera actinophylla", + "name": "Grosse Strahlenaralie", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/b/bc/Octopus_Tree_%28Schefflera_actinophylla%29_at_Hyderabad%2C_AP_W_283.jpg", + "localImageUri": "/plants/schefflera-actinophylla--grosse-strahlenaralie--a69cdd16.webp", + "status": "existing" + }, + { + "id": "plant_0ee7b22313a79a28", + "botanicalName": "Mentha spicata", + "name": "Gruene Minze", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/05/Minze.jpg/500px-Minze.jpg", + "localImageUri": "/plants/mentha-spicata--gruene-minze--7cb727ef.webp", + "status": "existing" + }, + { + "id": "plant_730c6fc12cf97511", + "botanicalName": "Psidium guajava", + "name": "Guave", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/3a/Psidium_guajava_fruit.jpg/500px-Psidium_guajava_fruit.jpg", + "localImageUri": "/plants/psidium-guajava--guave--5d507482.webp", + "status": "existing" + }, + { + "id": "plant_39c58604790693b9", + "botanicalName": "Ficus elastica", + "name": "Gummibaum", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/16/Ficus_elastica_leaves_02.JPG/500px-Ficus_elastica_leaves_02.JPG", + "localImageUri": "/plants/ficus-elastica--gummibaum--925b35e7.webp", + "status": "existing" + }, + { + "id": "plant_aa6664ed7adebcb5", + "botanicalName": "Cucumis sativus", + "name": "Gurke", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/96/ARS_cucumber.jpg/500px-ARS_cucumber.jpg", + "localImageUri": "/plants/cucumis-sativus--gurke--3b96fd46.webp", + "status": "existing" + }, + { + "id": "plant_46b49e1b0e69fa64", + "botanicalName": "Guzmania lingulata", + "name": "Guzmania", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/84/Bromeliaceae03.jpg/500px-Bromeliaceae03.jpg", + "localImageUri": "/plants/guzmania-lingulata--guzmania--63fafdcb.webp", + "status": "existing" + }, + { + "id": "plant_81cd86630aca39e5", + "botanicalName": "Betula pendula", + "name": "Hange-Birke", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/8a/Betula_pendula_Finland.jpg/500px-Betula_pendula_Finland.jpg", + "localImageUri": "/plants/betula-pendula--hange-birke--aff0bb68.webp", + "status": "existing" + }, + { + "id": "plant_00e33defbd0b49c5", + "botanicalName": "Hyacinthoides non-scripta", + "name": "Hasengloeckchen", + "sourceUri": "wikimedia-search:Hyacinthoides%20non-scripta", + "localImageUri": "/plants/hyacinthoides-non-scripta--hasengloeckchen--cda24b58.webp", + "status": "existing" + }, + { + "id": "plant_f94ccafdbc6c519d", + "botanicalName": "Opuntia microdasys", + "name": "Hasenohren-Kaktus", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/36/Opuntia_microdasys_3.jpg/500px-Opuntia_microdasys_3.jpg", + "localImageUri": "/plants/opuntia-microdasys--hasenohren-kaktus--de2a7439.webp", + "status": "existing" + }, + { + "id": "plant_f297c0da1221e6d4", + "botanicalName": "Heliamphora nutans", + "name": "Heliamphora", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/f9/Roraima_Heliamphora_nutans1.JPG/500px-Roraima_Heliamphora_nutans1.JPG", + "localImageUri": "/plants/heliamphora-nutans--heliamphora--16977b41.webp", + "status": "existing" + }, + { + "id": "plant_39436f8620e13b0e", + "botanicalName": "Heliconia psittacorum", + "name": "Heliconia", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/6f/Parrot_heliconia_%28Heliconia_psittacorum%29.jpg/500px-Parrot_heliconia_%28Heliconia_psittacorum%29.jpg", + "localImageUri": "/plants/heliconia-psittacorum--heliconia--15bad812.webp", + "status": "existing" + }, + { + "id": "plant_530216d88dff6849", + "botanicalName": "Heliotropium arborescens", + "name": "Heliotrop", + "sourceUri": "wikimedia-search:Heliotropium%20arborescens", + "localImageUri": "/plants/heliotropium-arborescens--heliotrop--73a11073.webp", + "status": "existing" + }, + { + "id": "plant_588b544697087860", + "botanicalName": "Symphyotrichum novi-belgii", + "name": "Herbstaster", + "sourceUri": "wikimedia-search:Symphyotrichum%20novi-belgii", + "localImageUri": "/plants/symphyotrichum-novi-belgii--herbstaster--615b51bf.webp", + "status": "existing" + }, + { + "id": "plant_b246d39c63f29a40", + "botanicalName": "Philodendron hederaceum", + "name": "Herzblatt-Philodendron", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/bb/Philodendron_scandens_subsp_oxycardium2.jpg/500px-Philodendron_scandens_subsp_oxycardium2.jpg", + "localImageUri": "/plants/philodendron-hederaceum--herzblatt-philodendron--54360959.webp", + "status": "existing" + }, + { + "id": "plant_3de588912c04dc7f", + "botanicalName": "Ceropegia woodii", + "name": "Herzkette", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/5/55/Ceropegia_linearis_subsp_woodii.jpg", + "localImageUri": "/plants/ceropegia-woodii--herzkette--b51fb231.webp", + "status": "existing" + }, + { + "id": "plant_8b5798718a1dc5c6", + "botanicalName": "Hibiscus rosa-sinensis", + "name": "Hibiskus", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/21/Hibiscus_Brilliant.jpg/500px-Hibiscus_Brilliant.jpg", + "localImageUri": "/plants/hibiscus-rosa-sinensis--hibiskus--9e6d8b54.webp", + "status": "existing" + }, + { + "id": "plant_59744831808b8fd7", + "botanicalName": "Viola cornuta", + "name": "Hornveilchen", + "sourceUri": "wikimedia-search:Viola%20cornuta", + "localImageUri": "/plants/viola-cornuta--hornveilchen--d2abebd6.webp", + "status": "existing" + }, + { + "id": "plant_38a5122c0bea580a", + "botanicalName": "Hydrangea macrophylla", + "name": "Hortensie", + "sourceUri": "wikimedia-search:Hydrangea%20macrophylla", + "localImageUri": "/plants/hydrangea-macrophylla--hortensie--78d76f22.webp", + "status": "existing" + }, + { + "id": "plant_0306abe03e6d7296", + "botanicalName": "Hyacinthus orientalis", + "name": "Hyazinthe", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/82/Hyacinth_flower.jpg/500px-Hyacinth_flower.jpg", + "localImageUri": "/plants/hyacinthus-orientalis--hyazinthe--2c07af5d.webp", + "status": "existing" + }, + { + "id": "plant_be65cacf4e579727", + "botanicalName": "Monarda didyma", + "name": "Indianernessel", + "sourceUri": "wikimedia-search:Monarda%20didyma", + "localImageUri": "/plants/monarda-didyma--indianernessel--309858d1.webp", + "status": "existing" + }, + { + "id": "plant_4e66095e06f32cf4", + "botanicalName": "Azalea indica", + "name": "Indische Azalee", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/de/Rhododendron_indicum1.jpg/500px-Rhododendron_indicum1.jpg", + "localImageUri": "/plants/azalea-indica--indische-azalee--fe6e49a3.webp", + "status": "existing" + }, + { + "id": "plant_902876241a0c1f6f", + "botanicalName": "Zingiber officinale", + "name": "Ingwer", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/18/Koeh-146-no_text.jpg/500px-Koeh-146-no_text.jpg", + "localImageUri": "/plants/zingiber-officinale--ingwer--597975c9.webp", + "status": "existing" + }, + { + "id": "plant_202d5c1a3f83e307", + "botanicalName": "Jacaranda mimosifolia", + "name": "Jacaranda", + "sourceUri": "wikimedia-search:Jacaranda%20mimosifolia", + "localImageUri": "/plants/jacaranda-mimosifolia--jacaranda--324b12c5.webp", + "status": "existing" + }, + { + "id": "plant_2f9ba405e4cbd7de", + "botanicalName": "Crassula ovata", + "name": "Jadepflanze", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/5a/Crassula_ovata_700.jpg/500px-Crassula_ovata_700.jpg", + "localImageUri": "/plants/crassula-ovata--jadepflanze--3ac94122.webp", + "status": "existing" + }, + { + "id": "plant_192fc2d6932b5621", + "botanicalName": "Aucuba japonica", + "name": "Japanische Aucube", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c6/Aucuba_japonica_Gold_Dust_NBG_LR.jpg/500px-Aucuba_japonica_Gold_Dust_NBG_LR.jpg", + "localImageUri": "/plants/aucuba-japonica--japanische-aucube--c4bcd588.webp", + "status": "existing" + }, + { + "id": "plant_a0c9b297c07374b5", + "botanicalName": "Rhododendron simsii", + "name": "Japanische Azalee", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/67/Rhododendron_simsii-bunga_2-Lany_pirna.jpg/500px-Rhododendron_simsii-bunga_2-Lany_pirna.jpg", + "localImageUri": "/plants/rhododendron-simsii--japanische-azalee--ef16f2c0.webp", + "status": "existing" + }, + { + "id": "plant_28ae5636958be358", + "botanicalName": "Jasminum polyanthum", + "name": "Jasmin", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/2d/%28MHNT%29_Jasminum_polyanthum_%E2%80%93_flowers_and_buds.jpg/500px-%28MHNT%29_Jasminum_polyanthum_%E2%80%93_flowers_and_buds.jpg", + "localImageUri": "/plants/jasminum-polyanthum--jasmin--14162cf1.webp", + "status": "existing" + }, + { + "id": "plant_8fea9248ff0c7bb5", + "botanicalName": "Hypericum perforatum", + "name": "Johanniskraut", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/cf/%28MHNT%29_Hypericum_perforatum_flower_and_buttons.jpg/500px-%28MHNT%29_Hypericum_perforatum_flower_and_buttons.jpg", + "localImageUri": "/plants/hypericum-perforatum--johanniskraut--9bdb2ebc.webp", + "status": "existing" + }, + { + "id": "plant_9e91885abb04cb86", + "botanicalName": "Coffea arabica Nana", + "name": "Kaffeepflanze arabica nana", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/13/Starr-121108-1098-Coffea_arabica-Philippine_dwarf_habit_with_Forest_and_Angela-Pali_o_Waipio-Maui_%2825102146741%29.jpg/1280px-Starr-121108-1098-Coffea_arabica-Philippine_dwarf_habit_with_Forest_and_Angela-Pali_o_Waipio-Maui_%2825102146741%29.jpg", + "localImageUri": "/plants/coffea-arabica-nana--kaffeepflanze-arabica-nana--3dab6209.webp", + "status": "existing" + }, + { + "id": "plant_c2b3a25e00acf3e2", + "botanicalName": "Coffea arabica", + "name": "Kaffeestrauch", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c7/Coffee_Flowers.JPG/500px-Coffee_Flowers.JPG", + "localImageUri": "/plants/coffea-arabica--kaffeestrauch--a5ffdda3.webp", + "status": "existing" + }, + { + "id": "plant_7597db1c1b395452", + "botanicalName": "Kalanchoe blossfeldiana", + "name": "Kalanchoe", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/8d/Kalanchoe_blossfeldiana_3.jpg/500px-Kalanchoe_blossfeldiana_3.jpg", + "localImageUri": "/plants/kalanchoe-blossfeldiana--kalanchoe--e040640f.webp", + "status": "existing" + }, + { + "id": "plant_78775c3119a08f01", + "botanicalName": "Eschscholzia californica", + "name": "Kalifornischer Mohn", + "sourceUri": "wikimedia-search:Eschscholzia%20californica", + "localImageUri": "/plants/eschscholzia-californica--kalifornischer-mohn--da7d0f79.webp", + "status": "existing" + }, + { + "id": "plant_735b19d4a6efe5c0", + "botanicalName": "Camellia japonica", + "name": "Kamelie", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e9/Camellia_japonica_NBG.jpg/500px-Camellia_japonica_NBG.jpg", + "localImageUri": "/plants/camellia-japonica--kamelie--6a23eb3f.webp", + "status": "existing" + }, + { + "id": "plant_e0432335ee4f0033", + "botanicalName": "Chamomilla recutita", + "name": "Kamille", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c8/Matricaria_February_2008-1.jpg/500px-Matricaria_February_2008-1.jpg", + "localImageUri": "/plants/chamomilla-recutita--kamille--0bffdb72.webp", + "status": "existing" + }, + { + "id": "plant_de21871ad8dcaefd", + "botanicalName": "Kalanchoe tomentosa", + "name": "Kaninchen-Ohren", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/04/Kalanchoe_tomentosa_01.jpg/500px-Kalanchoe_tomentosa_01.jpg", + "localImageUri": "/plants/kalanchoe-tomentosa--kaninchen-ohren--2c3b1e90.webp", + "status": "existing" + }, + { + "id": "plant_cb7817f551f6c73e", + "botanicalName": "Nepenthes alata", + "name": "Kannenpflanze", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/7/77/Nepenthes_alata_ASR_062007_mt_ambucao_luzon.jpg", + "localImageUri": "/plants/nepenthes-alata--kannenpflanze--30016442.webp", + "status": "existing" + }, + { + "id": "plant_325a00f384ac1a15", + "botanicalName": "Aloe arborescens", + "name": "Kap-Aloe", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b9/Aloe_arborescens_Compton.JPG/500px-Aloe_arborescens_Compton.JPG", + "localImageUri": "/plants/aloe-arborescens--kap-aloe--2c4f60ef.webp", + "status": "existing" + }, + { + "id": "plant_bb4dea2113550a88", + "botanicalName": "Aloe ferox", + "name": "Kap-Aloe (ferox)", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/9/9e/Aloe_Ferox_between_Cofimvaba_and_Ngcobo.jpg", + "localImageUri": "/plants/aloe-ferox--kap-aloe-ferox--e78c3f65.webp", + "status": "existing" + }, + { + "id": "plant_d32498f051c71256", + "botanicalName": "Osteospermum ecklonis", + "name": "Kapmargerite", + "sourceUri": "wikimedia-search:Osteospermum%20ecklonis", + "localImageUri": "/plants/osteospermum-ecklonis--kapmargerite--7d0ac9d6.webp", + "status": "existing" + }, + { + "id": "plant_f0348c48dc721bb9", + "botanicalName": "Tropaeolum majus", + "name": "Kapuzinerkresse", + "sourceUri": "wikimedia-search:Tropaeolum%20majus", + "localImageUri": "/plants/tropaeolum-majus--kapuzinerkresse--c007c761.webp", + "status": "existing" + }, + { + "id": "plant_f8c518688fd2d49b", + "botanicalName": "Daucus carota", + "name": "Karotte", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/23/Daucus_carota_May_2008-1_edit.jpg/500px-Daucus_carota_May_2008-1_edit.jpg", + "localImageUri": "/plants/daucus-carota--karotte--85d90d33.webp", + "status": "existing" + }, + { + "id": "plant_dc535ae68a36c48c", + "botanicalName": "Nepeta cataria", + "name": "Katzenminze", + "sourceUri": "wikimedia-search:Nepeta%20cataria", + "localImageUri": "/plants/nepeta-cataria--katzenminze--7935cfe0.webp", + "status": "existing" + }, + { + "id": "plant_c605a83dcbce1a97", + "botanicalName": "Howea forsteriana", + "name": "Kentia-Palme", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/99/Howea_forsteriana_Lord_Howe_Island.jpg/500px-Howea_forsteriana_Lord_Howe_Island.jpg", + "localImageUri": "/plants/howea-forsteriana--kentia-palme--f2c205ea.webp", + "status": "existing" + }, + { + "id": "plant_8927d794f67ea97c", + "botanicalName": "Anthriscus cerefolium", + "name": "Kerbel", + "sourceUri": "wikimedia-search:Anthriscus%20cerefolium", + "localImageUri": "/plants/anthriscus-cerefolium--kerbel--eb8bf3ab.webp", + "status": "existing" + }, + { + "id": "plant_bf13d931fa5427de", + "botanicalName": "Cordyline australis", + "name": "Keulenlilie", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/f7/CabbageTreeKaihoka.jpg/500px-CabbageTreeKaihoka.jpg", + "localImageUri": "/plants/cordyline-australis--keulenlilie--31be351b.webp", + "status": "existing" + }, + { + "id": "plant_d47591d55ee11f4c", + "botanicalName": "Pinus sylvestris", + "name": "Kiefer", + "sourceUri": "wikimedia-search:Pinus%20sylvestris", + "localImageUri": "/plants/pinus-sylvestris--kiefer--6db5e3c6.webp", + "status": "existing" + }, + { + "id": "plant_3cc71b10ff1d5d6e", + "botanicalName": "Prunus laurocerasus", + "name": "Kirschlorbeer", + "sourceUri": "wikimedia-search:Prunus%20laurocerasus", + "localImageUri": "/plants/prunus-laurocerasus--kirschlorbeer--9291015b.webp", + "status": "existing" + }, + { + "id": "plant_205589ef30c6f380", + "botanicalName": "Oxalis triangularis", + "name": "Kleeblume", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/15/Oxalis_triangularis6.jpg/500px-Oxalis_triangularis6.jpg", + "localImageUri": "/plants/oxalis-triangularis--kleeblume--9080763b.webp", + "status": "existing" + }, + { + "id": "plant_e1f0a5c763e6f721", + "botanicalName": "Hoya bella", + "name": "Kleine Wachsblume", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/d1/%E7%BE%8E%E9%BA%97%E6%AF%AC%E8%98%AD_Hoya_bella_-%E9%A6%99%E6%B8%AF%E5%85%AC%E5%9C%92_Hong_Kong_Park-_%289240227808%29.jpg/500px-%E7%BE%8E%E9%BA%97%E6%AF%AC%E8%98%AD_Hoya_bella_-%E9%A6%99%E6%B8%AF%E5%85%AC%E5%9C%92_Hong_Kong_Park-_%289240227808%29.jpg", + "localImageUri": "/plants/hoya-bella--kleine-wachsblume--db73dcff.webp", + "status": "existing" + }, + { + "id": "plant_156a82fb0d4e7201", + "botanicalName": "Begonia tuberhybrida", + "name": "Knollen-Begonie", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b7/Begonia-tuberhybride_Red.jpg/500px-Begonia-tuberhybride_Red.jpg", + "localImageUri": "/plants/begonia-tuberhybrida--knollen-begonie--7d9dfd00.webp", + "status": "existing" + }, + { + "id": "plant_6fdbc0c3fc6d0820", + "botanicalName": "Epiphyllum oxypetalum", + "name": "Koenigin der Nacht", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/6e/Epiphyllum_oxypetalum_flower.JPG/500px-Epiphyllum_oxypetalum_flower.JPG", + "localImageUri": "/plants/epiphyllum-oxypetalum--koenigin-der-nacht--7ecd1979.webp", + "status": "existing" + }, + { + "id": "plant_fb262dee6cb22325", + "botanicalName": "Protea cynaroides", + "name": "Koenigs-Protea", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/3d/Protea_cynaroides_3.jpg/500px-Protea_cynaroides_3.jpg", + "localImageUri": "/plants/protea-cynaroides--koenigs-protea--2186e16d.webp", + "status": "existing" + }, + { + "id": "plant_c18b4430b4dfeef8", + "botanicalName": "Begonia rex", + "name": "Koenigsbegonie", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/62/Painted_Leaved_Begonia._Begonia_rex_Putz._Flore_des_serres_et_des_jardins_de_l%27Europe_v.12_%281857%29.jpg/500px-Painted_Leaved_Begonia._Begonia_rex_Putz._Flore_des_serres_et_des_jardins_de_l%27Europe_v.12_%281857%29.jpg", + "localImageUri": "/plants/begonia-rex--koenigsbegonie--b6083f44.webp", + "status": "existing" + }, + { + "id": "plant_6579aa953da5beea", + "botanicalName": "Verbascum thapsus", + "name": "Koenigskerze", + "sourceUri": "wikimedia-search:Verbascum%20thapsus", + "localImageUri": "/plants/verbascum-thapsus--koenigskerze--26f01a84.webp", + "status": "existing" + }, + { + "id": "plant_24e5004efcd91423", + "botanicalName": "Gaillardia aristata", + "name": "Kokardenblume", + "sourceUri": "wikimedia-search:Gaillardia%20aristata", + "localImageUri": "/plants/gaillardia-aristata--kokardenblume--050cf2e5.webp", + "status": "existing" + }, + { + "id": "plant_71f244d60e9fb18d", + "botanicalName": "Conophytum calculus", + "name": "Konophytum", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b0/1_Conophytum_calculus_-_RSA_3.jpg/500px-1_Conophytum_calculus_-_RSA_3.jpg", + "localImageUri": "/plants/conophytum-calculus--konophytum--4c3a116e.webp", + "status": "existing" + }, + { + "id": "plant_5f6dd525e28bd218", + "botanicalName": "Rhipsalis baccifera", + "name": "Korallenkaktus", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/ba/Rhipsalis_baccifera_01_ies.jpg/500px-Rhipsalis_baccifera_01_ies.jpg", + "localImageUri": "/plants/rhipsalis-baccifera--korallenkaktus--3097b146.webp", + "status": "existing" + }, + { + "id": "plant_589a537d2b599299", + "botanicalName": "Coriandrum sativum", + "name": "Koriander", + "sourceUri": "wikimedia-search:Coriandrum%20sativum", + "localImageUri": "/plants/coriandrum-sativum--koriander--c1d3ccee.webp", + "status": "existing" + }, + { + "id": "plant_9a590a40395f4882", + "botanicalName": "Centaurea cyanus", + "name": "Kornblume", + "sourceUri": "wikimedia-search:Centaurea%20cyanus", + "localImageUri": "/plants/centaurea-cyanus--kornblume--ff8efded.webp", + "status": "existing" + }, + { + "id": "plant_a6e9bf1a9c4162fb", + "botanicalName": "Cosmos bipinnatus", + "name": "Kosmee", + "sourceUri": "wikimedia-search:Cosmos%20bipinnatus", + "localImageUri": "/plants/cosmos-bipinnatus--kosmee--5a231205.webp", + "status": "existing" + }, + { + "id": "plant_612f629e95b2c540", + "botanicalName": "Cotyledon orbiculata", + "name": "Kotyledon", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/90/Cotyledon_orbiculata_-_pigs_ear_-_Cape_Point_-_South_Africa_2.JPG/500px-Cotyledon_orbiculata_-_pigs_ear_-_Cape_Point_-_South_Africa_2.JPG", + "localImageUri": "/plants/cotyledon-orbiculata--kotyledon--e61a1c1a.webp", + "status": "existing" + }, + { + "id": "plant_f6cb2e28c94b0f3c", + "botanicalName": "Anthurium crystallinum", + "name": "Kristall-Anthurie", + "sourceUri": "wikimedia-search:Anthurium%20crystallinum", + "localImageUri": "/plants/anthurium-crystallinum--kristall-anthurie--2d5ec8d4.webp", + "status": "existing" + }, + { + "id": "plant_adce82fe150c9814", + "botanicalName": "Crocus vernus", + "name": "Krokus", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e2/Crocus_vernus_with_bee.jpg/500px-Crocus_vernus_with_bee.jpg", + "localImageUri": "/plants/crocus-vernus--krokus--31f51b70.webp", + "status": "existing" + }, + { + "id": "plant_830ccd232b784d9e", + "botanicalName": "Codiaeum variegatum", + "name": "Kroton", + "sourceUri": "wikimedia-search:Garden%20croton", + "localImageUri": "/plants/codiaeum-variegatum--kroton--fceb7491.webp", + "status": "existing" + }, + { + "id": "plant_64ba168636b5e8a3", + "botanicalName": "Curcuma longa", + "name": "Kurkuma", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/ab/Turmeric_inflorescence.jpg/500px-Turmeric_inflorescence.jpg", + "localImageUri": "/plants/curcuma-longa--kurkuma--cb270150.webp", + "status": "existing" + }, + { + "id": "plant_bb51efcb52023c48", + "botanicalName": "Lithops julii", + "name": "Lebende Steine", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/0f/Lithops_julii_fulleri.jpg/500px-Lithops_julii_fulleri.jpg", + "localImageUri": "/plants/lithops-julii--lebende-steine--939c0d2c.webp", + "status": "existing" + }, + { + "id": "plant_93f2cc182268c96a", + "botanicalName": "Helleborus orientalis", + "name": "Lenzrose", + "sourceUri": "wikimedia-search:Helleborus%20orientalis", + "localImageUri": "/plants/helleborus-orientalis--lenzrose--f7df56b8.webp", + "status": "existing" + }, + { + "id": "plant_e969375587d68477", + "botanicalName": "Levisticum officinale", + "name": "Liebstoeckel", + "sourceUri": "wikimedia-search:Levisticum%20officinale", + "localImageUri": "/plants/levisticum-officinale--liebstoeckel--649f0af1.webp", + "status": "existing" + }, + { + "id": "plant_0a16a89a9de52d5c", + "botanicalName": "Tradescantia pallida", + "name": "Lila Tradescantia", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/5a/Tradescantia_pallida_kz03.jpg/500px-Tradescantia_pallida_kz03.jpg", + "localImageUri": "/plants/tradescantia-pallida--lila-tradescantia--fa444b81.webp", + "status": "existing" + }, + { + "id": "plant_a34bdd68ffb97e12", + "botanicalName": "Aeschynanthus radicans", + "name": "Lippenstiftpflanze", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/52/Aeschynanthus_radicans.jpg/500px-Aeschynanthus_radicans.jpg", + "localImageUri": "/plants/aeschynanthus-radicans--lippenstiftpflanze--c0f3a18c.webp", + "status": "existing" + }, + { + "id": "plant_fe714a89f340dc8c", + "botanicalName": "Antirrhinum majus", + "name": "Loewenmaeulchen", + "sourceUri": "wikimedia-search:Antirrhinum%20majus", + "localImageUri": "/plants/antirrhinum-majus--loewenmaeulchen--ee99a45e.webp", + "status": "existing" + }, + { + "id": "plant_061cff94e10bff7a", + "botanicalName": "Laurus nobilis", + "name": "Lorbeer", + "sourceUri": "wikimedia-search:Laurus%20nobilis", + "localImageUri": "/plants/laurus-nobilis--lorbeer--7fb425a5.webp", + "status": "existing" + }, + { + "id": "plant_db7b7c883a5fb716", + "botanicalName": "Tillandsia ionantha", + "name": "Luftpflanze", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b5/Purple_sky_plant_-_Andrey_Zharkikh.jpg/500px-Purple_sky_plant_-_Andrey_Zharkikh.jpg", + "localImageUri": "/plants/tillandsia-ionantha--luftpflanze--c221d48d.webp", + "status": "existing" + }, + { + "id": "plant_15527732e9ae75b4", + "botanicalName": "Lupinus polyphyllus", + "name": "Lupine", + "sourceUri": "wikimedia-search:Lupinus%20polyphyllus", + "localImageUri": "/plants/lupinus-polyphyllus--lupine--d528d819.webp", + "status": "existing" + }, + { + "id": "plant_fafb81415756f893", + "botanicalName": "Stephanotis floribunda", + "name": "Madagaskar-Jasmin", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/31/Stephanotis_floribunda3L._Marie.jpg/500px-Stephanotis_floribunda3L._Marie.jpg", + "localImageUri": "/plants/stephanotis-floribunda--madagaskar-jasmin--f5b3e914.webp", + "status": "existing" + }, + { + "id": "plant_b9e7bf04918e8547", + "botanicalName": "Coreopsis tinctoria", + "name": "Maedchenauge", + "sourceUri": "wikimedia-search:Coreopsis%20tinctoria", + "localImageUri": "/plants/coreopsis-tinctoria--maedchenauge--64a5d938.webp", + "status": "existing" + }, + { + "id": "plant_7a9e8ffc731ea60b", + "botanicalName": "Magnolia grandiflora", + "name": "Magnolie", + "sourceUri": "wikimedia-search:Magnolia%20grandiflora", + "localImageUri": "/plants/magnolia-grandiflora--magnolie--5eaff200.webp", + "status": "existing" + }, + { + "id": "plant_0e1ce38a0405df52", + "botanicalName": "Convallaria majalis", + "name": "Maigloeckchen", + "sourceUri": "wikimedia-search:Convallaria%20majalis", + "localImageUri": "/plants/convallaria-majalis--maigloeckchen--d7acb648.webp", + "status": "existing" + }, + { + "id": "plant_cabb9c3df66307ba", + "botanicalName": "Dracaena fragrans", + "name": "Maisstrauch", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/db/Dracaena_fragrans_%282%29.jpg/500px-Dracaena_fragrans_%282%29.jpg", + "localImageUri": "/plants/dracaena-fragrans--maisstrauch--107c7d0f.webp", + "status": "existing" + }, + { + "id": "plant_b89779554bd0233f", + "botanicalName": "Origanum majorana", + "name": "Majoran", + "sourceUri": "wikimedia-search:Origanum%20majorana", + "localImageUri": "/plants/origanum-majorana--majoran--d0d23e9f.webp", + "status": "existing" + }, + { + "id": "plant_d52a80feceba729c", + "botanicalName": "Mammillaria zeilmanniana", + "name": "Mammillaria", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/af/Mammillaria_zeilmanniana.jpg/500px-Mammillaria_zeilmanniana.jpg", + "localImageUri": "/plants/mammillaria-zeilmanniana--mammillaria--ee6d834e.webp", + "status": "existing" + }, + { + "id": "plant_9406fa4ffbef305b", + "botanicalName": "Beta vulgaris", + "name": "Mangold", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/f/ff/Beta_vulgaris_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-167.jpg", + "localImageUri": "/plants/beta-vulgaris--mangold--7fb88006.webp", + "status": "existing" + }, + { + "id": "plant_39d8c8f7dced6c59", + "botanicalName": "Leucanthemum vulgare", + "name": "Margerite", + "sourceUri": "wikimedia-search:Leucanthemum%20vulgare", + "localImageUri": "/plants/leucanthemum-vulgare--margerite--f583d6a2.webp", + "status": "existing" + }, + { + "id": "plant_ca9b1576aab12566", + "botanicalName": "Epipremnum aureum Marble Queen", + "name": "Marmor-Efeutute", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/ca/Epipremnum_aureum_Marble_Queen.jpg/500px-Epipremnum_aureum_Marble_Queen.jpg", + "localImageUri": "/plants/epipremnum-aureum-marble-queen--marmor-efeutute--1d6745d9.webp", + "status": "existing" + }, + { + "id": "plant_e66a57622e22d994", + "botanicalName": "Salvia farinacea", + "name": "Mehlsalbei", + "sourceUri": "wikimedia-search:Salvia%20farinacea", + "localImageUri": "/plants/salvia-farinacea--mehlsalbei--a046f0ea.webp", + "status": "existing" + }, + { + "id": "plant_95de7815c2f690ce", + "botanicalName": "Washingtonia robusta", + "name": "Mexikanische Fächerpalme", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b8/Arecales_-_Washingtonia_robusta_-_1.jpg/500px-Arecales_-_Washingtonia_robusta_-_1.jpg", + "localImageUri": "/plants/washingtonia-robusta--mexikanische-facherpalme--ced2cfe1.webp", + "status": "existing" + }, + { + "id": "plant_01ed2f643e7d5d8e", + "botanicalName": "Rhaphidophora tetrasperma", + "name": "Mini-Monstera", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/db/Rhaphidophora_tetrasperma.jpg/500px-Rhaphidophora_tetrasperma.jpg", + "localImageUri": "/plants/rhaphidophora-tetrasperma--mini-monstera--8698ef03.webp", + "status": "existing" + }, + { + "id": "plant_6448079452dd9eb8", + "botanicalName": "Gazania rigens", + "name": "Mittagsgold", + "sourceUri": "wikimedia-search:Gazania%20rigens", + "localImageUri": "/plants/gazania-rigens--mittagsgold--cc595e45.webp", + "status": "existing" + }, + { + "id": "plant_8d0ea0639b4e5136", + "botanicalName": "Papaver rhoeas", + "name": "Mohn", + "sourceUri": "wikimedia-search:Papaver%20rhoeas", + "localImageUri": "/plants/papaver-rhoeas--mohn--32fb9e83.webp", + "status": "existing" + }, + { + "id": "plant_8e8b8bf4c4f7bdb6", + "botanicalName": "Gymnocalycium mihanovichii", + "name": "Mond-Kaktus", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/51/Gymnocalycium_mihanovichii_4.JPG/500px-Gymnocalycium_mihanovichii_4.JPG", + "localImageUri": "/plants/gymnocalycium-mihanovichii--mond-kaktus--c7e6e78b.webp", + "status": "existing" + }, + { + "id": "plant_e8ab689f2d26d8b2", + "botanicalName": "Pachyphytum oviferum", + "name": "Mondstein-Pflanze", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/8f/%28MHNT%29_Pachyphytum_oviferum_-_Habitus.jpg/500px-%28MHNT%29_Pachyphytum_oviferum_-_Habitus.jpg", + "localImageUri": "/plants/pachyphytum-oviferum--mondstein-pflanze--66cf2adc.webp", + "status": "existing" + }, + { + "id": "plant_b843de18953d2232", + "botanicalName": "Monstera adansonii", + "name": "Monstera adansonii", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/fb/Monstera_adansonii_79319231.jpg/500px-Monstera_adansonii_79319231.jpg", + "localImageUri": "/plants/monstera-adansonii--911eb5ba.webp", + "status": "existing" + }, + { + "id": "plant_44c152d886d0b190", + "botanicalName": "Monstera obliqua", + "name": "Monstera obliqua", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/4d/Obiqula.jpg/500px-Obiqula.jpg", + "localImageUri": "/plants/monstera-obliqua--8ab6f307.webp", + "status": "existing" + }, + { + "id": "plant_da8adeffa961a540", + "botanicalName": "Crassula muscosa", + "name": "Moos-Crassula", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/5e/Crassula_muscosa_Grubosz_2006-05-03_01.jpg/500px-Crassula_muscosa_Grubosz_2006-05-03_01.jpg", + "localImageUri": "/plants/crassula-muscosa--moos-crassula--41420e37.webp", + "status": "existing" + }, + { + "id": "plant_917a7775d4ada0c1", + "botanicalName": "Alpinia zerumbet", + "name": "Muschelingwer", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/1e/200410_Alpinia_zerumbet_1.JPG/500px-200410_Alpinia_zerumbet_1.JPG", + "localImageUri": "/plants/alpinia-zerumbet--muschelingwer--f0c5c11e.webp", + "status": "existing" + }, + { + "id": "plant_eff2ecdef8205cc1", + "botanicalName": "Dianthus caryophyllus", + "name": "Nelke", + "sourceUri": "wikimedia-search:Dianthus%20caryophyllus", + "localImageUri": "/plants/dianthus-caryophyllus--nelke--1ccf57de.webp", + "status": "existing" + }, + { + "id": "plant_5358cd292660e315", + "botanicalName": "Nemesia strumosa", + "name": "Nemesie", + "sourceUri": "wikimedia-search:Nemesia%20strumosa", + "localImageUri": "/plants/nemesia-strumosa--nemesie--90e80dd2.webp", + "status": "existing" + }, + { + "id": "plant_de18a22fc81062c9", + "botanicalName": "Epipremnum pinnatum Neon", + "name": "Neon-Efeutute", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/de/Epipremnum_pinnatum_%27Neon%27%2C_Longwood_Gardens_01.jpg/500px-Epipremnum_pinnatum_%27Neon%27%2C_Longwood_Gardens_01.jpg", + "localImageUri": "/plants/epipremnum-pinnatum-neon--neon-efeutute--3e91b575.webp", + "status": "existing" + }, + { + "id": "plant_3d4bc95e6500e9fc", + "botanicalName": "Neoregelia carolinae", + "name": "Neoregelia", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/27/Neoregelia_carolinae_BotGardBln310505a.jpg/500px-Neoregelia_carolinae_BotGardBln310505a.jpg", + "localImageUri": "/plants/neoregelia-carolinae--neoregelia--454c3c96.webp", + "status": "existing" + }, + { + "id": "plant_ac3f55a2073b1427", + "botanicalName": "Fittonia albivenis", + "name": "Nervenpflanze", + "sourceUri": "wikimedia-search:Fittonia%20albivenis", + "localImageUri": "/plants/fittonia-albivenis--nervenpflanze--b674f5e6.webp", + "status": "existing" + }, + { + "id": "plant_c62ac934518110bb", + "botanicalName": "Impatiens hawkeri", + "name": "Neuguinea-Balsamine", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/f7/Impatiens_hawkeri%2C_beijo-pintado_%28flores_vermelhas%29_07.jpg/500px-Impatiens_hawkeri%2C_beijo-pintado_%28flores_vermelhas%29_07.jpg", + "localImageUri": "/plants/impatiens-hawkeri--neuguinea-balsamine--4e5c7c8f.webp", + "status": "existing" + }, + { + "id": "plant_8fe9abf012241581", + "botanicalName": "Araucaria heterophylla", + "name": "Norfolk-Tanne", + "sourceUri": "wikimedia-search:Araucaria%20heterophylla", + "localImageUri": "/plants/araucaria-heterophylla--norfolk-tanne--56ef2a36.webp", + "status": "existing" + }, + { + "id": "plant_3dec7298828d7d5b", + "botanicalName": "Nerium oleander", + "name": "Oleander", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/cc/Nerium_oleander_flowers_leaves.jpg/500px-Nerium_oleander_flowers_leaves.jpg", + "localImageUri": "/plants/nerium-oleander--oleander--87c4b966.webp", + "status": "existing" + }, + { + "id": "plant_8915ad2e41841f3d", + "botanicalName": "Citrus sinensis", + "name": "Orangenbaum", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b0/OrangeBloss_wb.jpg/500px-OrangeBloss_wb.jpg", + "localImageUri": "/plants/citrus-sinensis--orangenbaum--294e1722.webp", + "status": "existing" + }, + { + "id": "plant_d61f0c50e94b917d", + "botanicalName": "Origanum vulgare", + "name": "Oregano", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/14/Origanum_vulgare_-_harilik_pune.jpg/500px-Origanum_vulgare_-_harilik_pune.jpg", + "localImageUri": "/plants/origanum-vulgare--oregano--33c6269c.webp", + "status": "existing" + }, + { + "id": "plant_a62147e5f0805622", + "botanicalName": "Narcissus pseudonarcissus", + "name": "Osterglocke", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a4/Narcissus_pseudonarcissus_flower_300303.jpg/500px-Narcissus_pseudonarcissus_flower_300303.jpg", + "localImageUri": "/plants/narcissus-pseudonarcissus--osterglocke--32e917c0.webp", + "status": "existing" + }, + { + "id": "plant_f66ecda188a5efad", + "botanicalName": "Lilium longiflorum", + "name": "Ostertrompete", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Lilium_longiflorum_%28Easter_Lily%29.JPG/500px-Lilium_longiflorum_%28Easter_Lily%29.JPG", + "localImageUri": "/plants/lilium-longiflorum--ostertrompete--4b791484.webp", + "status": "existing" + }, + { + "id": "plant_8b92e803087c2f97", + "botanicalName": "Cycas revoluta", + "name": "Palmfarn", + "sourceUri": "wikimedia-search:Cycas%20revoluta", + "localImageUri": "/plants/cycas-revoluta--palmfarn--71371c45.webp", + "status": "existing" + }, + { + "id": "plant_e4f082a4e9f3a8c5", + "botanicalName": "Carica papaya", + "name": "Papaya", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/84/Carica_papaya_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-029.jpg/500px-Carica_papaya_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-029.jpg", + "localImageUri": "/plants/carica-papaya--papaya--240dc331.webp", + "status": "existing" + }, + { + "id": "plant_612cf58237a77a91", + "botanicalName": "Strelitzia reginae", + "name": "Paradiesvogelblume", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/55/Bird_of_Paradise_flower.JPG/500px-Bird_of_Paradise_flower.JPG", + "localImageUri": "/plants/strelitzia-reginae--paradiesvogelblume--3ee1f013.webp", + "status": "existing" + }, + { + "id": "plant_61ec02f0a706b922", + "botanicalName": "Cyperus alternifolius", + "name": "Paragraphenpflanze", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/7/76/Cyperus_alternifolius_2.jpg", + "localImageUri": "/plants/cyperus-alternifolius--paragraphenpflanze--986a54bf.webp", + "status": "existing" + }, + { + "id": "plant_13543a8abb8f50c8", + "botanicalName": "Passiflora caerulea", + "name": "Passionsblume", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/9a/Passiflora_caerulea_%282019-06-24%29_frontal-view.jpg/500px-Passiflora_caerulea_%282019-06-24%29_frontal-view.jpg", + "localImageUri": "/plants/passiflora-caerulea--passionsblume--b8effb5e.webp", + "status": "existing" + }, + { + "id": "plant_b9a0c1910297e2cb", + "botanicalName": "Senecio rowleyanus", + "name": "Perlenschnur-Pflanze", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/fd/Senecio_rowleyanus_leaves.jpg/500px-Senecio_rowleyanus_leaves.jpg", + "localImageUri": "/plants/senecio-rowleyanus--perlenschnur-pflanze--803d2b22.webp", + "status": "existing" + }, + { + "id": "plant_ab8fc977bd930772", + "botanicalName": "Cereus peruvianus", + "name": "Peruanischer Fackelkaktus", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/53/Cereus_repandus_in_Aruba_-_on_the_way_back_from_Altovista_chapel_%282896840490%29.jpg/500px-Cereus_repandus_in_Aruba_-_on_the_way_back_from_Altovista_chapel_%282896840490%29.jpg", + "localImageUri": "/plants/cereus-peruvianus--peruanischer-fackelkaktus--b087b5cf.webp", + "status": "existing" + }, + { + "id": "plant_f57319d9209a678f", + "botanicalName": "Petroselinum crispum", + "name": "Petersilie", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e4/Petroselinum.jpg/500px-Petroselinum.jpg", + "localImageUri": "/plants/petroselinum-crispum--petersilie--23a7cb86.webp", + "status": "existing" + }, + { + "id": "plant_d859b55b599f2742", + "botanicalName": "Petunia hybrida", + "name": "Petunie", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/55/PetuniaFlower.JPG/500px-PetuniaFlower.JPG", + "localImageUri": "/plants/petunia-hybrida--petunie--af7deb4f.webp", + "status": "existing" + }, + { + "id": "plant_9f46ccdc5b9b10f3", + "botanicalName": "Syngonium podophyllum", + "name": "Pfeilblatt", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/58/Zingiber_malaysianum.jpg/500px-Zingiber_malaysianum.jpg", + "localImageUri": "/plants/syngonium-podophyllum--pfeilblatt--ca7b7b9f.webp", + "status": "existing" + }, + { + "id": "plant_c7b763cec4d30529", + "botanicalName": "Beaucarnea recurvata", + "name": "Pferdeschwanzpalme", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/7e/Beaucarnea_recurvata%2C_Ocampo%2C_Tamaulipas%2C_Mexico_1.jpg/500px-Beaucarnea_recurvata%2C_Ocampo%2C_Tamaulipas%2C_Mexico_1.jpg", + "localImageUri": "/plants/beaucarnea-recurvata--pferdeschwanzpalme--31691c81.webp", + "status": "existing" + }, + { + "id": "plant_0c3f812b6186ea56", + "botanicalName": "Paeonia lactiflora", + "name": "Pfingstrose", + "sourceUri": "wikimedia-search:Paeonia%20lactiflora", + "localImageUri": "/plants/paeonia-lactiflora--pfingstrose--c81e92ef.webp", + "status": "existing" + }, + { + "id": "plant_418e4442c57e9974", + "botanicalName": "Philodendron bipinnatifidum", + "name": "Philodendron bipinnatifidum", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c1/Tree1.JPG/500px-Tree1.JPG", + "localImageUri": "/plants/philodendron-bipinnatifidum--f7a662b8.webp", + "status": "existing" + }, + { + "id": "plant_d1c45583a39e702e", + "botanicalName": "Philodendron hederaceum Brasil", + "name": "Philodendron Brasil", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/0/0b/Philodendron_hederaceum_hederaceum_Brasil_0zz.jpg", + "localImageUri": "/plants/philodendron-hederaceum-brasil--philodendron-brasil--993a964b.webp", + "status": "existing" + }, + { + "id": "plant_64223543ba5ff673", + "botanicalName": "Philodendron gloriosum", + "name": "Philodendron gloriosum", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e1/Philodendron_gloriosum_%2829587099650%29.jpg/500px-Philodendron_gloriosum_%2829587099650%29.jpg", + "localImageUri": "/plants/philodendron-gloriosum--059733a1.webp", + "status": "existing" + }, + { + "id": "plant_deca5dabffc8f210", + "botanicalName": "Philodendron erubescens Pink Princess", + "name": "Philodendron Pink Princess", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/8/89/Philodendron_Pink_Princess.jpg", + "localImageUri": "/plants/philodendron-erubescens-pink-princess--philodendron-pink-princess--b027e5d1.webp", + "status": "existing" + }, + { + "id": "plant_c5bbd24975a2d56e", + "botanicalName": "Thaumatophyllum xanadu", + "name": "Philodendron Xanadu", + "sourceUri": "wikimedia-search:Thaumatophyllum%20xanadu", + "localImageUri": "/plants/thaumatophyllum-xanadu--philodendron-xanadu--dda107bf.webp", + "status": "existing" + }, + { + "id": "plant_6a5d7ac021669bb4", + "botanicalName": "Primula vulgaris", + "name": "Primel", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/ad/Prole%C4%87no_cve%C4%87e_3.JPG/500px-Prole%C4%87no_cve%C4%87e_3.JPG", + "localImageUri": "/plants/primula-vulgaris--primel--038312ee.webp", + "status": "existing" + }, + { + "id": "plant_dbd06a3bc479c493", + "botanicalName": "Ipomoea purpurea", + "name": "Prunkwinde", + "sourceUri": "wikimedia-search:Ipomoea%20purpurea", + "localImageUri": "/plants/ipomoea-purpurea--prunkwinde--a9c61099.webp", + "status": "existing" + }, + { + "id": "plant_b82556f9406de287", + "botanicalName": "Hypoestes phyllostachya", + "name": "Punktblatt", + "sourceUri": "wikimedia-search:Hypoestes%20phyllostachya", + "localImageUri": "/plants/hypoestes-phyllostachya--punktblatt--08034897.webp", + "status": "existing" + }, + { + "id": "plant_045dd35819e8793f", + "botanicalName": "Sarracenia purpurea", + "name": "Purpursonnentau", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/7c/Sarracenia_purpurea_Flowers.JPG/500px-Sarracenia_purpurea_Flowers.JPG", + "localImageUri": "/plants/sarracenia-purpurea--purpursonnentau--38d9e604.webp", + "status": "existing" + }, + { + "id": "plant_1feebf3d053224a9", + "botanicalName": "Raphanus sativus", + "name": "Radieschen", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/0c/Radish_3371103037_4ab07db0bf_o.jpg/500px-Radish_3371103037_4ab07db0bf_o.jpg", + "localImageUri": "/plants/raphanus-sativus--radieschen--797f22e6.webp", + "status": "existing" + }, + { + "id": "plant_af46a07c444780ca", + "botanicalName": "Peperomia polybotrya", + "name": "Raindrop-Peperomie", + "sourceUri": "wikimedia-search:Peperomia%20polybotrya", + "localImageUri": "/plants/peperomia-polybotrya--raindrop-peperomie--12a71756.webp", + "status": "existing" + }, + { + "id": "plant_ab8cfe05f8183d2c", + "botanicalName": "Ranunculus asiaticus", + "name": "Ranunkel", + "sourceUri": "wikimedia-search:Ranunculus%20asiaticus", + "localImageUri": "/plants/ranunculus-asiaticus--ranunkel--accafde4.webp", + "status": "existing" + }, + { + "id": "plant_563226faba183e0d", + "botanicalName": "Selaginella uncinata", + "name": "Regenbogenmoos", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/34/Selaginella_uncinata_-_Berlin_Botanical_Garden_-_IMG_8722.JPG/500px-Selaginella_uncinata_-_Berlin_Botanical_Garden_-_IMG_8722.JPG", + "localImageUri": "/plants/selaginella-uncinata--regenbogenmoos--fac3dec7.webp", + "status": "existing" + }, + { + "id": "plant_8fd28228f90cb02c", + "botanicalName": "Rhododendron catawbiense", + "name": "Rhododendron", + "sourceUri": "wikimedia-search:Rhododendron%20catawbiense", + "localImageUri": "/plants/rhododendron-catawbiense--rhododendron--b7977ab9.webp", + "status": "existing" + }, + { + "id": "plant_a6883747d701df71", + "botanicalName": "Clivia miniata", + "name": "Riemenblatt", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c2/Clivia_miniata%2C_blomme_en_vrugte%2C_Manie_van_der_Schijff_BT%2C_a.jpg/500px-Clivia_miniata%2C_blomme_en_vrugte%2C_Manie_van_der_Schijff_BT%2C_a.jpg", + "localImageUri": "/plants/clivia-miniata--riemenblatt--29bc76f5.webp", + "status": "existing" + }, + { + "id": "plant_c6e77cf5ecbf70cb", + "botanicalName": "Calendula officinalis", + "name": "Ringelblume", + "sourceUri": "wikimedia-search:Calendula%20officinalis", + "localImageUri": "/plants/calendula-officinalis--ringelblume--03f33ce8.webp", + "status": "existing" + }, + { + "id": "plant_5e0e0211b3e815d1", + "botanicalName": "Peperomia caperata", + "name": "Rippenpeperomie", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/14/Peperomia_caperata_1-OB9.jpg/500px-Peperomia_caperata_1-OB9.jpg", + "localImageUri": "/plants/peperomia-caperata--rippenpeperomie--b3a48151.webp", + "status": "existing" + }, + { + "id": "plant_47384e6f56f96010", + "botanicalName": "Delphinium elatum", + "name": "Rittersporn", + "sourceUri": "wikimedia-search:Delphinium%20elatum", + "localImageUri": "/plants/delphinium-elatum--rittersporn--d7df6211.webp", + "status": "existing" + }, + { + "id": "plant_f3c4aea00446ce7d", + "botanicalName": "Hippeastrum hybrid", + "name": "Ritterstern", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/fc/Hippeastrum_hybrid_1.jpg/500px-Hippeastrum_hybrid_1.jpg", + "localImageUri": "/plants/hippeastrum-hybrid--ritterstern--82bc6dc8.webp", + "status": "existing" + }, + { + "id": "plant_cdba57900c250b2a", + "botanicalName": "Robinia pseudoacacia", + "name": "Robinie", + "sourceUri": "wikimedia-search:Robinia%20pseudoacacia", + "localImageUri": "/plants/robinia-pseudoacacia--robinie--a3887565.webp", + "status": "existing" + }, + { + "id": "plant_354a445932988de3", + "botanicalName": "Chamaemelum nobile", + "name": "Roemische Kamille", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/f/f2/Chamaemelum_nobile_kz02.jpg", + "localImageUri": "/plants/chamaemelum-nobile--roemische-kamille--9235aca6.webp", + "status": "existing" + }, + { + "id": "plant_2b5acacfe6dbc6dd", + "botanicalName": "Rosa x hybrida", + "name": "Rose", + "sourceUri": "wikimedia-search:Rosa%20x%20hybrida", + "localImageUri": "/plants/rosa-x-hybrida--rose--7375780c.webp", + "status": "existing" + }, + { + "id": "plant_ce9ff96b95f4fe81", + "botanicalName": "Pelargonium graveolens", + "name": "Rosengeranie", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b7/%28MHNT%29_Pelargonium_graveolens_flower_and_leaves.jpg/500px-%28MHNT%29_Pelargonium_graveolens_flower_and_leaves.jpg", + "localImageUri": "/plants/pelargonium-graveolens--rosengeranie--d7f8a481.webp", + "status": "existing" + }, + { + "id": "plant_bc06c3ee948f7ba7", + "botanicalName": "Rosmarinus officinalis", + "name": "Rosmarin", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a3/Rosemary_in_bloom.JPG/500px-Rosemary_in_bloom.JPG", + "localImageUri": "/plants/rosmarinus-officinalis--rosmarin--2791f58d.webp", + "status": "existing" + }, + { + "id": "plant_a50df676efef7b7d", + "botanicalName": "Digitalis purpurea", + "name": "Roter Fingerhut", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/ba/Digitalis_purpurea_LC0101.jpg/500px-Digitalis_purpurea_LC0101.jpg", + "localImageUri": "/plants/digitalis-purpurea--roter-fingerhut--be177092.webp", + "status": "existing" + }, + { + "id": "plant_4f9c3ae955d4b1b0", + "botanicalName": "Philodendron erubescens", + "name": "Roter Philodendron", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c7/Philodendron_erubescens_-_Leaves.jpg/500px-Philodendron_erubescens_-_Leaves.jpg", + "localImageUri": "/plants/philodendron-erubescens--roter-philodendron--5d917978.webp", + "status": "existing" + }, + { + "id": "plant_0790565aca23f0a8", + "botanicalName": "Rudbeckia hirta", + "name": "Rudbeckie", + "sourceUri": "wikimedia-search:Rudbeckia%20hirta", + "localImageUri": "/plants/rudbeckia-hirta--rudbeckie--e1dd8170.webp", + "status": "existing" + }, + { + "id": "plant_b6887f02c51a178f", + "botanicalName": "Lactuca sativa", + "name": "Salat", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/da/Iceberg_lettuce_in_SB.jpg/500px-Iceberg_lettuce_in_SB.jpg", + "localImageUri": "/plants/lactuca-sativa--salat--7cd31564.webp", + "status": "existing" + }, + { + "id": "plant_e3f7fa02342527b0", + "botanicalName": "Salvia officinalis", + "name": "Salbei", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/5a/Salvia_officinalis0.jpg/500px-Salvia_officinalis0.jpg", + "localImageUri": "/plants/salvia-officinalis--salbei--9fe3bf8f.webp", + "status": "existing" + }, + { + "id": "plant_8ab2cdddfd49ca3a", + "botanicalName": "Anthurium clarinervium", + "name": "Samt-Anthurie", + "sourceUri": "wikimedia-search:Anthurium%20clarinervium", + "localImageUri": "/plants/anthurium-clarinervium--samt-anthurie--dd38d7fa.webp", + "status": "existing" + }, + { + "id": "plant_5ce8d8944fd3edc3", + "botanicalName": "Echinopsis pachanoi", + "name": "San-Pedro-Kaktus", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/62/Starr_070320-5799_Echinopsis_pachanoi.jpg/500px-Starr_070320-5799_Echinopsis_pachanoi.jpg", + "localImageUri": "/plants/echinopsis-pachanoi--san-pedro-kaktus--7f1085bc.webp", + "status": "existing" + }, + { + "id": "plant_d30b54367d7c0ccc", + "botanicalName": "Scindapsus pictus", + "name": "Satinpothos", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/ca/Scindapsus_pictus_01.jpg/500px-Scindapsus_pictus_01.jpg", + "localImageUri": "/plants/scindapsus-pictus--satinpothos--8991b0e9.webp", + "status": "existing" + }, + { + "id": "plant_5ed455617815911c", + "botanicalName": "Rumex acetosa", + "name": "Sauerampfer", + "sourceUri": "wikimedia-search:Rumex%20acetosa", + "localImageUri": "/plants/rumex-acetosa--sauerampfer--8078fc90.webp", + "status": "existing" + }, + { + "id": "plant_cbc9b35001d4f2fa", + "botanicalName": "Achillea millefolium", + "name": "Schafgarbe", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/1a/Achillea_millefolium_%28bright%29.jpg/500px-Achillea_millefolium_%28bright%29.jpg", + "localImageUri": "/plants/achillea-millefolium--schafgarbe--a945b3a0.webp", + "status": "existing" + }, + { + "id": "plant_ceea5c9d9b527cea", + "botanicalName": "Mimosa pudica", + "name": "Schamkraut", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/26/Mimosa_pudica_in_September_month.jpg/500px-Mimosa_pudica_in_September_month.jpg", + "localImageUri": "/plants/mimosa-pudica--schamkraut--89ce823f.webp", + "status": "existing" + }, + { + "id": "plant_0bbd3af303fd64ab", + "botanicalName": "Buddleja davidii", + "name": "Schmetterlingsflieder", + "sourceUri": "wikimedia-search:Buddleja%20davidii", + "localImageUri": "/plants/buddleja-davidii--schmetterlingsflieder--c6785fa7.webp", + "status": "existing" + }, + { + "id": "plant_f02576d98e962040", + "botanicalName": "Phalaenopsis amabilis", + "name": "Schmetterlingsorchidee", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/59/Phalaenopsis_amabilis_Orchi_198.jpg/500px-Phalaenopsis_amabilis_Orchi_198.jpg", + "localImageUri": "/plants/phalaenopsis-amabilis--schmetterlingsorchidee--3c14cbf2.webp", + "status": "existing" + }, + { + "id": "plant_a346ee92e571923a", + "botanicalName": "Allium tuberosum", + "name": "Schnittknoblauch", + "sourceUri": "wikimedia-search:Allium%20tuberosum", + "localImageUri": "/plants/allium-tuberosum--schnittknoblauch--3904b032.webp", + "status": "existing" + }, + { + "id": "plant_1b8072d12aee4246", + "botanicalName": "Allium schoenoprasum", + "name": "Schnittlauch", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/49/Allium_schoenoprasum_-_Bombus_lapidarius_-_Tootsi.jpg/500px-Allium_schoenoprasum_-_Bombus_lapidarius_-_Tootsi.jpg", + "localImageUri": "/plants/allium-schoenoprasum--schnittlauch--d820fe95.webp", + "status": "existing" + }, + { + "id": "plant_2dcb1ec9ac8b968f", + "botanicalName": "Pandanus veitchii", + "name": "Schraubenbaum", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/fb/Pandanus_tectorius.jpg/500px-Pandanus_tectorius.jpg", + "localImageUri": "/plants/pandanus-veitchii--schraubenbaum--36aa501d.webp", + "status": "existing" + }, + { + "id": "plant_40f7fbbd6ef0e3ba", + "botanicalName": "Aspidistra elatior", + "name": "Schusterpflanze", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/fc/Aspidistra_elatior1.jpg/500px-Aspidistra_elatior1.jpg", + "localImageUri": "/plants/aspidistra-elatior--schusterpflanze--27471002.webp", + "status": "existing" + }, + { + "id": "plant_fb7db49b3c127f71", + "botanicalName": "Aeonium arboreum", + "name": "Schwarze Rose (Aeonium)", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/28/Madeira%2C_Palheiro_Gardens_-_Aeonium_arboreum_%28Marokko%29_IMG_2310.JPG/500px-Madeira%2C_Palheiro_Gardens_-_Aeonium_arboreum_%28Marokko%29_IMG_2310.JPG", + "localImageUri": "/plants/aeonium-arboreum--schwarze-rose-aeonium--2fa8210f.webp", + "status": "existing" + }, + { + "id": "plant_183e544c5601be51", + "botanicalName": "Sambucus nigra", + "name": "Schwarzer Holunder", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/61/Sambucus_nigra_004.jpg/500px-Sambucus_nigra_004.jpg", + "localImageUri": "/plants/sambucus-nigra--schwarzer-holunder--fd1fe0a5.webp", + "status": "existing" + }, + { + "id": "plant_6f49714ec9e1191f", + "botanicalName": "Asclepias tuberosa", + "name": "Seidenpflanze", + "sourceUri": "wikimedia-search:Asclepias%20tuberosa", + "localImageUri": "/plants/asclepias-tuberosa--seidenpflanze--d082aa6e.webp", + "status": "existing" + }, + { + "id": "plant_269c939743f4674a", + "botanicalName": "Leucanthemum x superbum", + "name": "Shasta-Margerite", + "sourceUri": "wikimedia-search:Leucanthemum%20x%20superbum", + "localImageUri": "/plants/leucanthemum-x-superbum--shasta-margerite--519d56a9.webp", + "status": "existing" + }, + { + "id": "plant_a44a902f4af980ef", + "botanicalName": "Perilla frutescens", + "name": "Shiso", + "sourceUri": "wikimedia-search:Perilla%20frutescens", + "localImageUri": "/plants/perilla-frutescens--shiso--c065ca09.webp", + "status": "existing" + }, + { + "id": "plant_3c6961985d686c33", + "botanicalName": "Salix alba", + "name": "Silber-Weide", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/f8/Salix_alba_leaves.jpg/500px-Salix_alba_leaves.jpg", + "localImageUri": "/plants/salix-alba--silber-weide--407a5b47.webp", + "status": "existing" + }, + { + "id": "plant_4d4483c9e8f98e94", + "botanicalName": "Aechmea fasciata", + "name": "Silbervase", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/23/Aechmea_fasciata2.jpg/500px-Aechmea_fasciata2.jpg", + "localImageUri": "/plants/aechmea-fasciata--silbervase--04efba01.webp", + "status": "existing" + }, + { + "id": "plant_24c71b67fe2ed42a", + "botanicalName": "Adenium socotranum", + "name": "Socotra-Wuestenrose", + "sourceUri": "wikimedia-search:Adenium%20socotranum", + "localImageUri": "/plants/adenium-socotranum--socotra-wuestenrose--0118195c.webp", + "status": "existing" + }, + { + "id": "plant_d9407787d1cc720e", + "botanicalName": "Helianthus annuus", + "name": "Sonnenblume", + "sourceUri": "wikimedia-search:Helianthus%20annuus", + "localImageUri": "/plants/helianthus-annuus--sonnenblume--d26f9031.webp", + "status": "existing" + }, + { + "id": "plant_a91db7a3318f3302", + "botanicalName": "Echinacea purpurea", + "name": "Sonnenhut", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/8e/Echinacea_purpurea_Grandview_Prairie.jpg/500px-Echinacea_purpurea_Grandview_Prairie.jpg", + "localImageUri": "/plants/echinacea-purpurea--sonnenhut--cd110eab.webp", + "status": "existing" + }, + { + "id": "plant_0aa802b967afc69a", + "botanicalName": "Drosera capensis", + "name": "Sonnentau", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/0f/Drosera_capensis_bend.JPG/500px-Drosera_capensis_bend.JPG", + "localImageUri": "/plants/drosera-capensis--sonnentau--7122f48c.webp", + "status": "existing" + }, + { + "id": "plant_db7dd5c2bff6c42d", + "botanicalName": "Tillandsia usneoides", + "name": "Spanisches Moos", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/13/Spanish_moss_at_the_Mcbryde_Garden_in_hawaii.jpg/500px-Spanish_moss_at_the_Mcbryde_Garden_in_hawaii.jpg", + "localImageUri": "/plants/tillandsia-usneoides--spanisches-moos--80677975.webp", + "status": "existing" + }, + { + "id": "plant_ac11d9bd0c391e9d", + "botanicalName": "Portulacaria afra", + "name": "Speckbaum", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/46/Portulacaria_afra_02.JPG/500px-Portulacaria_afra_02.JPG", + "localImageUri": "/plants/portulacaria-afra--speckbaum--b630ec3c.webp", + "status": "existing" + }, + { + "id": "plant_477dc83da2cd56cb", + "botanicalName": "Peperomia obtusifolia", + "name": "Spiegelpeperomie", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/19/Peperomia_obtusifolia_3-OB9.jpg/500px-Peperomia_obtusifolia_3-OB9.jpg", + "localImageUri": "/plants/peperomia-obtusifolia--spiegelpeperomie--fffbf481.webp", + "status": "existing" + }, + { + "id": "plant_4e6527efa4ab752f", + "botanicalName": "Spiraea japonica", + "name": "Spierstrauch", + "sourceUri": "wikimedia-search:Spiraea%20japonica", + "localImageUri": "/plants/spiraea-japonica--spierstrauch--2fce09a7.webp", + "status": "existing" + }, + { + "id": "plant_4f624a47f15a976c", + "botanicalName": "Spinacia oleracea", + "name": "Spinat", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/37/Spinacia_oleracea_Spinazie_bloeiend.jpg/500px-Spinacia_oleracea_Spinazie_bloeiend.jpg", + "localImageUri": "/plants/spinacia-oleracea--spinat--67379554.webp", + "status": "existing" + }, + { + "id": "plant_3c3e9d84b343cb19", + "botanicalName": "Acer platanoides", + "name": "Spitzahorn", + "sourceUri": "wikimedia-search:Acer%20platanoides", + "localImageUri": "/plants/acer-platanoides--spitzahorn--dc2fbf6a.webp", + "status": "existing" + }, + { + "id": "plant_c3b438f135460578", + "botanicalName": "Rhapis excelsa", + "name": "Stab-Palme", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/0c/Arya_-_Rhapis_excelsa_at_hotel_citradream_Cirebon_2019_0.jpg/500px-Arya_-_Rhapis_excelsa_at_hotel_citradream_Cirebon_2019_0.jpg", + "localImageUri": "/plants/rhapis-excelsa--stab-palme--3f2eded0.webp", + "status": "existing" + }, + { + "id": "plant_ec4cfefb4784d583", + "botanicalName": "Ilex aquifolium", + "name": "Stechpalme", + "sourceUri": "wikimedia-search:Ilex%20aquifolium", + "localImageUri": "/plants/ilex-aquifolium--stechpalme--19cff9ae.webp", + "status": "existing" + }, + { + "id": "plant_0bff1afe77c852a9", + "botanicalName": "Pelargonium zonale", + "name": "Stehende Geranie", + "sourceUri": "wikimedia-search:Pelargonium%20zonale", + "localImageUri": "/plants/pelargonium-zonale--stehende-geranie--2854b148.webp", + "status": "existing" + }, + { + "id": "plant_dfd8a974072ccdde", + "botanicalName": "Stevia rebaudiana", + "name": "Stevia", + "sourceUri": "wikimedia-search:Stevia%20rebaudiana", + "localImageUri": "/plants/stevia-rebaudiana--stevia--423f53ff.webp", + "status": "existing" + }, + { + "id": "plant_e6998b94b6aa9483", + "botanicalName": "Viola wittrockiana", + "name": "Stiefmuetterchen", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b8/PansyScan_%28cropped%29.jpg/500px-PansyScan_%28cropped%29.jpg", + "localImageUri": "/plants/viola-wittrockiana--stiefmuetterchen--d2cb587c.webp", + "status": "existing" + }, + { + "id": "plant_4e7aa106c2e0dbed", + "botanicalName": "Miltoniopsis roezlii", + "name": "Stiefmuetterchen-Orchidee", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/bd/Miltoniopsis_roezlii_%28as_Odontoglossum_roezlii%29_-_pl._30_-_Bateman%2C_Monogr.Odont.jpg/500px-Miltoniopsis_roezlii_%28as_Odontoglossum_roezlii%29_-_pl._30_-_Bateman%2C_Monogr.Odont.jpg", + "localImageUri": "/plants/miltoniopsis-roezlii--stiefmuetterchen-orchidee--87379182.webp", + "status": "existing" + }, + { + "id": "plant_b608fca2dcc684e2", + "botanicalName": "Alcea rosea", + "name": "Stockrose", + "sourceUri": "wikimedia-search:Alcea%20rosea", + "localImageUri": "/plants/alcea-rosea--stockrose--4b6ec327.webp", + "status": "existing" + }, + { + "id": "plant_67521f8578f80480", + "botanicalName": "Schefflera arboricola", + "name": "Strahlenaralie", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/82/Schefflera_arboricola%2C_vrugte%2C_a%2C_Pretoria.jpg/500px-Schefflera_arboricola%2C_vrugte%2C_a%2C_Pretoria.jpg", + "localImageUri": "/plants/schefflera-arboricola--strahlenaralie--b445fcbb.webp", + "status": "existing" + }, + { + "id": "plant_29784101db6f97ac", + "botanicalName": "Curio radicans", + "name": "String of Bananas", + "sourceUri": "wikimedia-search:Curio%20radicans", + "localImageUri": "/plants/curio-radicans--string-of-bananas--cee5c6f3.webp", + "status": "existing" + }, + { + "id": "plant_a765276379bdfc03", + "botanicalName": "Curio x peregrinus", + "name": "String of Dolphins", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/0/00/Dolphinplant.jpg", + "localImageUri": "/plants/curio-x-peregrinus--string-of-dolphins--167250ea.webp", + "status": "existing" + }, + { + "id": "plant_15d0205868b79470", + "botanicalName": "Stromanthe sanguinea", + "name": "Stromanthe", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/38/Stromanthe_sanguinea_in_garden_in_Manaus%2C_Brazil.jpg/500px-Stromanthe_sanguinea_in_garden_in_Manaus%2C_Brazil.jpg", + "localImageUri": "/plants/stromanthe-sanguinea--stromanthe--a9ffe5b3.webp", + "status": "existing" + }, + { + "id": "plant_9d6e62be0b1cb281", + "botanicalName": "Tagetes patula", + "name": "Studentenblume", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e7/French_marigold_Tagetes_patula.jpg/500px-French_marigold_Tagetes_patula.jpg", + "localImageUri": "/plants/tagetes-patula--studentenblume--0da7d656.webp", + "status": "existing" + }, + { + "id": "plant_4b198e1fefa08544", + "botanicalName": "Ipomoea batatas", + "name": "Suesskartoffel", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/58/Ipomoea_batatas_006.JPG/500px-Ipomoea_batatas_006.JPG", + "localImageUri": "/plants/ipomoea-batatas--suesskartoffel--09695c9f.webp", + "status": "existing" + }, + { + "id": "plant_592490afaac6a7aa", + "botanicalName": "Hemerocallis fulva", + "name": "Taglilie", + "sourceUri": "wikimedia-search:Hemerocallis%20fulva", + "localImageUri": "/plants/hemerocallis-fulva--taglilie--de9c4c6c.webp", + "status": "existing" + }, + { + "id": "plant_876974955b59c59e", + "botanicalName": "Oncidium sphacelatum", + "name": "Tanzerinnen-Orchidee", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/37/Oncidium_sphacelatum03.jpg/500px-Oncidium_sphacelatum03.jpg", + "localImageUri": "/plants/oncidium-sphacelatum--tanzerinnen-orchidee--79ae7545.webp", + "status": "existing" + }, + { + "id": "plant_2ee0814c52ec43e5", + "botanicalName": "Colocasia esculenta", + "name": "Taro", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/30/Songe-R%C3%A9union.JPG/500px-Songe-R%C3%A9union.JPG", + "localImageUri": "/plants/colocasia-esculenta--taro--d23c3d35.webp", + "status": "existing" + }, + { + "id": "plant_8860c603977b7048", + "botanicalName": "Camellia sinensis", + "name": "Teestrauch", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/71/Csinensis.jpg/500px-Csinensis.jpg", + "localImageUri": "/plants/camellia-sinensis--teestrauch--2c1d14da.webp", + "status": "existing" + }, + { + "id": "plant_716160bf88dd9d13", + "botanicalName": "Plumeria rubra", + "name": "Tempel-Baum", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/aa/Champa_tree_with_pink_flowers_in_Islamabad%2C_Pakistan.jpg/500px-Champa_tree_with_pink_flowers_in_Islamabad%2C_Pakistan.jpg", + "localImageUri": "/plants/plumeria-rubra--tempel-baum--657d110b.webp", + "status": "existing" + }, + { + "id": "plant_9b35df06e64f0898", + "botanicalName": "Thymus vulgaris", + "name": "Thymian", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/4f/Thymus_vulgaris1.JPG/500px-Thymus_vulgaris1.JPG", + "localImageUri": "/plants/thymus-vulgaris--thymian--64a6471c.webp", + "status": "existing" + }, + { + "id": "plant_4318ad8d02f7a1e3", + "botanicalName": "Cordyline fruticosa", + "name": "Tiroler Keulenlilie", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/2d/Cordyline_fruticosa_%2820262433874%29.jpg/500px-Cordyline_fruticosa_%2820262433874%29.jpg", + "localImageUri": "/plants/cordyline-fruticosa--tiroler-keulenlilie--4a44ec99.webp", + "status": "existing" + }, + { + "id": "plant_6209cff29d20de9d", + "botanicalName": "Solanum lycopersicum", + "name": "Tomate", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/89/Tomato_je.jpg/500px-Tomato_je.jpg", + "localImageUri": "/plants/solanum-lycopersicum--tomate--e68be402.webp", + "status": "existing" + }, + { + "id": "plant_ca4a549c5f190565", + "botanicalName": "Lamprocapnos spectabilis", + "name": "Traenendes Herz", + "sourceUri": "wikimedia-search:Lamprocapnos%20spectabilis", + "localImageUri": "/plants/lamprocapnos-spectabilis--traenendes-herz--ab9054da.webp", + "status": "existing" + }, + { + "id": "plant_5b5d63d3d16734c3", + "botanicalName": "Muscari armeniacum", + "name": "Traubenhyazinthe", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/1a/Muscari_armeniacum_4.jpg/500px-Muscari_armeniacum_4.jpg", + "localImageUri": "/plants/muscari-armeniacum--traubenhyazinthe--bc818bf4.webp", + "status": "existing" + }, + { + "id": "plant_79692a800f05a5e6", + "botanicalName": "Fuchsia triphylla", + "name": "Triphylla-Fuchsie", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/90/Fuchsia_triphylla_kz01.jpg/500px-Fuchsia_triphylla_kz01.jpg", + "localImageUri": "/plants/fuchsia-triphylla--triphylla-fuchsie--822e8e3b.webp", + "status": "existing" + }, + { + "id": "plant_31af49a80e8b525f", + "botanicalName": "Catalpa bignonioides", + "name": "Trompetenbaum", + "sourceUri": "wikimedia-search:Catalpa%20bignonioides", + "localImageUri": "/plants/catalpa-bignonioides--trompetenbaum--b3b0e8b4.webp", + "status": "existing" + }, + { + "id": "plant_b62179d49d13e958", + "botanicalName": "Campsis radicans", + "name": "Trompetenwinde", + "sourceUri": "wikimedia-search:Campsis%20radicans", + "localImageUri": "/plants/campsis-radicans--trompetenwinde--7ed75a41.webp", + "status": "existing" + }, + { + "id": "plant_6ad4ada285b323dd", + "botanicalName": "Polypodium vulgare", + "name": "Tueipelfarn", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/56/T%C3%BCpfelfarn_%28Polypodium_vulgare%29.jpg/500px-T%C3%BCpfelfarn_%28Polypodium_vulgare%29.jpg", + "localImageUri": "/plants/polypodium-vulgare--tueipelfarn--2e4f5046.webp", + "status": "existing" + }, + { + "id": "plant_f03bc24e17022dd9", + "botanicalName": "Microsorum punctatum", + "name": "Tueipelfarn (Microsorum)", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/9f/Microsorum_punctatum.jpg/500px-Microsorum_punctatum.jpg", + "localImageUri": "/plants/microsorum-punctatum--tueipelfarn-microsorum--77fa4bea.webp", + "status": "existing" + }, + { + "id": "plant_a90c8b9c4cddc806", + "botanicalName": "Tulipa gesneriana", + "name": "Tulpe", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/9e/%D7%A6%D7%91%D7%A2%D7%95%D7%A0%D7%99%D7%9D.JPG/500px-%D7%A6%D7%91%D7%A2%D7%95%D7%A0%D7%99%D7%9D.JPG", + "localImageUri": "/plants/tulipa-gesneriana--tulpe--373bf645.webp", + "status": "existing" + }, + { + "id": "plant_ea198ff58c8805c6", + "botanicalName": "Pilea peperomioides", + "name": "Ufopflanze", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/6d/Pilea_peperomioides_Chinese_money_plant.jpg/500px-Pilea_peperomioides_Chinese_money_plant.jpg", + "localImageUri": "/plants/pilea-peperomioides--ufopflanze--6b60c68b.webp", + "status": "existing" + }, + { + "id": "plant_40fc59a7783f4dbd", + "botanicalName": "Vanda coerulea", + "name": "Vanda-Orchidee", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b3/An_orchid_%28Vanda_caerulea%29%3B_flowering_stem._Watercolour._Wellcome_V0043303.jpg/500px-An_orchid_%28Vanda_caerulea%29%3B_flowering_stem._Watercolour._Wellcome_V0043303.jpg", + "localImageUri": "/plants/vanda-coerulea--vanda-orchidee--d3b6fab1.webp", + "status": "existing" + }, + { + "id": "plant_ec96801b21f4b888", + "botanicalName": "Vanilla planifolia", + "name": "Vanille", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e6/Vanilla_planifolia_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-278.jpg/500px-Vanilla_planifolia_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-278.jpg", + "localImageUri": "/plants/vanilla-planifolia--vanille--39790d8a.webp", + "status": "existing" + }, + { + "id": "plant_e0c02d30e9553083", + "botanicalName": "Dionaea muscipula", + "name": "Venusfliegenfalle", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/37/Venus_Flytrap_showing_trigger_hairs.jpg/500px-Venus_Flytrap_showing_trigger_hairs.jpg", + "localImageUri": "/plants/dionaea-muscipula--venusfliegenfalle--fbcebf61.webp", + "status": "existing" + }, + { + "id": "plant_78ed61e5bca062af", + "botanicalName": "Myosotis sylvatica", + "name": "Vergissmeinnicht", + "sourceUri": "wikimedia-search:Myosotis%20sylvatica", + "localImageUri": "/plants/myosotis-sylvatica--vergissmeinnicht--0d817fb7.webp", + "status": "existing" + }, + { + "id": "plant_621534b573f3fbd1", + "botanicalName": "Asplenium nidus", + "name": "Vogelnest-Farn", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/84/Asplenium_nidus_%28Bukidnon%2C_Philippines%29_02.jpg/500px-Asplenium_nidus_%28Bukidnon%2C_Philippines%29_02.jpg", + "localImageUri": "/plants/asplenium-nidus--vogelnest-farn--c9fbbb3c.webp", + "status": "existing" + }, + { + "id": "plant_b109c47be52f9ec8", + "botanicalName": "Hoya carnosa", + "name": "Wachsblume", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/ea/NKN-2007-06-13_114250_Hoya_Carnosa_%28Yvan_Leduc_author_for_Wikipedia%29.jpg/500px-NKN-2007-06-13_114250_Hoya_Carnosa_%28Yvan_Leduc_author_for_Wikipedia%29.jpg", + "localImageUri": "/plants/hoya-carnosa--wachsblume--4da8fed5.webp", + "status": "existing" + }, + { + "id": "plant_632f108725deeafe", + "botanicalName": "Lantana camara", + "name": "Wandelroeschen", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/52/LantanaFlowerLeaves.jpg/500px-LantanaFlowerLeaves.jpg", + "localImageUri": "/plants/lantana-camara--wandelroeschen--b8fc5640.webp", + "status": "existing" + }, + { + "id": "plant_57f737231af6effa", + "botanicalName": "Eutrema japonicum", + "name": "Wasabi", + "sourceUri": "wikimedia-search:Eutrema%20japonicum", + "localImageUri": "/plants/eutrema-japonicum--wasabi--0ea8f701.webp", + "status": "existing" + }, + { + "id": "plant_75007016cfcc5200", + "botanicalName": "Peperomia argyreia", + "name": "Wassermelonen-Peperomie", + "sourceUri": "wikimedia-search:Peperomia%20argyreia", + "localImageUri": "/plants/peperomia-argyreia--wassermelonen-peperomie--1f013dee.webp", + "status": "existing" + }, + { + "id": "plant_c64390ca3c3743fe", + "botanicalName": "Utricularia gibba", + "name": "Wasserschlauch", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/bd/Utricularia_gibba_flower_01.jpg/500px-Utricularia_gibba_flower_01.jpg", + "localImageUri": "/plants/utricularia-gibba--wasserschlauch--13643b06.webp", + "status": "existing" + }, + { + "id": "plant_bd3c4350600627fd", + "botanicalName": "Weigela florida", + "name": "Weigelie", + "sourceUri": "wikimedia-search:Weigela%20florida", + "localImageUri": "/plants/weigela-florida--weigelie--0bf98f7f.webp", + "status": "existing" + }, + { + "id": "plant_33f62ca8680da000", + "botanicalName": "Schlumbergera truncata", + "name": "Weihnachtskaktus", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/f1/Schlumbergera_truncata_%28Exotic_Flora_Plate_20%29.jpg/500px-Schlumbergera_truncata_%28Exotic_Flora_Plate_20%29.jpg", + "localImageUri": "/plants/schlumbergera-truncata--weihnachtskaktus--c8f10c80.webp", + "status": "existing" + }, + { + "id": "plant_8218a6240dd4a406", + "botanicalName": "Euphorbia pulcherrima", + "name": "Weihnachtsstern", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e1/Weihnachtsstern_-_gro%C3%9F.jpg/500px-Weihnachtsstern_-_gro%C3%9F.jpg", + "localImageUri": "/plants/euphorbia-pulcherrima--weihnachtsstern--ce82aeac.webp", + "status": "existing" + }, + { + "id": "plant_4275140824142c04", + "botanicalName": "Strelitzia nicolai", + "name": "Weisse Strelitzie", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/ba/Strelitzia_nicolai_3.jpg/500px-Strelitzia_nicolai_3.jpg", + "localImageUri": "/plants/strelitzia-nicolai--weisse-strelitzie--30b92c65.webp", + "status": "existing" + }, + { + "id": "plant_0a06480067428b83", + "botanicalName": "Tradescantia fluminensis", + "name": "Weisse Tradescantia", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/ef/Tradescantia_fluminensis_%28Flowers%29.jpg/500px-Tradescantia_fluminensis_%28Flowers%29.jpg", + "localImageUri": "/plants/tradescantia-fluminensis--weisse-tradescantia--ed8ecd20.webp", + "status": "existing" + }, + { + "id": "plant_316228d023b525c1", + "botanicalName": "Artemisia absinthium", + "name": "Wermut", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/eb/Artemisia_absinthium_P1210748.jpg/500px-Artemisia_absinthium_P1210748.jpg", + "localImageUri": "/plants/artemisia-absinthium--wermut--26709c63.webp", + "status": "existing" + }, + { + "id": "plant_77608bbef47bdc04", + "botanicalName": "Adenium obesum", + "name": "Wuestenrose", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/4a/Adenium_Obesum_Flower_Side_Macro_Mar22_D72_23052-58_ZS_P.jpg/500px-Adenium_Obesum_Flower_Side_Macro_Mar22_D72_23052-58_ZS_P.jpg", + "localImageUri": "/plants/adenium-obesum--wuestenrose--18b1b800.webp", + "status": "existing" + }, + { + "id": "plant_31c096c7b1717c86", + "botanicalName": "Hyssopus officinalis", + "name": "Ysop", + "sourceUri": "wikimedia-search:Hyssopus%20officinalis", + "localImageUri": "/plants/hyssopus-officinalis--ysop--d3df148e.webp", + "status": "existing" + }, + { + "id": "plant_247330481dff3519", + "botanicalName": "Yucca aloifolia", + "name": "Yucca aloifolia", + "sourceUri": "wikimedia-search:Yucca%20aloifolia", + "localImageUri": "/plants/yucca-aloifolia--ce8ca7a3.webp", + "status": "existing" + }, + { + "id": "plant_a0e4e7fa68bbad41", + "botanicalName": "Yucca elephantipes", + "name": "Yucca-Palme", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/bd/Yucca_gigantea_-_Jard%C3%ADn_Bot%C3%A1nico_Canario_Viera_y_Clavijo_-_Gran_Canaria.jpg/500px-Yucca_gigantea_-_Jard%C3%ADn_Bot%C3%A1nico_Canario_Viera_y_Clavijo_-_Gran_Canaria.jpg", + "localImageUri": "/plants/yucca-elephantipes--yucca-palme--1e34e66e.webp", + "status": "existing" + }, + { + "id": "plant_28107fe5558dfaa3", + "botanicalName": "Hamamelis mollis", + "name": "Zaubernuss", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/ce/Hamamelis_mollis0.jpg/500px-Hamamelis_mollis0.jpg", + "localImageUri": "/plants/hamamelis-mollis--zaubernuss--7ef3c16c.webp", + "status": "existing" + }, + { + "id": "plant_75abff461b3d9bf8", + "botanicalName": "Haworthia fasciata", + "name": "Zebra-Haworthie", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/5c/1_Haworthia_fasciata_-MBB_Kabeljouws_River.jpg/500px-1_Haworthia_fasciata_-MBB_Kabeljouws_River.jpg", + "localImageUri": "/plants/haworthia-fasciata--zebra-haworthie--e4e7e4db.webp", + "status": "existing" + }, + { + "id": "plant_f7d0af5f2c284fff", + "botanicalName": "Tradescantia zebrina", + "name": "Zebrakraut", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/fd/Zebrina_pendula_20060521_2_closer.jpg/500px-Zebrina_pendula_20060521_2_closer.jpg", + "localImageUri": "/plants/tradescantia-zebrina--zebrakraut--1e9a096a.webp", + "status": "existing" + }, + { + "id": "plant_54030db3ff0bde0a", + "botanicalName": "Cedrus libani", + "name": "Zeder", + "sourceUri": "wikimedia-search:Cedrus%20libani", + "localImageUri": "/plants/cedrus-libani--zeder--6af4a3dd.webp", + "status": "existing" + }, + { + "id": "plant_998c8c4ed16286d8", + "botanicalName": "Nicotiana alata", + "name": "Ziertabak", + "sourceUri": "wikimedia-search:Nicotiana%20alata", + "localImageUri": "/plants/nicotiana-alata--ziertabak--e83c441c.webp", + "status": "existing" + }, + { + "id": "plant_ec8a05c334d66976", + "botanicalName": "Zinnia elegans", + "name": "Zinnie", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/6e/Zinnienbl%C3%BCte_Zinnia_elegans_stack15_20190722-RM-7222254.jpg/500px-Zinnienbl%C3%BCte_Zinnia_elegans_stack15_20190722-RM-7222254.jpg", + "localImageUri": "/plants/zinnia-elegans--zinnie--6d666757.webp", + "status": "existing" + }, + { + "id": "plant_29250eba0cf2291f", + "botanicalName": "Citrus limon", + "name": "Zitronenbaum", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e4/P1030323.JPG/500px-P1030323.JPG", + "localImageUri": "/plants/citrus-limon--zitronenbaum--100d9901.webp", + "status": "existing" + }, + { + "id": "plant_3e605c281bb361cc", + "botanicalName": "Cymbopogon citratus", + "name": "Zitronengras", + "sourceUri": "wikimedia-search:Cymbopogon%20citratus", + "localImageUri": "/plants/cymbopogon-citratus--zitronengras--671a6414.webp", + "status": "existing" + }, + { + "id": "plant_8febd56fe7368d57", + "botanicalName": "Melissa officinalis", + "name": "Zitronenmelisse", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/70/Lemon_balm_plant.jpg/500px-Lemon_balm_plant.jpg", + "localImageUri": "/plants/melissa-officinalis--zitronenmelisse--79ec1828.webp", + "status": "existing" + }, + { + "id": "plant_dc96f296e8d0e517", + "botanicalName": "Aloysia citrodora", + "name": "Zitronenverbene", + "sourceUri": "wikimedia-search:Aloysia%20citrodora", + "localImageUri": "/plants/aloysia-citrodora--zitronenverbene--92460709.webp", + "status": "existing" + }, + { + "id": "plant_3a3d31c9d818021b", + "botanicalName": "Phoenix roebelenii", + "name": "Zwergdattelpalme", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/1d/Starr_070124-3839_Phoenix_roebelenii.jpg/500px-Starr_070124-3839_Phoenix_roebelenii.jpg", + "localImageUri": "/plants/phoenix-roebelenii--zwergdattelpalme--f83a8f6a.webp", + "status": "existing" + }, + { + "id": "plant_5c8f76b2c7d187f1", + "botanicalName": "Sansevieria cylindrica", + "name": "Zylindrischer Bogenhanf", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c8/Sansevieria_cylindrica_flowers_7.jpg/500px-Sansevieria_cylindrica_flowers_7.jpg", + "localImageUri": "/plants/sansevieria-cylindrica--zylindrischer-bogenhanf--5b3a59b5.webp", + "status": "existing" + }, + { + "id": "plant_7fe204e226887efa", + "botanicalName": "Cymbidium lowianum", + "name": "Zymbidium", + "sourceUri": "https://upload.wikimedia.org/wikipedia/commons/b/b7/Cymbidium_lowianum_-_Bot-DSCF1035.jpg", + "localImageUri": "/plants/cymbidium-lowianum--zymbidium--3ee7a3d5.webp", + "status": "existing" + }, + { + "id": "plant_d138e647d3e19b04", + "botanicalName": "Cupressus sempervirens", + "name": "Zypresse", + "sourceUri": "wikimedia-search:Cupressus%20sempervirens", + "localImageUri": "/plants/cupressus-sempervirens--zypresse--fece2137.webp", + "status": "existing" + } + ] } \ No newline at end of file diff --git a/server/public/plants/wikimedia-search-cache.json b/server/public/plants/wikimedia-search-cache.json index f37dc00..7d7e9ec 100644 --- a/server/public/plants/wikimedia-search-cache.json +++ b/server/public/plants/wikimedia-search-cache.json @@ -1,387 +1,387 @@ -{ - "Stapelia grandiflora": "https://upload.wikimedia.org/wikipedia/commons/6/67/Carrion_Plant_%28Stapelia_grandiflora%29_2.jpg", - "Saintpaulia ionantha": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/19/2007-04-20Saintpaulia_ionantha04.jpg/1280px-2007-04-20Saintpaulia_ionantha04.jpg", - "Agave americana": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/3b/Agave_July_2011-1.jpg/1280px-Agave_July_2011-1.jpg", - "Alocasia amazonica": "https://upload.wikimedia.org/wikipedia/commons/0/0e/Alocasia_x_amazonica_a2.jpg", - "Arnica montana": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/17/Arnica_montana_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-015.jpg/1280px-Arnica_montana_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-015.jpg", - "Valeriana officinalis": "https://upload.wikimedia.org/wikipedia/commons/1/17/Valeriana_officinalis_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-143.jpg", - "Bambusa vulgaris": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/51/Bambusa_vulgaris_%28Dominica%29.jpg/1280px-Bambusa_vulgaris_%28Dominica%29.jpg", - "Musa acuminata": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/2e/Musa_acuminata_kz01.jpg/1280px-Musa_acuminata_kz01.jpg", - "Chamaedorea elegans": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/f5/Chamaedorea_elegans.jpg/1280px-Chamaedorea_elegans.jpg", - "Senecio serpens": "https://upload.wikimedia.org/wikipedia/commons/2/2b/Senecio_serpens.jpg", - "Phlebodium aureum": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/2d/Starr_050107-2831_Phlebodium_aureum.jpg/1280px-Starr_050107-2831_Phlebodium_aureum.jpg", - "Canna indica": "https://upload.wikimedia.org/wikipedia/commons/9/99/Canna_indica_%28wild_species%29_flowers.JPG", - "Geranium sanguineum": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e2/Geranium_sanguineum_-_verev_kurereha.jpg/1280px-Geranium_sanguineum_-_verev_kurereha.jpg", - "Ficus retusa": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/9d/Ficus_retusa_2zz.jpg/1280px-Ficus_retusa_2zz.jpg", - "Bougainvillea spectabilis": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/f8/Starr_030418-0058_Bougainvillea_spectabilis.jpg/1280px-Starr_030418-0058_Bougainvillea_spectabilis.jpg", - "Caladium bicolor": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b8/Caladium_bicolor_%27Florida_Sweetheart%27_Plant_2220px.jpg/1280px-Caladium_bicolor_%27Florida_Sweetheart%27_Plant_2220px.jpg", - "Calibrachoa hybrida": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e2/Basket_of_Calibrachoa_parviflora_by_A_-_2020-06-18.jpg/1280px-Basket_of_Calibrachoa_parviflora_by_A_-_2020-06-18.jpg", - "Callisia repens": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e6/Turtle_Vine_%28Callisia_repens%29_1.jpg/1280px-Turtle_Vine_%28Callisia_repens%29_1.jpg", - "Cattleya labiata": "https://upload.wikimedia.org/wikipedia/commons/9/97/Cattleya_labiata_2.jpg", - "Capsicum annuum": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/cc/Capsicum_annuum.JPG/1280px-Capsicum_annuum.JPG", - "Livistona chinensis": "https://upload.wikimedia.org/wikipedia/commons/f/f6/Livistona-chinensis.jpg", - "Rosa chinensis": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/95/Rosa_chinensis_04-08-2012_01.jpg/1280px-Rosa_chinensis_04-08-2012_01.jpg", - "Columnea gloriosa": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/6d/Columnea_gloriosa_137-8378.jpg/1280px-Columnea_gloriosa_137-8378.jpg", - "Dieffenbachia seguine": "https://upload.wikimedia.org/wikipedia/commons/8/80/Dieffenbachia_seguine1FKST.jpg", - "Dischidia ruscifolia": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/ec/%E7%99%BE%E8%90%AC%E5%BF%83_Dischidia_ruscifolia_-%E9%A6%99%E6%B8%AF%E5%8B%95%E6%A4%8D%E7%89%A9%E5%85%AC%E5%9C%92_Hong_Kong_Botanical_Garden-_%289240152650%29.jpg/1280px-%E7%99%BE%E8%90%AC%E5%BF%83_Dischidia_ruscifolia_-%E9%A6%99%E6%B8%AF%E5%8B%95%E6%A4%8D%E7%89%A9%E5%85%AC%E5%9C%92_Hong_Kong_Botanical_Garden-_%289240152650%29.jpg", - "Dracaena marginata": "https://upload.wikimedia.org/wikipedia/commons/f/f9/Dracaena_marginata_IndoorPlant_0605k.jpg", - "Streptocarpus hybridus": "https://upload.wikimedia.org/wikipedia/commons/9/9f/2007-03-20Streptocarpus01.jpg", - "Dudleya brittonii": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/10/Dudleya_Brittonii.jpg/1280px-Dudleya_Brittonii.jpg", - "Acer palmatum": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/de/Portland_Japanese_Garden_maple.jpg/1280px-Portland_Japanese_Garden_maple.jpg", - "Fatsia japonica": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/44/Fatsia_japonica.003_-_Zapateira.jpg/1280px-Fatsia_japonica.003_-_Zapateira.jpg", - "Vriesea splendens": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/d6/Vriesea_splendens_flower.jpg/1280px-Vriesea_splendens_flower.jpg", - "Impatiens walleriana": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/1e/Impatiens_walleriana_01.JPG/1280px-Impatiens_walleriana_01.JPG", - "Begonia maculata": "https://upload.wikimedia.org/wikipedia/commons/d/df/Begonia_maculata3073316230.jpg", - "Adiantum raddianum": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/45/Starr_030807-0143_Adiantum_raddianum.jpg/1280px-Starr_030807-0143_Adiantum_raddianum.jpg", - "Fuchsia hybrida": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/cc/Fuchsia_%C3%97_hybrida.jpg/1280px-Fuchsia_%C3%97_hybrida.jpg", - "Gasteria carinata": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/12/Gasteria_carinata_hh.jpg/1280px-Gasteria_carinata_hh.jpg", - "Ficus lyrata": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/84/Starr_031108-0130_Ficus_lyrata.jpg/1280px-Starr_031108-0130_Ficus_lyrata.jpg", - "Graptopetalum paraguayense": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/59/%28MHNT%29_Graptopetalum_paraguayense_-_leaves.jpg/1280px-%28MHNT%29_Graptopetalum_paraguayense_-_leaves.jpg", - "Platycerium bifurcatum": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/ab/Platycerium_bifurcatum_%28Corne_d%27%C3%A9lan%29_-_107.jpg/1280px-Platycerium_bifurcatum_%28Corne_d%27%C3%A9lan%29_-_107.jpg", - "Gloxinia speciosa": "https://upload.wikimedia.org/wikipedia/commons/8/87/Sinnningia_speciosa_im_Querbeet-Wintergarten.jpg", - "Echinocactus grusonii": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/46/Echinocactus_grusonii_qtl1.jpg/1280px-Echinocactus_grusonii_qtl1.jpg", - "Phyllostachys aurea": "https://upload.wikimedia.org/wikipedia/commons/3/3b/Phyllostachys_aurea0.jpg", - "Punica granatum": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/db/Illustration_Punica_granatum2.jpg/1280px-Illustration_Punica_granatum2.jpg", - "Schefflera actinophylla": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e6/Schefflera_actinophylla_02.JPG/1280px-Schefflera_actinophylla_02.JPG", - "Ficus elastica": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/88/Ficus_November_2008-1.jpg/1280px-Ficus_November_2008-1.jpg", - "Cucumis sativus": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/07/Cucumis_sativus_0001.JPG/1280px-Cucumis_sativus_0001.JPG", - "Betula pendula": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/17/Betula_pendula_in_Sedovo_1.jpg/1280px-Betula_pendula_in_Sedovo_1.jpg", - "Philodendron hederaceum": "https://upload.wikimedia.org/wikipedia/commons/b/bb/Philodendron_scandens_subsp_oxycardium2.jpg", - "Ceropegia woodii": "https://upload.wikimedia.org/wikipedia/commons/5/55/Ceropegia_linearis_subsp_woodii.jpg", - "Hyacinthus orientalis": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/ae/Garden_Hyacinth_Hyacinthus_orientalis_%27Blue_Jacket%27_Flower_2000px.jpg/1280px-Garden_Hyacinth_Hyacinthus_orientalis_%27Blue_Jacket%27_Flower_2000px.jpg", - "Azalea indica": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/de/Rhododendron_indicum1.jpg/1280px-Rhododendron_indicum1.jpg", - "Zingiber officinale": "https://upload.wikimedia.org/wikipedia/commons/c/c1/Ginger_Plant_vs.jpg", - "Crassula ovata": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/5d/Crassula_ovata_RTBG.jpg/1280px-Crassula_ovata_RTBG.jpg", - "Rhododendron simsii": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/9b/Rhododendron_simsii_01.JPG/1280px-Rhododendron_simsii_01.JPG", - "Coffea arabica": "https://upload.wikimedia.org/wikipedia/commons/1/10/Coffea_arabica_2.jpg", - "Kalanchoe blossfeldiana": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/fa/Kalanchoe_blossfeldiana_%28Florist_Kalanchoe%29.jpg/1280px-Kalanchoe_blossfeldiana_%28Florist_Kalanchoe%29.jpg", - "Camellia japonica": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/6d/Camellia_japonica_var._decumbens_3.JPG/1280px-Camellia_japonica_var._decumbens_3.JPG", - "Chamomilla recutita": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a7/Chamomile%40original_size.jpg/1280px-Chamomile%40original_size.jpg", - "Aloe arborescens": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/34/Aloe_arborescens_01.JPG/1280px-Aloe_arborescens_01.JPG", - "Aloe ferox": "https://upload.wikimedia.org/wikipedia/commons/9/9e/Aloe_Ferox_between_Cofimvaba_and_Ngcobo.jpg", - "Daucus carota": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/23/Daucus_carota_May_2008-1_edit.jpg/1280px-Daucus_carota_May_2008-1_edit.jpg", - "Oxalis triangularis": "https://upload.wikimedia.org/wikipedia/commons/1/15/Oxalis_triangularis6.jpg", - "Hoya bella": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/d1/%E7%BE%8E%E9%BA%97%E6%AF%AC%E8%98%AD_Hoya_bella_-%E9%A6%99%E6%B8%AF%E5%85%AC%E5%9C%92_Hong_Kong_Park-_%289240227808%29.jpg/1280px-%E7%BE%8E%E9%BA%97%E6%AF%AC%E8%98%AD_Hoya_bella_-%E9%A6%99%E6%B8%AF%E5%85%AC%E5%9C%92_Hong_Kong_Park-_%289240227808%29.jpg", - "Begonia tuberhybrida": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/62/Begonia_x_tuberhybrida_1005Pink1.JPG/1280px-Begonia_x_tuberhybrida_1005Pink1.JPG", - "Epiphyllum oxypetalum": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/59/Kakteen_IMG_4213.jpg/1280px-Kakteen_IMG_4213.jpg", - "Protea cynaroides": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/3d/Protea_cynaroides_3.jpg/1280px-Protea_cynaroides_3.jpg", - "Conophytum calculus": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/25/Conophytum_calculus_-_Namaqualand_-_South_Africa_5.jpg/1280px-Conophytum_calculus_-_Namaqualand_-_South_Africa_5.jpg", - "Rhipsalis baccifera": "https://upload.wikimedia.org/wikipedia/commons/b/ba/Rhipsalis_baccifera_01_ies.jpg", - "Cotyledon orbiculata": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/bb/Cotyledon_orbiculata_2.jpg/1280px-Cotyledon_orbiculata_2.jpg", - "Lithops julii": "https://upload.wikimedia.org/wikipedia/commons/4/4d/Lithops_julii_Nicos_Farm_strain.jpg", - "Tradescantia pallida": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/be/Tradescantia_pallida_C.jpg/1280px-Tradescantia_pallida_C.jpg", - "Aeschynanthus radicans": "https://upload.wikimedia.org/wikipedia/commons/5/52/Aeschynanthus_radicans.jpg", - "Tillandsia ionantha": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/d9/Matthaei_Botanical_Gardens_-_IMG_8999.JPG/1280px-Matthaei_Botanical_Gardens_-_IMG_8999.JPG", - "Stephanotis floribunda": "https://upload.wikimedia.org/wikipedia/commons/9/9d/Stephanotis_floribunda.jpg", - "Dracaena fragrans": "https://upload.wikimedia.org/wikipedia/commons/6/64/Dracaena_fragrans_a1.jpg", - "Beta vulgaris": "https://upload.wikimedia.org/wikipedia/commons/f/ff/Beta_vulgaris_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-167.jpg", - "Rhaphidophora tetrasperma": "https://upload.wikimedia.org/wikipedia/commons/d/db/Rhaphidophora_tetrasperma.jpg", - "Pachyphytum oviferum": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/39/Pachyphytum_oviferum_1.jpg/1280px-Pachyphytum_oviferum_1.jpg", - "Monstera adansonii": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/34/Monstera_adansonii_CBM.png/1280px-Monstera_adansonii_CBM.png", - "Crassula muscosa": "https://upload.wikimedia.org/wikipedia/commons/5/5e/Crassula_muscosa_Grubosz_2006-05-03_01.jpg", - "Epipremnum pinnatum Neon": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/de/Epipremnum_pinnatum_%27Neon%27%2C_Longwood_Gardens_01.jpg/1280px-Epipremnum_pinnatum_%27Neon%27%2C_Longwood_Gardens_01.jpg", - "Lilium longiflorum": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Lilium_longiflorum_%28Easter_Lily%29.JPG/1280px-Lilium_longiflorum_%28Easter_Lily%29.JPG", - "Senecio rowleyanus": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/3b/Senecio_rowleyanus.jpg/1280px-Senecio_rowleyanus.jpg", - "Petroselinum crispum": "https://upload.wikimedia.org/wikipedia/commons/2/2d/Petroselinum_crispum_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-103.jpg", - "Petunia hybrida": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/af/Petunia_x_hybrida_a2.JPG/1280px-Petunia_x_hybrida_a2.JPG", - "Syngonium podophyllum": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/07/Syngonium_podophyllum_Golden_0zz.jpg/1280px-Syngonium_podophyllum_Golden_0zz.jpg", - "Philodendron bipinnatifidum": "https://upload.wikimedia.org/wikipedia/commons/c/c1/Tree1.JPG", - "Philodendron gloriosum": "https://upload.wikimedia.org/wikipedia/commons/f/f1/Philodendron_gloriosum.jpg", - "Primula vulgaris": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/76/Chipping_Sodbury_MMB_02_primula_vulgaris.jpg/1280px-Chipping_Sodbury_MMB_02_primula_vulgaris.jpg", - "Raphanus sativus": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/73/Raphanus_sativus_of_Salem.jpg/1280px-Raphanus_sativus_of_Salem.jpg", - "Selaginella uncinata": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/34/Selaginella_uncinata_-_Berlin_Botanical_Garden_-_IMG_8722.JPG/1280px-Selaginella_uncinata_-_Berlin_Botanical_Garden_-_IMG_8722.JPG", - "Peperomia caperata": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/14/Peperomia_caperata_1-OB9.jpg/1280px-Peperomia_caperata_1-OB9.jpg", - "Hippeastrum hybrid": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/fc/Hippeastrum_hybrid_1.jpg/1280px-Hippeastrum_hybrid_1.jpg", - "Digitalis purpurea": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/ba/Digitalis_purpurea_LC0101.jpg/1280px-Digitalis_purpurea_LC0101.jpg", - "Lactuca sativa": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/6b/Romaine_lettuce.jpg/1280px-Romaine_lettuce.jpg", - "Salvia officinalis": "https://upload.wikimedia.org/wikipedia/commons/5/5a/Salvia_officinalis0.jpg", - "Scindapsus pictus": "https://upload.wikimedia.org/wikipedia/commons/c/ca/Scindapsus_pictus_01.jpg", - "Mimosa pudica": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/04/Touch_Me_not.jpg/1280px-Touch_Me_not.jpg", - "Phalaenopsis amabilis": "https://upload.wikimedia.org/wikipedia/commons/3/32/Phalaenopsis_amabilis_Orchi_03.jpg", - "Allium schoenoprasum": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/74/Allium_schoenoprasum_J1.JPG/1280px-Allium_schoenoprasum_J1.JPG", - "Pandanus veitchii": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/fb/Pandanus_tectorius.jpg/1280px-Pandanus_tectorius.jpg", - "Aeonium arboreum": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c4/Aeonium_arboreum_01.jpg/1280px-Aeonium_arboreum_01.jpg", - "Adenium socotranum": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/fa/Adenium_seedling_2day_Uthandi_Aug21_D72_20609-21_ZP.jpg/1280px-Adenium_seedling_2day_Uthandi_Aug21_D72_20609-21_ZP.jpg", - "Echinacea purpurea": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b5/Monarch_Butterfly_Danaus_plexippus_on_Echinacea_purpurea_2800px.jpg/1280px-Monarch_Butterfly_Danaus_plexippus_on_Echinacea_purpurea_2800px.jpg", - "Tillandsia usneoides": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/74/Tillandsia_usneoides_%28Bromeliaceae%29_%2825004066956%29.jpg/1280px-Tillandsia_usneoides_%28Bromeliaceae%29_%2825004066956%29.jpg", - "Rhapis excelsa": "https://upload.wikimedia.org/wikipedia/commons/7/7d/Rhapis_excelsa.jpg", - "Viola wittrockiana": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/91/Pansy_viola_x_wittrockiana_blue.jpg/1280px-Pansy_viola_x_wittrockiana_blue.jpg", - "Schefflera arboricola": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/82/Schefflera_arboricola%2C_vrugte%2C_a%2C_Pretoria.jpg/1280px-Schefflera_arboricola%2C_vrugte%2C_a%2C_Pretoria.jpg", - "Tagetes patula": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/1f/French_marigold_garden_2009_G1.jpg/1280px-French_marigold_garden_2009_G1.jpg", - "Oncidium sphacelatum": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/37/Oncidium_sphacelatum03.jpg/1280px-Oncidium_sphacelatum03.jpg", - "Colocasia esculenta": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/83/Taro_leaf_underside%2C_backlit_by_sun.jpg/1280px-Taro_leaf_underside%2C_backlit_by_sun.jpg", - "Camellia sinensis": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e3/Camellia_sinensis_MHNT.BOT.2016.12.24.jpg/1280px-Camellia_sinensis_MHNT.BOT.2016.12.24.jpg", - "Plumeria rubra": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a2/White_Plumeria_from_Kannur_-_Kerala.jpg/1280px-White_Plumeria_from_Kannur_-_Kerala.jpg", - "Thymus vulgaris": "https://upload.wikimedia.org/wikipedia/commons/1/12/Thymus_vulgaris_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-271.jpg", - "Cordyline fruticosa": "https://upload.wikimedia.org/wikipedia/commons/0/05/Ti_plant_%28Cordyline_fruticosa%29.jpg", - "Solanum lycopersicum": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/89/Tomato_je.jpg/1280px-Tomato_je.jpg", - "Polypodium vulgare": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/33/Polypodium_vulgare%2C_sores_%28Matthieu_Gauvain%29.JPG/1280px-Polypodium_vulgare%2C_sores_%28Matthieu_Gauvain%29.JPG", - "Microsorum punctatum": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/9f/Microsorum_punctatum.jpg/1280px-Microsorum_punctatum.jpg", - "Tulipa gesneriana": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/9e/%D7%A6%D7%91%D7%A2%D7%95%D7%A0%D7%99%D7%9D.JPG/1280px-%D7%A6%D7%91%D7%A2%D7%95%D7%A0%D7%99%D7%9D.JPG", - "Vanilla planifolia": "https://upload.wikimedia.org/wikipedia/commons/4/40/Vanilla_planifolia_1.jpg", - "Asplenium nidus": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/73/Bird%27s-nest_Fern_Asplenium_nidus_Leaves_1.jpg/1280px-Bird%27s-nest_Fern_Asplenium_nidus_Leaves_1.jpg", - "Lantana camara": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/71/Twin_lantana_camara_edit.jpg/1280px-Twin_lantana_camara_edit.jpg", - "Schlumbergera truncata": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/61/Schlumbergera_truncata_flordemaio.jpg/1280px-Schlumbergera_truncata_flordemaio.jpg", - "Euphorbia pulcherrima": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/5d/2008_05_17_-_Euphorbia_pulcherrima_05a.JPG/1280px-2008_05_17_-_Euphorbia_pulcherrima_05a.JPG", - "Tradescantia fluminensis": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/05/Tradescantia_fluminensis_Flower_1.jpg/1280px-Tradescantia_fluminensis_Flower_1.jpg", - "Yucca elephantipes": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/d1/Yucca_elephantipes_HRM2.JPG/1280px-Yucca_elephantipes_HRM2.JPG", - "Hamamelis mollis": "https://upload.wikimedia.org/wikipedia/commons/c/ce/Hamamelis_mollis0.jpg", - "Haworthia fasciata": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/13/Haworthia_fasciata_%28Vermont%29.jpg/1280px-Haworthia_fasciata_%28Vermont%29.jpg", - "Tradescantia zebrina": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e6/Zebrina_pendula_20060521_2.JPG/1280px-Zebrina_pendula_20060521_2.JPG", - "Zinnia elegans": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/d7/Zinnia_elegans_with_Bombus_01.JPG/1280px-Zinnia_elegans_with_Bombus_01.JPG", - "Citrus limon": "https://upload.wikimedia.org/wikipedia/commons/e/e4/Lemon.jpg", - "Melissa officinalis": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/f9/Melissa_officinalis_1.jpg/1280px-Melissa_officinalis_1.jpg", - "Phoenix roebelenii": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/1d/Starr_070124-3839_Phoenix_roebelenii.jpg/1280px-Starr_070124-3839_Phoenix_roebelenii.jpg", - "Cymbidium lowianum": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/6b/Cymbidium_lowianum_var._concolor_3.jpg/1280px-Cymbidium_lowianum_var._concolor_3.jpg", - "Jasminum%20sambac": null, - "Pilea%20cadierei": null, - "Alocasia%20zebrina": null, - "Anemone%20coronaria": null, - "Jasminum sambac": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/75/JasminumSambac.jpg/1280px-JasminumSambac.jpg", - "Anemone coronaria": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/80/Blue_Anemone_coronaria.JPG/1280px-Blue_Anemone_coronaria.JPG", - "Pilea cadierei": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/30/PileaCadierei.jpg/1280px-PileaCadierei.jpg", - "Alocasia zebrina": "https://upload.wikimedia.org/wikipedia/commons/4/43/Alocasia_zebrina_Reticulata_1zz.jpg", - "Iris%20germanica": null, - "Dianthus%20barbatus": null, - "Iris germanica": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/29/Iris_germanica_001.jpg/1280px-Iris_germanica_001.jpg", - "Dianthus barbatus": "https://upload.wikimedia.org/wikipedia/commons/4/4f/Dianthus_barbatus_PID1688-4.jpg", - "Lavatera%20trimestris": null, - "Lavatera trimestris": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/57/Flower_April_2010-1a.jpg/1280px-Flower_April_2010-1a.jpg", - "Satureja%20hortensis": null, - "Satureja hortensis": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/5f/Satureja_hortensis_bgiu.jpg/1280px-Satureja_hortensis_bgiu.jpg", - "Borago%20officinalis": null, - "Borago officinalis": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/54/Borago_officinalis_%28flower%29.jpg/1280px-Borago_officinalis_%28flower%29.jpg", - "Soleirolia%20soleirolii": null, - "Soleirolia soleirolii": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Soleirolia_soleirolii_kz05.jpg/1280px-Soleirolia_soleirolii_kz05.jpg", - "Buxus%20sempervirens": null, - "Buxus sempervirens": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/ba/Buisfleurs.jpg/1280px-Buisfleurs.jpg", - "Plectranthus%20scutellarioides": null, - "Plectranthus scutellarioides": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/9c/Solenostemon_scutellarioides_%28Coleus_x_hybridus%29_%27Inky_Fingers%27_Leaf_Cluster_2730px.jpg/1280px-Solenostemon_scutellarioides_%28Coleus_x_hybridus%29_%27Inky_Fingers%27_Leaf_Cluster_2730px.jpg", - "Goeppertia%20insignis": null, - "Goeppertia insignis": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/94/Goeppertia_insignis.jpg/1280px-Goeppertia_insignis.jpg", - "Goeppertia%20ornata": null, - "Goeppertia ornata": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/42/CalatheaOrnataRoseo-Lineata.jpg/1280px-CalatheaOrnataRoseo-Lineata.jpg", - "Clematis%20viticella": null, - "Clematis viticella": "https://upload.wikimedia.org/wikipedia/commons/4/4f/Clematis_viticella3UME.jpg", - "Helichrysum%20italicum": null, - "Helichrysum italicum": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c5/Helichrysum_italicum_%28immortelle%29.JPG/1280px-Helichrysum_italicum_%28immortelle%29.JPG", - "Anethum%20graveolens": null, - "Anethum graveolens": "https://upload.wikimedia.org/wikipedia/commons/5/56/Anethum_graveolens_02.jpg", - "Lathyrus%20odoratus": null, - "Lathyrus odoratus": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/72/Lathyrus_odoratus_Painted_Lady.jpg/1280px-Lathyrus_odoratus_Painted_Lady.jpg", - "Sorbus%20aucuparia": null, - "Sorbus aucuparia": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/d4/2020_year._Herbarium._Sorbus_aucuparia._img-035.jpg/1280px-2020_year._Herbarium._Sorbus_aucuparia._img-035.jpg", - "Quercus%20robur": null, - "Quercus robur": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a9/Langaa_egeskov_rimfrost.jpg/1280px-Langaa_egeskov_rimfrost.jpg", - "Begonia%20semperflorens-cultorum": null, - "Begonia semperflorens-cultorum": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/28/Begonia_semperflorens.jpg/1280px-Begonia_semperflorens.jpg", - "Verbena%20bonariensis": null, - "Verbena bonariensis": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e0/Verbena_bonariensis.jpg/1280px-Verbena_bonariensis.jpg", - "Artemisia%20dracunculus": null, - "Artemisia dracunculus": "https://upload.wikimedia.org/wikipedia/commons/6/6c/Estragon_1511.jpg", - "Eucalyptus%20globulus": null, - "Eucalyptus globulus": "https://upload.wikimedia.org/wikipedia/commons/7/74/Eucalyptus_globulus_globulus.jpg", - "Schefflera%20elegantissima": null, - "Schefflera elegantissima": "https://upload.wikimedia.org/wikipedia/commons/6/64/Schefflera_elegantissima.jpg", - "Salvia%20splendens": null, - "Salvia splendens": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Salvia_splendens_%28357118788%29.jpg/1280px-Salvia_splendens_%28357118788%29.jpg", - "Picea%20abies": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/1b/Picea_abies_%27Rubra_Spicata%27_5_2021_Norway-_%2851176180455%29.jpg/1280px-Picea_abies_%27Rubra_Spicata%27_5_2021_Norway-_%2851176180455%29.jpg", - "Ficus%20altissima": null, - "Ficus altissima": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/60/Ficus_altissima1.jpg/1280px-Ficus_altissima1.jpg", - "Ficus%20microcarpa": null, - "Ficus microcarpa": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/d6/Bonsai_Adam_and_Eve_%28PPL2-Enhanced%29_julesvernex2.jpg/1280px-Bonsai_Adam_and_Eve_%28PPL2-Enhanced%29_julesvernex2.jpg", - "Delonix%20regia": null, - "Delonix regia": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/d6/Flame_tree_mali.jpg/1280px-Flame_tree_mali.jpg", - "Phlox%20paniculata": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e2/Phlox_paniculata_%27Opening_Act_Blush%27_6_2021_Garden_Phlox-_%2851242863119%29.jpg/1280px-Phlox_paniculata_%27Opening_Act_Blush%27_6_2021_Garden_Phlox-_%2851242863119%29.jpg", - "Syringa%20vulgaris": "https://upload.wikimedia.org/wikipedia/commons/2/2b/Syringa_vulgaris1.jpg", - "Forsythia%20x%20intermedia": null, - "Forsythia x intermedia": "https://upload.wikimedia.org/wikipedia/commons/b/b7/Forsythia-intermedia.JPG", - "Freesia%20refracta": null, - "Freesia refracta": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/9e/FreesiaRefracta1.JPG/1280px-FreesiaRefracta1.JPG", - "Amaranthus%20caudatus": null, - "Amaranthus caudatus": "https://upload.wikimedia.org/wikipedia/commons/b/b6/Amaranthus_caudatus1.jpg", - "Bellis%20perennis": null, - "Bellis perennis": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/1c/Pink_twinged_daisy_on_table_edit.jpg/1280px-Pink_twinged_daisy_on_table_edit.jpg", - "Impatiens%20balsamina": null, - "Impatiens balsamina": "https://upload.wikimedia.org/wikipedia/commons/f/f8/Impatiens_balsamina1.jpg", - "Hibiscus%20syriacus": null, - "Hibiscus syriacus": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/70/Hibiscus-syriacus.jpg/1280px-Hibiscus-syriacus.jpg", - "Lonicera%20japonica": null, - "Lonicera japonica": "https://upload.wikimedia.org/wikipedia/commons/b/b9/Honeysuckle_2.jpg", - "Ginkgo%20biloba": null, - "Ginkgo biloba": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/19/Ginkgo_biloba_MHNT.BOT.2010.13.1.jpg/1280px-Ginkgo_biloba_MHNT.BOT.2010.13.1.jpg", - "Gladiolus%20hortulanus": null, - "Gladiolus hortulanus": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/25/Gartengladiole_apricot.JPG/1280px-Gartengladiole_apricot.JPG", - "Pachira%20aquatica": null, - "Pachira aquatica": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/3a/Pachira_aquatica_%28inflorescense%29.jpg/1280px-Pachira_aquatica_%28inflorescense%29.jpg", - "Hyacinthoides%20non-scripta": null, - "Hyacinthoides non-scripta": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a8/Hyacinthoides_non-scripta_%28Common_Bluebell%29.jpg/1280px-Hyacinthoides_non-scripta_%28Common_Bluebell%29.jpg", - "Heliotropium%20arborescens": null, - "Heliotropium arborescens": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/cb/Heliotropium_arborescens_%27Mini_Marine%27_Heliotrope_Flower_2500px.jpg/1280px-Heliotropium_arborescens_%27Mini_Marine%27_Heliotrope_Flower_2500px.jpg", - "Symphyotrichum%20novi-belgii": null, - "Symphyotrichum novi-belgii": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/2f/Symphyotrichum_novi-belgii20090914_120.jpg/1280px-Symphyotrichum_novi-belgii20090914_120.jpg", - "Viola%20cornuta": null, - "Viola cornuta": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b6/Viola_cornuta_2008.jpg/1280px-Viola_cornuta_2008.jpg", - "Hydrangea%20macrophylla": null, - "Hydrangea macrophylla": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/7f/Hydrangea_macrophylla_-_Hortensia_hydrangea.jpg/1280px-Hydrangea_macrophylla_-_Hortensia_hydrangea.jpg", - "Monarda%20didyma": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/cd/Monarda_didyma_%27Colrain_Red%27_6_2021_Bee_Balm-_%2851273491889%29.jpg/1280px-Monarda_didyma_%27Colrain_Red%27_6_2021_Bee_Balm-_%2851273491889%29.jpg", - "Jacaranda%20mimosifolia": null, - "Jacaranda mimosifolia": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/6c/Jacaranda_mimosifolia_5334.jpg/1280px-Jacaranda_mimosifolia_5334.jpg", - "Coffea%20arabica%20Nana": null, - "Coffea arabica Nana": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/3e/Henry_G._Gilbert_Nursery_and_Seed_Trade_Catalog_Collection_%28IA_catalogueofgreen00dcla_0%29.pdf/page1-1016px-Henry_G._Gilbert_Nursery_and_Seed_Trade_Catalog_Collection_%28IA_catalogueofgreen00dcla_0%29.pdf.jpg", - "Eschscholzia%20californica": null, - "Eschscholzia californica": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/da/Eschscholzia_californica_in_Sedovo_006.jpg/1280px-Eschscholzia_californica_in_Sedovo_006.jpg", - "Osteospermum%20ecklonis": null, - "Osteospermum ecklonis": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/9e/Osteospermum_ecklonis1.JPG/1280px-Osteospermum_ecklonis1.JPG", - "Tropaeolum%20majus": null, - "Tropaeolum majus": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/87/Tropaeolum_majus_2005_G1.jpg/1280px-Tropaeolum_majus_2005_G1.jpg", - "Nepeta%20cataria": null, - "Nepeta cataria": "https://upload.wikimedia.org/wikipedia/commons/1/12/Nepeta_cataria_Sturm24.jpg", - "Anthriscus%20cerefolium": null, - "Anthriscus cerefolium": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/4b/Kerbel_%28Anthriscus_cerefolium%29_mit_Echter_Mehltau_%28Erysiphe_heraclei%29_Befall%2C_Schlaghecken.jpg/1280px-Kerbel_%28Anthriscus_cerefolium%29_mit_Echter_Mehltau_%28Erysiphe_heraclei%29_Befall%2C_Schlaghecken.jpg", - "Pinus%20sylvestris": null, - "Pinus sylvestris": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/5b/Meenikunno_maastikukaiteala.jpg/1280px-Meenikunno_maastikukaiteala.jpg", - "Prunus%20laurocerasus": null, - "Prunus laurocerasus": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/57/Fr%C3%BChling_bl%C3%BChender_Kirschenbaum.jpg/1280px-Fr%C3%BChling_bl%C3%BChender_Kirschenbaum.jpg", - "Verbascum%20thapsus": null, - "Verbascum thapsus": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/33/Koningskaars_R01.jpg/1280px-Koningskaars_R01.jpg", - "Gaillardia%20aristata": null, - "Gaillardia aristata": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/71/Gaillardia_July_2011-2.jpg/1280px-Gaillardia_July_2011-2.jpg", - "Coriandrum%20sativum": null, - "Coriandrum sativum": "https://upload.wikimedia.org/wikipedia/commons/1/13/Coriandrum_sativum_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-193.jpg", - "Centaurea%20cyanus": null, - "Centaurea cyanus": "https://upload.wikimedia.org/wikipedia/commons/e/e3/CentaureaCyanus-bloem-kl.jpg", - "Cosmos%20bipinnatus": null, - "Cosmos bipinnatus": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a8/Cosmos_bipinnatus%2C_Burdwan%2C_West_Bengal%2C_India_10_01_2013.jpg/1280px-Cosmos_bipinnatus%2C_Burdwan%2C_West_Bengal%2C_India_10_01_2013.jpg", - "Anthurium%20crystallinum": null, - "Anthurium crystallinum": "https://upload.wikimedia.org/wikipedia/commons/6/61/Alismatales_-_Anthurium_crystallinum_2.jpg", - "Codiaeum%20variegatum": null, - "Codiaeum variegatum": null, - "Kroton": null, - "Helleborus%20orientalis": null, - "Helleborus orientalis": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/9a/Helleborus_orientalis._Lenteroos_03.JPG/1280px-Helleborus_orientalis._Lenteroos_03.JPG", - "Levisticum%20officinale": null, - "Levisticum officinale": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/4c/Liebst%C3%B6ckel_%28Levisticum_officinale%29_mit_einem_Echten_Mehltau_%28Erysiphe_heraclei%29_Befall.%2C_Schlaghecken.jpg/1280px-Liebst%C3%B6ckel_%28Levisticum_officinale%29_mit_einem_Echten_Mehltau_%28Erysiphe_heraclei%29_Befall.%2C_Schlaghecken.jpg", - "Antirrhinum%20majus": null, - "Antirrhinum majus": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/64/Antirrhinum_majus_full_MichaD.jpg/1280px-Antirrhinum_majus_full_MichaD.jpg", - "Laurus%20nobilis": null, - "Laurus nobilis": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/fe/Laurus_nobilis_MHNT_Fleurs.jpg/1280px-Laurus_nobilis_MHNT_Fleurs.jpg", - "Lupinus%20polyphyllus": null, - "Lupinus polyphyllus": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e7/Lupinus_polyphyllus_MHNT.BOT.2004.0.463.jpg/1280px-Lupinus_polyphyllus_MHNT.BOT.2004.0.463.jpg", - "Coreopsis%20tinctoria": null, - "Coreopsis tinctoria": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/fe/Coreopsis_tinctoria_cultivar_Uptick_Cream_and_Red_4.JPG/1280px-Coreopsis_tinctoria_cultivar_Uptick_Cream_and_Red_4.JPG", - "Magnolia%20grandiflora": null, - "Magnolia grandiflora": "https://upload.wikimedia.org/wikipedia/commons/4/48/Magnolia_%C3%97_soulangeana_blossom.jpg", - "Convallaria%20majalis": null, - "Convallaria majalis": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a8/Beech%2C_ferns_and_lily_of_the_valley_in_Gullmarsskogen_1.jpg/1280px-Beech%2C_ferns_and_lily_of_the_valley_in_Gullmarsskogen_1.jpg", - "Origanum%20majorana": null, - "Origanum majorana": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/d6/Origanum_majorana.jpg/1280px-Origanum_majorana.jpg", - "Leucanthemum%20vulgare": null, - "Leucanthemum vulgare": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e7/Leucanthemum_vulgare_%27Filigran%27_Flower_2200px.jpg/1280px-Leucanthemum_vulgare_%27Filigran%27_Flower_2200px.jpg", - "Salvia%20farinacea": null, - "Salvia farinacea": "https://upload.wikimedia.org/wikipedia/commons/6/64/Salvia_farinacea1.jpg", - "Gazania%20rigens": null, - "Gazania rigens": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/3d/Gazania_rigens-1.jpg/1280px-Gazania_rigens-1.jpg", - "Papaver%20rhoeas": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/04/Papaver_rhoeas_6_2021_Poppy-_%2851237437202%29.jpg/1280px-Papaver_rhoeas_6_2021_Poppy-_%2851237437202%29.jpg", - "Dianthus%20caryophyllus": null, - "Dianthus caryophyllus": "https://upload.wikimedia.org/wikipedia/commons/8/80/Gartennelke_1.jpg", - "Nemesia%20strumosa": null, - "Nemesia strumosa": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/56/Nemesia_strumosa_two_colours.jpg/1280px-Nemesia_strumosa_two_colours.jpg", - "Fittonia%20albivenis": null, - "Fittonia albivenis": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/72/Colpfl25.jpg/1280px-Colpfl25.jpg", - "Araucaria%20heterophylla": null, - "Araucaria heterophylla": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/38/Araucaria_heterophylla_Norfolk_Island_0.jpg/1280px-Araucaria_heterophylla_Norfolk_Island_0.jpg", - "Cycas%20revoluta": "https://upload.wikimedia.org/wikipedia/commons/6/6d/Cycas_revoluta%2BFlorero.jpg", - "Paeonia%20lactiflora": null, - "Paeonia lactiflora": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/bf/P%C3%B6rtschach_Winklern_10.-Oktober-Stra%C3%9Fe_67_Paeonia_lactiflora_24052014_2076.jpg/1280px-P%C3%B6rtschach_Winklern_10.-Oktober-Stra%C3%9Fe_67_Paeonia_lactiflora_24052014_2076.jpg", - "Philodendron%20hederaceum%20Brasil": null, - "Philodendron hederaceum Brasil": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/44/Wikipedia_13._Fotoworkshop_Botanischer_Garten_Erlangen_2013_by-RaBoe_136.jpg/1280px-Wikipedia_13._Fotoworkshop_Botanischer_Garten_Erlangen_2013_by-RaBoe_136.jpg", - "Philodendron%20erubescens%20Pink%20Princess": null, - "Philodendron erubescens Pink Princess": "https://upload.wikimedia.org/wikipedia/commons/6/64/Arum_Family_-_Araceae_%283072475611%29.jpg", - "Thaumatophyllum%20xanadu": null, - "Thaumatophyllum xanadu": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/17/Philodendron_xanadu_AK1.jpg/1280px-Philodendron_xanadu_AK1.jpg", - "Ipomoea%20purpurea": null, - "Ipomoea purpurea": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/ab/Ipomoea_July_2011-4.jpg/1280px-Ipomoea_July_2011-4.jpg", - "Hypoestes%20phyllostachya": null, - "Hypoestes phyllostachya": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/43/Starr_080117-1693_Hypoestes_phyllostachya.jpg/1280px-Starr_080117-1693_Hypoestes_phyllostachya.jpg", - "Peperomia%20polybotrya": null, - "Peperomia polybotrya": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/87/Coin_Leaf_Peperomia_%28Peperomia_polybotrya_%27Jayde%27%29.jpg/1280px-Coin_Leaf_Peperomia_%28Peperomia_polybotrya_%27Jayde%27%29.jpg", - "Ranunculus%20asiaticus": null, - "Ranunculus asiaticus": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/23/Persian_Buttercup_01.jpg/1280px-Persian_Buttercup_01.jpg", - "Rhododendron%20catawbiense": null, - "Rhododendron catawbiense": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/6d/Rhododendron-catawbiense.jpg/1280px-Rhododendron-catawbiense.jpg", - "Calendula%20officinalis": "https://upload.wikimedia.org/wikipedia/commons/4/41/Calendula_officinalis_01.jpg", - "Delphinium%20elatum": null, - "Delphinium elatum": "https://upload.wikimedia.org/wikipedia/commons/5/54/Delphinium_elatum_a2.jpg", - "Robinia%20pseudoacacia": null, - "Robinia pseudoacacia": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/4b/Robinia_pseudoacacia_fruits.jpg/1280px-Robinia_pseudoacacia_fruits.jpg", - "Chamaemelum%20nobile": null, - "Chamaemelum nobile": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a7/Chamomile%40original_size.jpg/1280px-Chamomile%40original_size.jpg", - "Rosa%20x%20hybrida": null, - "Rosa x hybrida": "https://upload.wikimedia.org/wikipedia/commons/d/db/Rosa_x_hybrida_iceberg_Reimer_Kordes_1958.JPG", - "Rudbeckia%20hirta": null, - "Rudbeckia hirta": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/d1/Black_eyed_susan_20040717_110754_2.1474.jpg/1280px-Black_eyed_susan_20040717_110754_2.1474.jpg", - "Anthurium%20clarinervium": null, - "Anthurium clarinervium": "https://upload.wikimedia.org/wikipedia/commons/6/65/Anthurium_clarinervium.jpg", - "Rumex%20acetosa": null, - "Rumex acetosa": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/ee/Rumex_acetosa_-_Hapu_oblikas.jpg/1280px-Rumex_acetosa_-_Hapu_oblikas.jpg", - "Buddleja%20davidii": null, - "Buddleja davidii": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Distelfalter%2C_Vanessa_cardui_AUF_Schmetterlingsflieder%2C_Buddleja_davidii_1.JPG/1280px-Distelfalter%2C_Vanessa_cardui_AUF_Schmetterlingsflieder%2C_Buddleja_davidii_1.JPG", - "Allium%20tuberosum": null, - "Allium tuberosum": "https://upload.wikimedia.org/wikipedia/commons/a/a8/Allium_tuberosum1.jpg", - "Asclepias%20tuberosa": null, - "Asclepias tuberosa": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c9/Butterfly_Weed_Asclepias_tuberosa_Flower_Buds_3008px.jpg/1280px-Butterfly_Weed_Asclepias_tuberosa_Flower_Buds_3008px.jpg", - "Leucanthemum%20x%20superbum": null, - "Perilla%20frutescens": null, - "Leucanthemum x superbum": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/f5/Leucanthemum_x_superbum_%27Becky%27_in_NH.jpg/1280px-Leucanthemum_x_superbum_%27Becky%27_in_NH.jpg", - "Perilla frutescens": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/ee/Perilla_frutescens%27_flower.jpg/1280px-Perilla_frutescens%27_flower.jpg", - "Helianthus%20annuus": null, - "Spiraea%20japonica": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/8a/Spiraea_japonica_%27Gold_Mound%27_6_2021_Japanese_Spirea-_%2851238159051%29.jpg/1280px-Spiraea_japonica_%27Gold_Mound%27_6_2021_Japanese_Spirea-_%2851238159051%29.jpg", - "Helianthus annuus": "https://upload.wikimedia.org/wikipedia/commons/6/66/Sunflower_l.jpg", - "Acer%20platanoides": null, - "Acer platanoides": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/d1/2020_year._Herbarium._Acer_platanoides._img-012.jpg/1280px-2020_year._Herbarium._Acer_platanoides._img-012.jpg", - "Ilex%20aquifolium": null, - "Ilex aquifolium": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/4f/Mahonia_aquifolium_qtl1.jpg/1280px-Mahonia_aquifolium_qtl1.jpg", - "Pelargonium%20zonale": "https://upload.wikimedia.org/wikipedia/commons/6/64/Normal_Pelargonium-zonale-376.jpg", - "Stevia%20rebaudiana": null, - "Stevia rebaudiana": "https://upload.wikimedia.org/wikipedia/commons/d/d9/Stevia-rebaudiana-total.JPG", - "Alcea%20rosea": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a8/Alcea_rosea_6_2021_Hollyhock-_%2851264042906%29.jpg/1280px-Alcea_rosea_6_2021_Hollyhock-_%2851264042906%29.jpg", - "Curio%20radicans": null, - "Curio radicans": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/43/Senecio_radicans%2C_jard%C3%ADn_bot%C3%A1nico_de_Tallinn%2C_Estonia%2C_2012-08-13%2C_DD_01.JPG/1280px-Senecio_radicans%2C_jard%C3%ADn_bot%C3%A1nico_de_Tallinn%2C_Estonia%2C_2012-08-13%2C_DD_01.JPG", - "Curio%20x%20peregrinus": null, - "Curio x peregrinus": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/9f/Getty_Research_Institute_%28IA_johannchristiank00kund%29.pdf/page1-725px-Getty_Research_Institute_%28IA_johannchristiank00kund%29.pdf.jpg", - "Hemerocallis%20fulva": "https://upload.wikimedia.org/wikipedia/commons/0/0e/Hemerocallis_fulva_-_flower_view_02.jpg", - "Lamprocapnos%20spectabilis": null, - "Lamprocapnos spectabilis": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/df/Tr%C3%A4nendes_Herz_%28Dicentra_spectabilis%29.jpg/1280px-Tr%C3%A4nendes_Herz_%28Dicentra_spectabilis%29.jpg", - "Catalpa%20bignonioides": null, - "Catalpa bignonioides": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/0b/Catalpa_bignonioides_Aurea_JPG1a.jpg/1280px-Catalpa_bignonioides_Aurea_JPG1a.jpg", - "Campsis%20radicans": null, - "Campsis radicans": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/af/Campsis_radicans_0.4_R.jpg/1280px-Campsis_radicans_0.4_R.jpg", - "Myosotis%20sylvatica": null, - "Myosotis sylvatica": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/4b/Myosotis_sylvatica_%28aka%29.jpg/1280px-Myosotis_sylvatica_%28aka%29.jpg", - "Eutrema%20japonicum": null, - "Eutrema japonicum": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/5d/Wasabia_japonica_1.JPG/1280px-Wasabia_japonica_1.JPG", - "Peperomia%20argyreia": null, - "Peperomia argyreia": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/ac/Peperomia_argyreia.jpg/1280px-Peperomia_argyreia.jpg", - "Weigela%20florida": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/7e/Weigela_florida_%27Bokrashine%27_%27SHINING_SENSATION%27_6_2021_Weigela-_%2851239536602%29.jpg/1280px-Weigela_florida_%27Bokrashine%27_%27SHINING_SENSATION%27_6_2021_Weigela-_%2851239536602%29.jpg", - "Hyssopus%20officinalis": null, - "Hyssopus officinalis": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/6d/Hyssopus-officinalis-habit.jpg/1280px-Hyssopus-officinalis-habit.jpg", - "Yucca%20aloifolia": null, - "Yucca aloifolia": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/6c/Yucca_aloifolia_4.jpg/1280px-Yucca_aloifolia_4.jpg", - "Cedrus%20libani": null, - "Cedrus libani": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/19/Cedrus_libani_foliage_PAN.JPG/1280px-Cedrus_libani_foliage_PAN.JPG", - "Nicotiana%20alata": null, - "Nicotiana alata": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/45/Nicotiana_alata1By_Carl_E_Lewis.jpg/1280px-Nicotiana_alata1By_Carl_E_Lewis.jpg", - "Cymbopogon%20citratus": null, - "Cymbopogon citratus": "https://upload.wikimedia.org/wikipedia/commons/b/bd/YosriNov04Pokok_Serai.JPG", - "Aloysia%20citrodora": null, - "Aloysia citrodora": "https://upload.wikimedia.org/wikipedia/commons/a/a6/Aloysia_citriodora_002.jpg", - "Cupressus%20sempervirens": null, - "Cupressus sempervirens": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/9c/Cypress_Halefka.JPG/1280px-Cypress_Halefka.JPG", - "Cycas revoluta": "https://upload.wikimedia.org/wikipedia/commons/f/f4/Cycas_revoluta1327A.JPG", - "Calendula officinalis": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/0e/Calendula_in_Autumn.jpg/1280px-Calendula_in_Autumn.jpg", - "Pelargonium zonale": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a7/Pelargonium_zonale_%28Geraniaceae%29.jpg/1280px-Pelargonium_zonale_%28Geraniaceae%29.jpg", - "Hemerocallis fulva": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/66/Daylily_%28Hemerocallis_fulva%29_v2.jpg/1280px-Daylily_%28Hemerocallis_fulva%29_v2.jpg", - "Garden croton": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/bf/Colpfl05.jpg/1280px-Colpfl05.jpg", - "Senecio peregrinus": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/43/Figure_2._Schematic_representation_of_homoploid_and_allopolyploid_hybrid_speciation._Updated.svg/1280px-Figure_2._Schematic_representation_of_homoploid_and_allopolyploid_hybrid_speciation._Updated.svg.png" +{ + "Stapelia grandiflora": "https://upload.wikimedia.org/wikipedia/commons/6/67/Carrion_Plant_%28Stapelia_grandiflora%29_2.jpg", + "Saintpaulia ionantha": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/19/2007-04-20Saintpaulia_ionantha04.jpg/1280px-2007-04-20Saintpaulia_ionantha04.jpg", + "Agave americana": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/3b/Agave_July_2011-1.jpg/1280px-Agave_July_2011-1.jpg", + "Alocasia amazonica": "https://upload.wikimedia.org/wikipedia/commons/0/0e/Alocasia_x_amazonica_a2.jpg", + "Arnica montana": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/17/Arnica_montana_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-015.jpg/1280px-Arnica_montana_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-015.jpg", + "Valeriana officinalis": "https://upload.wikimedia.org/wikipedia/commons/1/17/Valeriana_officinalis_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-143.jpg", + "Bambusa vulgaris": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/51/Bambusa_vulgaris_%28Dominica%29.jpg/1280px-Bambusa_vulgaris_%28Dominica%29.jpg", + "Musa acuminata": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/2e/Musa_acuminata_kz01.jpg/1280px-Musa_acuminata_kz01.jpg", + "Chamaedorea elegans": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/f5/Chamaedorea_elegans.jpg/1280px-Chamaedorea_elegans.jpg", + "Senecio serpens": "https://upload.wikimedia.org/wikipedia/commons/2/2b/Senecio_serpens.jpg", + "Phlebodium aureum": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/2d/Starr_050107-2831_Phlebodium_aureum.jpg/1280px-Starr_050107-2831_Phlebodium_aureum.jpg", + "Canna indica": "https://upload.wikimedia.org/wikipedia/commons/9/99/Canna_indica_%28wild_species%29_flowers.JPG", + "Geranium sanguineum": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e2/Geranium_sanguineum_-_verev_kurereha.jpg/1280px-Geranium_sanguineum_-_verev_kurereha.jpg", + "Ficus retusa": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/9d/Ficus_retusa_2zz.jpg/1280px-Ficus_retusa_2zz.jpg", + "Bougainvillea spectabilis": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/f8/Starr_030418-0058_Bougainvillea_spectabilis.jpg/1280px-Starr_030418-0058_Bougainvillea_spectabilis.jpg", + "Caladium bicolor": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b8/Caladium_bicolor_%27Florida_Sweetheart%27_Plant_2220px.jpg/1280px-Caladium_bicolor_%27Florida_Sweetheart%27_Plant_2220px.jpg", + "Calibrachoa hybrida": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e2/Basket_of_Calibrachoa_parviflora_by_A_-_2020-06-18.jpg/1280px-Basket_of_Calibrachoa_parviflora_by_A_-_2020-06-18.jpg", + "Callisia repens": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e6/Turtle_Vine_%28Callisia_repens%29_1.jpg/1280px-Turtle_Vine_%28Callisia_repens%29_1.jpg", + "Cattleya labiata": "https://upload.wikimedia.org/wikipedia/commons/9/97/Cattleya_labiata_2.jpg", + "Capsicum annuum": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/cc/Capsicum_annuum.JPG/1280px-Capsicum_annuum.JPG", + "Livistona chinensis": "https://upload.wikimedia.org/wikipedia/commons/f/f6/Livistona-chinensis.jpg", + "Rosa chinensis": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/95/Rosa_chinensis_04-08-2012_01.jpg/1280px-Rosa_chinensis_04-08-2012_01.jpg", + "Columnea gloriosa": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/6d/Columnea_gloriosa_137-8378.jpg/1280px-Columnea_gloriosa_137-8378.jpg", + "Dieffenbachia seguine": "https://upload.wikimedia.org/wikipedia/commons/8/80/Dieffenbachia_seguine1FKST.jpg", + "Dischidia ruscifolia": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/ec/%E7%99%BE%E8%90%AC%E5%BF%83_Dischidia_ruscifolia_-%E9%A6%99%E6%B8%AF%E5%8B%95%E6%A4%8D%E7%89%A9%E5%85%AC%E5%9C%92_Hong_Kong_Botanical_Garden-_%289240152650%29.jpg/1280px-%E7%99%BE%E8%90%AC%E5%BF%83_Dischidia_ruscifolia_-%E9%A6%99%E6%B8%AF%E5%8B%95%E6%A4%8D%E7%89%A9%E5%85%AC%E5%9C%92_Hong_Kong_Botanical_Garden-_%289240152650%29.jpg", + "Dracaena marginata": "https://upload.wikimedia.org/wikipedia/commons/f/f9/Dracaena_marginata_IndoorPlant_0605k.jpg", + "Streptocarpus hybridus": "https://upload.wikimedia.org/wikipedia/commons/9/9f/2007-03-20Streptocarpus01.jpg", + "Dudleya brittonii": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/10/Dudleya_Brittonii.jpg/1280px-Dudleya_Brittonii.jpg", + "Acer palmatum": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/de/Portland_Japanese_Garden_maple.jpg/1280px-Portland_Japanese_Garden_maple.jpg", + "Fatsia japonica": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/44/Fatsia_japonica.003_-_Zapateira.jpg/1280px-Fatsia_japonica.003_-_Zapateira.jpg", + "Vriesea splendens": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/d6/Vriesea_splendens_flower.jpg/1280px-Vriesea_splendens_flower.jpg", + "Impatiens walleriana": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/1e/Impatiens_walleriana_01.JPG/1280px-Impatiens_walleriana_01.JPG", + "Begonia maculata": "https://upload.wikimedia.org/wikipedia/commons/d/df/Begonia_maculata3073316230.jpg", + "Adiantum raddianum": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/45/Starr_030807-0143_Adiantum_raddianum.jpg/1280px-Starr_030807-0143_Adiantum_raddianum.jpg", + "Fuchsia hybrida": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/cc/Fuchsia_%C3%97_hybrida.jpg/1280px-Fuchsia_%C3%97_hybrida.jpg", + "Gasteria carinata": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/12/Gasteria_carinata_hh.jpg/1280px-Gasteria_carinata_hh.jpg", + "Ficus lyrata": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/84/Starr_031108-0130_Ficus_lyrata.jpg/1280px-Starr_031108-0130_Ficus_lyrata.jpg", + "Graptopetalum paraguayense": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/59/%28MHNT%29_Graptopetalum_paraguayense_-_leaves.jpg/1280px-%28MHNT%29_Graptopetalum_paraguayense_-_leaves.jpg", + "Platycerium bifurcatum": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/ab/Platycerium_bifurcatum_%28Corne_d%27%C3%A9lan%29_-_107.jpg/1280px-Platycerium_bifurcatum_%28Corne_d%27%C3%A9lan%29_-_107.jpg", + "Gloxinia speciosa": "https://upload.wikimedia.org/wikipedia/commons/8/87/Sinnningia_speciosa_im_Querbeet-Wintergarten.jpg", + "Echinocactus grusonii": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/46/Echinocactus_grusonii_qtl1.jpg/1280px-Echinocactus_grusonii_qtl1.jpg", + "Phyllostachys aurea": "https://upload.wikimedia.org/wikipedia/commons/3/3b/Phyllostachys_aurea0.jpg", + "Punica granatum": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/db/Illustration_Punica_granatum2.jpg/1280px-Illustration_Punica_granatum2.jpg", + "Schefflera actinophylla": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e6/Schefflera_actinophylla_02.JPG/1280px-Schefflera_actinophylla_02.JPG", + "Ficus elastica": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/88/Ficus_November_2008-1.jpg/1280px-Ficus_November_2008-1.jpg", + "Cucumis sativus": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/07/Cucumis_sativus_0001.JPG/1280px-Cucumis_sativus_0001.JPG", + "Betula pendula": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/17/Betula_pendula_in_Sedovo_1.jpg/1280px-Betula_pendula_in_Sedovo_1.jpg", + "Philodendron hederaceum": "https://upload.wikimedia.org/wikipedia/commons/b/bb/Philodendron_scandens_subsp_oxycardium2.jpg", + "Ceropegia woodii": "https://upload.wikimedia.org/wikipedia/commons/5/55/Ceropegia_linearis_subsp_woodii.jpg", + "Hyacinthus orientalis": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/ae/Garden_Hyacinth_Hyacinthus_orientalis_%27Blue_Jacket%27_Flower_2000px.jpg/1280px-Garden_Hyacinth_Hyacinthus_orientalis_%27Blue_Jacket%27_Flower_2000px.jpg", + "Azalea indica": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/de/Rhododendron_indicum1.jpg/1280px-Rhododendron_indicum1.jpg", + "Zingiber officinale": "https://upload.wikimedia.org/wikipedia/commons/c/c1/Ginger_Plant_vs.jpg", + "Crassula ovata": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/5d/Crassula_ovata_RTBG.jpg/1280px-Crassula_ovata_RTBG.jpg", + "Rhododendron simsii": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/9b/Rhododendron_simsii_01.JPG/1280px-Rhododendron_simsii_01.JPG", + "Coffea arabica": "https://upload.wikimedia.org/wikipedia/commons/1/10/Coffea_arabica_2.jpg", + "Kalanchoe blossfeldiana": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/fa/Kalanchoe_blossfeldiana_%28Florist_Kalanchoe%29.jpg/1280px-Kalanchoe_blossfeldiana_%28Florist_Kalanchoe%29.jpg", + "Camellia japonica": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/6d/Camellia_japonica_var._decumbens_3.JPG/1280px-Camellia_japonica_var._decumbens_3.JPG", + "Chamomilla recutita": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a7/Chamomile%40original_size.jpg/1280px-Chamomile%40original_size.jpg", + "Aloe arborescens": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/34/Aloe_arborescens_01.JPG/1280px-Aloe_arborescens_01.JPG", + "Aloe ferox": "https://upload.wikimedia.org/wikipedia/commons/9/9e/Aloe_Ferox_between_Cofimvaba_and_Ngcobo.jpg", + "Daucus carota": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/23/Daucus_carota_May_2008-1_edit.jpg/1280px-Daucus_carota_May_2008-1_edit.jpg", + "Oxalis triangularis": "https://upload.wikimedia.org/wikipedia/commons/1/15/Oxalis_triangularis6.jpg", + "Hoya bella": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/d1/%E7%BE%8E%E9%BA%97%E6%AF%AC%E8%98%AD_Hoya_bella_-%E9%A6%99%E6%B8%AF%E5%85%AC%E5%9C%92_Hong_Kong_Park-_%289240227808%29.jpg/1280px-%E7%BE%8E%E9%BA%97%E6%AF%AC%E8%98%AD_Hoya_bella_-%E9%A6%99%E6%B8%AF%E5%85%AC%E5%9C%92_Hong_Kong_Park-_%289240227808%29.jpg", + "Begonia tuberhybrida": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/62/Begonia_x_tuberhybrida_1005Pink1.JPG/1280px-Begonia_x_tuberhybrida_1005Pink1.JPG", + "Epiphyllum oxypetalum": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/59/Kakteen_IMG_4213.jpg/1280px-Kakteen_IMG_4213.jpg", + "Protea cynaroides": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/3d/Protea_cynaroides_3.jpg/1280px-Protea_cynaroides_3.jpg", + "Conophytum calculus": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/25/Conophytum_calculus_-_Namaqualand_-_South_Africa_5.jpg/1280px-Conophytum_calculus_-_Namaqualand_-_South_Africa_5.jpg", + "Rhipsalis baccifera": "https://upload.wikimedia.org/wikipedia/commons/b/ba/Rhipsalis_baccifera_01_ies.jpg", + "Cotyledon orbiculata": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/bb/Cotyledon_orbiculata_2.jpg/1280px-Cotyledon_orbiculata_2.jpg", + "Lithops julii": "https://upload.wikimedia.org/wikipedia/commons/4/4d/Lithops_julii_Nicos_Farm_strain.jpg", + "Tradescantia pallida": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/be/Tradescantia_pallida_C.jpg/1280px-Tradescantia_pallida_C.jpg", + "Aeschynanthus radicans": "https://upload.wikimedia.org/wikipedia/commons/5/52/Aeschynanthus_radicans.jpg", + "Tillandsia ionantha": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/d9/Matthaei_Botanical_Gardens_-_IMG_8999.JPG/1280px-Matthaei_Botanical_Gardens_-_IMG_8999.JPG", + "Stephanotis floribunda": "https://upload.wikimedia.org/wikipedia/commons/9/9d/Stephanotis_floribunda.jpg", + "Dracaena fragrans": "https://upload.wikimedia.org/wikipedia/commons/6/64/Dracaena_fragrans_a1.jpg", + "Beta vulgaris": "https://upload.wikimedia.org/wikipedia/commons/f/ff/Beta_vulgaris_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-167.jpg", + "Rhaphidophora tetrasperma": "https://upload.wikimedia.org/wikipedia/commons/d/db/Rhaphidophora_tetrasperma.jpg", + "Pachyphytum oviferum": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/39/Pachyphytum_oviferum_1.jpg/1280px-Pachyphytum_oviferum_1.jpg", + "Monstera adansonii": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/34/Monstera_adansonii_CBM.png/1280px-Monstera_adansonii_CBM.png", + "Crassula muscosa": "https://upload.wikimedia.org/wikipedia/commons/5/5e/Crassula_muscosa_Grubosz_2006-05-03_01.jpg", + "Epipremnum pinnatum Neon": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/de/Epipremnum_pinnatum_%27Neon%27%2C_Longwood_Gardens_01.jpg/1280px-Epipremnum_pinnatum_%27Neon%27%2C_Longwood_Gardens_01.jpg", + "Lilium longiflorum": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Lilium_longiflorum_%28Easter_Lily%29.JPG/1280px-Lilium_longiflorum_%28Easter_Lily%29.JPG", + "Senecio rowleyanus": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/3b/Senecio_rowleyanus.jpg/1280px-Senecio_rowleyanus.jpg", + "Petroselinum crispum": "https://upload.wikimedia.org/wikipedia/commons/2/2d/Petroselinum_crispum_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-103.jpg", + "Petunia hybrida": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/af/Petunia_x_hybrida_a2.JPG/1280px-Petunia_x_hybrida_a2.JPG", + "Syngonium podophyllum": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/07/Syngonium_podophyllum_Golden_0zz.jpg/1280px-Syngonium_podophyllum_Golden_0zz.jpg", + "Philodendron bipinnatifidum": "https://upload.wikimedia.org/wikipedia/commons/c/c1/Tree1.JPG", + "Philodendron gloriosum": "https://upload.wikimedia.org/wikipedia/commons/f/f1/Philodendron_gloriosum.jpg", + "Primula vulgaris": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/76/Chipping_Sodbury_MMB_02_primula_vulgaris.jpg/1280px-Chipping_Sodbury_MMB_02_primula_vulgaris.jpg", + "Raphanus sativus": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/73/Raphanus_sativus_of_Salem.jpg/1280px-Raphanus_sativus_of_Salem.jpg", + "Selaginella uncinata": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/34/Selaginella_uncinata_-_Berlin_Botanical_Garden_-_IMG_8722.JPG/1280px-Selaginella_uncinata_-_Berlin_Botanical_Garden_-_IMG_8722.JPG", + "Peperomia caperata": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/14/Peperomia_caperata_1-OB9.jpg/1280px-Peperomia_caperata_1-OB9.jpg", + "Hippeastrum hybrid": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/fc/Hippeastrum_hybrid_1.jpg/1280px-Hippeastrum_hybrid_1.jpg", + "Digitalis purpurea": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/ba/Digitalis_purpurea_LC0101.jpg/1280px-Digitalis_purpurea_LC0101.jpg", + "Lactuca sativa": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/6b/Romaine_lettuce.jpg/1280px-Romaine_lettuce.jpg", + "Salvia officinalis": "https://upload.wikimedia.org/wikipedia/commons/5/5a/Salvia_officinalis0.jpg", + "Scindapsus pictus": "https://upload.wikimedia.org/wikipedia/commons/c/ca/Scindapsus_pictus_01.jpg", + "Mimosa pudica": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/04/Touch_Me_not.jpg/1280px-Touch_Me_not.jpg", + "Phalaenopsis amabilis": "https://upload.wikimedia.org/wikipedia/commons/3/32/Phalaenopsis_amabilis_Orchi_03.jpg", + "Allium schoenoprasum": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/74/Allium_schoenoprasum_J1.JPG/1280px-Allium_schoenoprasum_J1.JPG", + "Pandanus veitchii": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/fb/Pandanus_tectorius.jpg/1280px-Pandanus_tectorius.jpg", + "Aeonium arboreum": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c4/Aeonium_arboreum_01.jpg/1280px-Aeonium_arboreum_01.jpg", + "Adenium socotranum": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/fa/Adenium_seedling_2day_Uthandi_Aug21_D72_20609-21_ZP.jpg/1280px-Adenium_seedling_2day_Uthandi_Aug21_D72_20609-21_ZP.jpg", + "Echinacea purpurea": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b5/Monarch_Butterfly_Danaus_plexippus_on_Echinacea_purpurea_2800px.jpg/1280px-Monarch_Butterfly_Danaus_plexippus_on_Echinacea_purpurea_2800px.jpg", + "Tillandsia usneoides": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/74/Tillandsia_usneoides_%28Bromeliaceae%29_%2825004066956%29.jpg/1280px-Tillandsia_usneoides_%28Bromeliaceae%29_%2825004066956%29.jpg", + "Rhapis excelsa": "https://upload.wikimedia.org/wikipedia/commons/7/7d/Rhapis_excelsa.jpg", + "Viola wittrockiana": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/91/Pansy_viola_x_wittrockiana_blue.jpg/1280px-Pansy_viola_x_wittrockiana_blue.jpg", + "Schefflera arboricola": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/82/Schefflera_arboricola%2C_vrugte%2C_a%2C_Pretoria.jpg/1280px-Schefflera_arboricola%2C_vrugte%2C_a%2C_Pretoria.jpg", + "Tagetes patula": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/1f/French_marigold_garden_2009_G1.jpg/1280px-French_marigold_garden_2009_G1.jpg", + "Oncidium sphacelatum": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/37/Oncidium_sphacelatum03.jpg/1280px-Oncidium_sphacelatum03.jpg", + "Colocasia esculenta": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/83/Taro_leaf_underside%2C_backlit_by_sun.jpg/1280px-Taro_leaf_underside%2C_backlit_by_sun.jpg", + "Camellia sinensis": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e3/Camellia_sinensis_MHNT.BOT.2016.12.24.jpg/1280px-Camellia_sinensis_MHNT.BOT.2016.12.24.jpg", + "Plumeria rubra": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a2/White_Plumeria_from_Kannur_-_Kerala.jpg/1280px-White_Plumeria_from_Kannur_-_Kerala.jpg", + "Thymus vulgaris": "https://upload.wikimedia.org/wikipedia/commons/1/12/Thymus_vulgaris_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-271.jpg", + "Cordyline fruticosa": "https://upload.wikimedia.org/wikipedia/commons/0/05/Ti_plant_%28Cordyline_fruticosa%29.jpg", + "Solanum lycopersicum": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/89/Tomato_je.jpg/1280px-Tomato_je.jpg", + "Polypodium vulgare": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/33/Polypodium_vulgare%2C_sores_%28Matthieu_Gauvain%29.JPG/1280px-Polypodium_vulgare%2C_sores_%28Matthieu_Gauvain%29.JPG", + "Microsorum punctatum": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/9f/Microsorum_punctatum.jpg/1280px-Microsorum_punctatum.jpg", + "Tulipa gesneriana": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/9e/%D7%A6%D7%91%D7%A2%D7%95%D7%A0%D7%99%D7%9D.JPG/1280px-%D7%A6%D7%91%D7%A2%D7%95%D7%A0%D7%99%D7%9D.JPG", + "Vanilla planifolia": "https://upload.wikimedia.org/wikipedia/commons/4/40/Vanilla_planifolia_1.jpg", + "Asplenium nidus": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/73/Bird%27s-nest_Fern_Asplenium_nidus_Leaves_1.jpg/1280px-Bird%27s-nest_Fern_Asplenium_nidus_Leaves_1.jpg", + "Lantana camara": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/71/Twin_lantana_camara_edit.jpg/1280px-Twin_lantana_camara_edit.jpg", + "Schlumbergera truncata": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/61/Schlumbergera_truncata_flordemaio.jpg/1280px-Schlumbergera_truncata_flordemaio.jpg", + "Euphorbia pulcherrima": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/5d/2008_05_17_-_Euphorbia_pulcherrima_05a.JPG/1280px-2008_05_17_-_Euphorbia_pulcherrima_05a.JPG", + "Tradescantia fluminensis": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/05/Tradescantia_fluminensis_Flower_1.jpg/1280px-Tradescantia_fluminensis_Flower_1.jpg", + "Yucca elephantipes": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/d1/Yucca_elephantipes_HRM2.JPG/1280px-Yucca_elephantipes_HRM2.JPG", + "Hamamelis mollis": "https://upload.wikimedia.org/wikipedia/commons/c/ce/Hamamelis_mollis0.jpg", + "Haworthia fasciata": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/13/Haworthia_fasciata_%28Vermont%29.jpg/1280px-Haworthia_fasciata_%28Vermont%29.jpg", + "Tradescantia zebrina": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e6/Zebrina_pendula_20060521_2.JPG/1280px-Zebrina_pendula_20060521_2.JPG", + "Zinnia elegans": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/d7/Zinnia_elegans_with_Bombus_01.JPG/1280px-Zinnia_elegans_with_Bombus_01.JPG", + "Citrus limon": "https://upload.wikimedia.org/wikipedia/commons/e/e4/Lemon.jpg", + "Melissa officinalis": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/f9/Melissa_officinalis_1.jpg/1280px-Melissa_officinalis_1.jpg", + "Phoenix roebelenii": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/1d/Starr_070124-3839_Phoenix_roebelenii.jpg/1280px-Starr_070124-3839_Phoenix_roebelenii.jpg", + "Cymbidium lowianum": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/6b/Cymbidium_lowianum_var._concolor_3.jpg/1280px-Cymbidium_lowianum_var._concolor_3.jpg", + "Jasminum%20sambac": null, + "Pilea%20cadierei": null, + "Alocasia%20zebrina": null, + "Anemone%20coronaria": null, + "Jasminum sambac": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/75/JasminumSambac.jpg/1280px-JasminumSambac.jpg", + "Anemone coronaria": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/80/Blue_Anemone_coronaria.JPG/1280px-Blue_Anemone_coronaria.JPG", + "Pilea cadierei": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/30/PileaCadierei.jpg/1280px-PileaCadierei.jpg", + "Alocasia zebrina": "https://upload.wikimedia.org/wikipedia/commons/4/43/Alocasia_zebrina_Reticulata_1zz.jpg", + "Iris%20germanica": null, + "Dianthus%20barbatus": null, + "Iris germanica": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/29/Iris_germanica_001.jpg/1280px-Iris_germanica_001.jpg", + "Dianthus barbatus": "https://upload.wikimedia.org/wikipedia/commons/4/4f/Dianthus_barbatus_PID1688-4.jpg", + "Lavatera%20trimestris": null, + "Lavatera trimestris": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/57/Flower_April_2010-1a.jpg/1280px-Flower_April_2010-1a.jpg", + "Satureja%20hortensis": null, + "Satureja hortensis": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/5f/Satureja_hortensis_bgiu.jpg/1280px-Satureja_hortensis_bgiu.jpg", + "Borago%20officinalis": null, + "Borago officinalis": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/54/Borago_officinalis_%28flower%29.jpg/1280px-Borago_officinalis_%28flower%29.jpg", + "Soleirolia%20soleirolii": null, + "Soleirolia soleirolii": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Soleirolia_soleirolii_kz05.jpg/1280px-Soleirolia_soleirolii_kz05.jpg", + "Buxus%20sempervirens": null, + "Buxus sempervirens": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/ba/Buisfleurs.jpg/1280px-Buisfleurs.jpg", + "Plectranthus%20scutellarioides": null, + "Plectranthus scutellarioides": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/9c/Solenostemon_scutellarioides_%28Coleus_x_hybridus%29_%27Inky_Fingers%27_Leaf_Cluster_2730px.jpg/1280px-Solenostemon_scutellarioides_%28Coleus_x_hybridus%29_%27Inky_Fingers%27_Leaf_Cluster_2730px.jpg", + "Goeppertia%20insignis": null, + "Goeppertia insignis": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/94/Goeppertia_insignis.jpg/1280px-Goeppertia_insignis.jpg", + "Goeppertia%20ornata": null, + "Goeppertia ornata": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/42/CalatheaOrnataRoseo-Lineata.jpg/1280px-CalatheaOrnataRoseo-Lineata.jpg", + "Clematis%20viticella": null, + "Clematis viticella": "https://upload.wikimedia.org/wikipedia/commons/4/4f/Clematis_viticella3UME.jpg", + "Helichrysum%20italicum": null, + "Helichrysum italicum": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c5/Helichrysum_italicum_%28immortelle%29.JPG/1280px-Helichrysum_italicum_%28immortelle%29.JPG", + "Anethum%20graveolens": null, + "Anethum graveolens": "https://upload.wikimedia.org/wikipedia/commons/5/56/Anethum_graveolens_02.jpg", + "Lathyrus%20odoratus": null, + "Lathyrus odoratus": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/72/Lathyrus_odoratus_Painted_Lady.jpg/1280px-Lathyrus_odoratus_Painted_Lady.jpg", + "Sorbus%20aucuparia": null, + "Sorbus aucuparia": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/d4/2020_year._Herbarium._Sorbus_aucuparia._img-035.jpg/1280px-2020_year._Herbarium._Sorbus_aucuparia._img-035.jpg", + "Quercus%20robur": null, + "Quercus robur": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a9/Langaa_egeskov_rimfrost.jpg/1280px-Langaa_egeskov_rimfrost.jpg", + "Begonia%20semperflorens-cultorum": null, + "Begonia semperflorens-cultorum": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/28/Begonia_semperflorens.jpg/1280px-Begonia_semperflorens.jpg", + "Verbena%20bonariensis": null, + "Verbena bonariensis": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e0/Verbena_bonariensis.jpg/1280px-Verbena_bonariensis.jpg", + "Artemisia%20dracunculus": null, + "Artemisia dracunculus": "https://upload.wikimedia.org/wikipedia/commons/6/6c/Estragon_1511.jpg", + "Eucalyptus%20globulus": null, + "Eucalyptus globulus": "https://upload.wikimedia.org/wikipedia/commons/7/74/Eucalyptus_globulus_globulus.jpg", + "Schefflera%20elegantissima": null, + "Schefflera elegantissima": "https://upload.wikimedia.org/wikipedia/commons/6/64/Schefflera_elegantissima.jpg", + "Salvia%20splendens": null, + "Salvia splendens": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Salvia_splendens_%28357118788%29.jpg/1280px-Salvia_splendens_%28357118788%29.jpg", + "Picea%20abies": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/1b/Picea_abies_%27Rubra_Spicata%27_5_2021_Norway-_%2851176180455%29.jpg/1280px-Picea_abies_%27Rubra_Spicata%27_5_2021_Norway-_%2851176180455%29.jpg", + "Ficus%20altissima": null, + "Ficus altissima": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/60/Ficus_altissima1.jpg/1280px-Ficus_altissima1.jpg", + "Ficus%20microcarpa": null, + "Ficus microcarpa": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/d6/Bonsai_Adam_and_Eve_%28PPL2-Enhanced%29_julesvernex2.jpg/1280px-Bonsai_Adam_and_Eve_%28PPL2-Enhanced%29_julesvernex2.jpg", + "Delonix%20regia": null, + "Delonix regia": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/d6/Flame_tree_mali.jpg/1280px-Flame_tree_mali.jpg", + "Phlox%20paniculata": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e2/Phlox_paniculata_%27Opening_Act_Blush%27_6_2021_Garden_Phlox-_%2851242863119%29.jpg/1280px-Phlox_paniculata_%27Opening_Act_Blush%27_6_2021_Garden_Phlox-_%2851242863119%29.jpg", + "Syringa%20vulgaris": "https://upload.wikimedia.org/wikipedia/commons/2/2b/Syringa_vulgaris1.jpg", + "Forsythia%20x%20intermedia": null, + "Forsythia x intermedia": "https://upload.wikimedia.org/wikipedia/commons/b/b7/Forsythia-intermedia.JPG", + "Freesia%20refracta": null, + "Freesia refracta": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/9e/FreesiaRefracta1.JPG/1280px-FreesiaRefracta1.JPG", + "Amaranthus%20caudatus": null, + "Amaranthus caudatus": "https://upload.wikimedia.org/wikipedia/commons/b/b6/Amaranthus_caudatus1.jpg", + "Bellis%20perennis": null, + "Bellis perennis": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/1c/Pink_twinged_daisy_on_table_edit.jpg/1280px-Pink_twinged_daisy_on_table_edit.jpg", + "Impatiens%20balsamina": null, + "Impatiens balsamina": "https://upload.wikimedia.org/wikipedia/commons/f/f8/Impatiens_balsamina1.jpg", + "Hibiscus%20syriacus": null, + "Hibiscus syriacus": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/70/Hibiscus-syriacus.jpg/1280px-Hibiscus-syriacus.jpg", + "Lonicera%20japonica": null, + "Lonicera japonica": "https://upload.wikimedia.org/wikipedia/commons/b/b9/Honeysuckle_2.jpg", + "Ginkgo%20biloba": null, + "Ginkgo biloba": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/19/Ginkgo_biloba_MHNT.BOT.2010.13.1.jpg/1280px-Ginkgo_biloba_MHNT.BOT.2010.13.1.jpg", + "Gladiolus%20hortulanus": null, + "Gladiolus hortulanus": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/25/Gartengladiole_apricot.JPG/1280px-Gartengladiole_apricot.JPG", + "Pachira%20aquatica": null, + "Pachira aquatica": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/3a/Pachira_aquatica_%28inflorescense%29.jpg/1280px-Pachira_aquatica_%28inflorescense%29.jpg", + "Hyacinthoides%20non-scripta": null, + "Hyacinthoides non-scripta": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a8/Hyacinthoides_non-scripta_%28Common_Bluebell%29.jpg/1280px-Hyacinthoides_non-scripta_%28Common_Bluebell%29.jpg", + "Heliotropium%20arborescens": null, + "Heliotropium arborescens": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/cb/Heliotropium_arborescens_%27Mini_Marine%27_Heliotrope_Flower_2500px.jpg/1280px-Heliotropium_arborescens_%27Mini_Marine%27_Heliotrope_Flower_2500px.jpg", + "Symphyotrichum%20novi-belgii": null, + "Symphyotrichum novi-belgii": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/2f/Symphyotrichum_novi-belgii20090914_120.jpg/1280px-Symphyotrichum_novi-belgii20090914_120.jpg", + "Viola%20cornuta": null, + "Viola cornuta": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b6/Viola_cornuta_2008.jpg/1280px-Viola_cornuta_2008.jpg", + "Hydrangea%20macrophylla": null, + "Hydrangea macrophylla": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/7f/Hydrangea_macrophylla_-_Hortensia_hydrangea.jpg/1280px-Hydrangea_macrophylla_-_Hortensia_hydrangea.jpg", + "Monarda%20didyma": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/cd/Monarda_didyma_%27Colrain_Red%27_6_2021_Bee_Balm-_%2851273491889%29.jpg/1280px-Monarda_didyma_%27Colrain_Red%27_6_2021_Bee_Balm-_%2851273491889%29.jpg", + "Jacaranda%20mimosifolia": null, + "Jacaranda mimosifolia": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/6c/Jacaranda_mimosifolia_5334.jpg/1280px-Jacaranda_mimosifolia_5334.jpg", + "Coffea%20arabica%20Nana": null, + "Coffea arabica Nana": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/3e/Henry_G._Gilbert_Nursery_and_Seed_Trade_Catalog_Collection_%28IA_catalogueofgreen00dcla_0%29.pdf/page1-1016px-Henry_G._Gilbert_Nursery_and_Seed_Trade_Catalog_Collection_%28IA_catalogueofgreen00dcla_0%29.pdf.jpg", + "Eschscholzia%20californica": null, + "Eschscholzia californica": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/da/Eschscholzia_californica_in_Sedovo_006.jpg/1280px-Eschscholzia_californica_in_Sedovo_006.jpg", + "Osteospermum%20ecklonis": null, + "Osteospermum ecklonis": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/9e/Osteospermum_ecklonis1.JPG/1280px-Osteospermum_ecklonis1.JPG", + "Tropaeolum%20majus": null, + "Tropaeolum majus": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/87/Tropaeolum_majus_2005_G1.jpg/1280px-Tropaeolum_majus_2005_G1.jpg", + "Nepeta%20cataria": null, + "Nepeta cataria": "https://upload.wikimedia.org/wikipedia/commons/1/12/Nepeta_cataria_Sturm24.jpg", + "Anthriscus%20cerefolium": null, + "Anthriscus cerefolium": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/4b/Kerbel_%28Anthriscus_cerefolium%29_mit_Echter_Mehltau_%28Erysiphe_heraclei%29_Befall%2C_Schlaghecken.jpg/1280px-Kerbel_%28Anthriscus_cerefolium%29_mit_Echter_Mehltau_%28Erysiphe_heraclei%29_Befall%2C_Schlaghecken.jpg", + "Pinus%20sylvestris": null, + "Pinus sylvestris": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/5b/Meenikunno_maastikukaiteala.jpg/1280px-Meenikunno_maastikukaiteala.jpg", + "Prunus%20laurocerasus": null, + "Prunus laurocerasus": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/57/Fr%C3%BChling_bl%C3%BChender_Kirschenbaum.jpg/1280px-Fr%C3%BChling_bl%C3%BChender_Kirschenbaum.jpg", + "Verbascum%20thapsus": null, + "Verbascum thapsus": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/33/Koningskaars_R01.jpg/1280px-Koningskaars_R01.jpg", + "Gaillardia%20aristata": null, + "Gaillardia aristata": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/71/Gaillardia_July_2011-2.jpg/1280px-Gaillardia_July_2011-2.jpg", + "Coriandrum%20sativum": null, + "Coriandrum sativum": "https://upload.wikimedia.org/wikipedia/commons/1/13/Coriandrum_sativum_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-193.jpg", + "Centaurea%20cyanus": null, + "Centaurea cyanus": "https://upload.wikimedia.org/wikipedia/commons/e/e3/CentaureaCyanus-bloem-kl.jpg", + "Cosmos%20bipinnatus": null, + "Cosmos bipinnatus": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a8/Cosmos_bipinnatus%2C_Burdwan%2C_West_Bengal%2C_India_10_01_2013.jpg/1280px-Cosmos_bipinnatus%2C_Burdwan%2C_West_Bengal%2C_India_10_01_2013.jpg", + "Anthurium%20crystallinum": null, + "Anthurium crystallinum": "https://upload.wikimedia.org/wikipedia/commons/6/61/Alismatales_-_Anthurium_crystallinum_2.jpg", + "Codiaeum%20variegatum": null, + "Codiaeum variegatum": null, + "Kroton": null, + "Helleborus%20orientalis": null, + "Helleborus orientalis": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/9a/Helleborus_orientalis._Lenteroos_03.JPG/1280px-Helleborus_orientalis._Lenteroos_03.JPG", + "Levisticum%20officinale": null, + "Levisticum officinale": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/4c/Liebst%C3%B6ckel_%28Levisticum_officinale%29_mit_einem_Echten_Mehltau_%28Erysiphe_heraclei%29_Befall.%2C_Schlaghecken.jpg/1280px-Liebst%C3%B6ckel_%28Levisticum_officinale%29_mit_einem_Echten_Mehltau_%28Erysiphe_heraclei%29_Befall.%2C_Schlaghecken.jpg", + "Antirrhinum%20majus": null, + "Antirrhinum majus": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/64/Antirrhinum_majus_full_MichaD.jpg/1280px-Antirrhinum_majus_full_MichaD.jpg", + "Laurus%20nobilis": null, + "Laurus nobilis": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/fe/Laurus_nobilis_MHNT_Fleurs.jpg/1280px-Laurus_nobilis_MHNT_Fleurs.jpg", + "Lupinus%20polyphyllus": null, + "Lupinus polyphyllus": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e7/Lupinus_polyphyllus_MHNT.BOT.2004.0.463.jpg/1280px-Lupinus_polyphyllus_MHNT.BOT.2004.0.463.jpg", + "Coreopsis%20tinctoria": null, + "Coreopsis tinctoria": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/fe/Coreopsis_tinctoria_cultivar_Uptick_Cream_and_Red_4.JPG/1280px-Coreopsis_tinctoria_cultivar_Uptick_Cream_and_Red_4.JPG", + "Magnolia%20grandiflora": null, + "Magnolia grandiflora": "https://upload.wikimedia.org/wikipedia/commons/4/48/Magnolia_%C3%97_soulangeana_blossom.jpg", + "Convallaria%20majalis": null, + "Convallaria majalis": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a8/Beech%2C_ferns_and_lily_of_the_valley_in_Gullmarsskogen_1.jpg/1280px-Beech%2C_ferns_and_lily_of_the_valley_in_Gullmarsskogen_1.jpg", + "Origanum%20majorana": null, + "Origanum majorana": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/d6/Origanum_majorana.jpg/1280px-Origanum_majorana.jpg", + "Leucanthemum%20vulgare": null, + "Leucanthemum vulgare": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e7/Leucanthemum_vulgare_%27Filigran%27_Flower_2200px.jpg/1280px-Leucanthemum_vulgare_%27Filigran%27_Flower_2200px.jpg", + "Salvia%20farinacea": null, + "Salvia farinacea": "https://upload.wikimedia.org/wikipedia/commons/6/64/Salvia_farinacea1.jpg", + "Gazania%20rigens": null, + "Gazania rigens": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/3d/Gazania_rigens-1.jpg/1280px-Gazania_rigens-1.jpg", + "Papaver%20rhoeas": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/04/Papaver_rhoeas_6_2021_Poppy-_%2851237437202%29.jpg/1280px-Papaver_rhoeas_6_2021_Poppy-_%2851237437202%29.jpg", + "Dianthus%20caryophyllus": null, + "Dianthus caryophyllus": "https://upload.wikimedia.org/wikipedia/commons/8/80/Gartennelke_1.jpg", + "Nemesia%20strumosa": null, + "Nemesia strumosa": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/56/Nemesia_strumosa_two_colours.jpg/1280px-Nemesia_strumosa_two_colours.jpg", + "Fittonia%20albivenis": null, + "Fittonia albivenis": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/72/Colpfl25.jpg/1280px-Colpfl25.jpg", + "Araucaria%20heterophylla": null, + "Araucaria heterophylla": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/38/Araucaria_heterophylla_Norfolk_Island_0.jpg/1280px-Araucaria_heterophylla_Norfolk_Island_0.jpg", + "Cycas%20revoluta": "https://upload.wikimedia.org/wikipedia/commons/6/6d/Cycas_revoluta%2BFlorero.jpg", + "Paeonia%20lactiflora": null, + "Paeonia lactiflora": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/bf/P%C3%B6rtschach_Winklern_10.-Oktober-Stra%C3%9Fe_67_Paeonia_lactiflora_24052014_2076.jpg/1280px-P%C3%B6rtschach_Winklern_10.-Oktober-Stra%C3%9Fe_67_Paeonia_lactiflora_24052014_2076.jpg", + "Philodendron%20hederaceum%20Brasil": null, + "Philodendron hederaceum Brasil": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/44/Wikipedia_13._Fotoworkshop_Botanischer_Garten_Erlangen_2013_by-RaBoe_136.jpg/1280px-Wikipedia_13._Fotoworkshop_Botanischer_Garten_Erlangen_2013_by-RaBoe_136.jpg", + "Philodendron%20erubescens%20Pink%20Princess": null, + "Philodendron erubescens Pink Princess": "https://upload.wikimedia.org/wikipedia/commons/6/64/Arum_Family_-_Araceae_%283072475611%29.jpg", + "Thaumatophyllum%20xanadu": null, + "Thaumatophyllum xanadu": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/17/Philodendron_xanadu_AK1.jpg/1280px-Philodendron_xanadu_AK1.jpg", + "Ipomoea%20purpurea": null, + "Ipomoea purpurea": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/ab/Ipomoea_July_2011-4.jpg/1280px-Ipomoea_July_2011-4.jpg", + "Hypoestes%20phyllostachya": null, + "Hypoestes phyllostachya": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/43/Starr_080117-1693_Hypoestes_phyllostachya.jpg/1280px-Starr_080117-1693_Hypoestes_phyllostachya.jpg", + "Peperomia%20polybotrya": null, + "Peperomia polybotrya": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/87/Coin_Leaf_Peperomia_%28Peperomia_polybotrya_%27Jayde%27%29.jpg/1280px-Coin_Leaf_Peperomia_%28Peperomia_polybotrya_%27Jayde%27%29.jpg", + "Ranunculus%20asiaticus": null, + "Ranunculus asiaticus": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/23/Persian_Buttercup_01.jpg/1280px-Persian_Buttercup_01.jpg", + "Rhododendron%20catawbiense": null, + "Rhododendron catawbiense": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/6d/Rhododendron-catawbiense.jpg/1280px-Rhododendron-catawbiense.jpg", + "Calendula%20officinalis": "https://upload.wikimedia.org/wikipedia/commons/4/41/Calendula_officinalis_01.jpg", + "Delphinium%20elatum": null, + "Delphinium elatum": "https://upload.wikimedia.org/wikipedia/commons/5/54/Delphinium_elatum_a2.jpg", + "Robinia%20pseudoacacia": null, + "Robinia pseudoacacia": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/4b/Robinia_pseudoacacia_fruits.jpg/1280px-Robinia_pseudoacacia_fruits.jpg", + "Chamaemelum%20nobile": null, + "Chamaemelum nobile": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a7/Chamomile%40original_size.jpg/1280px-Chamomile%40original_size.jpg", + "Rosa%20x%20hybrida": null, + "Rosa x hybrida": "https://upload.wikimedia.org/wikipedia/commons/d/db/Rosa_x_hybrida_iceberg_Reimer_Kordes_1958.JPG", + "Rudbeckia%20hirta": null, + "Rudbeckia hirta": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/d1/Black_eyed_susan_20040717_110754_2.1474.jpg/1280px-Black_eyed_susan_20040717_110754_2.1474.jpg", + "Anthurium%20clarinervium": null, + "Anthurium clarinervium": "https://upload.wikimedia.org/wikipedia/commons/6/65/Anthurium_clarinervium.jpg", + "Rumex%20acetosa": null, + "Rumex acetosa": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/ee/Rumex_acetosa_-_Hapu_oblikas.jpg/1280px-Rumex_acetosa_-_Hapu_oblikas.jpg", + "Buddleja%20davidii": null, + "Buddleja davidii": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Distelfalter%2C_Vanessa_cardui_AUF_Schmetterlingsflieder%2C_Buddleja_davidii_1.JPG/1280px-Distelfalter%2C_Vanessa_cardui_AUF_Schmetterlingsflieder%2C_Buddleja_davidii_1.JPG", + "Allium%20tuberosum": null, + "Allium tuberosum": "https://upload.wikimedia.org/wikipedia/commons/a/a8/Allium_tuberosum1.jpg", + "Asclepias%20tuberosa": null, + "Asclepias tuberosa": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c9/Butterfly_Weed_Asclepias_tuberosa_Flower_Buds_3008px.jpg/1280px-Butterfly_Weed_Asclepias_tuberosa_Flower_Buds_3008px.jpg", + "Leucanthemum%20x%20superbum": null, + "Perilla%20frutescens": null, + "Leucanthemum x superbum": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/f5/Leucanthemum_x_superbum_%27Becky%27_in_NH.jpg/1280px-Leucanthemum_x_superbum_%27Becky%27_in_NH.jpg", + "Perilla frutescens": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/ee/Perilla_frutescens%27_flower.jpg/1280px-Perilla_frutescens%27_flower.jpg", + "Helianthus%20annuus": null, + "Spiraea%20japonica": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/8a/Spiraea_japonica_%27Gold_Mound%27_6_2021_Japanese_Spirea-_%2851238159051%29.jpg/1280px-Spiraea_japonica_%27Gold_Mound%27_6_2021_Japanese_Spirea-_%2851238159051%29.jpg", + "Helianthus annuus": "https://upload.wikimedia.org/wikipedia/commons/6/66/Sunflower_l.jpg", + "Acer%20platanoides": null, + "Acer platanoides": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/d1/2020_year._Herbarium._Acer_platanoides._img-012.jpg/1280px-2020_year._Herbarium._Acer_platanoides._img-012.jpg", + "Ilex%20aquifolium": null, + "Ilex aquifolium": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/4f/Mahonia_aquifolium_qtl1.jpg/1280px-Mahonia_aquifolium_qtl1.jpg", + "Pelargonium%20zonale": "https://upload.wikimedia.org/wikipedia/commons/6/64/Normal_Pelargonium-zonale-376.jpg", + "Stevia%20rebaudiana": null, + "Stevia rebaudiana": "https://upload.wikimedia.org/wikipedia/commons/d/d9/Stevia-rebaudiana-total.JPG", + "Alcea%20rosea": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a8/Alcea_rosea_6_2021_Hollyhock-_%2851264042906%29.jpg/1280px-Alcea_rosea_6_2021_Hollyhock-_%2851264042906%29.jpg", + "Curio%20radicans": null, + "Curio radicans": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/43/Senecio_radicans%2C_jard%C3%ADn_bot%C3%A1nico_de_Tallinn%2C_Estonia%2C_2012-08-13%2C_DD_01.JPG/1280px-Senecio_radicans%2C_jard%C3%ADn_bot%C3%A1nico_de_Tallinn%2C_Estonia%2C_2012-08-13%2C_DD_01.JPG", + "Curio%20x%20peregrinus": null, + "Curio x peregrinus": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/9f/Getty_Research_Institute_%28IA_johannchristiank00kund%29.pdf/page1-725px-Getty_Research_Institute_%28IA_johannchristiank00kund%29.pdf.jpg", + "Hemerocallis%20fulva": "https://upload.wikimedia.org/wikipedia/commons/0/0e/Hemerocallis_fulva_-_flower_view_02.jpg", + "Lamprocapnos%20spectabilis": null, + "Lamprocapnos spectabilis": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/df/Tr%C3%A4nendes_Herz_%28Dicentra_spectabilis%29.jpg/1280px-Tr%C3%A4nendes_Herz_%28Dicentra_spectabilis%29.jpg", + "Catalpa%20bignonioides": null, + "Catalpa bignonioides": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/0b/Catalpa_bignonioides_Aurea_JPG1a.jpg/1280px-Catalpa_bignonioides_Aurea_JPG1a.jpg", + "Campsis%20radicans": null, + "Campsis radicans": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/af/Campsis_radicans_0.4_R.jpg/1280px-Campsis_radicans_0.4_R.jpg", + "Myosotis%20sylvatica": null, + "Myosotis sylvatica": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/4b/Myosotis_sylvatica_%28aka%29.jpg/1280px-Myosotis_sylvatica_%28aka%29.jpg", + "Eutrema%20japonicum": null, + "Eutrema japonicum": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/5d/Wasabia_japonica_1.JPG/1280px-Wasabia_japonica_1.JPG", + "Peperomia%20argyreia": null, + "Peperomia argyreia": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/ac/Peperomia_argyreia.jpg/1280px-Peperomia_argyreia.jpg", + "Weigela%20florida": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/7e/Weigela_florida_%27Bokrashine%27_%27SHINING_SENSATION%27_6_2021_Weigela-_%2851239536602%29.jpg/1280px-Weigela_florida_%27Bokrashine%27_%27SHINING_SENSATION%27_6_2021_Weigela-_%2851239536602%29.jpg", + "Hyssopus%20officinalis": null, + "Hyssopus officinalis": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/6d/Hyssopus-officinalis-habit.jpg/1280px-Hyssopus-officinalis-habit.jpg", + "Yucca%20aloifolia": null, + "Yucca aloifolia": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/6c/Yucca_aloifolia_4.jpg/1280px-Yucca_aloifolia_4.jpg", + "Cedrus%20libani": null, + "Cedrus libani": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/19/Cedrus_libani_foliage_PAN.JPG/1280px-Cedrus_libani_foliage_PAN.JPG", + "Nicotiana%20alata": null, + "Nicotiana alata": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/45/Nicotiana_alata1By_Carl_E_Lewis.jpg/1280px-Nicotiana_alata1By_Carl_E_Lewis.jpg", + "Cymbopogon%20citratus": null, + "Cymbopogon citratus": "https://upload.wikimedia.org/wikipedia/commons/b/bd/YosriNov04Pokok_Serai.JPG", + "Aloysia%20citrodora": null, + "Aloysia citrodora": "https://upload.wikimedia.org/wikipedia/commons/a/a6/Aloysia_citriodora_002.jpg", + "Cupressus%20sempervirens": null, + "Cupressus sempervirens": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/9c/Cypress_Halefka.JPG/1280px-Cypress_Halefka.JPG", + "Cycas revoluta": "https://upload.wikimedia.org/wikipedia/commons/f/f4/Cycas_revoluta1327A.JPG", + "Calendula officinalis": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/0e/Calendula_in_Autumn.jpg/1280px-Calendula_in_Autumn.jpg", + "Pelargonium zonale": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a7/Pelargonium_zonale_%28Geraniaceae%29.jpg/1280px-Pelargonium_zonale_%28Geraniaceae%29.jpg", + "Hemerocallis fulva": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/66/Daylily_%28Hemerocallis_fulva%29_v2.jpg/1280px-Daylily_%28Hemerocallis_fulva%29_v2.jpg", + "Garden croton": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/bf/Colpfl05.jpg/1280px-Colpfl05.jpg", + "Senecio peregrinus": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/43/Figure_2._Schematic_representation_of_homoploid_and_allopolyploid_hybrid_speciation._Updated.svg/1280px-Figure_2._Schematic_representation_of_homoploid_and_allopolyploid_hybrid_speciation._Updated.svg.png" } \ No newline at end of file diff --git a/server/scripts/download-plant-images.js b/server/scripts/download-plant-images.js index 3a85ff3..51dbe5a 100644 --- a/server/scripts/download-plant-images.js +++ b/server/scripts/download-plant-images.js @@ -1,486 +1,486 @@ -#!/usr/bin/env node -/* eslint-disable no-console */ -const fs = require('fs'); -const path = require('path'); -const crypto = require('crypto'); -require('dotenv').config(); - -const sharp = require('sharp'); -const { openDatabase, closeDatabase, all, run } = require('../lib/sqlite'); -const { ensurePlantSchema } = require('../lib/plants'); - -const OUTPUT_DIR = path.join(__dirname, '..', 'public', 'plants'); -const MANIFEST_PATH = path.join(OUTPUT_DIR, 'manifest.json'); -const ROOT_DIR = path.join(__dirname, '..', '..'); -const PLANTS_DUMP_PATH = path.join(ROOT_DIR, 'plants_dump_utf8.json'); -const SEARCH_CACHE_PATH = path.join(OUTPUT_DIR, 'wikimedia-search-cache.json'); -const MAX_CONCURRENCY = Number(process.env.PLANT_IMAGE_CONCURRENCY || 1); -const REQUEST_TIMEOUT_MS = 20000; -const MAX_FETCH_RETRIES = 5; -const WIKIMEDIA_SEARCH_PREFIX = 'wikimedia-search:'; - -const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms)); - -const slugify = (value) => { - const normalized = String(value || '') - .normalize('NFD') - .replace(/[\u0300-\u036f]/g, '') - .toLowerCase() - .replace(/[^a-z0-9]+/g, '-') - .replace(/^-+|-+$/g, ''); - return normalized || 'plant'; -}; - -const buildFileBaseName = (plant) => { - const botanicalSlug = slugify(plant.botanicalName); - const nameSlug = slugify(plant.name); - const suffix = crypto - .createHash('sha1') - .update(`${plant.id}|${plant.botanicalName}|${plant.name}`) - .digest('hex') - .slice(0, 8); - - if (nameSlug && nameSlug !== botanicalSlug) { - return `${botanicalSlug}--${nameSlug}--${suffix}`; - } - - return `${botanicalSlug}--${suffix}`; -}; - -const ensureOutputDir = () => { - fs.mkdirSync(OUTPUT_DIR, { recursive: true }); -}; - -const loadRefreshMatchers = () => new Set( - String(process.env.PLANT_IMAGE_REFRESH || '') - .split(',') - .map((value) => value.trim().toLowerCase()) - .filter(Boolean), -); - -const loadManifest = () => { - try { - const raw = fs.readFileSync(MANIFEST_PATH, 'utf8'); - return JSON.parse(raw); - } catch { - return { generatedAt: null, items: [] }; - } -}; - -const saveManifest = (manifest) => { - fs.writeFileSync(MANIFEST_PATH, JSON.stringify(manifest, null, 2)); -}; - -const loadSearchCache = () => { - try { - return JSON.parse(fs.readFileSync(SEARCH_CACHE_PATH, 'utf8')); - } catch { - return {}; - } -}; - -const saveSearchCache = (cache) => { - fs.writeFileSync(SEARCH_CACHE_PATH, JSON.stringify(cache, null, 2)); -}; - -const shouldRefreshPlantImage = (plant, refreshMatchers) => { - if (!refreshMatchers || refreshMatchers.size === 0) return false; - - return [ - plant.id, - plant.name, - plant.botanicalName, - ].some((value) => refreshMatchers.has(String(value || '').trim().toLowerCase())); -}; - -const loadDumpFallbackMap = () => { - try { - const raw = fs.readFileSync(PLANTS_DUMP_PATH, 'utf8'); - const entries = JSON.parse(raw); - if (!Array.isArray(entries)) return new Map(); - - const map = new Map(); - for (const entry of entries) { - if (!entry || typeof entry.botanicalName !== 'string' || typeof entry.imageUri !== 'string') continue; - const key = entry.botanicalName.trim().toLowerCase(); - if (!key || !/^https?:\/\//i.test(entry.imageUri)) continue; - if (!map.has(key)) map.set(key, entry.imageUri.trim()); - } - return map; - } catch { - return new Map(); - } -}; - -const getRetryDelayMs = (attempt, retryAfterHeader) => { - const retryAfterSeconds = Number(retryAfterHeader); - if (Number.isFinite(retryAfterSeconds) && retryAfterSeconds > 0) { - return retryAfterSeconds * 1000; - } - return Math.min(30000, 3000 * 2 ** attempt); -}; - -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 toWikimediaFilePathUrl = (rawUrl) => { - if (typeof rawUrl !== 'string' || !rawUrl.includes('upload.wikimedia.org/wikipedia/commons/')) { - return null; - } - - const cleanUrl = rawUrl.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 `https://commons.wikimedia.org/wiki/Special:FilePath/${encodeURIComponent(decoded)}`; -}; - -const parseWikimediaSearchQuery = (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; - - return decodeRepeatedly(rawQuery); -}; - -const fetchImageBuffer = async (url, attempt = 0, redirectCount = 0) => { - if (redirectCount > 5) { - throw new Error('Too many redirects'); - } - - const controller = new AbortController(); - const timeout = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS); - - try { - const response = await fetch(url, { - headers: { - 'User-Agent': 'GreenLens-PlantImageImporter/1.0', - 'Accept': 'image/avif,image/webp,image/apng,image/*,*/*;q=0.8', - 'Referer': 'https://commons.wikimedia.org/', - }, - redirect: 'manual', - signal: controller.signal, - }); - - if ([301, 302, 303, 307, 308].includes(response.status)) { - const location = response.headers.get('location'); - if (!location) throw new Error(`Redirect without location for ${url}`); - const nextUrl = new URL(location, url).toString(); - return fetchImageBuffer(nextUrl, attempt, redirectCount + 1); - } - - if ((response.status === 429 || response.status >= 500) && attempt < MAX_FETCH_RETRIES) { - const delayMs = getRetryDelayMs(attempt, response.headers.get('retry-after')); - await sleep(delayMs); - return fetchImageBuffer(url, attempt + 1, redirectCount); - } - - if (!response.ok) { - throw new Error(`HTTP ${response.status}`); - } - - const arrayBuffer = await response.arrayBuffer(); - return Buffer.from(arrayBuffer); - } finally { - clearTimeout(timeout); - } -}; - -const searchWikimediaImage = async (query, searchCache) => { - const normalizedQuery = String(query || '').trim(); - if (!normalizedQuery) return null; - - if (Object.prototype.hasOwnProperty.call(searchCache, normalizedQuery)) { - return searchCache[normalizedQuery] || null; - } - - const apiUrl = `https://commons.wikimedia.org/w/api.php?action=query&generator=search&gsrnamespace=6&gsrsearch=${encodeURIComponent(normalizedQuery)}&gsrlimit=5&prop=imageinfo&iiprop=url&iiurlwidth=1200&format=json`; - - try { - const controller = new AbortController(); - const timeout = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS); - const response = await fetch(apiUrl, { - headers: { - 'User-Agent': 'GreenLens-PlantImageImporter/1.0', - 'Accept': 'application/json', - }, - signal: controller.signal, - }); - clearTimeout(timeout); - - if (!response.ok) { - searchCache[normalizedQuery] = null; - saveSearchCache(searchCache); - return null; - } - - const data = await response.json(); - const pages = data?.query?.pages ? Object.values(data.query.pages) : []; - - for (const page of pages) { - const imageInfo = page?.imageinfo?.[0]; - const candidate = imageInfo?.thumburl || imageInfo?.url || null; - if (candidate && /^https?:\/\//i.test(candidate)) { - searchCache[normalizedQuery] = candidate; - saveSearchCache(searchCache); - return candidate; - } - } - } catch { - // Ignore and cache as null below. - } - - searchCache[normalizedQuery] = null; - saveSearchCache(searchCache); - return null; -}; - -const convertToWebp = async (inputBuffer, outputPath) => { - const tempPath = `${outputPath}.tmp-${process.pid}-${Date.now()}.webp`; - await sharp(inputBuffer) - .rotate() - .resize({ - width: 1200, - height: 1200, - fit: 'inside', - withoutEnlargement: true, - }) - .webp({ quality: 82 }) - .toFile(tempPath); - - fs.copyFileSync(tempPath, 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 processPlant = async (db, plant, manifestItems, dumpFallbackMap, searchCache, refreshMatchers) => { - const currentUri = String(plant.imageUri || '').trim(); - const placeholderQuery = parseWikimediaSearchQuery(currentUri); - const fileBaseName = buildFileBaseName(plant); - const fileName = `${fileBaseName}.webp`; - const localImageUri = `/plants/${fileName}`; - const outputPath = path.join(OUTPUT_DIR, fileName); - const dumpFallbackUri = dumpFallbackMap.get(String(plant.botanicalName || '').trim().toLowerCase()) || null; - const shouldRefresh = shouldRefreshPlantImage(plant, refreshMatchers); - - if (fs.existsSync(outputPath) && !shouldRefresh) { - await updatePlantImageUri(db, plant.id, localImageUri); - manifestItems.push({ - id: plant.id, - botanicalName: plant.botanicalName, - name: plant.name, - sourceUri: currentUri, - localImageUri, - status: 'existing', - }); - return { status: 'existing', plantId: plant.id, localImageUri }; - } - - if (!/^https?:\/\//i.test(currentUri) && !placeholderQuery) { - manifestItems.push({ - id: plant.id, - botanicalName: plant.botanicalName, - name: plant.name, - sourceUri: currentUri, - localImageUri, - status: 'skipped', - reason: 'Current imageUri is not a remote URL and no local file exists yet.', - }); - return { status: 'skipped', plantId: plant.id, localImageUri }; - } - - let lastError = null; - let sourceUsed = currentUri; - let buffer = null; - - const searchedUri = await searchWikimediaImage(placeholderQuery, searchCache) - || await searchWikimediaImage(plant.botanicalName, searchCache) - || await searchWikimediaImage(plant.name, searchCache); - - const candidateUris = [ - /^https?:\/\//i.test(currentUri) ? currentUri : null, - /^https?:\/\//i.test(currentUri) ? toWikimediaFilePathUrl(currentUri) : null, - dumpFallbackUri, - toWikimediaFilePathUrl(dumpFallbackUri), - searchedUri, - toWikimediaFilePathUrl(searchedUri), - ].filter(Boolean); - - for (const candidateUri of [...new Set(candidateUris)]) { - try { - buffer = await fetchImageBuffer(candidateUri); - sourceUsed = candidateUri; - break; - } catch (error) { - lastError = error; - } - } - - if (!buffer) { - throw lastError || new Error('Image download failed'); - } - - await convertToWebp(buffer, outputPath); - await updatePlantImageUri(db, plant.id, localImageUri); - - manifestItems.push({ - id: plant.id, - botanicalName: plant.botanicalName, - name: plant.name, - sourceUri: sourceUsed, - localImageUri, - status: 'downloaded', - }); - - await sleep(900); - return { status: 'downloaded', plantId: plant.id, localImageUri }; -}; - -const runWithConcurrency = async (items, worker, concurrency) => { - const queue = [...items]; - const results = []; - - const runners = Array.from({ length: Math.min(concurrency, queue.length) }, async () => { - while (queue.length > 0) { - const item = queue.shift(); - if (!item) return; - results.push(await worker(item)); - } - }); - - await Promise.all(runners); - return results; -}; - -const main = async () => { - ensureOutputDir(); - const manifest = loadManifest(); - const manifestItems = []; - const dumpFallbackMap = loadDumpFallbackMap(); - const searchCache = loadSearchCache(); - const refreshMatchers = loadRefreshMatchers(); - const db = await openDatabase(); - - try { - await ensurePlantSchema(db); - const plants = await all( - db, - `SELECT id, name, botanicalName, imageUri - FROM plants - ORDER BY name COLLATE NOCASE ASC`, - ); - - console.log(`Preparing ${plants.length} plant images...`); - - const failures = []; - let completed = 0; - - await runWithConcurrency( - plants, - async (plant) => { - try { - const result = await processPlant(db, plant, manifestItems, dumpFallbackMap, searchCache, refreshMatchers); - completed += 1; - console.log(`[${completed}/${plants.length}] ${plant.botanicalName} -> ${result.status}`); - return result; - } catch (error) { - completed += 1; - const message = error instanceof Error ? error.message : String(error); - console.error(`[${completed}/${plants.length}] ${plant.botanicalName} -> failed: ${message}`); - failures.push({ - id: plant.id, - name: plant.name, - botanicalName: plant.botanicalName, - sourceUri: plant.imageUri, - error: message, - }); - manifestItems.push({ - id: plant.id, - botanicalName: plant.botanicalName, - name: plant.name, - sourceUri: plant.imageUri, - status: 'failed', - error: message, - }); - return { status: 'failed', plantId: plant.id }; - } - }, - MAX_CONCURRENCY, - ); - - const downloadedCount = manifestItems.filter((item) => item.status === 'downloaded').length; - const existingCount = manifestItems.filter((item) => item.status === 'existing').length; - const skippedCount = manifestItems.filter((item) => item.status === 'skipped').length; - - saveManifest({ - generatedAt: new Date().toISOString(), - summary: { - totalPlants: plants.length, - downloadedCount, - existingCount, - skippedCount, - failureCount: failures.length, - }, - failures, - items: manifestItems, - }); - - console.log(''); - console.log(`Downloaded: ${downloadedCount}`); - console.log(`Already present: ${existingCount}`); - console.log(`Skipped: ${skippedCount}`); - console.log(`Failed: ${failures.length}`); - console.log(`Manifest: ${MANIFEST_PATH}`); - - if (failures.length > 0) { - process.exitCode = 1; - } - } finally { - await closeDatabase(db); - } -}; - -main().catch((error) => { - console.error('Plant image import failed.'); - console.error(error instanceof Error ? error.stack || error.message : String(error)); - process.exit(1); -}); +#!/usr/bin/env node +/* eslint-disable no-console */ +const fs = require('fs'); +const path = require('path'); +const crypto = require('crypto'); +require('dotenv').config(); + +const sharp = require('sharp'); +const { openDatabase, closeDatabase, all, run } = require('../lib/sqlite'); +const { ensurePlantSchema } = require('../lib/plants'); + +const OUTPUT_DIR = path.join(__dirname, '..', 'public', 'plants'); +const MANIFEST_PATH = path.join(OUTPUT_DIR, 'manifest.json'); +const ROOT_DIR = path.join(__dirname, '..', '..'); +const PLANTS_DUMP_PATH = path.join(ROOT_DIR, 'plants_dump_utf8.json'); +const SEARCH_CACHE_PATH = path.join(OUTPUT_DIR, 'wikimedia-search-cache.json'); +const MAX_CONCURRENCY = Number(process.env.PLANT_IMAGE_CONCURRENCY || 1); +const REQUEST_TIMEOUT_MS = 20000; +const MAX_FETCH_RETRIES = 5; +const WIKIMEDIA_SEARCH_PREFIX = 'wikimedia-search:'; + +const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms)); + +const slugify = (value) => { + const normalized = String(value || '') + .normalize('NFD') + .replace(/[\u0300-\u036f]/g, '') + .toLowerCase() + .replace(/[^a-z0-9]+/g, '-') + .replace(/^-+|-+$/g, ''); + return normalized || 'plant'; +}; + +const buildFileBaseName = (plant) => { + const botanicalSlug = slugify(plant.botanicalName); + const nameSlug = slugify(plant.name); + const suffix = crypto + .createHash('sha1') + .update(`${plant.id}|${plant.botanicalName}|${plant.name}`) + .digest('hex') + .slice(0, 8); + + if (nameSlug && nameSlug !== botanicalSlug) { + return `${botanicalSlug}--${nameSlug}--${suffix}`; + } + + return `${botanicalSlug}--${suffix}`; +}; + +const ensureOutputDir = () => { + fs.mkdirSync(OUTPUT_DIR, { recursive: true }); +}; + +const loadRefreshMatchers = () => new Set( + String(process.env.PLANT_IMAGE_REFRESH || '') + .split(',') + .map((value) => value.trim().toLowerCase()) + .filter(Boolean), +); + +const loadManifest = () => { + try { + const raw = fs.readFileSync(MANIFEST_PATH, 'utf8'); + return JSON.parse(raw); + } catch { + return { generatedAt: null, items: [] }; + } +}; + +const saveManifest = (manifest) => { + fs.writeFileSync(MANIFEST_PATH, JSON.stringify(manifest, null, 2)); +}; + +const loadSearchCache = () => { + try { + return JSON.parse(fs.readFileSync(SEARCH_CACHE_PATH, 'utf8')); + } catch { + return {}; + } +}; + +const saveSearchCache = (cache) => { + fs.writeFileSync(SEARCH_CACHE_PATH, JSON.stringify(cache, null, 2)); +}; + +const shouldRefreshPlantImage = (plant, refreshMatchers) => { + if (!refreshMatchers || refreshMatchers.size === 0) return false; + + return [ + plant.id, + plant.name, + plant.botanicalName, + ].some((value) => refreshMatchers.has(String(value || '').trim().toLowerCase())); +}; + +const loadDumpFallbackMap = () => { + try { + const raw = fs.readFileSync(PLANTS_DUMP_PATH, 'utf8'); + const entries = JSON.parse(raw); + if (!Array.isArray(entries)) return new Map(); + + const map = new Map(); + for (const entry of entries) { + if (!entry || typeof entry.botanicalName !== 'string' || typeof entry.imageUri !== 'string') continue; + const key = entry.botanicalName.trim().toLowerCase(); + if (!key || !/^https?:\/\//i.test(entry.imageUri)) continue; + if (!map.has(key)) map.set(key, entry.imageUri.trim()); + } + return map; + } catch { + return new Map(); + } +}; + +const getRetryDelayMs = (attempt, retryAfterHeader) => { + const retryAfterSeconds = Number(retryAfterHeader); + if (Number.isFinite(retryAfterSeconds) && retryAfterSeconds > 0) { + return retryAfterSeconds * 1000; + } + return Math.min(30000, 3000 * 2 ** attempt); +}; + +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 toWikimediaFilePathUrl = (rawUrl) => { + if (typeof rawUrl !== 'string' || !rawUrl.includes('upload.wikimedia.org/wikipedia/commons/')) { + return null; + } + + const cleanUrl = rawUrl.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 `https://commons.wikimedia.org/wiki/Special:FilePath/${encodeURIComponent(decoded)}`; +}; + +const parseWikimediaSearchQuery = (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; + + return decodeRepeatedly(rawQuery); +}; + +const fetchImageBuffer = async (url, attempt = 0, redirectCount = 0) => { + if (redirectCount > 5) { + throw new Error('Too many redirects'); + } + + const controller = new AbortController(); + const timeout = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS); + + try { + const response = await fetch(url, { + headers: { + 'User-Agent': 'GreenLens-PlantImageImporter/1.0', + 'Accept': 'image/avif,image/webp,image/apng,image/*,*/*;q=0.8', + 'Referer': 'https://commons.wikimedia.org/', + }, + redirect: 'manual', + signal: controller.signal, + }); + + if ([301, 302, 303, 307, 308].includes(response.status)) { + const location = response.headers.get('location'); + if (!location) throw new Error(`Redirect without location for ${url}`); + const nextUrl = new URL(location, url).toString(); + return fetchImageBuffer(nextUrl, attempt, redirectCount + 1); + } + + if ((response.status === 429 || response.status >= 500) && attempt < MAX_FETCH_RETRIES) { + const delayMs = getRetryDelayMs(attempt, response.headers.get('retry-after')); + await sleep(delayMs); + return fetchImageBuffer(url, attempt + 1, redirectCount); + } + + if (!response.ok) { + throw new Error(`HTTP ${response.status}`); + } + + const arrayBuffer = await response.arrayBuffer(); + return Buffer.from(arrayBuffer); + } finally { + clearTimeout(timeout); + } +}; + +const searchWikimediaImage = async (query, searchCache) => { + const normalizedQuery = String(query || '').trim(); + if (!normalizedQuery) return null; + + if (Object.prototype.hasOwnProperty.call(searchCache, normalizedQuery)) { + return searchCache[normalizedQuery] || null; + } + + const apiUrl = `https://commons.wikimedia.org/w/api.php?action=query&generator=search&gsrnamespace=6&gsrsearch=${encodeURIComponent(normalizedQuery)}&gsrlimit=5&prop=imageinfo&iiprop=url&iiurlwidth=1200&format=json`; + + try { + const controller = new AbortController(); + const timeout = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS); + const response = await fetch(apiUrl, { + headers: { + 'User-Agent': 'GreenLens-PlantImageImporter/1.0', + 'Accept': 'application/json', + }, + signal: controller.signal, + }); + clearTimeout(timeout); + + if (!response.ok) { + searchCache[normalizedQuery] = null; + saveSearchCache(searchCache); + return null; + } + + const data = await response.json(); + const pages = data?.query?.pages ? Object.values(data.query.pages) : []; + + for (const page of pages) { + const imageInfo = page?.imageinfo?.[0]; + const candidate = imageInfo?.thumburl || imageInfo?.url || null; + if (candidate && /^https?:\/\//i.test(candidate)) { + searchCache[normalizedQuery] = candidate; + saveSearchCache(searchCache); + return candidate; + } + } + } catch { + // Ignore and cache as null below. + } + + searchCache[normalizedQuery] = null; + saveSearchCache(searchCache); + return null; +}; + +const convertToWebp = async (inputBuffer, outputPath) => { + const tempPath = `${outputPath}.tmp-${process.pid}-${Date.now()}.webp`; + await sharp(inputBuffer) + .rotate() + .resize({ + width: 1200, + height: 1200, + fit: 'inside', + withoutEnlargement: true, + }) + .webp({ quality: 82 }) + .toFile(tempPath); + + fs.copyFileSync(tempPath, 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 processPlant = async (db, plant, manifestItems, dumpFallbackMap, searchCache, refreshMatchers) => { + const currentUri = String(plant.imageUri || '').trim(); + const placeholderQuery = parseWikimediaSearchQuery(currentUri); + const fileBaseName = buildFileBaseName(plant); + const fileName = `${fileBaseName}.webp`; + const localImageUri = `/plants/${fileName}`; + const outputPath = path.join(OUTPUT_DIR, fileName); + const dumpFallbackUri = dumpFallbackMap.get(String(plant.botanicalName || '').trim().toLowerCase()) || null; + const shouldRefresh = shouldRefreshPlantImage(plant, refreshMatchers); + + if (fs.existsSync(outputPath) && !shouldRefresh) { + await updatePlantImageUri(db, plant.id, localImageUri); + manifestItems.push({ + id: plant.id, + botanicalName: plant.botanicalName, + name: plant.name, + sourceUri: currentUri, + localImageUri, + status: 'existing', + }); + return { status: 'existing', plantId: plant.id, localImageUri }; + } + + if (!/^https?:\/\//i.test(currentUri) && !placeholderQuery) { + manifestItems.push({ + id: plant.id, + botanicalName: plant.botanicalName, + name: plant.name, + sourceUri: currentUri, + localImageUri, + status: 'skipped', + reason: 'Current imageUri is not a remote URL and no local file exists yet.', + }); + return { status: 'skipped', plantId: plant.id, localImageUri }; + } + + let lastError = null; + let sourceUsed = currentUri; + let buffer = null; + + const searchedUri = await searchWikimediaImage(placeholderQuery, searchCache) + || await searchWikimediaImage(plant.botanicalName, searchCache) + || await searchWikimediaImage(plant.name, searchCache); + + const candidateUris = [ + /^https?:\/\//i.test(currentUri) ? currentUri : null, + /^https?:\/\//i.test(currentUri) ? toWikimediaFilePathUrl(currentUri) : null, + dumpFallbackUri, + toWikimediaFilePathUrl(dumpFallbackUri), + searchedUri, + toWikimediaFilePathUrl(searchedUri), + ].filter(Boolean); + + for (const candidateUri of [...new Set(candidateUris)]) { + try { + buffer = await fetchImageBuffer(candidateUri); + sourceUsed = candidateUri; + break; + } catch (error) { + lastError = error; + } + } + + if (!buffer) { + throw lastError || new Error('Image download failed'); + } + + await convertToWebp(buffer, outputPath); + await updatePlantImageUri(db, plant.id, localImageUri); + + manifestItems.push({ + id: plant.id, + botanicalName: plant.botanicalName, + name: plant.name, + sourceUri: sourceUsed, + localImageUri, + status: 'downloaded', + }); + + await sleep(900); + return { status: 'downloaded', plantId: plant.id, localImageUri }; +}; + +const runWithConcurrency = async (items, worker, concurrency) => { + const queue = [...items]; + const results = []; + + const runners = Array.from({ length: Math.min(concurrency, queue.length) }, async () => { + while (queue.length > 0) { + const item = queue.shift(); + if (!item) return; + results.push(await worker(item)); + } + }); + + await Promise.all(runners); + return results; +}; + +const main = async () => { + ensureOutputDir(); + const manifest = loadManifest(); + const manifestItems = []; + const dumpFallbackMap = loadDumpFallbackMap(); + const searchCache = loadSearchCache(); + const refreshMatchers = loadRefreshMatchers(); + const db = await openDatabase(); + + try { + await ensurePlantSchema(db); + const plants = await all( + db, + `SELECT id, name, botanicalName, imageUri + FROM plants + ORDER BY name COLLATE NOCASE ASC`, + ); + + console.log(`Preparing ${plants.length} plant images...`); + + const failures = []; + let completed = 0; + + await runWithConcurrency( + plants, + async (plant) => { + try { + const result = await processPlant(db, plant, manifestItems, dumpFallbackMap, searchCache, refreshMatchers); + completed += 1; + console.log(`[${completed}/${plants.length}] ${plant.botanicalName} -> ${result.status}`); + return result; + } catch (error) { + completed += 1; + const message = error instanceof Error ? error.message : String(error); + console.error(`[${completed}/${plants.length}] ${plant.botanicalName} -> failed: ${message}`); + failures.push({ + id: plant.id, + name: plant.name, + botanicalName: plant.botanicalName, + sourceUri: plant.imageUri, + error: message, + }); + manifestItems.push({ + id: plant.id, + botanicalName: plant.botanicalName, + name: plant.name, + sourceUri: plant.imageUri, + status: 'failed', + error: message, + }); + return { status: 'failed', plantId: plant.id }; + } + }, + MAX_CONCURRENCY, + ); + + const downloadedCount = manifestItems.filter((item) => item.status === 'downloaded').length; + const existingCount = manifestItems.filter((item) => item.status === 'existing').length; + const skippedCount = manifestItems.filter((item) => item.status === 'skipped').length; + + saveManifest({ + generatedAt: new Date().toISOString(), + summary: { + totalPlants: plants.length, + downloadedCount, + existingCount, + skippedCount, + failureCount: failures.length, + }, + failures, + items: manifestItems, + }); + + console.log(''); + console.log(`Downloaded: ${downloadedCount}`); + console.log(`Already present: ${existingCount}`); + console.log(`Skipped: ${skippedCount}`); + console.log(`Failed: ${failures.length}`); + console.log(`Manifest: ${MANIFEST_PATH}`); + + if (failures.length > 0) { + process.exitCode = 1; + } + } finally { + await closeDatabase(db); + } +}; + +main().catch((error) => { + console.error('Plant image import failed.'); + console.error(error instanceof Error ? error.stack || error.message : String(error)); + process.exit(1); +}); diff --git a/server/scripts/plant-diagnostics.js b/server/scripts/plant-diagnostics.js index 509d173..03d2753 100644 --- a/server/scripts/plant-diagnostics.js +++ b/server/scripts/plant-diagnostics.js @@ -1,23 +1,23 @@ -#!/usr/bin/env node -/* eslint-disable no-console */ -require('dotenv').config(); - -const { closeDatabase, openDatabase } = require('../lib/sqlite'); -const { ensurePlantSchema, getPlantDiagnostics } = require('../lib/plants'); - -const main = async () => { - const db = await openDatabase(); - try { - await ensurePlantSchema(db); - const diagnostics = await getPlantDiagnostics(db); - console.log(JSON.stringify(diagnostics, null, 2)); - } finally { - await closeDatabase(db); - } -}; - -main().catch((error) => { - console.error('Failed to read plant diagnostics.'); - console.error(error instanceof Error ? error.stack || error.message : String(error)); - process.exit(1); -}); +#!/usr/bin/env node +/* eslint-disable no-console */ +require('dotenv').config(); + +const { closeDatabase, openDatabase } = require('../lib/sqlite'); +const { ensurePlantSchema, getPlantDiagnostics } = require('../lib/plants'); + +const main = async () => { + const db = await openDatabase(); + try { + await ensurePlantSchema(db); + const diagnostics = await getPlantDiagnostics(db); + console.log(JSON.stringify(diagnostics, null, 2)); + } finally { + await closeDatabase(db); + } +}; + +main().catch((error) => { + console.error('Failed to read plant diagnostics.'); + console.error(error instanceof Error ? error.stack || error.message : String(error)); + process.exit(1); +}); diff --git a/server/scripts/rebuild-from-batches.js b/server/scripts/rebuild-from-batches.js index 62f9aaf..b2c090c 100644 --- a/server/scripts/rebuild-from-batches.js +++ b/server/scripts/rebuild-from-batches.js @@ -1,123 +1,123 @@ -#!/usr/bin/env node -/* eslint-disable no-console */ -const fs = require('fs'); -const path = require('path'); -const vm = require('vm'); -require('dotenv').config(); - -const { closeDatabase, openDatabase } = require('../lib/sqlite'); -const { ensurePlantSchema, rebuildPlantsCatalog } = require('../lib/plants'); - -let ts; -try { - ts = require('typescript'); -} catch (error) { - console.error('The rebuild script needs the "typescript" package in node_modules.'); - console.error('Install dependencies in the repository root before running this script.'); - process.exit(1); -} - -const ROOT_DIR = path.resolve(__dirname, '..', '..'); -const BATCH_1_PATH = path.join(ROOT_DIR, 'constants', 'lexiconBatch1.ts'); -const BATCH_2_PATH = path.join(ROOT_DIR, 'constants', 'lexiconBatch2.ts'); - -const resolveTsFilePath = (fromFile, specifier) => { - if (!specifier.startsWith('.')) return null; - const fromDirectory = path.dirname(fromFile); - const absoluteBase = path.resolve(fromDirectory, specifier); - const candidates = [ - absoluteBase, - `${absoluteBase}.ts`, - `${absoluteBase}.tsx`, - path.join(absoluteBase, 'index.ts'), - ]; - for (const candidate of candidates) { - if (fs.existsSync(candidate) && fs.statSync(candidate).isFile()) { - return candidate; - } - } - return null; -}; - -const loadTsModule = (absolutePath, cache = new Map()) => { - if (cache.has(absolutePath)) return cache.get(absolutePath); - - const source = fs.readFileSync(absolutePath, 'utf8'); - const transpiled = ts.transpileModule(source, { - compilerOptions: { - module: ts.ModuleKind.CommonJS, - target: ts.ScriptTarget.ES2020, - esModuleInterop: true, - jsx: ts.JsxEmit.ReactJSX, - }, - fileName: absolutePath, - reportDiagnostics: false, - }).outputText; - - const module = { exports: {} }; - cache.set(absolutePath, module.exports); - - const localRequire = (specifier) => { - const resolvedTsPath = resolveTsFilePath(absolutePath, specifier); - if (resolvedTsPath) { - return loadTsModule(resolvedTsPath, cache); - } - return require(specifier); - }; - - const sandbox = { - module, - exports: module.exports, - require: localRequire, - __dirname: path.dirname(absolutePath), - __filename: absolutePath, - console, - process, - Buffer, - setTimeout, - clearTimeout, - }; - - vm.runInNewContext(transpiled, sandbox, { filename: absolutePath }); - cache.set(absolutePath, module.exports); - return module.exports; -}; - -const loadBatchEntries = () => { - const batch1Module = loadTsModule(BATCH_1_PATH); - const batch2Module = loadTsModule(BATCH_2_PATH); - - const batch1Entries = batch1Module.LEXICON_BATCH_1_ENTRIES; - const batch2Entries = batch2Module.LEXICON_BATCH_2_ENTRIES; - - if (!Array.isArray(batch1Entries) || !Array.isArray(batch2Entries)) { - throw new Error('Could not load lexicon batch entries from TypeScript constants.'); - } - - return [...batch1Entries, ...batch2Entries]; -}; - -const main = async () => { - const entries = loadBatchEntries(); - const db = await openDatabase(); - - try { - await ensurePlantSchema(db); - const summary = await rebuildPlantsCatalog(db, entries, { - source: 'local_batch_script', - preserveExistingIds: true, - enforceUniqueImages: true, - }); - - console.log('Rebuild finished successfully.'); - console.log(JSON.stringify(summary, null, 2)); - } finally { - await closeDatabase(db); - } -}; - -main().catch((error) => { - console.error('Failed to rebuild plants from local batches.'); - console.error(error instanceof Error ? error.stack || error.message : String(error)); - process.exit(1); -}); +#!/usr/bin/env node +/* eslint-disable no-console */ +const fs = require('fs'); +const path = require('path'); +const vm = require('vm'); +require('dotenv').config(); + +const { closeDatabase, openDatabase } = require('../lib/sqlite'); +const { ensurePlantSchema, rebuildPlantsCatalog } = require('../lib/plants'); + +let ts; +try { + ts = require('typescript'); +} catch (error) { + console.error('The rebuild script needs the "typescript" package in node_modules.'); + console.error('Install dependencies in the repository root before running this script.'); + process.exit(1); +} + +const ROOT_DIR = path.resolve(__dirname, '..', '..'); +const BATCH_1_PATH = path.join(ROOT_DIR, 'constants', 'lexiconBatch1.ts'); +const BATCH_2_PATH = path.join(ROOT_DIR, 'constants', 'lexiconBatch2.ts'); + +const resolveTsFilePath = (fromFile, specifier) => { + if (!specifier.startsWith('.')) return null; + const fromDirectory = path.dirname(fromFile); + const absoluteBase = path.resolve(fromDirectory, specifier); + const candidates = [ + absoluteBase, + `${absoluteBase}.ts`, + `${absoluteBase}.tsx`, + path.join(absoluteBase, 'index.ts'), + ]; + for (const candidate of candidates) { + if (fs.existsSync(candidate) && fs.statSync(candidate).isFile()) { + return candidate; + } + } + return null; +}; + +const loadTsModule = (absolutePath, cache = new Map()) => { + if (cache.has(absolutePath)) return cache.get(absolutePath); + + const source = fs.readFileSync(absolutePath, 'utf8'); + const transpiled = ts.transpileModule(source, { + compilerOptions: { + module: ts.ModuleKind.CommonJS, + target: ts.ScriptTarget.ES2020, + esModuleInterop: true, + jsx: ts.JsxEmit.ReactJSX, + }, + fileName: absolutePath, + reportDiagnostics: false, + }).outputText; + + const module = { exports: {} }; + cache.set(absolutePath, module.exports); + + const localRequire = (specifier) => { + const resolvedTsPath = resolveTsFilePath(absolutePath, specifier); + if (resolvedTsPath) { + return loadTsModule(resolvedTsPath, cache); + } + return require(specifier); + }; + + const sandbox = { + module, + exports: module.exports, + require: localRequire, + __dirname: path.dirname(absolutePath), + __filename: absolutePath, + console, + process, + Buffer, + setTimeout, + clearTimeout, + }; + + vm.runInNewContext(transpiled, sandbox, { filename: absolutePath }); + cache.set(absolutePath, module.exports); + return module.exports; +}; + +const loadBatchEntries = () => { + const batch1Module = loadTsModule(BATCH_1_PATH); + const batch2Module = loadTsModule(BATCH_2_PATH); + + const batch1Entries = batch1Module.LEXICON_BATCH_1_ENTRIES; + const batch2Entries = batch2Module.LEXICON_BATCH_2_ENTRIES; + + if (!Array.isArray(batch1Entries) || !Array.isArray(batch2Entries)) { + throw new Error('Could not load lexicon batch entries from TypeScript constants.'); + } + + return [...batch1Entries, ...batch2Entries]; +}; + +const main = async () => { + const entries = loadBatchEntries(); + const db = await openDatabase(); + + try { + await ensurePlantSchema(db); + const summary = await rebuildPlantsCatalog(db, entries, { + source: 'local_batch_script', + preserveExistingIds: true, + enforceUniqueImages: true, + }); + + console.log('Rebuild finished successfully.'); + console.log(JSON.stringify(summary, null, 2)); + } finally { + await closeDatabase(db); + } +}; + +main().catch((error) => { + console.error('Failed to rebuild plants from local batches.'); + console.error(error instanceof Error ? error.stack || error.message : String(error)); + process.exit(1); +}); diff --git a/services/authService.ts b/services/authService.ts index 102f116..aa5ebc4 100644 --- a/services/authService.ts +++ b/services/authService.ts @@ -1,137 +1,137 @@ -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(); - -export interface AuthSession { - userId: number; // local SQLite id (for plants/settings queries) - serverUserId: string; // server-side user id (in JWT) - email: string; - name: string; - token: string; // JWT from server - loggedInAt: string; -} - -// ─── Internal helpers ────────────────────────────────────────────────────── - -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; - let response: Response; - try { - response = await fetch(url, { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify(body), - }); - } catch (e) { - if (!hasBackendUrl) { - throw new Error('BACKEND_URL_MISSING'); - } - throw new Error('NETWORK_ERROR'); - } - const data = await response.json().catch(() => ({})); - if (!response.ok) { - const code = (data as any).code || 'AUTH_ERROR'; - const msg = (data as any).message || ''; - console.warn(`[Auth] ${path} failed:`, response.status, code, msg); - throw new Error(code); - } - return data as any; -}; - -const buildSession = (data: { userId: string; email: string; name: string; token: string }): AuthSession => { - const localUser = AuthDb.ensureLocalUser(data.email, data.name); - return { - userId: localUser.id, - serverUserId: data.userId, - email: data.email, - name: data.name, - token: data.token, - loggedInAt: new Date().toISOString(), - }; -}; - -// ─── AuthService ─────────────────────────────────────────────────────────── - -export const AuthService = { - async getSession(): Promise { - try { - const raw = await SecureStore.getItemAsync(SESSION_KEY); - if (!raw) return null; - const parsed = JSON.parse(raw) as Partial; - if (!parsed.token || !parsed.serverUserId || !parsed.userId) { - await clearStoredSession(); - return null; - } - return parsed as AuthSession; - } catch { - await clearStoredSession(); - return null; - } - }, - - async signUp(email: string, name: string, password: string): Promise { - const data = await authPost('/auth/signup', { email, name, password }); - const session = buildSession(data); - await SecureStore.setItemAsync(SESSION_KEY, JSON.stringify(session)); - return session; - }, - - async login(email: string, password: string): Promise { - const data = await authPost('/auth/login', { email, password }); - const session = buildSession(data); - await SecureStore.setItemAsync(SESSION_KEY, JSON.stringify(session)); - return session; - }, - - async logout(): Promise { - await clearStoredSession(); - }, - - async updateSessionName(name: string): Promise { - const session = await this.getSession(); - if (!session) return; - 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}` }, - }); - if (response.status === 401 || response.status === 403) return 'invalid'; - return 'valid'; - } catch { - return 'unreachable'; - } - }, - - async checkIfFirstRun(): Promise { - const flag = await SecureStore.getItemAsync('greenlens_first_run_complete'); - return flag !== 'true'; - }, - - async markFirstRunComplete(): Promise { - await SecureStore.setItemAsync('greenlens_first_run_complete', 'true'); - }, - - async clearAllData(): Promise { - await clearStoredSession(); - await SecureStore.deleteItemAsync('greenlens_first_run_complete'); - // Note: SQLite tables aren't cleared here to avoid destroying user data - // without explicit consent, but session tokens are wiped. - }, -}; +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(); + +export interface AuthSession { + userId: number; // local SQLite id (for plants/settings queries) + serverUserId: string; // server-side user id (in JWT) + email: string; + name: string; + token: string; // JWT from server + loggedInAt: string; +} + +// ─── Internal helpers ────────────────────────────────────────────────────── + +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; + let response: Response; + try { + response = await fetch(url, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(body), + }); + } catch (e) { + if (!hasBackendUrl) { + throw new Error('BACKEND_URL_MISSING'); + } + throw new Error('NETWORK_ERROR'); + } + const data = await response.json().catch(() => ({})); + if (!response.ok) { + const code = (data as any).code || 'AUTH_ERROR'; + const msg = (data as any).message || ''; + console.warn(`[Auth] ${path} failed:`, response.status, code, msg); + throw new Error(code); + } + return data as any; +}; + +const buildSession = (data: { userId: string; email: string; name: string; token: string }): AuthSession => { + const localUser = AuthDb.ensureLocalUser(data.email, data.name); + return { + userId: localUser.id, + serverUserId: data.userId, + email: data.email, + name: data.name, + token: data.token, + loggedInAt: new Date().toISOString(), + }; +}; + +// ─── AuthService ─────────────────────────────────────────────────────────── + +export const AuthService = { + async getSession(): Promise { + try { + const raw = await SecureStore.getItemAsync(SESSION_KEY); + if (!raw) return null; + const parsed = JSON.parse(raw) as Partial; + if (!parsed.token || !parsed.serverUserId || !parsed.userId) { + await clearStoredSession(); + return null; + } + return parsed as AuthSession; + } catch { + await clearStoredSession(); + return null; + } + }, + + async signUp(email: string, name: string, password: string): Promise { + const data = await authPost('/auth/signup', { email, name, password }); + const session = buildSession(data); + await SecureStore.setItemAsync(SESSION_KEY, JSON.stringify(session)); + return session; + }, + + async login(email: string, password: string): Promise { + const data = await authPost('/auth/login', { email, password }); + const session = buildSession(data); + await SecureStore.setItemAsync(SESSION_KEY, JSON.stringify(session)); + return session; + }, + + async logout(): Promise { + await clearStoredSession(); + }, + + async updateSessionName(name: string): Promise { + const session = await this.getSession(); + if (!session) return; + 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}` }, + }); + if (response.status === 401 || response.status === 403) return 'invalid'; + return 'valid'; + } catch { + return 'unreachable'; + } + }, + + async checkIfFirstRun(): Promise { + const flag = await SecureStore.getItemAsync('greenlens_first_run_complete'); + return flag !== 'true'; + }, + + async markFirstRunComplete(): Promise { + await SecureStore.setItemAsync('greenlens_first_run_complete', 'true'); + }, + + async clearAllData(): Promise { + await clearStoredSession(); + await SecureStore.deleteItemAsync('greenlens_first_run_complete'); + // Note: SQLite tables aren't cleared here to avoid destroying user data + // without explicit consent, but session tokens are wiped. + }, +}; diff --git a/services/backend/backendApiClient.ts b/services/backend/backendApiClient.ts index d26cd8f..d6b2778 100644 --- a/services/backend/backendApiClient.ts +++ b/services/backend/backendApiClient.ts @@ -4,274 +4,303 @@ import { BillingSummary, HealthCheckResponse, PurchaseProductId, + RevenueCatCustomerInfo, ScanPlantResponse, SemanticSearchResponse, ServiceHealthResponse, SimulatedWebhookEvent, SimulatePurchaseResponse, 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; - -const mapHttpStatusToErrorCode = (status: number): BackendErrorCode => { - if (status === 400) return 'BAD_REQUEST'; - if (status === 401 || status === 403) return 'UNAUTHORIZED'; - if (status === 402) return 'INSUFFICIENT_CREDITS'; - if (status === 408 || status === 504) return 'TIMEOUT'; - return 'PROVIDER_ERROR'; -}; - -const buildBackendUrl = (path: string): string => { - const base = BACKEND_BASE_URL.replace(/\/$/, ''); - return `${base}${path}`; -}; - -const parseMaybeJson = (value: string): Record | null => { - if (!value) return null; - try { - return JSON.parse(value) as Record; - } catch { - return null; - } -}; - -const makeRequest = async ( - path: string, - options: { - method: 'GET' | 'POST'; - token: string; - idempotencyKey?: string; - body?: Record; - }, -): Promise => { - const controller = new AbortController(); - const timeout = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS); - - try { - const headers: Record = { - 'Content-Type': 'application/json', - 'Authorization': `Bearer ${options.token}`, - }; - if (options.idempotencyKey) { - headers['Idempotency-Key'] = options.idempotencyKey; - } - - const response = await fetch(buildBackendUrl(path), { - method: options.method, - headers, - body: options.body ? JSON.stringify(options.body) : undefined, - signal: controller.signal, - }); - - const rawText = await response.text(); - const jsonPayload = parseMaybeJson(rawText); - - if (!response.ok) { - const payloadCode = jsonPayload?.code; - const code = typeof payloadCode === 'string' - ? payloadCode as BackendErrorCode - : mapHttpStatusToErrorCode(response.status); - const payloadMessage = jsonPayload?.message; - const message = typeof payloadMessage === 'string' - ? payloadMessage - : `Backend request failed with status ${response.status}.`; - throw new BackendApiError(code, message, response.status, jsonPayload || undefined); - } - - if (jsonPayload == null) { - throw new BackendApiError('PROVIDER_ERROR', 'Backend returned invalid JSON.', 502); - } - - return jsonPayload as T; - } catch (error) { - if (error instanceof BackendApiError) throw error; - if (error instanceof Error && error.name === 'AbortError') { - throw new BackendApiError('TIMEOUT', 'Backend request timed out.', 408); - } - throw new BackendApiError('PROVIDER_ERROR', 'Backend request failed unexpectedly.', 500, { - detail: error instanceof Error ? error.message : String(error), - }); - } finally { - clearTimeout(timeout); - } -}; - -export const backendApiClient = { - getServiceHealth: async (): Promise => { - if (!BACKEND_BASE_URL) { - return { - ok: true, - uptimeSec: 0, - timestamp: new Date().toISOString(), - openAiConfigured: Boolean(process.env.EXPO_PUBLIC_OPENAI_API_KEY), - dbReady: true, - dbPath: 'in-app-mock-backend', - stripeConfigured: Boolean(process.env.EXPO_PUBLIC_STRIPE_PUBLISHABLE_KEY), - scanModel: (process.env.EXPO_PUBLIC_OPENAI_SCAN_MODEL || 'gpt-5').trim(), - healthModel: (process.env.EXPO_PUBLIC_OPENAI_HEALTH_MODEL || process.env.EXPO_PUBLIC_OPENAI_SCAN_MODEL || 'gpt-5').trim(), - }; - } - - const token = await getAuthToken(); - return makeRequest('/health', { - method: 'GET', - token, - }); - }, - +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; + +const mapHttpStatusToErrorCode = (status: number): BackendErrorCode => { + if (status === 400) return 'BAD_REQUEST'; + if (status === 401 || status === 403) return 'UNAUTHORIZED'; + if (status === 402) return 'INSUFFICIENT_CREDITS'; + if (status === 408 || status === 504) return 'TIMEOUT'; + return 'PROVIDER_ERROR'; +}; + +const buildBackendUrl = (path: string): string => { + const base = BACKEND_BASE_URL.replace(/\/$/, ''); + return `${base}${path}`; +}; + +const parseMaybeJson = (value: string): Record | null => { + if (!value) return null; + try { + return JSON.parse(value) as Record; + } catch { + return null; + } +}; + +const makeRequest = async ( + path: string, + options: { + method: 'GET' | 'POST'; + token: string; + idempotencyKey?: string; + body?: Record; + }, +): Promise => { + const controller = new AbortController(); + const timeout = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS); + + try { + const headers: Record = { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${options.token}`, + }; + if (options.idempotencyKey) { + headers['Idempotency-Key'] = options.idempotencyKey; + } + + const response = await fetch(buildBackendUrl(path), { + method: options.method, + headers, + body: options.body ? JSON.stringify(options.body) : undefined, + signal: controller.signal, + }); + + const rawText = await response.text(); + const jsonPayload = parseMaybeJson(rawText); + + if (!response.ok) { + const payloadCode = jsonPayload?.code; + const code = typeof payloadCode === 'string' + ? payloadCode as BackendErrorCode + : mapHttpStatusToErrorCode(response.status); + const payloadMessage = jsonPayload?.message; + const message = typeof payloadMessage === 'string' + ? payloadMessage + : `Backend request failed with status ${response.status}.`; + throw new BackendApiError(code, message, response.status, jsonPayload || undefined); + } + + if (jsonPayload == null) { + throw new BackendApiError('PROVIDER_ERROR', 'Backend returned invalid JSON.', 502); + } + + return jsonPayload as T; + } catch (error) { + if (error instanceof BackendApiError) throw error; + if (error instanceof Error && error.name === 'AbortError') { + throw new BackendApiError('TIMEOUT', 'Backend request timed out.', 408); + } + throw new BackendApiError('NETWORK_ERROR', 'No network connection.', 0, { + detail: error instanceof Error ? error.message : String(error), + }); + } finally { + clearTimeout(timeout); + } +}; + +export const backendApiClient = { + getServiceHealth: async (): Promise => { + if (!BACKEND_BASE_URL) { + return { + ok: true, + uptimeSec: 0, + timestamp: new Date().toISOString(), + openAiConfigured: Boolean(process.env.EXPO_PUBLIC_OPENAI_API_KEY), + dbReady: true, + dbPath: 'in-app-mock-backend', + stripeConfigured: Boolean(process.env.EXPO_PUBLIC_STRIPE_PUBLISHABLE_KEY), + scanModel: (process.env.EXPO_PUBLIC_OPENAI_SCAN_MODEL || 'gpt-5').trim(), + healthModel: (process.env.EXPO_PUBLIC_OPENAI_HEALTH_MODEL || process.env.EXPO_PUBLIC_OPENAI_SCAN_MODEL || 'gpt-5').trim(), + }; + } + + const token = await getAuthToken(); + return makeRequest('/health', { + method: 'GET', + token, + }); + }, + getBillingSummary: async (): Promise => { - const token = await getAuthToken(); - if (!BACKEND_BASE_URL) { - return mockBackendService.getBillingSummary(token); - } - + const token = await getAuthToken(); + if (!BACKEND_BASE_URL) { + return mockBackendService.getBillingSummary(token); + } + return makeRequest('/v1/billing/summary', { method: 'GET', token, }); }, + syncRevenueCatState: async (params: { + customerInfo: RevenueCatCustomerInfo; + }): Promise => { + const token = await getAuthToken(); + if (!BACKEND_BASE_URL) { + return mockBackendService.syncRevenueCatState({ + userId: token, + customerInfo: params.customerInfo, + }); + } + + return makeRequest('/v1/billing/sync-revenuecat', { + method: 'POST', + token, + body: { + customerInfo: params.customerInfo, + }, + }); + }, + scanPlant: async (params: { - idempotencyKey: string; - imageUri: string; - language: Language; - }): Promise => { - const token = await getAuthToken(); - if (!BACKEND_BASE_URL) { - return mockBackendService.scanPlant({ - userId: token, - idempotencyKey: params.idempotencyKey, - imageUri: params.imageUri, - language: params.language, - }); - } - - return makeRequest('/v1/scan', { - method: 'POST', - token, - idempotencyKey: params.idempotencyKey, - body: { - imageUri: params.imageUri, - language: params.language, - }, - }); - }, - - semanticSearch: async (params: { - idempotencyKey: string; - query: string; - language: Language; - }): Promise => { - const token = await getAuthToken(); - if (!BACKEND_BASE_URL) { - return mockBackendService.semanticSearch({ - userId: token, - idempotencyKey: params.idempotencyKey, - query: params.query, - language: params.language, - }); - } - - return makeRequest('/v1/search/semantic', { - method: 'POST', - token, - idempotencyKey: params.idempotencyKey, - body: { - query: params.query, - language: params.language, - }, - }); - }, - - runHealthCheck: async (params: { - idempotencyKey: string; - imageUri: string; - language: Language; - plantContext?: { - name: string; - botanicalName: string; - careInfo: CareInfo; - description?: string; - }; - }): Promise => { - const token = await getAuthToken(); - if (!BACKEND_BASE_URL) { - return mockBackendService.healthCheck({ - userId: token, - idempotencyKey: params.idempotencyKey, - imageUri: params.imageUri, - language: params.language, - plantContext: params.plantContext, - }); - } - - return makeRequest('/v1/health-check', { - method: 'POST', - token, - idempotencyKey: params.idempotencyKey, - body: { - imageUri: params.imageUri, - language: params.language, - plantContext: params.plantContext, - }, - }); - }, - - simulatePurchase: async (params: { - idempotencyKey: string; - productId: PurchaseProductId; - }): Promise => { - const token = await getAuthToken(); - if (!BACKEND_BASE_URL) { - return mockBackendService.simulatePurchase({ - userId: token, - idempotencyKey: params.idempotencyKey, - productId: params.productId, - }); - } - - return makeRequest('/v1/billing/simulate-purchase', { - method: 'POST', - token, - idempotencyKey: params.idempotencyKey, - body: { - productId: params.productId, - }, - }); - }, - - simulateWebhook: async (params: { - idempotencyKey: string; - event: SimulatedWebhookEvent; - payload?: { credits?: number }; - }): Promise => { - const token = await getAuthToken(); - if (!BACKEND_BASE_URL) { - return mockBackendService.simulateWebhook({ - userId: token, - idempotencyKey: params.idempotencyKey, - event: params.event, - payload: params.payload, - }); - } - - return makeRequest('/v1/billing/simulate-webhook', { - method: 'POST', - token, - idempotencyKey: params.idempotencyKey, - body: { - event: params.event, - payload: params.payload || {}, - }, - }); - }, -}; - -export const isInsufficientCreditsError = (error: unknown): boolean => { - return error instanceof BackendApiError && error.code === 'INSUFFICIENT_CREDITS'; -}; + idempotencyKey: string; + imageUri: string; + language: Language; + }): Promise => { + const token = await getAuthToken(); + if (!BACKEND_BASE_URL) { + return mockBackendService.scanPlant({ + userId: token, + idempotencyKey: params.idempotencyKey, + imageUri: params.imageUri, + language: params.language, + }); + } + + return makeRequest('/v1/scan', { + method: 'POST', + token, + idempotencyKey: params.idempotencyKey, + body: { + imageUri: params.imageUri, + language: params.language, + }, + }); + }, + + semanticSearch: async (params: { + idempotencyKey: string; + query: string; + language: Language; + }): Promise => { + const token = await getAuthToken(); + if (!BACKEND_BASE_URL) { + return mockBackendService.semanticSearch({ + userId: token, + idempotencyKey: params.idempotencyKey, + query: params.query, + language: params.language, + }); + } + + return makeRequest('/v1/search/semantic', { + method: 'POST', + token, + idempotencyKey: params.idempotencyKey, + body: { + query: params.query, + language: params.language, + }, + }); + }, + + runHealthCheck: async (params: { + idempotencyKey: string; + imageUri: string; + language: Language; + plantContext?: { + name: string; + botanicalName: string; + careInfo: CareInfo; + description?: string; + }; + }): Promise => { + const token = await getAuthToken(); + if (!BACKEND_BASE_URL) { + return mockBackendService.healthCheck({ + userId: token, + idempotencyKey: params.idempotencyKey, + imageUri: params.imageUri, + language: params.language, + plantContext: params.plantContext, + }); + } + + return makeRequest('/v1/health-check', { + method: 'POST', + token, + idempotencyKey: params.idempotencyKey, + body: { + imageUri: params.imageUri, + language: params.language, + plantContext: params.plantContext, + }, + }); + }, + + simulatePurchase: async (params: { + idempotencyKey: string; + productId: PurchaseProductId; + }): Promise => { + const token = await getAuthToken(); + if (!BACKEND_BASE_URL) { + return mockBackendService.simulatePurchase({ + userId: token, + idempotencyKey: params.idempotencyKey, + productId: params.productId, + }); + } + + return makeRequest('/v1/billing/simulate-purchase', { + method: 'POST', + token, + idempotencyKey: params.idempotencyKey, + body: { + productId: params.productId, + }, + }); + }, + + simulateWebhook: async (params: { + idempotencyKey: string; + event: SimulatedWebhookEvent; + payload?: { credits?: number }; + }): Promise => { + const token = await getAuthToken(); + if (!BACKEND_BASE_URL) { + return mockBackendService.simulateWebhook({ + userId: token, + idempotencyKey: params.idempotencyKey, + event: params.event, + payload: params.payload, + }); + } + + return makeRequest('/v1/billing/simulate-webhook', { + method: 'POST', + token, + idempotencyKey: params.idempotencyKey, + body: { + event: params.event, + payload: params.payload || {}, + }, + }); + }, +}; + +export const isInsufficientCreditsError = (error: unknown): boolean => { + return error instanceof BackendApiError && error.code === 'INSUFFICIENT_CREDITS'; +}; + +export const isNetworkError = (error: unknown): boolean => { + return ( + error instanceof BackendApiError && + (error.code === 'NETWORK_ERROR' || error.code === 'TIMEOUT') + ); +}; diff --git a/services/backend/contracts.ts b/services/backend/contracts.ts index 57162f6..4042abf 100644 --- a/services/backend/contracts.ts +++ b/services/backend/contracts.ts @@ -1,156 +1,186 @@ -import { CareInfo, IdentificationResult, Language, PlantHealthCheck } from '../../types'; - -export type PlanId = 'free' | 'pro'; -export type BillingProvider = 'mock' | 'revenuecat' | 'stripe'; -export type PurchaseProductId = 'monthly_pro' | 'yearly_pro' | 'topup_small' | 'topup_medium' | 'topup_large'; -export type SimulatedWebhookEvent = - | 'entitlement_granted' - | 'entitlement_revoked' - | 'topup_granted' - | 'credits_depleted'; - -export interface BackendDatabaseEntry extends IdentificationResult { - imageUri: string; - imageStatus?: 'ok' | 'missing' | 'invalid'; - categories: string[]; -} - -export interface CreditState { - monthlyAllowance: number; - usedThisCycle: number; - topupBalance: number; - available: number; - cycleStartedAt: string; - cycleEndsAt: string; -} - -export interface EntitlementState { - plan: PlanId; - provider: BillingProvider; - status: 'active' | 'inactive'; - renewsAt: string | null; -} - +import { CareInfo, IdentificationResult, Language, PlantHealthCheck } from '../../types'; + +export type PlanId = 'free' | 'pro'; +export type BillingProvider = 'mock' | 'revenuecat' | 'stripe'; +export type PurchaseProductId = 'monthly_pro' | 'yearly_pro' | 'topup_small' | 'topup_medium' | 'topup_large'; +export type SimulatedWebhookEvent = + | 'entitlement_granted' + | 'entitlement_revoked' + | 'topup_granted' + | 'credits_depleted'; + +export interface BackendDatabaseEntry extends IdentificationResult { + imageUri: string; + imageStatus?: 'ok' | 'missing' | 'invalid'; + categories: string[]; +} + +export interface CreditState { + monthlyAllowance: number; + usedThisCycle: number; + topupBalance: number; + available: number; + cycleStartedAt: string; + cycleEndsAt: string; +} + +export interface EntitlementState { + plan: PlanId; + provider: BillingProvider; + status: 'active' | 'inactive'; + renewsAt: string | null; +} + export interface BillingSummary { entitlement: EntitlementState; credits: CreditState; availableProducts: PurchaseProductId[]; } -export interface ScanPlantRequest { - userId: string; - idempotencyKey: string; - imageUri: string; - language: Language; +export interface RevenueCatEntitlementInfo { + productIdentifier?: string; + expirationDate?: string | null; + expiresDate?: string | null; } -export interface ScanPlantResponse { - result: IdentificationResult; - creditsCharged: number; - modelPath: string[]; - modelUsed?: string | null; - modelFallbackCount?: number; - billing: BillingSummary; +export interface RevenueCatNonSubscriptionTransaction { + productIdentifier?: string; + transactionIdentifier?: string; + transactionId?: string; + purchaseDate?: string | null; } -export interface SemanticSearchRequest { - userId: string; - idempotencyKey: string; - query: string; - language: Language; -} - -export interface SemanticSearchResponse { - status: 'success' | 'no_results'; - results: BackendDatabaseEntry[]; - creditsCharged: number; - billing: BillingSummary; -} - -export interface HealthCheckRequest { - userId: string; - idempotencyKey: string; - imageUri: string; - language: Language; - plantContext?: { - name: string; - botanicalName: string; - careInfo: CareInfo; - description?: string; +export interface RevenueCatCustomerInfo { + appUserId?: string | null; + originalAppUserId?: string | null; + entitlements: { + active: Record; }; + nonSubscriptions?: Record; + allPurchasedProductIdentifiers?: string[]; + latestExpirationDate?: string | null; } - -export interface HealthCheckResponse { - healthCheck: PlantHealthCheck; - creditsCharged: number; - modelUsed?: string | null; - modelFallbackCount?: number; - billing: BillingSummary; -} - -export interface ServiceHealthResponse { - ok: boolean; - uptimeSec: number; - timestamp: string; - openAiConfigured: boolean; - dbReady?: boolean; - dbPath?: string; - stripeConfigured?: boolean; - scanModel?: string; - healthModel?: string; -} - -export interface SimulatePurchaseRequest { - userId: string; - idempotencyKey: string; - productId: PurchaseProductId; -} - -export interface SimulatePurchaseResponse { - appliedProduct: PurchaseProductId; - billing: BillingSummary; -} - -export interface SimulateWebhookRequest { - userId: string; - idempotencyKey: string; - event: SimulatedWebhookEvent; - payload?: { - credits?: number; - }; -} - + +export interface ScanPlantRequest { + userId: string; + idempotencyKey: string; + imageUri: string; + language: Language; +} + +export interface ScanPlantResponse { + result: IdentificationResult; + creditsCharged: number; + modelPath: string[]; + modelUsed?: string | null; + modelFallbackCount?: number; + billing: BillingSummary; +} + +export interface SemanticSearchRequest { + userId: string; + idempotencyKey: string; + query: string; + language: Language; +} + +export interface SemanticSearchResponse { + status: 'success' | 'no_results'; + results: BackendDatabaseEntry[]; + creditsCharged: number; + billing: BillingSummary; +} + +export interface HealthCheckRequest { + userId: string; + idempotencyKey: string; + imageUri: string; + language: Language; + plantContext?: { + name: string; + botanicalName: string; + careInfo: CareInfo; + description?: string; + }; +} + +export interface HealthCheckResponse { + healthCheck: PlantHealthCheck; + creditsCharged: number; + modelUsed?: string | null; + modelFallbackCount?: number; + billing: BillingSummary; +} + +export interface ServiceHealthResponse { + ok: boolean; + uptimeSec: number; + timestamp: string; + openAiConfigured: boolean; + dbReady?: boolean; + dbPath?: string; + stripeConfigured?: boolean; + scanModel?: string; + healthModel?: string; +} + +export interface SimulatePurchaseRequest { + userId: string; + idempotencyKey: string; + productId: PurchaseProductId; +} + +export interface SimulatePurchaseResponse { + appliedProduct: PurchaseProductId; + billing: BillingSummary; +} + +export interface SimulateWebhookRequest { + userId: string; + idempotencyKey: string; + event: SimulatedWebhookEvent; + payload?: { + credits?: number; + }; +} + export interface SimulateWebhookResponse { event: SimulatedWebhookEvent; billing: BillingSummary; } -export type BackendErrorCode = - | 'INSUFFICIENT_CREDITS' - | 'UNAUTHORIZED' - | 'TIMEOUT' - | 'PROVIDER_ERROR' - | 'BAD_REQUEST'; - -export class BackendApiError extends Error { - public readonly code: BackendErrorCode; - public readonly status: number; - public readonly metadata?: Record; - - constructor( - code: BackendErrorCode, - message: string, - status = 500, - metadata?: Record, - ) { - super(message); - this.name = 'BackendApiError'; - this.code = code; - this.status = status; - this.metadata = metadata; - } +export interface SyncRevenueCatStateResponse { + billing: BillingSummary; + syncedAt: string; } - -export const isBackendApiError = (error: unknown): error is BackendApiError => { - return error instanceof BackendApiError; -}; + +export type BackendErrorCode = + | 'INSUFFICIENT_CREDITS' + | 'UNAUTHORIZED' + | 'TIMEOUT' + | 'NETWORK_ERROR' + | 'PROVIDER_ERROR' + | 'BAD_REQUEST'; + +export class BackendApiError extends Error { + public readonly code: BackendErrorCode; + public readonly status: number; + public readonly metadata?: Record; + + constructor( + code: BackendErrorCode, + message: string, + status = 500, + metadata?: Record, + ) { + super(message); + this.name = 'BackendApiError'; + this.code = code; + this.status = status; + this.metadata = metadata; + } +} + +export const isBackendApiError = (error: unknown): error is BackendApiError => { + return error instanceof BackendApiError; +}; diff --git a/services/backend/mockBackendService.ts b/services/backend/mockBackendService.ts index 1d94b18..49931a8 100644 --- a/services/backend/mockBackendService.ts +++ b/services/backend/mockBackendService.ts @@ -1,12 +1,14 @@ -import AsyncStorage from '@react-native-async-storage/async-storage'; -import { - BackendApiError, - BillingProvider, - BillingSummary, +import AsyncStorage from '@react-native-async-storage/async-storage'; +import { + BackendApiError, + BillingProvider, + BillingSummary, HealthCheckRequest, HealthCheckResponse, PlanId, PurchaseProductId, + RevenueCatCustomerInfo, + RevenueCatNonSubscriptionTransaction, ScanPlantRequest, ScanPlantResponse, SemanticSearchRequest, @@ -15,30 +17,31 @@ import { SimulatePurchaseResponse, SimulateWebhookRequest, SimulateWebhookResponse, + SyncRevenueCatStateResponse, isBackendApiError, } from './contracts'; -import { getMockPlantByImage, searchMockCatalog } from './mockCatalog'; -import { openAiScanService } from './openAiScanService'; -import { IdentificationResult, PlantHealthCheck } from '../../types'; - -const MOCK_ACCOUNT_STORE_KEY = 'greenlens_mock_backend_accounts_v1'; -const MOCK_IDEMPOTENCY_STORE_KEY = 'greenlens_mock_backend_idempotency_v1'; - -const FREE_MONTHLY_CREDITS = 15; -const GUEST_TRIAL_CREDITS = 5; -const PRO_MONTHLY_CREDITS = 250; - -const SCAN_PRIMARY_COST = 1; -const SCAN_REVIEW_COST = 1; -const SEMANTIC_SEARCH_COST = 2; -const HEALTH_CHECK_COST = 2; - -const LOW_CONFIDENCE_REVIEW_THRESHOLD = 0.8; -const FREE_SIMULATED_DELAY_MS = 1100; -const PRO_SIMULATED_DELAY_MS = 280; - -const TOPUP_DEFAULT_CREDITS = 60; - +import { getMockPlantByImage, searchMockCatalog } from './mockCatalog'; +import { openAiScanService } from './openAiScanService'; +import { IdentificationResult, PlantHealthCheck } from '../../types'; + +const MOCK_ACCOUNT_STORE_KEY = 'greenlens_mock_backend_accounts_v1'; +const MOCK_IDEMPOTENCY_STORE_KEY = 'greenlens_mock_backend_idempotency_v1'; + +const FREE_MONTHLY_CREDITS = 15; +const GUEST_TRIAL_CREDITS = 5; +const PRO_MONTHLY_CREDITS = 250; + +const SCAN_PRIMARY_COST = 1; +const SCAN_REVIEW_COST = 1; +const SEMANTIC_SEARCH_COST = 2; +const HEALTH_CHECK_COST = 2; + +const LOW_CONFIDENCE_REVIEW_THRESHOLD = 0.8; +const FREE_SIMULATED_DELAY_MS = 1100; +const PRO_SIMULATED_DELAY_MS = 280; + +const TOPUP_DEFAULT_CREDITS = 60; + const TOPUP_CREDITS_BY_PRODUCT: Record = { monthly_pro: 0, yearly_pro: 0, @@ -47,585 +50,594 @@ const TOPUP_CREDITS_BY_PRODUCT: Record = { topup_large: 200, }; -interface MockAccountRecord { - userId: string; - plan: PlanId; - provider: BillingProvider; - cycleStartedAt: string; - cycleEndsAt: string; - monthlyAllowance: number; - usedThisCycle: number; - topupBalance: number; - renewsAt: string | null; - updatedAt: string; -} - -interface IdempotencyRecord { - response: unknown; - createdAt: string; -} - -type AccountStore = Record; -type IdempotencyStore = Record; - -const userLocks = new Map>(); - -const nowIso = (): string => new Date().toISOString(); - -const startOfUtcMonth = (date: Date): Date => { - return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), 1, 0, 0, 0, 0)); -}; - -const addUtcMonths = (date: Date, months: number): Date => { - return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth() + months, 1, 0, 0, 0, 0)); -}; - -const addDays = (date: Date, days: number): Date => { - const result = new Date(date.getTime()); - result.setUTCDate(result.getUTCDate() + days); - return result; -}; - -const getCycleBounds = (now: Date) => { - const cycleStartedAt = startOfUtcMonth(now); - const cycleEndsAt = addUtcMonths(cycleStartedAt, 1); - return { cycleStartedAt, cycleEndsAt }; -}; - -const getMonthlyAllowanceForPlan = (plan: PlanId, userId?: string): number => { - if (userId === 'guest') return GUEST_TRIAL_CREDITS; - return plan === 'pro' ? PRO_MONTHLY_CREDITS : FREE_MONTHLY_CREDITS; -}; - -const getSimulatedDelay = (plan: PlanId): number => { - return plan === 'pro' ? PRO_SIMULATED_DELAY_MS : FREE_SIMULATED_DELAY_MS; -}; - -const sleep = async (ms: number): Promise => { - if (ms <= 0) return; - await new Promise(resolve => setTimeout(resolve, ms)); -}; - -const withUserLock = async (userId: string, worker: () => Promise): Promise => { - const previousLock = userLocks.get(userId) || Promise.resolve(); - let releaseLock: () => void = () => {}; - const activeLock = new Promise((resolve) => { - releaseLock = resolve; - }); - userLocks.set(userId, activeLock); - - await previousLock; - try { - return await worker(); - } finally { - releaseLock(); - if (userLocks.get(userId) === activeLock) { - userLocks.delete(userId); - } - } -}; - -const readJson = async (key: string, fallbackValue: T): Promise => { - try { - const raw = await AsyncStorage.getItem(key); - if (!raw) return fallbackValue; - return JSON.parse(raw) as T; - } catch (error) { - console.error(`Failed to read mock backend key ${key}`, error); - return fallbackValue; - } -}; - -const writeJson = async (key: string, value: T): Promise => { - try { - await AsyncStorage.setItem(key, JSON.stringify(value)); - } catch (error) { - console.error(`Failed to write mock backend key ${key}`, error); - } -}; - -const loadStores = async (): Promise<{ accounts: AccountStore; idempotency: IdempotencyStore }> => { - const [accounts, idempotency] = await Promise.all([ - readJson(MOCK_ACCOUNT_STORE_KEY, {}), - readJson(MOCK_IDEMPOTENCY_STORE_KEY, {}), - ]); - return { accounts, idempotency }; -}; - -const persistStores = async (stores: { accounts: AccountStore; idempotency: IdempotencyStore }): Promise => { - await Promise.all([ - writeJson(MOCK_ACCOUNT_STORE_KEY, stores.accounts), - writeJson(MOCK_IDEMPOTENCY_STORE_KEY, stores.idempotency), - ]); -}; - -const buildDefaultAccount = (userId: string, now: Date): MockAccountRecord => { - const { cycleStartedAt, cycleEndsAt } = getCycleBounds(now); - const allowance = getMonthlyAllowanceForPlan('free', userId); - return { - userId, - plan: 'free', - provider: 'mock', - cycleStartedAt: cycleStartedAt.toISOString(), - cycleEndsAt: cycleEndsAt.toISOString(), - monthlyAllowance: allowance, - usedThisCycle: 0, - topupBalance: 0, - renewsAt: null, - updatedAt: nowIso(), - }; -}; - -const alignAccountToCurrentCycle = (account: MockAccountRecord, now: Date): MockAccountRecord => { - const next = { ...account }; - const expectedMonthlyAllowance = getMonthlyAllowanceForPlan(next.plan, next.userId); - if (next.monthlyAllowance !== expectedMonthlyAllowance) { - next.monthlyAllowance = expectedMonthlyAllowance; - } - - if (!next.renewsAt && next.plan === 'pro' && next.provider === 'mock') { - 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 getOrCreateAccount = (stores: { accounts: AccountStore }, userId: string): MockAccountRecord => { - const now = new Date(); - const existing = stores.accounts[userId] || buildDefaultAccount(userId, now); - const aligned = alignAccountToCurrentCycle(existing, now); - stores.accounts[userId] = aligned; - return aligned; -}; - -const getAvailableCredits = (account: MockAccountRecord): number => { - const monthlyRemaining = Math.max(0, account.monthlyAllowance - account.usedThisCycle); - return monthlyRemaining + Math.max(0, account.topupBalance); -}; - +const REVENUECAT_PRO_ENTITLEMENT_ID = (process.env.EXPO_PUBLIC_REVENUECAT_PRO_ENTITLEMENT_ID || 'pro').trim() || 'pro'; + +interface MockAccountRecord { + userId: string; + plan: PlanId; + provider: BillingProvider; + cycleStartedAt: string; + cycleEndsAt: string; + monthlyAllowance: number; + usedThisCycle: number; + topupBalance: number; + renewsAt: string | null; + updatedAt: string; +} + +interface IdempotencyRecord { + response: unknown; + createdAt: string; +} + +type AccountStore = Record; +type IdempotencyStore = Record; + +const userLocks = new Map>(); + +const nowIso = (): string => new Date().toISOString(); + +const startOfUtcMonth = (date: Date): Date => { + return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), 1, 0, 0, 0, 0)); +}; + +const addUtcMonths = (date: Date, months: number): Date => { + return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth() + months, 1, 0, 0, 0, 0)); +}; + +const addDays = (date: Date, days: number): Date => { + const result = new Date(date.getTime()); + result.setUTCDate(result.getUTCDate() + days); + return result; +}; + +const getCycleBounds = (now: Date) => { + const cycleStartedAt = startOfUtcMonth(now); + const cycleEndsAt = addUtcMonths(cycleStartedAt, 1); + return { cycleStartedAt, cycleEndsAt }; +}; + +const getMonthlyAllowanceForPlan = (plan: PlanId, userId?: string): number => { + if (userId === 'guest') return GUEST_TRIAL_CREDITS; + return plan === 'pro' ? PRO_MONTHLY_CREDITS : FREE_MONTHLY_CREDITS; +}; + +const getSimulatedDelay = (plan: PlanId): number => { + return plan === 'pro' ? PRO_SIMULATED_DELAY_MS : FREE_SIMULATED_DELAY_MS; +}; + +const sleep = async (ms: number): Promise => { + if (ms <= 0) return; + await new Promise(resolve => setTimeout(resolve, ms)); +}; + +const withUserLock = async (userId: string, worker: () => Promise): Promise => { + const previousLock = userLocks.get(userId) || Promise.resolve(); + let releaseLock: () => void = () => {}; + const activeLock = new Promise((resolve) => { + releaseLock = resolve; + }); + userLocks.set(userId, activeLock); + + await previousLock; + try { + return await worker(); + } finally { + releaseLock(); + if (userLocks.get(userId) === activeLock) { + userLocks.delete(userId); + } + } +}; + +const readJson = async (key: string, fallbackValue: T): Promise => { + try { + const raw = await AsyncStorage.getItem(key); + if (!raw) return fallbackValue; + return JSON.parse(raw) as T; + } catch (error) { + console.error(`Failed to read mock backend key ${key}`, error); + return fallbackValue; + } +}; + +const writeJson = async (key: string, value: T): Promise => { + try { + await AsyncStorage.setItem(key, JSON.stringify(value)); + } catch (error) { + console.error(`Failed to write mock backend key ${key}`, error); + } +}; + +const loadStores = async (): Promise<{ accounts: AccountStore; idempotency: IdempotencyStore }> => { + const [accounts, idempotency] = await Promise.all([ + readJson(MOCK_ACCOUNT_STORE_KEY, {}), + readJson(MOCK_IDEMPOTENCY_STORE_KEY, {}), + ]); + return { accounts, idempotency }; +}; + +const persistStores = async (stores: { accounts: AccountStore; idempotency: IdempotencyStore }): Promise => { + await Promise.all([ + writeJson(MOCK_ACCOUNT_STORE_KEY, stores.accounts), + writeJson(MOCK_IDEMPOTENCY_STORE_KEY, stores.idempotency), + ]); +}; + +const buildDefaultAccount = (userId: string, now: Date): MockAccountRecord => { + const { cycleStartedAt, cycleEndsAt } = getCycleBounds(now); + const allowance = getMonthlyAllowanceForPlan('free', userId); + return { + userId, + plan: 'free', + provider: 'mock', + cycleStartedAt: cycleStartedAt.toISOString(), + cycleEndsAt: cycleEndsAt.toISOString(), + monthlyAllowance: allowance, + usedThisCycle: 0, + topupBalance: 0, + renewsAt: null, + updatedAt: nowIso(), + }; +}; + +const alignAccountToCurrentCycle = (account: MockAccountRecord, now: Date): MockAccountRecord => { + const next = { ...account }; + const expectedMonthlyAllowance = getMonthlyAllowanceForPlan(next.plan, next.userId); + if (next.monthlyAllowance !== expectedMonthlyAllowance) { + next.monthlyAllowance = expectedMonthlyAllowance; + } + + if (!next.renewsAt && next.plan === 'pro' && next.provider === 'mock') { + 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 getOrCreateAccount = (stores: { accounts: AccountStore }, userId: string): MockAccountRecord => { + const now = new Date(); + const existing = stores.accounts[userId] || buildDefaultAccount(userId, now); + const aligned = alignAccountToCurrentCycle(existing, now); + stores.accounts[userId] = aligned; + return aligned; +}; + +const getAvailableCredits = (account: MockAccountRecord): number => { + const monthlyRemaining = Math.max(0, account.monthlyAllowance - account.usedThisCycle); + return monthlyRemaining + Math.max(0, account.topupBalance); +}; + const buildBillingSummary = (account: MockAccountRecord): BillingSummary => { return { entitlement: { plan: account.plan, provider: account.provider, - status: 'active', + 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: ['monthly_pro', 'yearly_pro', 'topup_small', 'topup_medium', 'topup_large'], + credits: { + monthlyAllowance: account.monthlyAllowance, + usedThisCycle: account.usedThisCycle, + topupBalance: account.topupBalance, + available: getAvailableCredits(account), + cycleStartedAt: account.cycleStartedAt, + cycleEndsAt: account.cycleEndsAt, + }, + availableProducts: ['monthly_pro', 'yearly_pro', 'topup_small', 'topup_medium', 'topup_large'], }; }; -const readIdempotentResponse = (store: IdempotencyStore, key: string): T | null => { - const record = store[key]; - if (!record) return null; - return record.response as T; +const normalizeRevenueCatTransactions = ( + customerInfo: RevenueCatCustomerInfo, +): RevenueCatNonSubscriptionTransaction[] => { + const nonSubscriptions = customerInfo?.nonSubscriptions || {}; + return Object.values(nonSubscriptions).flatMap((entries) => Array.isArray(entries) ? entries : []); }; - -const writeIdempotentResponse = (store: IdempotencyStore, key: string, value: T): void => { - store[key] = { - response: value, - createdAt: nowIso(), - }; -}; - -const consumeCredits = (account: MockAccountRecord, cost: number): number => { - if (cost <= 0) return 0; - - const available = getAvailableCredits(account); - if (available < cost) { - throw new BackendApiError( - 'INSUFFICIENT_CREDITS', - `Insufficient credits. Required ${cost}, available ${available}.`, - 402, - { required: 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 consumeCreditsWithIdempotency = ( - account: MockAccountRecord, - idempotencyStore: IdempotencyStore, - key: string, - cost: number, -): number => { - const existing = readIdempotentResponse<{ charged: number }>(idempotencyStore, key); - if (existing) return existing.charged; - - const charged = consumeCredits(account, cost); - writeIdempotentResponse(idempotencyStore, key, { charged }); - return charged; -}; - -const endpointKey = (scope: string, userId: string, idempotencyKey: string): string => { - return `endpoint:${scope}:${userId}:${idempotencyKey}`; -}; - -const chargeKey = (scope: string, userId: string, idempotencyKey: string): string => { - return `charge:${scope}:${userId}:${idempotencyKey}`; -}; - -const hashString = (value: string): number => { - let hash = 0; - for (let i = 0; i < value.length; i += 1) { - hash = ((hash << 5) - hash + value.charCodeAt(i)) | 0; - } - return Math.abs(hash); -}; - -const clampConfidence = (value: number): number => { - return Math.max(0.05, Math.min(0.99, Number(value.toFixed(2)))); -}; - -const buildMockHealthCheck = (request: HealthCheckRequest, creditsCharged: number): PlantHealthCheck => { - const source = [ - request.imageUri, - request.plantContext?.name || '', - request.plantContext?.botanicalName || '', - request.plantContext?.careInfo?.light || '', - request.plantContext?.careInfo?.temp || '', - ].join('|'); - const hash = hashString(source); - const score = 40 + (hash % 56); - - const status: PlantHealthCheck['status'] = score >= 75 - ? 'healthy' - : score >= 55 - ? 'watch' - : 'critical'; - - const confidenceBase = 0.45 + ((hash % 20) / 100); - const confidenceMid = 0.35 + (((hash >> 2) % 20) / 100); - const confidenceLow = 0.25 + (((hash >> 4) % 20) / 100); - - if (request.language === 'de') { - const likelyIssues = status === 'critical' - ? [ - { - title: 'Moegliche Ueberwaesserung', - confidence: clampConfidence(confidenceBase + 0.22), - details: 'Gelbe, weiche Blaetter koennen auf zu nasse Erde hindeuten.', - }, - { - title: 'Wurzelstress', - confidence: clampConfidence(confidenceMid + 0.15), - details: 'Pruefe, ob das Substrat verdichtet ist oder unangenehm riecht.', - }, - { - title: 'Lichtmangel', - confidence: clampConfidence(confidenceLow + 0.1), - details: 'Zu wenig Licht kann zu Vergilbung und schwaecherem Wuchs fuehren.', - }, - ] - : status === 'watch' - ? [ - { - title: 'Leichter Naehrstoffmangel', - confidence: clampConfidence(confidenceBase), - details: 'Ein Teil der Vergilbung kann durch fehlende Naehrstoffe entstehen.', - }, - { - title: 'Unregelmaessiges Giessen', - confidence: clampConfidence(confidenceMid), - details: 'Zu grosse Schwankungen zwischen trocken und sehr nass belasten die Pflanze.', - }, - { - title: 'Standortstress', - confidence: clampConfidence(confidenceLow), - details: 'Zugluft oder haeufige Standortwechsel koennen Blattreaktionen ausloesen.', - }, - ] - : [ - { - title: 'Leichte Lichtanpassung noetig', - confidence: clampConfidence(confidenceBase - 0.1), - details: 'Einige Blaetter zeigen milde Stressanzeichen, insgesamt wirkt die Pflanze stabil.', - }, - { - title: 'Naechsten Duengertermin beobachten', - confidence: clampConfidence(confidenceMid - 0.1), - details: 'Bei weiterem Vergilben Duengung in kleiner Dosis einplanen.', - }, - { - title: 'Normale Blattalterung', - confidence: clampConfidence(confidenceLow - 0.05), - details: 'Aeltere untere Blaetter duerfen gelegentlich gelb werden.', - }, - ]; - - const actionsNow = status === 'critical' - ? [ - 'Giessen fuer 3-5 Tage pausieren und Feuchtigkeit tief im Topf pruefen.', - 'Gelbe oder matschige Blaetter sauber entfernen.', - 'Topf auf gute Drainage pruefen; stehendes Wasser sofort entfernen.', - ] - : status === 'watch' - ? [ - 'Giessrhythmus fuer die naechsten 7 Tage konsistent halten.', - 'Pflanze heller, aber ohne harte Mittagssonne stellen.', - 'Auf Schaedlinge an Blattunterseiten kontrollieren.', - ] - : [ - 'Aktuellen Pflegeplan beibehalten.', - 'Nur bei deutlich trockener Erde giessen.', - 'Gelbe Altblaetter nach Bedarf entfernen.', - ]; - - const plan7Days = status === 'critical' - ? [ - 'Tag 1: Feuchtigkeit messen und Uebertopf entleeren.', - 'Tag 3: Blattfarbe und Festigkeit erneut pruefen.', - 'Tag 5: Bei nasser Erde Umtopfen mit luftiger Mischung erwaegen.', - 'Tag 7: Neuen Foto-Health-Check ausfuehren.', - ] - : [ - 'Tag 1: Standort und Lichtdauer notieren.', - 'Tag 3: Leichte Drehung fuer gleichmaessigen Wuchs.', - 'Tag 5: Bodenfeuchte vor Giessen kontrollieren.', - 'Tag 7: Vergleichsfoto erstellen.', - ]; - - return { - generatedAt: nowIso(), - overallHealthScore: score, - status, - likelyIssues, - actionsNow, - plan7Days, - creditsCharged, - imageUri: request.imageUri, - }; - } - - if (request.language === 'es') { - const likelyIssues = status === 'critical' - ? [ - { - title: 'Posible exceso de riego', - confidence: clampConfidence(confidenceBase + 0.22), - details: 'Hojas amarillas y blandas pueden indicar demasiada humedad.', - }, - { - title: 'Estres de raiz', - confidence: clampConfidence(confidenceMid + 0.15), - details: 'Revisa si el sustrato esta compacto o con mal olor.', - }, - { - title: 'Falta de luz', - confidence: clampConfidence(confidenceLow + 0.1), - details: 'La luz insuficiente puede causar amarilleo y crecimiento lento.', - }, - ] - : status === 'watch' - ? [ - { - title: 'Deficit leve de nutrientes', - confidence: clampConfidence(confidenceBase), - details: 'Parte del amarilleo puede venir de nutricion insuficiente.', - }, - { - title: 'Riego irregular', - confidence: clampConfidence(confidenceMid), - details: 'Cambios bruscos entre seco y muy humedo estresan la planta.', - }, - { - title: 'Estres de ubicacion', - confidence: clampConfidence(confidenceLow), - details: 'Corrientes de aire o cambios frecuentes pueden afectar las hojas.', - }, - ] - : [ - { - title: 'Ajuste suave de luz', - confidence: clampConfidence(confidenceBase - 0.1), - details: 'Se observan signos leves, pero el estado general es bueno.', - }, - { - title: 'Monitorear fertilizacion', - confidence: clampConfidence(confidenceMid - 0.1), - details: 'Si continua el amarilleo, aplicar dosis pequena de fertilizante.', - }, - { - title: 'Envejecimiento normal', - confidence: clampConfidence(confidenceLow - 0.05), - details: 'Hojas inferiores viejas pueden amarillear de forma natural.', - }, - ]; - - const actionsNow = status === 'critical' - ? [ - 'Pausar riego 3-5 dias y comprobar humedad profunda.', - 'Retirar hojas amarillas o blandas con herramienta limpia.', - 'Verificar drenaje y eliminar agua acumulada.', - ] - : status === 'watch' - ? [ - 'Mantener riego estable durante 7 dias.', - 'Mover a una zona mas luminosa sin sol fuerte directo.', - 'Revisar plagas en el reverso de las hojas.', - ] - : [ - 'Mantener rutina actual de cuidado.', - 'Regar solo cuando el sustrato este claramente seco.', - 'Retirar hojas amarillas antiguas si hace falta.', - ]; - - const plan7Days = status === 'critical' - ? [ - 'Dia 1: Medir humedad y vaciar agua retenida.', - 'Dia 3: Revisar color y firmeza de hojas.', - 'Dia 5: Si sigue muy humedo, considerar trasplante con mezcla aireada.', - 'Dia 7: Repetir health-check con foto nueva.', - ] - : [ - 'Dia 1: Registrar ubicacion y horas de luz.', - 'Dia 3: Girar planta ligeramente para crecimiento uniforme.', - 'Dia 5: Comprobar humedad antes de regar.', - 'Dia 7: Tomar foto de comparacion.', - ]; - - return { - generatedAt: nowIso(), - overallHealthScore: score, - status, - likelyIssues, - actionsNow, - plan7Days, - creditsCharged, - imageUri: request.imageUri, - }; - } - - const likelyIssues = status === 'critical' - ? [ - { - title: 'Possible overwatering', - confidence: clampConfidence(confidenceBase + 0.22), - details: 'Yellow and soft leaves can indicate excess moisture.', - }, - { - title: 'Root stress', - confidence: clampConfidence(confidenceMid + 0.15), - details: 'Check if the substrate is compacted or has a sour smell.', - }, - { - title: 'Low light stress', - confidence: clampConfidence(confidenceLow + 0.1), - details: 'Insufficient light can trigger yellowing and slower growth.', - }, - ] - : status === 'watch' - ? [ - { - title: 'Mild nutrient deficiency', - confidence: clampConfidence(confidenceBase), - details: 'Part of the yellowing may come from missing nutrients.', - }, - { - title: 'Inconsistent watering', - confidence: clampConfidence(confidenceMid), - details: 'Large swings between dry and wet can stress foliage.', - }, - { - title: 'Placement stress', - confidence: clampConfidence(confidenceLow), - details: 'Drafts or frequent location changes can affect leaves.', - }, - ] - : [ - { - title: 'Minor light adjustment', - confidence: clampConfidence(confidenceBase - 0.1), - details: 'Mild stress signs are present, but overall condition looks stable.', - }, - { - title: 'Monitor next feeding', - confidence: clampConfidence(confidenceMid - 0.1), - details: 'If yellowing continues, apply a light fertilizer dose.', - }, - { - title: 'Normal leaf aging', - confidence: clampConfidence(confidenceLow - 0.05), - details: 'Older lower leaves can yellow naturally over time.', - }, - ]; - - const actionsNow = status === 'critical' - ? [ - 'Pause watering for 3-5 days and check deep soil moisture.', - 'Remove yellow or mushy leaves with clean tools.', - 'Ensure good drainage and empty standing water.', - ] - : status === 'watch' - ? [ - 'Keep watering schedule stable for 7 days.', - 'Move to brighter indirect light.', - 'Inspect leaf undersides for pests.', - ] - : [ - 'Keep the current care routine.', - 'Water only when soil is clearly dry.', - 'Trim older yellow leaves if needed.', - ]; - - const plan7Days = status === 'critical' - ? [ - 'Day 1: Check moisture and remove excess water.', - 'Day 3: Re-check leaf color and firmness.', - 'Day 5: If still soggy, repot into an airy mix.', - 'Day 7: Run another health-check photo.', - ] - : [ - 'Day 1: Note light duration and placement.', - 'Day 3: Rotate plant slightly for even growth.', - 'Day 5: Check soil moisture before watering.', - 'Day 7: Take a comparison photo.', - ]; - - return { - generatedAt: nowIso(), - overallHealthScore: score, - status, - likelyIssues, - actionsNow, - plan7Days, - creditsCharged, - imageUri: request.imageUri, - }; -}; - + +const readIdempotentResponse = (store: IdempotencyStore, key: string): T | null => { + const record = store[key]; + if (!record) return null; + return record.response as T; +}; + +const writeIdempotentResponse = (store: IdempotencyStore, key: string, value: T): void => { + store[key] = { + response: value, + createdAt: nowIso(), + }; +}; + +const consumeCredits = (account: MockAccountRecord, cost: number): number => { + if (cost <= 0) return 0; + + const available = getAvailableCredits(account); + if (available < cost) { + throw new BackendApiError( + 'INSUFFICIENT_CREDITS', + `Insufficient credits. Required ${cost}, available ${available}.`, + 402, + { required: 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 consumeCreditsWithIdempotency = ( + account: MockAccountRecord, + idempotencyStore: IdempotencyStore, + key: string, + cost: number, +): number => { + const existing = readIdempotentResponse<{ charged: number }>(idempotencyStore, key); + if (existing) return existing.charged; + + const charged = consumeCredits(account, cost); + writeIdempotentResponse(idempotencyStore, key, { charged }); + return charged; +}; + +const endpointKey = (scope: string, userId: string, idempotencyKey: string): string => { + return `endpoint:${scope}:${userId}:${idempotencyKey}`; +}; + +const chargeKey = (scope: string, userId: string, idempotencyKey: string): string => { + return `charge:${scope}:${userId}:${idempotencyKey}`; +}; + +const hashString = (value: string): number => { + let hash = 0; + for (let i = 0; i < value.length; i += 1) { + hash = ((hash << 5) - hash + value.charCodeAt(i)) | 0; + } + return Math.abs(hash); +}; + +const clampConfidence = (value: number): number => { + return Math.max(0.05, Math.min(0.99, Number(value.toFixed(2)))); +}; + +const buildMockHealthCheck = (request: HealthCheckRequest, creditsCharged: number): PlantHealthCheck => { + const source = [ + request.imageUri, + request.plantContext?.name || '', + request.plantContext?.botanicalName || '', + request.plantContext?.careInfo?.light || '', + request.plantContext?.careInfo?.temp || '', + ].join('|'); + const hash = hashString(source); + const score = 40 + (hash % 56); + + const status: PlantHealthCheck['status'] = score >= 75 + ? 'healthy' + : score >= 55 + ? 'watch' + : 'critical'; + + const confidenceBase = 0.45 + ((hash % 20) / 100); + const confidenceMid = 0.35 + (((hash >> 2) % 20) / 100); + const confidenceLow = 0.25 + (((hash >> 4) % 20) / 100); + + if (request.language === 'de') { + const likelyIssues = status === 'critical' + ? [ + { + title: 'Moegliche Ueberwaesserung', + confidence: clampConfidence(confidenceBase + 0.22), + details: 'Gelbe, weiche Blaetter koennen auf zu nasse Erde hindeuten.', + }, + { + title: 'Wurzelstress', + confidence: clampConfidence(confidenceMid + 0.15), + details: 'Pruefe, ob das Substrat verdichtet ist oder unangenehm riecht.', + }, + { + title: 'Lichtmangel', + confidence: clampConfidence(confidenceLow + 0.1), + details: 'Zu wenig Licht kann zu Vergilbung und schwaecherem Wuchs fuehren.', + }, + ] + : status === 'watch' + ? [ + { + title: 'Leichter Naehrstoffmangel', + confidence: clampConfidence(confidenceBase), + details: 'Ein Teil der Vergilbung kann durch fehlende Naehrstoffe entstehen.', + }, + { + title: 'Unregelmaessiges Giessen', + confidence: clampConfidence(confidenceMid), + details: 'Zu grosse Schwankungen zwischen trocken und sehr nass belasten die Pflanze.', + }, + { + title: 'Standortstress', + confidence: clampConfidence(confidenceLow), + details: 'Zugluft oder haeufige Standortwechsel koennen Blattreaktionen ausloesen.', + }, + ] + : [ + { + title: 'Leichte Lichtanpassung noetig', + confidence: clampConfidence(confidenceBase - 0.1), + details: 'Einige Blaetter zeigen milde Stressanzeichen, insgesamt wirkt die Pflanze stabil.', + }, + { + title: 'Naechsten Duengertermin beobachten', + confidence: clampConfidence(confidenceMid - 0.1), + details: 'Bei weiterem Vergilben Duengung in kleiner Dosis einplanen.', + }, + { + title: 'Normale Blattalterung', + confidence: clampConfidence(confidenceLow - 0.05), + details: 'Aeltere untere Blaetter duerfen gelegentlich gelb werden.', + }, + ]; + + const actionsNow = status === 'critical' + ? [ + 'Giessen fuer 3-5 Tage pausieren und Feuchtigkeit tief im Topf pruefen.', + 'Gelbe oder matschige Blaetter sauber entfernen.', + 'Topf auf gute Drainage pruefen; stehendes Wasser sofort entfernen.', + ] + : status === 'watch' + ? [ + 'Giessrhythmus fuer die naechsten 7 Tage konsistent halten.', + 'Pflanze heller, aber ohne harte Mittagssonne stellen.', + 'Auf Schaedlinge an Blattunterseiten kontrollieren.', + ] + : [ + 'Aktuellen Pflegeplan beibehalten.', + 'Nur bei deutlich trockener Erde giessen.', + 'Gelbe Altblaetter nach Bedarf entfernen.', + ]; + + const plan7Days = status === 'critical' + ? [ + 'Tag 1: Feuchtigkeit messen und Uebertopf entleeren.', + 'Tag 3: Blattfarbe und Festigkeit erneut pruefen.', + 'Tag 5: Bei nasser Erde Umtopfen mit luftiger Mischung erwaegen.', + 'Tag 7: Neuen Foto-Health-Check ausfuehren.', + ] + : [ + 'Tag 1: Standort und Lichtdauer notieren.', + 'Tag 3: Leichte Drehung fuer gleichmaessigen Wuchs.', + 'Tag 5: Bodenfeuchte vor Giessen kontrollieren.', + 'Tag 7: Vergleichsfoto erstellen.', + ]; + + return { + generatedAt: nowIso(), + overallHealthScore: score, + status, + likelyIssues, + actionsNow, + plan7Days, + creditsCharged, + imageUri: request.imageUri, + }; + } + + if (request.language === 'es') { + const likelyIssues = status === 'critical' + ? [ + { + title: 'Posible exceso de riego', + confidence: clampConfidence(confidenceBase + 0.22), + details: 'Hojas amarillas y blandas pueden indicar demasiada humedad.', + }, + { + title: 'Estres de raiz', + confidence: clampConfidence(confidenceMid + 0.15), + details: 'Revisa si el sustrato esta compacto o con mal olor.', + }, + { + title: 'Falta de luz', + confidence: clampConfidence(confidenceLow + 0.1), + details: 'La luz insuficiente puede causar amarilleo y crecimiento lento.', + }, + ] + : status === 'watch' + ? [ + { + title: 'Deficit leve de nutrientes', + confidence: clampConfidence(confidenceBase), + details: 'Parte del amarilleo puede venir de nutricion insuficiente.', + }, + { + title: 'Riego irregular', + confidence: clampConfidence(confidenceMid), + details: 'Cambios bruscos entre seco y muy humedo estresan la planta.', + }, + { + title: 'Estres de ubicacion', + confidence: clampConfidence(confidenceLow), + details: 'Corrientes de aire o cambios frecuentes pueden afectar las hojas.', + }, + ] + : [ + { + title: 'Ajuste suave de luz', + confidence: clampConfidence(confidenceBase - 0.1), + details: 'Se observan signos leves, pero el estado general es bueno.', + }, + { + title: 'Monitorear fertilizacion', + confidence: clampConfidence(confidenceMid - 0.1), + details: 'Si continua el amarilleo, aplicar dosis pequena de fertilizante.', + }, + { + title: 'Envejecimiento normal', + confidence: clampConfidence(confidenceLow - 0.05), + details: 'Hojas inferiores viejas pueden amarillear de forma natural.', + }, + ]; + + const actionsNow = status === 'critical' + ? [ + 'Pausar riego 3-5 dias y comprobar humedad profunda.', + 'Retirar hojas amarillas o blandas con herramienta limpia.', + 'Verificar drenaje y eliminar agua acumulada.', + ] + : status === 'watch' + ? [ + 'Mantener riego estable durante 7 dias.', + 'Mover a una zona mas luminosa sin sol fuerte directo.', + 'Revisar plagas en el reverso de las hojas.', + ] + : [ + 'Mantener rutina actual de cuidado.', + 'Regar solo cuando el sustrato este claramente seco.', + 'Retirar hojas amarillas antiguas si hace falta.', + ]; + + const plan7Days = status === 'critical' + ? [ + 'Dia 1: Medir humedad y vaciar agua retenida.', + 'Dia 3: Revisar color y firmeza de hojas.', + 'Dia 5: Si sigue muy humedo, considerar trasplante con mezcla aireada.', + 'Dia 7: Repetir health-check con foto nueva.', + ] + : [ + 'Dia 1: Registrar ubicacion y horas de luz.', + 'Dia 3: Girar planta ligeramente para crecimiento uniforme.', + 'Dia 5: Comprobar humedad antes de regar.', + 'Dia 7: Tomar foto de comparacion.', + ]; + + return { + generatedAt: nowIso(), + overallHealthScore: score, + status, + likelyIssues, + actionsNow, + plan7Days, + creditsCharged, + imageUri: request.imageUri, + }; + } + + const likelyIssues = status === 'critical' + ? [ + { + title: 'Possible overwatering', + confidence: clampConfidence(confidenceBase + 0.22), + details: 'Yellow and soft leaves can indicate excess moisture.', + }, + { + title: 'Root stress', + confidence: clampConfidence(confidenceMid + 0.15), + details: 'Check if the substrate is compacted or has a sour smell.', + }, + { + title: 'Low light stress', + confidence: clampConfidence(confidenceLow + 0.1), + details: 'Insufficient light can trigger yellowing and slower growth.', + }, + ] + : status === 'watch' + ? [ + { + title: 'Mild nutrient deficiency', + confidence: clampConfidence(confidenceBase), + details: 'Part of the yellowing may come from missing nutrients.', + }, + { + title: 'Inconsistent watering', + confidence: clampConfidence(confidenceMid), + details: 'Large swings between dry and wet can stress foliage.', + }, + { + title: 'Placement stress', + confidence: clampConfidence(confidenceLow), + details: 'Drafts or frequent location changes can affect leaves.', + }, + ] + : [ + { + title: 'Minor light adjustment', + confidence: clampConfidence(confidenceBase - 0.1), + details: 'Mild stress signs are present, but overall condition looks stable.', + }, + { + title: 'Monitor next feeding', + confidence: clampConfidence(confidenceMid - 0.1), + details: 'If yellowing continues, apply a light fertilizer dose.', + }, + { + title: 'Normal leaf aging', + confidence: clampConfidence(confidenceLow - 0.05), + details: 'Older lower leaves can yellow naturally over time.', + }, + ]; + + const actionsNow = status === 'critical' + ? [ + 'Pause watering for 3-5 days and check deep soil moisture.', + 'Remove yellow or mushy leaves with clean tools.', + 'Ensure good drainage and empty standing water.', + ] + : status === 'watch' + ? [ + 'Keep watering schedule stable for 7 days.', + 'Move to brighter indirect light.', + 'Inspect leaf undersides for pests.', + ] + : [ + 'Keep the current care routine.', + 'Water only when soil is clearly dry.', + 'Trim older yellow leaves if needed.', + ]; + + const plan7Days = status === 'critical' + ? [ + 'Day 1: Check moisture and remove excess water.', + 'Day 3: Re-check leaf color and firmness.', + 'Day 5: If still soggy, repot into an airy mix.', + 'Day 7: Run another health-check photo.', + ] + : [ + 'Day 1: Note light duration and placement.', + 'Day 3: Rotate plant slightly for even growth.', + 'Day 5: Check soil moisture before watering.', + 'Day 7: Take a comparison photo.', + ]; + + return { + generatedAt: nowIso(), + overallHealthScore: score, + status, + likelyIssues, + actionsNow, + plan7Days, + creditsCharged, + imageUri: request.imageUri, + }; +}; + export const mockBackendService = { getBillingSummary: async (userId: string): Promise => { return withUserLock(userId, async () => { @@ -637,339 +649,379 @@ export const mockBackendService = { }); }, + syncRevenueCatState: async (request: { + userId: string; + customerInfo: RevenueCatCustomerInfo; + }): 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]; + + 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; + const transactionId = transaction.transactionIdentifier || transaction.transactionId; + if (!productId || !transactionId || !productId.startsWith('topup_')) { + continue; + } + + const idempotencyKey = `revenuecat-topup:${transactionId}`; + if (stores.idempotency[idempotencyKey]) { + continue; + } + + account.topupBalance += TOPUP_CREDITS_BY_PRODUCT[productId] || 0; + writeIdempotentResponse(stores.idempotency, idempotencyKey, { transactionId, productId }); + } + + account.updatedAt = nowIso(); + await persistStores(stores); + return { + billing: buildBillingSummary(account), + syncedAt: nowIso(), + }; + }); + }, + scanPlant: async (request: ScanPlantRequest): Promise => { - const { response, simulatedDelayMs } = await withUserLock(request.userId, async () => { - const stores = await loadStores(); - const account = getOrCreateAccount(stores, request.userId); - - const idemEndpointKey = endpointKey('scan', request.userId, request.idempotencyKey); - const cachedResponse = readIdempotentResponse(stores.idempotency, idemEndpointKey); - if (cachedResponse) { - return { - response: cachedResponse, - simulatedDelayMs: getSimulatedDelay(account.plan), - }; - } - - let creditsCharged = 0; - const modelPath: string[] = []; - - creditsCharged += consumeCreditsWithIdempotency( - account, - stores.idempotency, - chargeKey('scan-primary', request.userId, request.idempotencyKey), - SCAN_PRIMARY_COST, - ); - - let usedOpenAi = false; - let result: IdentificationResult = getMockPlantByImage(request.imageUri, request.language, false); - - if (openAiScanService.isConfigured()) { - const openAiPrimary = await openAiScanService.identifyPlant( - request.imageUri, - request.language, - 'primary', - account.plan === 'pro' ? 'pro' : 'free', - ); - if (openAiPrimary) { - result = openAiPrimary; - usedOpenAi = true; - modelPath.push('openai-primary'); - } else { - result = getMockPlantByImage(request.imageUri, request.language, false); - modelPath.push('openai-primary-failed'); - modelPath.push('mock-primary-fallback'); - } - } else { - modelPath.push('mock-primary'); - } - - const shouldReview = result.confidence < LOW_CONFIDENCE_REVIEW_THRESHOLD; - if (shouldReview && account.plan === 'pro') { - try { - creditsCharged += consumeCreditsWithIdempotency( - account, - stores.idempotency, - chargeKey('scan-review', request.userId, request.idempotencyKey), - SCAN_REVIEW_COST, - ); - if (usedOpenAi) { - const openAiReview = await openAiScanService.identifyPlant( - request.imageUri, - request.language, - 'review', - account.plan === 'pro' ? 'pro' : 'free', - ); - if (openAiReview) { - result = openAiReview; - modelPath.push('openai-review'); - } else { - modelPath.push('openai-review-failed'); - } - } else { - result = getMockPlantByImage(request.imageUri, request.language, true); - modelPath.push('mock-review'); - } - } catch (error) { - if (isBackendApiError(error) && error.code === 'INSUFFICIENT_CREDITS') { - modelPath.push('review-skipped-insufficient-credits'); - } else { - throw error; - } - } - } else if (shouldReview) { - modelPath.push('review-skipped-free-plan'); - } - - account.updatedAt = nowIso(); - const response: ScanPlantResponse = { - result, - creditsCharged, - modelPath, - billing: buildBillingSummary(account), - }; - - writeIdempotentResponse(stores.idempotency, idemEndpointKey, response); - await persistStores(stores); - - return { - response, - simulatedDelayMs: getSimulatedDelay(account.plan), - }; - }); - - await sleep(simulatedDelayMs); - return response; - }, - - semanticSearch: async (request: SemanticSearchRequest): Promise => { - const { response, simulatedDelayMs } = await withUserLock(request.userId, async () => { - const stores = await loadStores(); - const account = getOrCreateAccount(stores, request.userId); - - const idemEndpointKey = endpointKey('semantic-search', request.userId, request.idempotencyKey); - const cachedResponse = readIdempotentResponse(stores.idempotency, idemEndpointKey); - if (cachedResponse) { - return { - response: cachedResponse, - simulatedDelayMs: getSimulatedDelay(account.plan), - }; - } - - const normalizedQuery = request.query.trim(); - if (!normalizedQuery) { - const noResultResponse: SemanticSearchResponse = { - status: 'no_results', - results: [], - creditsCharged: 0, - billing: buildBillingSummary(account), - }; - writeIdempotentResponse(stores.idempotency, idemEndpointKey, noResultResponse); - await persistStores(stores); - return { - response: noResultResponse, - simulatedDelayMs: getSimulatedDelay(account.plan), - }; - } - - const creditsCharged = consumeCreditsWithIdempotency( - account, - stores.idempotency, - chargeKey('semantic-search', request.userId, request.idempotencyKey), - SEMANTIC_SEARCH_COST, - ); - - const results = searchMockCatalog(request.query, request.language, 18); - account.updatedAt = nowIso(); - - const response: SemanticSearchResponse = { - status: results.length > 0 ? 'success' : 'no_results', - results, - creditsCharged, - billing: buildBillingSummary(account), - }; - - writeIdempotentResponse(stores.idempotency, idemEndpointKey, response); - await persistStores(stores); - - return { - response, - simulatedDelayMs: getSimulatedDelay(account.plan), - }; - }); - - await sleep(simulatedDelayMs); - return response; - }, - - healthCheck: async (request: HealthCheckRequest): Promise => { - const { response, simulatedDelayMs } = await withUserLock(request.userId, async () => { - const stores = await loadStores(); - const account = getOrCreateAccount(stores, request.userId); - - const idemEndpointKey = endpointKey('health-check', request.userId, request.idempotencyKey); - const cachedResponse = readIdempotentResponse(stores.idempotency, idemEndpointKey); - if (cachedResponse) { - return { - response: cachedResponse, - simulatedDelayMs: getSimulatedDelay(account.plan), - }; - } - - const normalizedImageUri = request.imageUri.trim(); - if (!normalizedImageUri) { - throw new BackendApiError('BAD_REQUEST', 'Health check requires an image URI.', 400); - } - - if (!openAiScanService.isConfigured()) { - throw new BackendApiError( - 'PROVIDER_ERROR', - 'OpenAI health check is unavailable. Please configure EXPO_PUBLIC_OPENAI_API_KEY.', - 502, - ); - } - - const aiAnalysis = await openAiScanService.analyzePlantHealth( - normalizedImageUri, - request.language, - request.plantContext, - ); - if (!aiAnalysis) { - throw new BackendApiError( - 'PROVIDER_ERROR', - 'OpenAI health check failed. Please verify API key, network access, and image quality.', - 502, - ); - } - - const creditsCharged = consumeCreditsWithIdempotency( - account, - stores.idempotency, - chargeKey('health-check', request.userId, request.idempotencyKey), - HEALTH_CHECK_COST, - ); - - const healthCheck: PlantHealthCheck = { - generatedAt: nowIso(), - overallHealthScore: aiAnalysis.overallHealthScore, - status: aiAnalysis.status, - likelyIssues: aiAnalysis.likelyIssues, - actionsNow: aiAnalysis.actionsNow, - plan7Days: aiAnalysis.plan7Days, - creditsCharged, - imageUri: normalizedImageUri, - }; - account.updatedAt = nowIso(); - - const response: HealthCheckResponse = { - healthCheck, - creditsCharged, - billing: buildBillingSummary(account), - }; - - writeIdempotentResponse(stores.idempotency, idemEndpointKey, response); - await persistStores(stores); - - return { - response, - simulatedDelayMs: getSimulatedDelay(account.plan), - }; - }); - - await sleep(simulatedDelayMs); - return response; - }, - - simulatePurchase: async (request: SimulatePurchaseRequest): Promise => { - return withUserLock(request.userId, async () => { - const stores = await loadStores(); - const account = getOrCreateAccount(stores, request.userId); - - const idemEndpointKey = endpointKey('simulate-purchase', request.userId, request.idempotencyKey); - const cachedResponse = readIdempotentResponse(stores.idempotency, idemEndpointKey); - if (cachedResponse) return cachedResponse; - - if (request.productId === 'monthly_pro' || request.productId === 'yearly_pro') { - const now = new Date(); - const { cycleStartedAt, cycleEndsAt } = getCycleBounds(now); - account.plan = 'pro'; - account.provider = 'mock'; - 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[request.productId]; - account.topupBalance += credits; - } - - account.updatedAt = nowIso(); - - const response: SimulatePurchaseResponse = { - appliedProduct: request.productId, - billing: buildBillingSummary(account), - }; - - writeIdempotentResponse(stores.idempotency, idemEndpointKey, response); - await persistStores(stores); - return response; - }); - }, - - simulateWebhook: async (request: SimulateWebhookRequest): Promise => { - return withUserLock(request.userId, async () => { - const stores = await loadStores(); - const account = getOrCreateAccount(stores, request.userId); - - const idemEndpointKey = endpointKey('simulate-webhook', request.userId, request.idempotencyKey); - const cachedResponse = readIdempotentResponse(stores.idempotency, idemEndpointKey); - if (cachedResponse) return cachedResponse; - - if (request.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(); - } - - if (request.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; - } - - if (request.event === 'topup_granted') { - const credits = Math.max(1, request.payload?.credits || TOPUP_DEFAULT_CREDITS); - account.topupBalance += credits; - } - - if (request.event === 'credits_depleted') { - account.usedThisCycle = account.monthlyAllowance; - account.topupBalance = 0; - } - - account.updatedAt = nowIso(); - - const response: SimulateWebhookResponse = { - event: request.event, - billing: buildBillingSummary(account), - }; - - writeIdempotentResponse(stores.idempotency, idemEndpointKey, response); - await persistStores(stores); - return response; - }); - }, -}; + const { response, simulatedDelayMs } = await withUserLock(request.userId, async () => { + const stores = await loadStores(); + const account = getOrCreateAccount(stores, request.userId); + + const idemEndpointKey = endpointKey('scan', request.userId, request.idempotencyKey); + const cachedResponse = readIdempotentResponse(stores.idempotency, idemEndpointKey); + if (cachedResponse) { + return { + response: cachedResponse, + simulatedDelayMs: getSimulatedDelay(account.plan), + }; + } + + let creditsCharged = 0; + const modelPath: string[] = []; + + creditsCharged += consumeCreditsWithIdempotency( + account, + stores.idempotency, + chargeKey('scan-primary', request.userId, request.idempotencyKey), + SCAN_PRIMARY_COST, + ); + + let usedOpenAi = false; + let result: IdentificationResult = getMockPlantByImage(request.imageUri, request.language, false); + + if (openAiScanService.isConfigured()) { + const openAiPrimary = await openAiScanService.identifyPlant( + request.imageUri, + request.language, + 'primary', + account.plan === 'pro' ? 'pro' : 'free', + ); + if (openAiPrimary) { + result = openAiPrimary; + usedOpenAi = true; + modelPath.push('openai-primary'); + } else { + result = getMockPlantByImage(request.imageUri, request.language, false); + modelPath.push('openai-primary-failed'); + modelPath.push('mock-primary-fallback'); + } + } else { + modelPath.push('mock-primary'); + } + + const shouldReview = result.confidence < LOW_CONFIDENCE_REVIEW_THRESHOLD; + if (shouldReview && account.plan === 'pro') { + try { + creditsCharged += consumeCreditsWithIdempotency( + account, + stores.idempotency, + chargeKey('scan-review', request.userId, request.idempotencyKey), + SCAN_REVIEW_COST, + ); + if (usedOpenAi) { + const openAiReview = await openAiScanService.identifyPlant( + request.imageUri, + request.language, + 'review', + account.plan === 'pro' ? 'pro' : 'free', + ); + if (openAiReview) { + result = openAiReview; + modelPath.push('openai-review'); + } else { + modelPath.push('openai-review-failed'); + } + } else { + result = getMockPlantByImage(request.imageUri, request.language, true); + modelPath.push('mock-review'); + } + } catch (error) { + if (isBackendApiError(error) && error.code === 'INSUFFICIENT_CREDITS') { + modelPath.push('review-skipped-insufficient-credits'); + } else { + throw error; + } + } + } else if (shouldReview) { + modelPath.push('review-skipped-free-plan'); + } + + account.updatedAt = nowIso(); + const response: ScanPlantResponse = { + result, + creditsCharged, + modelPath, + billing: buildBillingSummary(account), + }; + + writeIdempotentResponse(stores.idempotency, idemEndpointKey, response); + await persistStores(stores); + + return { + response, + simulatedDelayMs: getSimulatedDelay(account.plan), + }; + }); + + await sleep(simulatedDelayMs); + return response; + }, + + semanticSearch: async (request: SemanticSearchRequest): Promise => { + const { response, simulatedDelayMs } = await withUserLock(request.userId, async () => { + const stores = await loadStores(); + const account = getOrCreateAccount(stores, request.userId); + + const idemEndpointKey = endpointKey('semantic-search', request.userId, request.idempotencyKey); + const cachedResponse = readIdempotentResponse(stores.idempotency, idemEndpointKey); + if (cachedResponse) { + return { + response: cachedResponse, + simulatedDelayMs: getSimulatedDelay(account.plan), + }; + } + + const normalizedQuery = request.query.trim(); + if (!normalizedQuery) { + const noResultResponse: SemanticSearchResponse = { + status: 'no_results', + results: [], + creditsCharged: 0, + billing: buildBillingSummary(account), + }; + writeIdempotentResponse(stores.idempotency, idemEndpointKey, noResultResponse); + await persistStores(stores); + return { + response: noResultResponse, + simulatedDelayMs: getSimulatedDelay(account.plan), + }; + } + + const creditsCharged = consumeCreditsWithIdempotency( + account, + stores.idempotency, + chargeKey('semantic-search', request.userId, request.idempotencyKey), + SEMANTIC_SEARCH_COST, + ); + + const results = searchMockCatalog(request.query, request.language, 18); + account.updatedAt = nowIso(); + + const response: SemanticSearchResponse = { + status: results.length > 0 ? 'success' : 'no_results', + results, + creditsCharged, + billing: buildBillingSummary(account), + }; + + writeIdempotentResponse(stores.idempotency, idemEndpointKey, response); + await persistStores(stores); + + return { + response, + simulatedDelayMs: getSimulatedDelay(account.plan), + }; + }); + + await sleep(simulatedDelayMs); + return response; + }, + + healthCheck: async (request: HealthCheckRequest): Promise => { + const { response, simulatedDelayMs } = await withUserLock(request.userId, async () => { + const stores = await loadStores(); + const account = getOrCreateAccount(stores, request.userId); + + const idemEndpointKey = endpointKey('health-check', request.userId, request.idempotencyKey); + const cachedResponse = readIdempotentResponse(stores.idempotency, idemEndpointKey); + if (cachedResponse) { + return { + response: cachedResponse, + simulatedDelayMs: getSimulatedDelay(account.plan), + }; + } + + const normalizedImageUri = request.imageUri.trim(); + if (!normalizedImageUri) { + throw new BackendApiError('BAD_REQUEST', 'Health check requires an image URI.', 400); + } + + if (!openAiScanService.isConfigured()) { + throw new BackendApiError( + 'PROVIDER_ERROR', + 'OpenAI health check is unavailable. Please configure EXPO_PUBLIC_OPENAI_API_KEY.', + 502, + ); + } + + const aiAnalysis = await openAiScanService.analyzePlantHealth( + normalizedImageUri, + request.language, + request.plantContext, + ); + if (!aiAnalysis) { + throw new BackendApiError( + 'PROVIDER_ERROR', + 'OpenAI health check failed. Please verify API key, network access, and image quality.', + 502, + ); + } + + const creditsCharged = consumeCreditsWithIdempotency( + account, + stores.idempotency, + chargeKey('health-check', request.userId, request.idempotencyKey), + HEALTH_CHECK_COST, + ); + + const healthCheck: PlantHealthCheck = { + generatedAt: nowIso(), + overallHealthScore: aiAnalysis.overallHealthScore, + status: aiAnalysis.status, + likelyIssues: aiAnalysis.likelyIssues, + actionsNow: aiAnalysis.actionsNow, + plan7Days: aiAnalysis.plan7Days, + creditsCharged, + imageUri: normalizedImageUri, + }; + account.updatedAt = nowIso(); + + const response: HealthCheckResponse = { + healthCheck, + creditsCharged, + billing: buildBillingSummary(account), + }; + + writeIdempotentResponse(stores.idempotency, idemEndpointKey, response); + await persistStores(stores); + + return { + response, + simulatedDelayMs: getSimulatedDelay(account.plan), + }; + }); + + await sleep(simulatedDelayMs); + return response; + }, + + simulatePurchase: async (request: SimulatePurchaseRequest): Promise => { + return withUserLock(request.userId, async () => { + const stores = await loadStores(); + const account = getOrCreateAccount(stores, request.userId); + + const idemEndpointKey = endpointKey('simulate-purchase', request.userId, request.idempotencyKey); + const cachedResponse = readIdempotentResponse(stores.idempotency, idemEndpointKey); + if (cachedResponse) return cachedResponse; + + if (request.productId === 'monthly_pro' || request.productId === 'yearly_pro') { + const now = new Date(); + const { cycleStartedAt, cycleEndsAt } = getCycleBounds(now); + account.plan = 'pro'; + account.provider = 'mock'; + 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[request.productId]; + account.topupBalance += credits; + } + + account.updatedAt = nowIso(); + + const response: SimulatePurchaseResponse = { + appliedProduct: request.productId, + billing: buildBillingSummary(account), + }; + + writeIdempotentResponse(stores.idempotency, idemEndpointKey, response); + await persistStores(stores); + return response; + }); + }, + + simulateWebhook: async (request: SimulateWebhookRequest): Promise => { + return withUserLock(request.userId, async () => { + const stores = await loadStores(); + const account = getOrCreateAccount(stores, request.userId); + + const idemEndpointKey = endpointKey('simulate-webhook', request.userId, request.idempotencyKey); + const cachedResponse = readIdempotentResponse(stores.idempotency, idemEndpointKey); + if (cachedResponse) return cachedResponse; + + if (request.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(); + } + + if (request.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; + } + + if (request.event === 'topup_granted') { + const credits = Math.max(1, request.payload?.credits || TOPUP_DEFAULT_CREDITS); + account.topupBalance += credits; + } + + if (request.event === 'credits_depleted') { + account.usedThisCycle = account.monthlyAllowance; + account.topupBalance = 0; + } + + account.updatedAt = nowIso(); + + const response: SimulateWebhookResponse = { + event: request.event, + billing: buildBillingSummary(account), + }; + + writeIdempotentResponse(stores.idempotency, idemEndpointKey, response); + await persistStores(stores); + return response; + }); + }, +}; diff --git a/services/backend/mockCatalog.ts b/services/backend/mockCatalog.ts index d2464be..4cfd7d2 100644 --- a/services/backend/mockCatalog.ts +++ b/services/backend/mockCatalog.ts @@ -1,299 +1,299 @@ -import { Language } from '../../types'; -import { BackendDatabaseEntry } from './contracts'; -import { LEXICON_BATCH_1_ENTRIES } from '../../constants/lexiconBatch1'; -import { LEXICON_BATCH_2_ENTRIES } from '../../constants/lexiconBatch2'; -import { normalizeSearchText, rankHybridEntries } from '../../utils/hybridSearch'; - -interface MockPlantSeed { - botanicalName: string; - names: Record; - descriptions: Record; - imageUri: string; - categories: string[]; - baseConfidence: number; - care: { - waterIntervalDays: number; - light: Record; - temp: string; - }; -} - -const PLANTS: MockPlantSeed[] = [ - { - botanicalName: 'Monstera deliciosa', - names: { de: 'Monstera', en: 'Monstera', es: 'Monstera' }, - descriptions: { - de: 'Beliebte Zimmerpflanze mit grossen gelochten Blaettern. Mag helles indirektes Licht.', - en: 'Popular indoor plant with large split leaves. Prefers bright indirect light.', - es: 'Planta de interior popular con hojas grandes. Prefiere luz brillante indirecta.', - }, - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/2/2e/Monstera_deliciosa2.jpg/500px-Monstera_deliciosa2.jpg', - categories: ['easy', 'low_light', 'air_purifier'], - baseConfidence: 0.76, - care: { - waterIntervalDays: 7, - light: { de: 'Halbschatten', en: 'Partial shade', es: 'Sombra parcial' }, - temp: '18-24C', - }, - }, - { - botanicalName: 'Sansevieria trifasciata', - names: { de: 'Bogenhanf', en: 'Snake Plant', es: 'Lengua de suegra' }, - descriptions: { - de: 'Sehr robust und trockenheitsvertraeglich. Kommt auch mit wenig Licht klar.', - en: 'Very resilient and drought tolerant. Handles low light well.', - es: 'Muy resistente y tolera sequia. Funciona bien con poca luz.', - }, - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/f/fb/Snake_Plant_%28Sansevieria_trifasciata_%27Laurentii%27%29.jpg/500px-Snake_Plant_%28Sansevieria_trifasciata_%27Laurentii%27%29.jpg', - categories: ['easy', 'succulent', 'low_light'], - baseConfidence: 0.73, - care: { - waterIntervalDays: 14, - light: { de: 'Schatten bis Sonne', en: 'Shade to sun', es: 'Sombra a sol' }, - temp: '16-30C', - }, - }, - { - botanicalName: 'Aloe vera', - names: { de: 'Aloe Vera', en: 'Aloe Vera', es: 'Aloe Vera' }, - descriptions: { - de: 'Sukkulente mit heilender Gelstruktur in den Blaettern. Braucht viel Licht.', - en: 'Succulent with gel-filled leaves. Needs plenty of light.', - es: 'Suculenta con hojas de gel. Necesita bastante luz.', - }, - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/4/4b/Aloe_vera_flower_inset.png/500px-Aloe_vera_flower_inset.png', - categories: ['succulent', 'easy', 'sun'], - baseConfidence: 0.78, - care: { - waterIntervalDays: 12, - light: { de: 'Sonnig', en: 'Sunny', es: 'Soleado' }, - temp: '18-30C', - }, - }, - { - botanicalName: 'Epipremnum aureum', - names: { de: 'Efeutute', en: 'Pothos', es: 'Poto' }, - descriptions: { - de: 'Schnell wachsende Haengepflanze fuer Einsteiger. Vertraegt variierende Bedingungen.', - en: 'Fast-growing trailing plant ideal for beginners. Handles varied conditions.', - es: 'Planta colgante de crecimiento rapido para principiantes.', - }, - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/62/Money_Plant_%28Epipremnum_aureum%29_4.jpg/500px-Money_Plant_%28Epipremnum_aureum%29_4.jpg', - categories: ['easy', 'hanging', 'air_purifier'], - baseConfidence: 0.74, - care: { - waterIntervalDays: 7, - light: { de: 'Halbschatten bis hell', en: 'Partial shade to bright', es: 'Sombra parcial a brillante' }, - temp: '18-27C', - }, - }, - { - botanicalName: 'Spathiphyllum', - names: { de: 'Einblatt', en: 'Peace Lily', es: 'Cuna de moises' }, - descriptions: { - de: 'Bluetenpflanze fuer Innenraeume. Zeigt Wasserbedarf schnell durch haengende Blaetter.', - en: 'Indoor flowering plant. Droops clearly when it needs water.', - es: 'Planta de flor de interior. Muestra rapido cuando necesita riego.', - }, - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/b/bd/Spathiphyllum_cochlearispathum_RTBG.jpg/500px-Spathiphyllum_cochlearispathum_RTBG.jpg', - categories: ['flowering', 'low_light'], - baseConfidence: 0.72, - care: { - waterIntervalDays: 5, - light: { de: 'Halbschatten', en: 'Partial shade', es: 'Sombra parcial' }, - temp: '18-26C', - }, - }, - { - botanicalName: 'Zamioculcas zamiifolia', - names: { de: 'Gluecksfeder', en: 'ZZ Plant', es: 'Planta ZZ' }, - descriptions: { - de: 'Extrem pflegeleichte Pflanze mit dickem Rhizom. Perfekt fuer wenig Zeit.', - en: 'Extremely low-maintenance plant with thick rhizomes. Great for busy schedules.', - es: 'Planta muy facil de cuidar con rizomas gruesos.', - }, - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/c/cf/Zamioculcas_zamiifolia_1.jpg/500px-Zamioculcas_zamiifolia_1.jpg', - categories: ['easy', 'low_light'], - baseConfidence: 0.77, - care: { - waterIntervalDays: 14, - light: { de: 'Wenig Licht bis hell', en: 'Low light to bright', es: 'Poca luz a brillante' }, - temp: '18-28C', - }, - }, - { - botanicalName: 'Calathea orbifolia', - names: { de: 'Korbmarante', en: 'Calathea', es: 'Calathea' }, - descriptions: { - de: 'Dekorative Blaetter mit Muster. Liebt gleichmaessige Feuchte und hohe Luftfeuchtigkeit.', - en: 'Decorative patterned leaves. Prefers steady moisture and humidity.', - es: 'Hojas decorativas con patron. Prefiere humedad constante.', - }, - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/f/fa/Calathea_orbifolia_2.jpg/500px-Calathea_orbifolia_2.jpg', - categories: ['patterned', 'pet_friendly'], - baseConfidence: 0.68, - care: { - waterIntervalDays: 4, - light: { de: 'Halbschatten', en: 'Partial shade', es: 'Sombra parcial' }, - temp: '18-25C', - }, - }, - { - botanicalName: 'Chlorophytum comosum', - names: { de: 'Gruenlilie', en: 'Spider Plant', es: 'Cinta' }, - descriptions: { - de: 'Unkomplizierte Zimmerpflanze mit langen gebogenen Blaettern. Vermehrt sich schnell.', - en: 'Easy houseplant with long arched leaves. Propagates quickly.', - es: 'Planta sencilla con hojas largas arqueadas. Se multiplica rapido.', - }, - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/b/b1/Hierbabuena_0611_Revised.jpg/500px-Hierbabuena_0611_Revised.jpg', - categories: ['easy', 'pet_friendly', 'air_purifier'], - baseConfidence: 0.79, - care: { - waterIntervalDays: 6, - light: { de: 'Hell bis halbschattig', en: 'Bright to partial shade', es: 'Brillante a sombra parcial' }, - temp: '16-24C', - }, - }, - { - botanicalName: 'Anthurium andraeanum', - names: { de: 'Flamingoblume', en: 'Anthurium', es: 'Anturio' }, - descriptions: { - de: 'Auffaellige Hochblaetter und lange Bluetezeit. Braucht Waerme und gleichmaessige Feuchte.', - en: 'Known for vivid spathes and long bloom cycles. Likes warmth and even moisture.', - es: 'Conocida por sus flores vistosas. Requiere calor y riego regular.', - }, - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/8/8b/AnthuriumAndraenum.jpg/500px-AnthuriumAndraenum.jpg', - categories: ['flowering', 'high_humidity'], - baseConfidence: 0.71, - care: { - waterIntervalDays: 6, - light: { de: 'Hell ohne direkte Sonne', en: 'Bright indirect light', es: 'Luz brillante indirecta' }, - temp: '18-27C', - }, - }, - { - botanicalName: 'Nephrolepis exaltata', - names: { de: 'Schwertfarn', en: 'Boston Fern', es: 'Helecho de Boston' }, - descriptions: { - de: 'Fein gefiederter Farn. Benoetigt regelmaessige Feuchte und keine direkte Sonne.', - en: 'Fine-textured fern. Needs regular moisture and no harsh direct sun.', - es: 'Helecho de textura fina. Necesita humedad constante.', - }, - imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/3/30/Boston_Fern_%282873392811%29.png/500px-Boston_Fern_%282873392811%29.png', - categories: ['pet_friendly', 'air_purifier', 'high_humidity'], - baseConfidence: 0.7, - care: { - waterIntervalDays: 3, - light: { de: 'Halbschatten', en: 'Partial shade', es: 'Sombra parcial' }, - temp: '16-24C', - }, - }, -]; - -const hashString = (value: string): number => { - let hash = 2166136261; - for (let i = 0; i < value.length; i += 1) { - hash ^= value.charCodeAt(i); - hash = Math.imul(hash, 16777619); - } - return hash >>> 0; -}; - -const clampConfidence = (value: number): number => { - return Number(Math.max(0.4, Math.min(0.99, value)).toFixed(2)); -}; - -const toEntry = ( - seed: MockPlantSeed, - lang: Language, - confidence: number, -): BackendDatabaseEntry => { - return { - name: seed.names[lang], - botanicalName: seed.botanicalName, - description: seed.descriptions[lang], - confidence: clampConfidence(confidence), - careInfo: { - waterIntervalDays: seed.care.waterIntervalDays, - light: seed.care.light[lang], - temp: seed.care.temp, - }, - imageUri: seed.imageUri, - categories: seed.categories, - }; -}; - -const getFullCatalog = (lang: Language): BackendDatabaseEntry[] => { - const seeds = PLANTS.map(seed => toEntry(seed, lang, seed.baseConfidence)); - const batches = getBatchCatalog(lang); - const catalog = [...seeds, ...batches]; - - const seenBotanical = new Set(); - const seenImage = new Set(); - - return catalog.filter(e => { - const botanicalKey = normalizeSearchText(e.botanicalName); - const imageKey = e.imageUri.trim(); - - if (seenBotanical.has(botanicalKey) || seenImage.has(imageKey)) { - return false; - } - - seenBotanical.add(botanicalKey); - seenImage.add(imageKey); - return true; - }); -}; - -export const getMockCatalog = (lang: Language): BackendDatabaseEntry[] => { - return getFullCatalog(lang); -}; - -export const getMockPlantByImage = ( - imageUri: string, - lang: Language, - preferHighConfidence: boolean, -): BackendDatabaseEntry => { - const seeds = PLANTS; - const indexHash = hashString(`${lang}:${imageUri}`); - const selectedSeed = seeds[indexHash % seeds.length]; - - const varianceHash = hashString(`confidence:${imageUri}:${selectedSeed.botanicalName}`); - const variance = (varianceHash % 28) / 100; // 0.00 - 0.27 - const confidenceBase = selectedSeed.baseConfidence - 0.08 + variance; - const confidence = preferHighConfidence ? confidenceBase + 0.09 : confidenceBase; - - return toEntry(selectedSeed, lang, confidence); -}; - -const getBatchCatalog = (lang: Language): BackendDatabaseEntry[] => { - const all = [...LEXICON_BATCH_1_ENTRIES, ...LEXICON_BATCH_2_ENTRIES]; - return all.map(entry => ({ - name: entry.name, - botanicalName: entry.botanicalName, - description: entry.description || '', - confidence: entry.confidence, - careInfo: { - waterIntervalDays: entry.careInfo.waterIntervalDays, - light: entry.careInfo.light, - temp: entry.careInfo.temp, - }, - imageUri: entry.imageUri, - categories: entry.categories, - })); -}; - -export const searchMockCatalog = ( - query: string, - lang: Language, - limit = 12, -): BackendDatabaseEntry[] => { - const normalizedQuery = normalizeSearchText(query); - const deduped = getFullCatalog(lang); - - if (!normalizedQuery) return deduped.slice(0, limit); - - return rankHybridEntries(deduped, normalizedQuery, limit) - .map((candidate) => candidate.entry); -}; +import { Language } from '../../types'; +import { BackendDatabaseEntry } from './contracts'; +import { LEXICON_BATCH_1_ENTRIES } from '../../constants/lexiconBatch1'; +import { LEXICON_BATCH_2_ENTRIES } from '../../constants/lexiconBatch2'; +import { normalizeSearchText, rankHybridEntries } from '../../utils/hybridSearch'; + +interface MockPlantSeed { + botanicalName: string; + names: Record; + descriptions: Record; + imageUri: string; + categories: string[]; + baseConfidence: number; + care: { + waterIntervalDays: number; + light: Record; + temp: string; + }; +} + +const PLANTS: MockPlantSeed[] = [ + { + botanicalName: 'Monstera deliciosa', + names: { de: 'Monstera', en: 'Monstera', es: 'Monstera' }, + descriptions: { + de: 'Beliebte Zimmerpflanze mit grossen gelochten Blaettern. Mag helles indirektes Licht.', + en: 'Popular indoor plant with large split leaves. Prefers bright indirect light.', + es: 'Planta de interior popular con hojas grandes. Prefiere luz brillante indirecta.', + }, + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/2/2e/Monstera_deliciosa2.jpg/500px-Monstera_deliciosa2.jpg', + categories: ['easy', 'low_light', 'air_purifier'], + baseConfidence: 0.76, + care: { + waterIntervalDays: 7, + light: { de: 'Halbschatten', en: 'Partial shade', es: 'Sombra parcial' }, + temp: '18-24C', + }, + }, + { + botanicalName: 'Sansevieria trifasciata', + names: { de: 'Bogenhanf', en: 'Snake Plant', es: 'Lengua de suegra' }, + descriptions: { + de: 'Sehr robust und trockenheitsvertraeglich. Kommt auch mit wenig Licht klar.', + en: 'Very resilient and drought tolerant. Handles low light well.', + es: 'Muy resistente y tolera sequia. Funciona bien con poca luz.', + }, + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/f/fb/Snake_Plant_%28Sansevieria_trifasciata_%27Laurentii%27%29.jpg/500px-Snake_Plant_%28Sansevieria_trifasciata_%27Laurentii%27%29.jpg', + categories: ['easy', 'succulent', 'low_light'], + baseConfidence: 0.73, + care: { + waterIntervalDays: 14, + light: { de: 'Schatten bis Sonne', en: 'Shade to sun', es: 'Sombra a sol' }, + temp: '16-30C', + }, + }, + { + botanicalName: 'Aloe vera', + names: { de: 'Aloe Vera', en: 'Aloe Vera', es: 'Aloe Vera' }, + descriptions: { + de: 'Sukkulente mit heilender Gelstruktur in den Blaettern. Braucht viel Licht.', + en: 'Succulent with gel-filled leaves. Needs plenty of light.', + es: 'Suculenta con hojas de gel. Necesita bastante luz.', + }, + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/4/4b/Aloe_vera_flower_inset.png/500px-Aloe_vera_flower_inset.png', + categories: ['succulent', 'easy', 'sun'], + baseConfidence: 0.78, + care: { + waterIntervalDays: 12, + light: { de: 'Sonnig', en: 'Sunny', es: 'Soleado' }, + temp: '18-30C', + }, + }, + { + botanicalName: 'Epipremnum aureum', + names: { de: 'Efeutute', en: 'Pothos', es: 'Poto' }, + descriptions: { + de: 'Schnell wachsende Haengepflanze fuer Einsteiger. Vertraegt variierende Bedingungen.', + en: 'Fast-growing trailing plant ideal for beginners. Handles varied conditions.', + es: 'Planta colgante de crecimiento rapido para principiantes.', + }, + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/62/Money_Plant_%28Epipremnum_aureum%29_4.jpg/500px-Money_Plant_%28Epipremnum_aureum%29_4.jpg', + categories: ['easy', 'hanging', 'air_purifier'], + baseConfidence: 0.74, + care: { + waterIntervalDays: 7, + light: { de: 'Halbschatten bis hell', en: 'Partial shade to bright', es: 'Sombra parcial a brillante' }, + temp: '18-27C', + }, + }, + { + botanicalName: 'Spathiphyllum', + names: { de: 'Einblatt', en: 'Peace Lily', es: 'Cuna de moises' }, + descriptions: { + de: 'Bluetenpflanze fuer Innenraeume. Zeigt Wasserbedarf schnell durch haengende Blaetter.', + en: 'Indoor flowering plant. Droops clearly when it needs water.', + es: 'Planta de flor de interior. Muestra rapido cuando necesita riego.', + }, + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/b/bd/Spathiphyllum_cochlearispathum_RTBG.jpg/500px-Spathiphyllum_cochlearispathum_RTBG.jpg', + categories: ['flowering', 'low_light'], + baseConfidence: 0.72, + care: { + waterIntervalDays: 5, + light: { de: 'Halbschatten', en: 'Partial shade', es: 'Sombra parcial' }, + temp: '18-26C', + }, + }, + { + botanicalName: 'Zamioculcas zamiifolia', + names: { de: 'Gluecksfeder', en: 'ZZ Plant', es: 'Planta ZZ' }, + descriptions: { + de: 'Extrem pflegeleichte Pflanze mit dickem Rhizom. Perfekt fuer wenig Zeit.', + en: 'Extremely low-maintenance plant with thick rhizomes. Great for busy schedules.', + es: 'Planta muy facil de cuidar con rizomas gruesos.', + }, + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/c/cf/Zamioculcas_zamiifolia_1.jpg/500px-Zamioculcas_zamiifolia_1.jpg', + categories: ['easy', 'low_light'], + baseConfidence: 0.77, + care: { + waterIntervalDays: 14, + light: { de: 'Wenig Licht bis hell', en: 'Low light to bright', es: 'Poca luz a brillante' }, + temp: '18-28C', + }, + }, + { + botanicalName: 'Calathea orbifolia', + names: { de: 'Korbmarante', en: 'Calathea', es: 'Calathea' }, + descriptions: { + de: 'Dekorative Blaetter mit Muster. Liebt gleichmaessige Feuchte und hohe Luftfeuchtigkeit.', + en: 'Decorative patterned leaves. Prefers steady moisture and humidity.', + es: 'Hojas decorativas con patron. Prefiere humedad constante.', + }, + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/f/fa/Calathea_orbifolia_2.jpg/500px-Calathea_orbifolia_2.jpg', + categories: ['patterned', 'pet_friendly'], + baseConfidence: 0.68, + care: { + waterIntervalDays: 4, + light: { de: 'Halbschatten', en: 'Partial shade', es: 'Sombra parcial' }, + temp: '18-25C', + }, + }, + { + botanicalName: 'Chlorophytum comosum', + names: { de: 'Gruenlilie', en: 'Spider Plant', es: 'Cinta' }, + descriptions: { + de: 'Unkomplizierte Zimmerpflanze mit langen gebogenen Blaettern. Vermehrt sich schnell.', + en: 'Easy houseplant with long arched leaves. Propagates quickly.', + es: 'Planta sencilla con hojas largas arqueadas. Se multiplica rapido.', + }, + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/b/b1/Hierbabuena_0611_Revised.jpg/500px-Hierbabuena_0611_Revised.jpg', + categories: ['easy', 'pet_friendly', 'air_purifier'], + baseConfidence: 0.79, + care: { + waterIntervalDays: 6, + light: { de: 'Hell bis halbschattig', en: 'Bright to partial shade', es: 'Brillante a sombra parcial' }, + temp: '16-24C', + }, + }, + { + botanicalName: 'Anthurium andraeanum', + names: { de: 'Flamingoblume', en: 'Anthurium', es: 'Anturio' }, + descriptions: { + de: 'Auffaellige Hochblaetter und lange Bluetezeit. Braucht Waerme und gleichmaessige Feuchte.', + en: 'Known for vivid spathes and long bloom cycles. Likes warmth and even moisture.', + es: 'Conocida por sus flores vistosas. Requiere calor y riego regular.', + }, + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/8/8b/AnthuriumAndraenum.jpg/500px-AnthuriumAndraenum.jpg', + categories: ['flowering', 'high_humidity'], + baseConfidence: 0.71, + care: { + waterIntervalDays: 6, + light: { de: 'Hell ohne direkte Sonne', en: 'Bright indirect light', es: 'Luz brillante indirecta' }, + temp: '18-27C', + }, + }, + { + botanicalName: 'Nephrolepis exaltata', + names: { de: 'Schwertfarn', en: 'Boston Fern', es: 'Helecho de Boston' }, + descriptions: { + de: 'Fein gefiederter Farn. Benoetigt regelmaessige Feuchte und keine direkte Sonne.', + en: 'Fine-textured fern. Needs regular moisture and no harsh direct sun.', + es: 'Helecho de textura fina. Necesita humedad constante.', + }, + imageUri: 'https://upload.wikimedia.org/wikipedia/commons/thumb/3/30/Boston_Fern_%282873392811%29.png/500px-Boston_Fern_%282873392811%29.png', + categories: ['pet_friendly', 'air_purifier', 'high_humidity'], + baseConfidence: 0.7, + care: { + waterIntervalDays: 3, + light: { de: 'Halbschatten', en: 'Partial shade', es: 'Sombra parcial' }, + temp: '16-24C', + }, + }, +]; + +const hashString = (value: string): number => { + let hash = 2166136261; + for (let i = 0; i < value.length; i += 1) { + hash ^= value.charCodeAt(i); + hash = Math.imul(hash, 16777619); + } + return hash >>> 0; +}; + +const clampConfidence = (value: number): number => { + return Number(Math.max(0.4, Math.min(0.99, value)).toFixed(2)); +}; + +const toEntry = ( + seed: MockPlantSeed, + lang: Language, + confidence: number, +): BackendDatabaseEntry => { + return { + name: seed.names[lang], + botanicalName: seed.botanicalName, + description: seed.descriptions[lang], + confidence: clampConfidence(confidence), + careInfo: { + waterIntervalDays: seed.care.waterIntervalDays, + light: seed.care.light[lang], + temp: seed.care.temp, + }, + imageUri: seed.imageUri, + categories: seed.categories, + }; +}; + +const getFullCatalog = (lang: Language): BackendDatabaseEntry[] => { + const seeds = PLANTS.map(seed => toEntry(seed, lang, seed.baseConfidence)); + const batches = getBatchCatalog(lang); + const catalog = [...seeds, ...batches]; + + const seenBotanical = new Set(); + const seenImage = new Set(); + + return catalog.filter(e => { + const botanicalKey = normalizeSearchText(e.botanicalName); + const imageKey = e.imageUri.trim(); + + if (seenBotanical.has(botanicalKey) || seenImage.has(imageKey)) { + return false; + } + + seenBotanical.add(botanicalKey); + seenImage.add(imageKey); + return true; + }); +}; + +export const getMockCatalog = (lang: Language): BackendDatabaseEntry[] => { + return getFullCatalog(lang); +}; + +export const getMockPlantByImage = ( + imageUri: string, + lang: Language, + preferHighConfidence: boolean, +): BackendDatabaseEntry => { + const seeds = PLANTS; + const indexHash = hashString(`${lang}:${imageUri}`); + const selectedSeed = seeds[indexHash % seeds.length]; + + const varianceHash = hashString(`confidence:${imageUri}:${selectedSeed.botanicalName}`); + const variance = (varianceHash % 28) / 100; // 0.00 - 0.27 + const confidenceBase = selectedSeed.baseConfidence - 0.08 + variance; + const confidence = preferHighConfidence ? confidenceBase + 0.09 : confidenceBase; + + return toEntry(selectedSeed, lang, confidence); +}; + +const getBatchCatalog = (lang: Language): BackendDatabaseEntry[] => { + const all = [...LEXICON_BATCH_1_ENTRIES, ...LEXICON_BATCH_2_ENTRIES]; + return all.map(entry => ({ + name: entry.name, + botanicalName: entry.botanicalName, + description: entry.description || '', + confidence: entry.confidence, + careInfo: { + waterIntervalDays: entry.careInfo.waterIntervalDays, + light: entry.careInfo.light, + temp: entry.careInfo.temp, + }, + imageUri: entry.imageUri, + categories: entry.categories, + })); +}; + +export const searchMockCatalog = ( + query: string, + lang: Language, + limit = 12, +): BackendDatabaseEntry[] => { + const normalizedQuery = normalizeSearchText(query); + const deduped = getFullCatalog(lang); + + if (!normalizedQuery) return deduped.slice(0, limit); + + return rankHybridEntries(deduped, normalizedQuery, limit) + .map((candidate) => candidate.entry); +}; diff --git a/services/backend/openAiScanService.ts b/services/backend/openAiScanService.ts index 39a848e..7a41950 100644 --- a/services/backend/openAiScanService.ts +++ b/services/backend/openAiScanService.ts @@ -1,564 +1,564 @@ -import { CareInfo, IdentificationResult, Language } from '../../types'; - -type OpenAiScanMode = 'primary' | 'review'; - -export interface OpenAiHealthIssue { - title: string; - confidence: number; - details: string; -} - -export interface OpenAiHealthAnalysis { - overallHealthScore: number; - status: 'healthy' | 'watch' | 'critical'; - likelyIssues: OpenAiHealthIssue[]; - actionsNow: string[]; - plan7Days: string[]; -} - -const OPENAI_API_KEY = (process.env.EXPO_PUBLIC_OPENAI_API_KEY || '').trim(); -const OPENAI_SCAN_MODEL = (process.env.EXPO_PUBLIC_OPENAI_SCAN_MODEL || 'gpt-5-mini').trim(); -const OPENAI_SCAN_MODEL_PRO = (process.env.EXPO_PUBLIC_OPENAI_SCAN_MODEL_PRO || OPENAI_SCAN_MODEL).trim(); -const OPENAI_HEALTH_MODEL = (process.env.EXPO_PUBLIC_OPENAI_HEALTH_MODEL || OPENAI_SCAN_MODEL).trim(); -const OPENAI_SCAN_FALLBACK_MODELS = (process.env.EXPO_PUBLIC_OPENAI_SCAN_FALLBACK_MODELS || 'gpt-5-mini,gpt-4.1-mini').trim(); -const OPENAI_SCAN_FALLBACK_MODELS_PRO = (process.env.EXPO_PUBLIC_OPENAI_SCAN_FALLBACK_MODELS_PRO || OPENAI_SCAN_FALLBACK_MODELS).trim(); -const OPENAI_HEALTH_FALLBACK_MODELS = (process.env.EXPO_PUBLIC_OPENAI_HEALTH_FALLBACK_MODELS || OPENAI_SCAN_FALLBACK_MODELS).trim(); -const OPENAI_CHAT_COMPLETIONS_URL = 'https://api.openai.com/v1/chat/completions'; -const OPENAI_TIMEOUT_MS = (() => { - const raw = (process.env.EXPO_PUBLIC_OPENAI_TIMEOUT_MS || '45000').trim(); - const parsed = Number.parseInt(raw, 10); - if (Number.isFinite(parsed) && parsed >= 10000) return parsed; - return 45000; -})(); - -const parseModelChain = (primaryModel: string, fallbackModels: string): string[] => { - const models = [primaryModel]; - fallbackModels.split(',').forEach((model) => { - const normalized = model.trim(); - if (normalized) models.push(normalized); - }); - return [...new Set(models)]; -}; - -const OPENAI_SCAN_MODEL_CHAIN = parseModelChain(OPENAI_SCAN_MODEL, OPENAI_SCAN_FALLBACK_MODELS); -const OPENAI_SCAN_MODEL_CHAIN_PRO = parseModelChain(OPENAI_SCAN_MODEL_PRO, OPENAI_SCAN_FALLBACK_MODELS_PRO); -const OPENAI_HEALTH_MODEL_CHAIN = parseModelChain(OPENAI_HEALTH_MODEL, OPENAI_HEALTH_FALLBACK_MODELS); - -const getScanModelChain = (plan: 'free' | 'pro'): string[] => { - return plan === 'pro' ? OPENAI_SCAN_MODEL_CHAIN_PRO : OPENAI_SCAN_MODEL_CHAIN; -}; - -const clamp = (value: number, min: number, max: number): number => { - return Math.min(max, Math.max(min, value)); -}; - -const toErrorMessage = (error: unknown): string => { - if (error instanceof Error) return error.message; - return String(error); -}; - -const summarizeImageUri = (imageUri: string): string => { - const trimmed = imageUri.trim(); - if (!trimmed) return 'empty'; - if (trimmed.startsWith('data:image')) return `data-uri(${Math.round(trimmed.length / 1024)}kb)`; - return trimmed.length > 120 ? `${trimmed.slice(0, 120)}...` : trimmed; -}; - -const toJsonString = (content: string): string => { - const trimmed = content.trim(); - if (!trimmed) return trimmed; - - const fenced = trimmed.match(/^```(?:json)?\s*([\s\S]*?)\s*```$/i); - if (fenced?.[1]) return fenced[1].trim(); - return trimmed; -}; - -const parseContentToJson = (content: string): Record | null => { - try { - const parsed = JSON.parse(toJsonString(content)); - if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) { - return parsed as Record; - } - return null; - } catch { - return null; - } -}; - -const getString = (value: unknown): string => { - return typeof value === 'string' ? value.trim() : ''; -}; - -const getNumber = (value: unknown): number | null => { - if (typeof value === 'number' && Number.isFinite(value)) return value; - if (typeof value === 'string' && value.trim()) { - const parsed = Number(value); - if (Number.isFinite(parsed)) return parsed; - } - return null; -}; - -const getStringArray = (value: unknown): string[] => { - if (!Array.isArray(value)) return []; - return value - .map((item) => (typeof item === 'string' ? item.trim() : '')) - .filter(Boolean); -}; - -const normalizeResult = ( - raw: Record, - language: Language, -): IdentificationResult | null => { - const name = getString(raw.name); - const botanicalName = getString(raw.botanicalName); - const description = getString(raw.description); - const confidenceRaw = getNumber(raw.confidence); - const careInfoRaw = raw.careInfo; - - if (!name || !botanicalName || !careInfoRaw || typeof careInfoRaw !== 'object' || Array.isArray(careInfoRaw)) { - return null; - } - - const careInfoObj = careInfoRaw as Record; - const waterIntervalRaw = getNumber(careInfoObj.waterIntervalDays); - const light = getString(careInfoObj.light); - const temp = getString(careInfoObj.temp); - - if (waterIntervalRaw == null || !light || !temp) { - return null; - } - - const fallbackDescription = language === 'de' - ? `${name} wurde per KI erkannt. Pflegehinweise sind unten aufgefuehrt.` - : language === 'es' - ? `${name} se detecto con IA. Debajo veras recomendaciones de cuidado.` - : `${name} was identified with AI. Care guidance is shown below.`; - - return { - name, - botanicalName, - confidence: clamp(confidenceRaw ?? 0.72, 0.05, 0.99), - description: description || fallbackDescription, - careInfo: { - waterIntervalDays: Math.round(clamp(waterIntervalRaw, 1, 45)), - light, - temp, - }, - }; -}; - -const getLanguageLabel = (language: Language): string => { - if (language === 'de') return 'German'; - if (language === 'es') return 'Spanish'; - return 'English'; -}; - -const buildPrompt = (language: Language, mode: OpenAiScanMode): string => { - const reviewInstruction = mode === 'review' - ? 'Re-check your first hypothesis with stricter botanical accuracy and correct any mismatch.' - : 'Identify the most likely houseplant species from this image with conservative confidence.'; - - const nameLanguageInstruction = language === 'en' - ? '- "name" must be an English common name only. Never return a German or other non-English common name. If no reliable English common name is known, use "botanicalName" as "name" instead of inventing or translating.' - : `- "name" must be strictly written in ${getLanguageLabel(language)}. If a reliable common name in that language is not known, use "botanicalName" as "name" instead of inventing a localized name.`; - - return [ - `${reviewInstruction}`, - `Return strict JSON only in this shape:`, - `{"name":"...","botanicalName":"...","confidence":0.0,"description":"...","careInfo":{"waterIntervalDays":7,"light":"...","temp":"..."}}`, - `Rules:`, - nameLanguageInstruction, - `- "description" and "careInfo.light" must be written in ${getLanguageLabel(language)}.`, - `- "botanicalName" must use accepted Latin scientific naming and must not be invented or misspelled.`, - `- If species is uncertain, prefer genus-level naming (for example: "Calathea sp.").`, - `- "confidence" must be between 0 and 1.`, - `- Keep confidence <= 0.55 when the image is ambiguous, blurred, or partially visible.`, - `- "waterIntervalDays" must be an integer between 1 and 45.`, - `- Do not include markdown, explanations, or extra keys.`, - ].join('\n'); -}; - -const buildHealthPrompt = ( - language: Language, - plantContext?: { - name: string; - botanicalName: string; - careInfo: CareInfo; - description?: string; - }, -): string => { - const contextLines = plantContext - ? [ - `Plant context:`, - `- name: ${plantContext.name}`, - `- botanicalName: ${plantContext.botanicalName}`, - `- care.light: ${plantContext.careInfo.light}`, - `- care.temp: ${plantContext.careInfo.temp}`, - `- care.waterIntervalDays: ${plantContext.careInfo.waterIntervalDays}`, - `- description: ${plantContext.description || 'n/a'}`, - ] - : ['Plant context: not provided']; - - return [ - `Analyze this plant photo for real health condition signs with focus on yellowing leaves, watering stress, pests, and light stress.`, - `Return strict JSON only in this shape:`, - `{"overallHealthScore":72,"status":"watch","likelyIssues":[{"title":"...","confidence":0.64,"details":"..."}],"actionsNow":["..."],"plan7Days":["..."]}`, - `Rules:`, - `- "overallHealthScore" must be an integer between 0 and 100.`, - `- "status" must be one of: "healthy", "watch", "critical".`, - `- "likelyIssues" must contain 1 to 4 items sorted by confidence descending.`, - `- "confidence" must be between 0 and 1.`, - `- "title", "details", "actionsNow", and "plan7Days" must be written in ${getLanguageLabel(language)}.`, - `- "actionsNow" should be immediate steps for the next 24 hours.`, - `- "plan7Days" should be short actionable steps for the next week.`, - `- Do not include markdown, explanations, or extra keys.`, - ...contextLines, - ].join('\n'); -}; - -const buildFallbackHealthAnalysis = ( - language: Language, - plantContext?: { - name: string; - botanicalName: string; - careInfo: CareInfo; - description?: string; - }, -): OpenAiHealthAnalysis => { - if (language === 'de') { - return { - overallHealthScore: 58, - status: 'watch', - likelyIssues: [ - { - title: 'Eingeschraenkte KI-Analyse', - confidence: 0.42, - details: `${plantContext?.name || 'Die Pflanze'} konnte wegen instabiler Antwort nicht vollstaendig bewertet werden.`, - }, - ], - actionsNow: [ - 'Neues Foto bei hellem, indirektem Licht aufnehmen.', - 'Blaetter auf Flecken, Schaedlinge und trockene Raender pruefen.', - 'Erst giessen, wenn die oberen 2-3 cm Erde trocken sind.', - ], - plan7Days: [ - 'In 2 Tagen mit neuem Foto erneut pruefen.', - 'Farbe und Blattspannung taeglich beobachten.', - 'Bei Verschlechterung Standort und Giessrhythmus anpassen.', - ], - }; - } - - if (language === 'es') { - return { - overallHealthScore: 58, - status: 'watch', - likelyIssues: [ - { - title: 'Analisis de IA limitado', - confidence: 0.42, - details: `${plantContext?.name || 'La planta'} no pudo evaluarse por completo por una respuesta inestable.`, - }, - ], - actionsNow: [ - 'Tomar una foto nueva con luz brillante e indirecta.', - 'Revisar hojas por manchas, plagas y bordes secos.', - 'Regar solo si los 2-3 cm superiores del sustrato estan secos.', - ], - plan7Days: [ - 'Revisar otra vez en 2 dias con una foto nueva.', - 'Observar color y firmeza de hojas cada dia.', - 'Si empeora, ajustar ubicacion y frecuencia de riego.', - ], - }; - } - - return { - overallHealthScore: 58, - status: 'watch', - likelyIssues: [ - { - title: 'Limited AI analysis', - confidence: 0.42, - details: `${plantContext?.name || 'This plant'} could not be fully assessed due to an unstable provider response.`, - }, - ], - actionsNow: [ - 'Capture a new photo in bright indirect light.', - 'Inspect leaves for spots, pests, and dry edges.', - 'Water only if the top 2-3 cm of soil is dry.', - ], - plan7Days: [ - 'Re-check in 2 days with a new photo.', - 'Track leaf color and firmness daily.', - 'If symptoms worsen, adjust placement and watering cadence.', - ], - }; -}; - -const normalizeHealthAnalysis = ( - raw: Record, - language: Language, -): OpenAiHealthAnalysis | null => { - const scoreRaw = getNumber(raw.overallHealthScore); - const statusRaw = getString(raw.status); - const issuesRaw = raw.likelyIssues; - const actionsNowRaw = getStringArray(raw.actionsNow).slice(0, 6); - const plan7DaysRaw = getStringArray(raw.plan7Days).slice(0, 7); - - if (scoreRaw == null || !statusRaw || !Array.isArray(issuesRaw)) { - return null; - } - - const status: OpenAiHealthAnalysis['status'] = statusRaw === 'healthy' || statusRaw === 'watch' || statusRaw === 'critical' - ? statusRaw - : 'watch'; - - const likelyIssues = issuesRaw - .map((entry) => { - if (!entry || typeof entry !== 'object' || Array.isArray(entry)) return null; - const issueObj = entry as Record; - const title = getString(issueObj.title); - const details = getString(issueObj.details); - const confidenceRaw = getNumber(issueObj.confidence); - if (!title || !details || confidenceRaw == null) return null; - return { - title, - details, - confidence: clamp(confidenceRaw, 0.05, 0.99), - } as OpenAiHealthIssue; - }) - .filter((entry): entry is OpenAiHealthIssue => Boolean(entry)) - .slice(0, 4); - - if (likelyIssues.length === 0 || actionsNowRaw.length === 0 || plan7DaysRaw.length === 0) { - const fallbackIssue = language === 'de' - ? 'Die KI konnte keine stabilen Gesundheitsmerkmale extrahieren.' - : language === 'es' - ? 'La IA no pudo extraer senales de salud estables.' - : 'AI could not extract stable health signals.'; - return { - overallHealthScore: Math.round(clamp(scoreRaw, 0, 100)), - status, - likelyIssues: [ - { - title: language === 'de' - ? 'Analyse unsicher' - : language === 'es' - ? 'Analisis incierto' - : 'Uncertain analysis', - confidence: 0.35, - details: fallbackIssue, - }, - ], - actionsNow: actionsNowRaw.length > 0 - ? actionsNowRaw - : [language === 'de' ? 'Neues, schaerferes Foto aufnehmen.' : language === 'es' ? 'Tomar una foto nueva y mas nitida.' : 'Capture a new, sharper photo.'], - plan7Days: plan7DaysRaw.length > 0 - ? plan7DaysRaw - : [language === 'de' ? 'In 2 Tagen erneut pruefen.' : language === 'es' ? 'Volver a revisar en 2 dias.' : 'Re-check in 2 days.'], - }; - } - - return { - overallHealthScore: Math.round(clamp(scoreRaw, 0, 100)), - status, - likelyIssues, - actionsNow: actionsNowRaw, - plan7Days: plan7DaysRaw, - }; -}; - -const extractMessageContent = (payload: unknown): string => { - const response = payload as { - choices?: Array<{ - message?: { - content?: string | Array<{ type?: string; text?: string }>; - }; - }>; - }; - - const content = response.choices?.[0]?.message?.content; - if (typeof content === 'string') return content; - if (Array.isArray(content)) { - return content - .map((chunk) => (chunk?.type === 'text' ? chunk.text || '' : '')) - .join('') - .trim(); - } - return ''; -}; - -const postChatCompletion = async ( - modelChain: string[], - imageUri: string, - messages: Array>, -): Promise<{ payload: Record | null; modelUsed: string | null; attemptedModels: string[] }> => { - const attemptedModels: string[] = []; - - for (const model of modelChain) { - attemptedModels.push(model); - const controller = new AbortController(); - const timeout = setTimeout(() => controller.abort(), OPENAI_TIMEOUT_MS); - - try { - const response = await fetch(OPENAI_CHAT_COMPLETIONS_URL, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - Authorization: `Bearer ${OPENAI_API_KEY}`, - }, - body: JSON.stringify({ - model, - response_format: { type: 'json_object' }, - messages, - }), - signal: controller.signal, - }); - - if (!response.ok) { - const body = await response.text(); - console.warn('OpenAI request HTTP error.', { - status: response.status, - model, - image: summarizeImageUri(imageUri), - bodyPreview: body.slice(0, 300), - }); - continue; - } - - const payload = (await response.json()) as Record; - return { payload, modelUsed: model, attemptedModels }; - } catch (error) { - const isTimeoutAbort = error instanceof Error && error.name === 'AbortError'; - console.warn('OpenAI request failed.', { - model, - timeoutMs: OPENAI_TIMEOUT_MS, - aborted: isTimeoutAbort, - error: toErrorMessage(error), - image: summarizeImageUri(imageUri), - }); - continue; - } finally { - clearTimeout(timeout); - } - } - - return { payload: null, modelUsed: null, attemptedModels }; -}; - -export const openAiScanService = { - isConfigured: (): boolean => Boolean(OPENAI_API_KEY), - - identifyPlant: async ( - imageUri: string, - language: Language, - mode: OpenAiScanMode = 'primary', - plan: 'free' | 'pro' = 'free', - ): Promise => { - if (!OPENAI_API_KEY) return null; - const modelChain = getScanModelChain(plan); - const completion = await postChatCompletion( - modelChain, - imageUri, - [ - { - role: 'system', - content: 'You are a plant identification assistant. Return strict JSON only.', - }, - { - role: 'user', - content: [ - { type: 'text', text: buildPrompt(language, mode) }, - { type: 'image_url', image_url: { url: imageUri } }, - ], - }, - ], - ); - - if (!completion.payload) return null; - - const content = extractMessageContent(completion.payload); - if (!content) { - console.warn('OpenAI plant scan returned empty message content.', { - model: completion.modelUsed || modelChain[0], - mode, - image: summarizeImageUri(imageUri), - }); - return null; - } - - const parsed = parseContentToJson(content); - if (!parsed) { - console.warn('OpenAI plant scan returned non-JSON content.', { - model: completion.modelUsed || modelChain[0], - mode, - preview: content.slice(0, 220), - }); - return null; - } - - const normalized = normalizeResult(parsed, language); - if (!normalized) { - console.warn('OpenAI plant scan JSON did not match required schema.', { - model: completion.modelUsed || modelChain[0], - mode, - keys: Object.keys(parsed), - }); - } - - return normalized; - }, - - analyzePlantHealth: async ( - imageUri: string, - language: Language, - plantContext?: { - name: string; - botanicalName: string; - careInfo: CareInfo; - description?: string; - }, - ): Promise => { - if (!OPENAI_API_KEY) return null; - const completion = await postChatCompletion( - OPENAI_HEALTH_MODEL_CHAIN, - imageUri, - [ - { - role: 'system', - content: 'You are a plant health diagnosis assistant. Return strict JSON only.', - }, - { - role: 'user', - content: [ - { type: 'text', text: buildHealthPrompt(language, plantContext) }, - { type: 'image_url', image_url: { url: imageUri } }, - ], - }, - ], - ); - - if (!completion.payload) return buildFallbackHealthAnalysis(language, plantContext); - - const content = extractMessageContent(completion.payload); - if (!content) { - console.warn('OpenAI health check returned empty content.', { - model: completion.modelUsed || OPENAI_HEALTH_MODEL_CHAIN[0], - image: summarizeImageUri(imageUri), - }); - return buildFallbackHealthAnalysis(language, plantContext); - } - - const parsed = parseContentToJson(content); - if (!parsed) { - console.warn('OpenAI health check returned non-JSON content.', { - model: completion.modelUsed || OPENAI_HEALTH_MODEL_CHAIN[0], - preview: content.slice(0, 220), - }); - return buildFallbackHealthAnalysis(language, plantContext); - } - - return normalizeHealthAnalysis(parsed, language) || buildFallbackHealthAnalysis(language, plantContext); - }, -}; +import { CareInfo, IdentificationResult, Language } from '../../types'; + +type OpenAiScanMode = 'primary' | 'review'; + +export interface OpenAiHealthIssue { + title: string; + confidence: number; + details: string; +} + +export interface OpenAiHealthAnalysis { + overallHealthScore: number; + status: 'healthy' | 'watch' | 'critical'; + likelyIssues: OpenAiHealthIssue[]; + actionsNow: string[]; + plan7Days: string[]; +} + +const OPENAI_API_KEY = (process.env.EXPO_PUBLIC_OPENAI_API_KEY || '').trim(); +const OPENAI_SCAN_MODEL = (process.env.EXPO_PUBLIC_OPENAI_SCAN_MODEL || 'gpt-5-mini').trim(); +const OPENAI_SCAN_MODEL_PRO = (process.env.EXPO_PUBLIC_OPENAI_SCAN_MODEL_PRO || OPENAI_SCAN_MODEL).trim(); +const OPENAI_HEALTH_MODEL = (process.env.EXPO_PUBLIC_OPENAI_HEALTH_MODEL || OPENAI_SCAN_MODEL).trim(); +const OPENAI_SCAN_FALLBACK_MODELS = (process.env.EXPO_PUBLIC_OPENAI_SCAN_FALLBACK_MODELS || 'gpt-5-mini,gpt-4.1-mini').trim(); +const OPENAI_SCAN_FALLBACK_MODELS_PRO = (process.env.EXPO_PUBLIC_OPENAI_SCAN_FALLBACK_MODELS_PRO || OPENAI_SCAN_FALLBACK_MODELS).trim(); +const OPENAI_HEALTH_FALLBACK_MODELS = (process.env.EXPO_PUBLIC_OPENAI_HEALTH_FALLBACK_MODELS || OPENAI_SCAN_FALLBACK_MODELS).trim(); +const OPENAI_CHAT_COMPLETIONS_URL = 'https://api.openai.com/v1/chat/completions'; +const OPENAI_TIMEOUT_MS = (() => { + const raw = (process.env.EXPO_PUBLIC_OPENAI_TIMEOUT_MS || '45000').trim(); + const parsed = Number.parseInt(raw, 10); + if (Number.isFinite(parsed) && parsed >= 10000) return parsed; + return 45000; +})(); + +const parseModelChain = (primaryModel: string, fallbackModels: string): string[] => { + const models = [primaryModel]; + fallbackModels.split(',').forEach((model) => { + const normalized = model.trim(); + if (normalized) models.push(normalized); + }); + return [...new Set(models)]; +}; + +const OPENAI_SCAN_MODEL_CHAIN = parseModelChain(OPENAI_SCAN_MODEL, OPENAI_SCAN_FALLBACK_MODELS); +const OPENAI_SCAN_MODEL_CHAIN_PRO = parseModelChain(OPENAI_SCAN_MODEL_PRO, OPENAI_SCAN_FALLBACK_MODELS_PRO); +const OPENAI_HEALTH_MODEL_CHAIN = parseModelChain(OPENAI_HEALTH_MODEL, OPENAI_HEALTH_FALLBACK_MODELS); + +const getScanModelChain = (plan: 'free' | 'pro'): string[] => { + return plan === 'pro' ? OPENAI_SCAN_MODEL_CHAIN_PRO : OPENAI_SCAN_MODEL_CHAIN; +}; + +const clamp = (value: number, min: number, max: number): number => { + return Math.min(max, Math.max(min, value)); +}; + +const toErrorMessage = (error: unknown): string => { + if (error instanceof Error) return error.message; + return String(error); +}; + +const summarizeImageUri = (imageUri: string): string => { + const trimmed = imageUri.trim(); + if (!trimmed) return 'empty'; + if (trimmed.startsWith('data:image')) return `data-uri(${Math.round(trimmed.length / 1024)}kb)`; + return trimmed.length > 120 ? `${trimmed.slice(0, 120)}...` : trimmed; +}; + +const toJsonString = (content: string): string => { + const trimmed = content.trim(); + if (!trimmed) return trimmed; + + const fenced = trimmed.match(/^```(?:json)?\s*([\s\S]*?)\s*```$/i); + if (fenced?.[1]) return fenced[1].trim(); + return trimmed; +}; + +const parseContentToJson = (content: string): Record | null => { + try { + const parsed = JSON.parse(toJsonString(content)); + if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) { + return parsed as Record; + } + return null; + } catch { + return null; + } +}; + +const getString = (value: unknown): string => { + return typeof value === 'string' ? value.trim() : ''; +}; + +const getNumber = (value: unknown): number | null => { + if (typeof value === 'number' && Number.isFinite(value)) return value; + if (typeof value === 'string' && value.trim()) { + const parsed = Number(value); + if (Number.isFinite(parsed)) return parsed; + } + return null; +}; + +const getStringArray = (value: unknown): string[] => { + if (!Array.isArray(value)) return []; + return value + .map((item) => (typeof item === 'string' ? item.trim() : '')) + .filter(Boolean); +}; + +const normalizeResult = ( + raw: Record, + language: Language, +): IdentificationResult | null => { + const name = getString(raw.name); + const botanicalName = getString(raw.botanicalName); + const description = getString(raw.description); + const confidenceRaw = getNumber(raw.confidence); + const careInfoRaw = raw.careInfo; + + if (!name || !botanicalName || !careInfoRaw || typeof careInfoRaw !== 'object' || Array.isArray(careInfoRaw)) { + return null; + } + + const careInfoObj = careInfoRaw as Record; + const waterIntervalRaw = getNumber(careInfoObj.waterIntervalDays); + const light = getString(careInfoObj.light); + const temp = getString(careInfoObj.temp); + + if (waterIntervalRaw == null || !light || !temp) { + return null; + } + + const fallbackDescription = language === 'de' + ? `${name} wurde per KI erkannt. Pflegehinweise sind unten aufgefuehrt.` + : language === 'es' + ? `${name} se detecto con IA. Debajo veras recomendaciones de cuidado.` + : `${name} was identified with AI. Care guidance is shown below.`; + + return { + name, + botanicalName, + confidence: clamp(confidenceRaw ?? 0.72, 0.05, 0.99), + description: description || fallbackDescription, + careInfo: { + waterIntervalDays: Math.round(clamp(waterIntervalRaw, 1, 45)), + light, + temp, + }, + }; +}; + +const getLanguageLabel = (language: Language): string => { + if (language === 'de') return 'German'; + if (language === 'es') return 'Spanish'; + return 'English'; +}; + +const buildPrompt = (language: Language, mode: OpenAiScanMode): string => { + const reviewInstruction = mode === 'review' + ? 'Re-check your first hypothesis with stricter botanical accuracy and correct any mismatch.' + : 'Identify the most likely houseplant species from this image with conservative confidence.'; + + const nameLanguageInstruction = language === 'en' + ? '- "name" must be an English common name only. Never return a German or other non-English common name. If no reliable English common name is known, use "botanicalName" as "name" instead of inventing or translating.' + : `- "name" must be strictly written in ${getLanguageLabel(language)}. If a reliable common name in that language is not known, use "botanicalName" as "name" instead of inventing a localized name.`; + + return [ + `${reviewInstruction}`, + `Return strict JSON only in this shape:`, + `{"name":"...","botanicalName":"...","confidence":0.0,"description":"...","careInfo":{"waterIntervalDays":7,"light":"...","temp":"..."}}`, + `Rules:`, + nameLanguageInstruction, + `- "description" and "careInfo.light" must be written in ${getLanguageLabel(language)}.`, + `- "botanicalName" must use accepted Latin scientific naming and must not be invented or misspelled.`, + `- If species is uncertain, prefer genus-level naming (for example: "Calathea sp.").`, + `- "confidence" must be between 0 and 1.`, + `- Keep confidence <= 0.55 when the image is ambiguous, blurred, or partially visible.`, + `- "waterIntervalDays" must be an integer between 1 and 45.`, + `- Do not include markdown, explanations, or extra keys.`, + ].join('\n'); +}; + +const buildHealthPrompt = ( + language: Language, + plantContext?: { + name: string; + botanicalName: string; + careInfo: CareInfo; + description?: string; + }, +): string => { + const contextLines = plantContext + ? [ + `Plant context:`, + `- name: ${plantContext.name}`, + `- botanicalName: ${plantContext.botanicalName}`, + `- care.light: ${plantContext.careInfo.light}`, + `- care.temp: ${plantContext.careInfo.temp}`, + `- care.waterIntervalDays: ${plantContext.careInfo.waterIntervalDays}`, + `- description: ${plantContext.description || 'n/a'}`, + ] + : ['Plant context: not provided']; + + return [ + `Analyze this plant photo for real health condition signs with focus on yellowing leaves, watering stress, pests, and light stress.`, + `Return strict JSON only in this shape:`, + `{"overallHealthScore":72,"status":"watch","likelyIssues":[{"title":"...","confidence":0.64,"details":"..."}],"actionsNow":["..."],"plan7Days":["..."]}`, + `Rules:`, + `- "overallHealthScore" must be an integer between 0 and 100.`, + `- "status" must be one of: "healthy", "watch", "critical".`, + `- "likelyIssues" must contain 1 to 4 items sorted by confidence descending.`, + `- "confidence" must be between 0 and 1.`, + `- "title", "details", "actionsNow", and "plan7Days" must be written in ${getLanguageLabel(language)}.`, + `- "actionsNow" should be immediate steps for the next 24 hours.`, + `- "plan7Days" should be short actionable steps for the next week.`, + `- Do not include markdown, explanations, or extra keys.`, + ...contextLines, + ].join('\n'); +}; + +const buildFallbackHealthAnalysis = ( + language: Language, + plantContext?: { + name: string; + botanicalName: string; + careInfo: CareInfo; + description?: string; + }, +): OpenAiHealthAnalysis => { + if (language === 'de') { + return { + overallHealthScore: 58, + status: 'watch', + likelyIssues: [ + { + title: 'Eingeschraenkte KI-Analyse', + confidence: 0.42, + details: `${plantContext?.name || 'Die Pflanze'} konnte wegen instabiler Antwort nicht vollstaendig bewertet werden.`, + }, + ], + actionsNow: [ + 'Neues Foto bei hellem, indirektem Licht aufnehmen.', + 'Blaetter auf Flecken, Schaedlinge und trockene Raender pruefen.', + 'Erst giessen, wenn die oberen 2-3 cm Erde trocken sind.', + ], + plan7Days: [ + 'In 2 Tagen mit neuem Foto erneut pruefen.', + 'Farbe und Blattspannung taeglich beobachten.', + 'Bei Verschlechterung Standort und Giessrhythmus anpassen.', + ], + }; + } + + if (language === 'es') { + return { + overallHealthScore: 58, + status: 'watch', + likelyIssues: [ + { + title: 'Analisis de IA limitado', + confidence: 0.42, + details: `${plantContext?.name || 'La planta'} no pudo evaluarse por completo por una respuesta inestable.`, + }, + ], + actionsNow: [ + 'Tomar una foto nueva con luz brillante e indirecta.', + 'Revisar hojas por manchas, plagas y bordes secos.', + 'Regar solo si los 2-3 cm superiores del sustrato estan secos.', + ], + plan7Days: [ + 'Revisar otra vez en 2 dias con una foto nueva.', + 'Observar color y firmeza de hojas cada dia.', + 'Si empeora, ajustar ubicacion y frecuencia de riego.', + ], + }; + } + + return { + overallHealthScore: 58, + status: 'watch', + likelyIssues: [ + { + title: 'Limited AI analysis', + confidence: 0.42, + details: `${plantContext?.name || 'This plant'} could not be fully assessed due to an unstable provider response.`, + }, + ], + actionsNow: [ + 'Capture a new photo in bright indirect light.', + 'Inspect leaves for spots, pests, and dry edges.', + 'Water only if the top 2-3 cm of soil is dry.', + ], + plan7Days: [ + 'Re-check in 2 days with a new photo.', + 'Track leaf color and firmness daily.', + 'If symptoms worsen, adjust placement and watering cadence.', + ], + }; +}; + +const normalizeHealthAnalysis = ( + raw: Record, + language: Language, +): OpenAiHealthAnalysis | null => { + const scoreRaw = getNumber(raw.overallHealthScore); + const statusRaw = getString(raw.status); + const issuesRaw = raw.likelyIssues; + const actionsNowRaw = getStringArray(raw.actionsNow).slice(0, 6); + const plan7DaysRaw = getStringArray(raw.plan7Days).slice(0, 7); + + if (scoreRaw == null || !statusRaw || !Array.isArray(issuesRaw)) { + return null; + } + + const status: OpenAiHealthAnalysis['status'] = statusRaw === 'healthy' || statusRaw === 'watch' || statusRaw === 'critical' + ? statusRaw + : 'watch'; + + const likelyIssues = issuesRaw + .map((entry) => { + if (!entry || typeof entry !== 'object' || Array.isArray(entry)) return null; + const issueObj = entry as Record; + const title = getString(issueObj.title); + const details = getString(issueObj.details); + const confidenceRaw = getNumber(issueObj.confidence); + if (!title || !details || confidenceRaw == null) return null; + return { + title, + details, + confidence: clamp(confidenceRaw, 0.05, 0.99), + } as OpenAiHealthIssue; + }) + .filter((entry): entry is OpenAiHealthIssue => Boolean(entry)) + .slice(0, 4); + + if (likelyIssues.length === 0 || actionsNowRaw.length === 0 || plan7DaysRaw.length === 0) { + const fallbackIssue = language === 'de' + ? 'Die KI konnte keine stabilen Gesundheitsmerkmale extrahieren.' + : language === 'es' + ? 'La IA no pudo extraer senales de salud estables.' + : 'AI could not extract stable health signals.'; + return { + overallHealthScore: Math.round(clamp(scoreRaw, 0, 100)), + status, + likelyIssues: [ + { + title: language === 'de' + ? 'Analyse unsicher' + : language === 'es' + ? 'Analisis incierto' + : 'Uncertain analysis', + confidence: 0.35, + details: fallbackIssue, + }, + ], + actionsNow: actionsNowRaw.length > 0 + ? actionsNowRaw + : [language === 'de' ? 'Neues, schaerferes Foto aufnehmen.' : language === 'es' ? 'Tomar una foto nueva y mas nitida.' : 'Capture a new, sharper photo.'], + plan7Days: plan7DaysRaw.length > 0 + ? plan7DaysRaw + : [language === 'de' ? 'In 2 Tagen erneut pruefen.' : language === 'es' ? 'Volver a revisar en 2 dias.' : 'Re-check in 2 days.'], + }; + } + + return { + overallHealthScore: Math.round(clamp(scoreRaw, 0, 100)), + status, + likelyIssues, + actionsNow: actionsNowRaw, + plan7Days: plan7DaysRaw, + }; +}; + +const extractMessageContent = (payload: unknown): string => { + const response = payload as { + choices?: Array<{ + message?: { + content?: string | Array<{ type?: string; text?: string }>; + }; + }>; + }; + + const content = response.choices?.[0]?.message?.content; + if (typeof content === 'string') return content; + if (Array.isArray(content)) { + return content + .map((chunk) => (chunk?.type === 'text' ? chunk.text || '' : '')) + .join('') + .trim(); + } + return ''; +}; + +const postChatCompletion = async ( + modelChain: string[], + imageUri: string, + messages: Array>, +): Promise<{ payload: Record | null; modelUsed: string | null; attemptedModels: string[] }> => { + const attemptedModels: string[] = []; + + for (const model of modelChain) { + attemptedModels.push(model); + const controller = new AbortController(); + const timeout = setTimeout(() => controller.abort(), OPENAI_TIMEOUT_MS); + + try { + const response = await fetch(OPENAI_CHAT_COMPLETIONS_URL, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${OPENAI_API_KEY}`, + }, + body: JSON.stringify({ + model, + response_format: { type: 'json_object' }, + messages, + }), + signal: controller.signal, + }); + + if (!response.ok) { + const body = await response.text(); + console.warn('OpenAI request HTTP error.', { + status: response.status, + model, + image: summarizeImageUri(imageUri), + bodyPreview: body.slice(0, 300), + }); + continue; + } + + const payload = (await response.json()) as Record; + return { payload, modelUsed: model, attemptedModels }; + } catch (error) { + const isTimeoutAbort = error instanceof Error && error.name === 'AbortError'; + console.warn('OpenAI request failed.', { + model, + timeoutMs: OPENAI_TIMEOUT_MS, + aborted: isTimeoutAbort, + error: toErrorMessage(error), + image: summarizeImageUri(imageUri), + }); + continue; + } finally { + clearTimeout(timeout); + } + } + + return { payload: null, modelUsed: null, attemptedModels }; +}; + +export const openAiScanService = { + isConfigured: (): boolean => Boolean(OPENAI_API_KEY), + + identifyPlant: async ( + imageUri: string, + language: Language, + mode: OpenAiScanMode = 'primary', + plan: 'free' | 'pro' = 'free', + ): Promise => { + if (!OPENAI_API_KEY) return null; + const modelChain = getScanModelChain(plan); + const completion = await postChatCompletion( + modelChain, + imageUri, + [ + { + role: 'system', + content: 'You are a plant identification assistant. Return strict JSON only.', + }, + { + role: 'user', + content: [ + { type: 'text', text: buildPrompt(language, mode) }, + { type: 'image_url', image_url: { url: imageUri } }, + ], + }, + ], + ); + + if (!completion.payload) return null; + + const content = extractMessageContent(completion.payload); + if (!content) { + console.warn('OpenAI plant scan returned empty message content.', { + model: completion.modelUsed || modelChain[0], + mode, + image: summarizeImageUri(imageUri), + }); + return null; + } + + const parsed = parseContentToJson(content); + if (!parsed) { + console.warn('OpenAI plant scan returned non-JSON content.', { + model: completion.modelUsed || modelChain[0], + mode, + preview: content.slice(0, 220), + }); + return null; + } + + const normalized = normalizeResult(parsed, language); + if (!normalized) { + console.warn('OpenAI plant scan JSON did not match required schema.', { + model: completion.modelUsed || modelChain[0], + mode, + keys: Object.keys(parsed), + }); + } + + return normalized; + }, + + analyzePlantHealth: async ( + imageUri: string, + language: Language, + plantContext?: { + name: string; + botanicalName: string; + careInfo: CareInfo; + description?: string; + }, + ): Promise => { + if (!OPENAI_API_KEY) return null; + const completion = await postChatCompletion( + OPENAI_HEALTH_MODEL_CHAIN, + imageUri, + [ + { + role: 'system', + content: 'You are a plant health diagnosis assistant. Return strict JSON only.', + }, + { + role: 'user', + content: [ + { type: 'text', text: buildHealthPrompt(language, plantContext) }, + { type: 'image_url', image_url: { url: imageUri } }, + ], + }, + ], + ); + + if (!completion.payload) return buildFallbackHealthAnalysis(language, plantContext); + + const content = extractMessageContent(completion.payload); + if (!content) { + console.warn('OpenAI health check returned empty content.', { + model: completion.modelUsed || OPENAI_HEALTH_MODEL_CHAIN[0], + image: summarizeImageUri(imageUri), + }); + return buildFallbackHealthAnalysis(language, plantContext); + } + + const parsed = parseContentToJson(content); + if (!parsed) { + console.warn('OpenAI health check returned non-JSON content.', { + model: completion.modelUsed || OPENAI_HEALTH_MODEL_CHAIN[0], + preview: content.slice(0, 220), + }); + return buildFallbackHealthAnalysis(language, plantContext); + } + + return normalizeHealthAnalysis(parsed, language) || buildFallbackHealthAnalysis(language, plantContext); + }, +}; diff --git a/services/backend/userIdentityService.ts b/services/backend/userIdentityService.ts index cbcd2e9..40bbf3a 100644 --- a/services/backend/userIdentityService.ts +++ b/services/backend/userIdentityService.ts @@ -1,17 +1,17 @@ -import * as SecureStore from 'expo-secure-store'; - -const SESSION_KEY = 'greenlens_session_v3'; - -export const getAuthToken = async (): Promise => { - try { - const raw = await SecureStore.getItemAsync(SESSION_KEY); - if (raw) { - const session = JSON.parse(raw); - if (typeof session?.token === 'string' && session.token) { - return session.token; - } - } - } catch {} - // Return 'guest' instead of throwing to allow guest mode - return 'guest'; -}; +import * as SecureStore from 'expo-secure-store'; + +const SESSION_KEY = 'greenlens_session_v3'; + +export const getAuthToken = async (): Promise => { + try { + const raw = await SecureStore.getItemAsync(SESSION_KEY); + if (raw) { + const session = JSON.parse(raw); + if (typeof session?.token === 'string' && session.token) { + return session.token; + } + } + } catch {} + // Return 'guest' instead of throwing to allow guest mode + return 'guest'; +}; diff --git a/services/database.ts b/services/database.ts index 6659f0d..c4efa00 100644 --- a/services/database.ts +++ b/services/database.ts @@ -1,344 +1,344 @@ -import * as SQLite from 'expo-sqlite'; -import { Plant, CareInfo, Language, AppearanceMode, ColorPalette } from '../types'; - -// ─── DB-Instanz ──────────────────────────────────────────────────────────────── - -let _db: SQLite.SQLiteDatabase | null = null; -let _isDatabaseInitialized = false; - -export const getDb = (): SQLite.SQLiteDatabase => { - if (!_db) _db = SQLite.openDatabaseSync('greenlens.db'); - return _db; -}; - -// ─── Schema ──────────────────────────────────────────────────────────────────── - -export const initDatabase = (): void => { - if (_isDatabaseInitialized) return; - - const db = getDb(); - - try { - db.execSync(` - PRAGMA foreign_keys = ON; - PRAGMA journal_mode = WAL; - - CREATE TABLE IF NOT EXISTS users ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - 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')) - ); - - CREATE TABLE IF NOT EXISTS user_settings ( - user_id INTEGER PRIMARY KEY REFERENCES users(id) ON DELETE CASCADE, - language TEXT NOT NULL DEFAULT 'de', - language_set INTEGER NOT NULL DEFAULT 0, - appearance_mode TEXT NOT NULL DEFAULT 'system', - color_palette TEXT NOT NULL DEFAULT 'forest', - profile_image TEXT, - onboarding_done INTEGER NOT NULL DEFAULT 0 - ); - - CREATE TABLE IF NOT EXISTS plants ( - id TEXT PRIMARY KEY, - user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE, - name TEXT NOT NULL, - botanical_name TEXT NOT NULL DEFAULT '', - image_uri TEXT NOT NULL DEFAULT '', - date_added TEXT NOT NULL, - care_info TEXT NOT NULL DEFAULT '{}', - last_watered TEXT NOT NULL, - watering_history TEXT NOT NULL DEFAULT '[]', - gallery TEXT NOT NULL DEFAULT '[]', - description TEXT, - notifications_enabled INTEGER NOT NULL DEFAULT 0, - health_checks TEXT NOT NULL DEFAULT '[]' - ); - - CREATE TABLE IF NOT EXISTS lexicon_search_history ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE, - query TEXT NOT NULL, - created_at TEXT NOT NULL DEFAULT (datetime('now')) - ); - - CREATE TABLE IF NOT EXISTS app_meta ( - key TEXT PRIMARY KEY, - value TEXT NOT NULL - ); - `); - _isDatabaseInitialized = true; - } catch (error) { - console.error('Failed to initialize SQLite schema.', error); - throw error; - } - - // Migration: add language_set column to existing databases - try { - db.runSync('ALTER TABLE user_settings ADD COLUMN language_set INTEGER NOT NULL DEFAULT 0'); - } catch (_) { /* column already exists */ } -}; - -// ─── App Meta ───────────────────────────────────────────────────────────────── - -export const AppMetaDb = { - get(key: string): string | null { - const row = getDb().getFirstSync<{ value: string }>( - 'SELECT value FROM app_meta WHERE key = ?', - [key], - ); - return row?.value ?? null; - }, - - set(key: string, value: string): void { - getDb().runSync( - 'INSERT INTO app_meta (key, value) VALUES (?, ?) ON CONFLICT(key) DO UPDATE SET value = excluded.value', - [key, value], - ); - }, -}; - -// ─── Auth ────────────────────────────────────────────────────────────────────── -// Credential management has moved to the server (server/lib/auth.js + JWT). -// AuthDb only manages the local device user (id=1) used for plants/settings queries. - -export interface DbUser { - id: number; - email: string; - name: string; -} - -export const AuthDb = { - // Ensures a local device user exists. Maps email to a unique local ID. - ensureLocalUser(email: string, name: string): { id: number } { - const db = getDb(); - const normalizedEmail = email.trim().toLowerCase(); - - // Check if this specific email already has a local account - const existing = db.getFirstSync<{ id: number }>('SELECT id FROM users WHERE email = ?', [normalizedEmail]); - - if (existing) { - // Update name just in case it changed on server - db.runSync('UPDATE users SET name = ? WHERE id = ?', [name.trim(), existing.id]); - return { id: existing.id }; - } - - // Create a new local user if it doesn't exist - const result = db.runSync( - 'INSERT INTO users (email, name, password_hash) VALUES (?, ?, ?)', - [normalizedEmail, name.trim(), 'server-auth'], - ); - - const newUserId = result.lastInsertRowId; - db.runSync('INSERT OR IGNORE INTO user_settings (user_id) VALUES (?)', [newUserId]); - - return { id: newUserId }; - }, - - getUserById(id: number): DbUser | null { - const db = getDb(); - const user = db.getFirstSync( - 'SELECT id, email, name FROM users WHERE id = ?', - [id], - ); - return user || null; - }, -}; - -// ─── Settings ────────────────────────────────────────────────────────────────── - -export const SettingsDb = { - get(userId: number) { - const db = getDb(); - db.runSync('INSERT OR IGNORE INTO user_settings (user_id) VALUES (?)', [userId]); - return db.getFirstSync<{ - language: string; - language_set: number; - appearance_mode: string; - color_palette: string; - profile_image: string | null; - onboarding_done: number; - }>('SELECT * FROM user_settings WHERE user_id = ?', [userId])!; - }, - - setLanguage(userId: number, lang: Language) { - getDb().runSync('UPDATE user_settings SET language = ?, language_set = 1 WHERE user_id = ?', [lang, userId]); - }, - - setAppearanceMode(userId: number, mode: AppearanceMode) { - getDb().runSync('UPDATE user_settings SET appearance_mode = ? WHERE user_id = ?', [mode, userId]); - }, - - setColorPalette(userId: number, palette: ColorPalette) { - getDb().runSync('UPDATE user_settings SET color_palette = ? WHERE user_id = ?', [palette, userId]); - }, - - setProfileImage(userId: number, uri: string | null) { - getDb().runSync('UPDATE user_settings SET profile_image = ? WHERE user_id = ?', [uri, userId]); - }, - - setOnboardingDone(userId: number, done: boolean) { - getDb().runSync( - 'UPDATE user_settings SET onboarding_done = ? WHERE user_id = ?', - [done ? 1 : 0, userId], - ); - }, - - setName(userId: number, name: string) { - getDb().runSync('UPDATE users SET name = ? WHERE id = ?', [name.trim(), userId]); - }, -}; - -// ─── Plants ──────────────────────────────────────────────────────────────────── - -const DEFAULT_CARE_INFO: CareInfo = { - waterIntervalDays: 7, - light: 'Bright indirect light', - temp: '18-25 C', -}; - -const safeJsonParse = (value: unknown, fallback: T, fieldName: string, plantId: string): T => { - if (typeof value !== 'string' || !value.trim()) return fallback; - - try { - return JSON.parse(value) as T; - } catch (error) { - console.warn('Failed to parse plant JSON field. Falling back to defaults.', { - plantId, - fieldName, - error: error instanceof Error ? error.message : String(error), - }); - return fallback; - } -}; - -const parsePlant = (row: any): Plant => ({ - id: row.id, - name: row.name, - botanicalName: row.botanical_name, - imageUri: row.image_uri, - dateAdded: row.date_added, - careInfo: safeJsonParse(row.care_info, DEFAULT_CARE_INFO, 'care_info', row.id), - lastWatered: row.last_watered, - wateringHistory: safeJsonParse(row.watering_history, [], 'watering_history', row.id), - gallery: safeJsonParse(row.gallery, [], 'gallery', row.id), - description: row.description ?? undefined, - notificationsEnabled: row.notifications_enabled === 1, - healthChecks: safeJsonParse(row.health_checks, [], 'health_checks', row.id), -}); - -export const PlantsDb = { - getAll(userId: number): Plant[] { - const rows = getDb().getAllSync( - 'SELECT * FROM plants WHERE user_id = ? ORDER BY date_added DESC', - [userId], - ); - return rows.map(parsePlant); - }, - - insert(userId: number, plant: Plant): void { - getDb().runSync( - `INSERT INTO plants - (id, user_id, name, botanical_name, image_uri, date_added, - care_info, last_watered, watering_history, gallery, - description, notifications_enabled, health_checks) - VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, - [ - plant.id, - userId, - plant.name, - plant.botanicalName, - plant.imageUri, - plant.dateAdded, - JSON.stringify(plant.careInfo), - plant.lastWatered, - JSON.stringify(plant.wateringHistory ?? []), - JSON.stringify(plant.gallery ?? []), - plant.description ?? null, - plant.notificationsEnabled ? 1 : 0, - JSON.stringify(plant.healthChecks ?? []), - ], - ); - }, - - update(userId: number, plant: Plant): void { - getDb().runSync( - `UPDATE plants SET - name = ?, botanical_name = ?, image_uri = ?, - care_info = ?, last_watered = ?, watering_history = ?, - gallery = ?, description = ?, notifications_enabled = ?, health_checks = ? - WHERE id = ? AND user_id = ?`, - [ - plant.name, - plant.botanicalName, - plant.imageUri, - JSON.stringify(plant.careInfo), - plant.lastWatered, - JSON.stringify(plant.wateringHistory ?? []), - JSON.stringify(plant.gallery ?? []), - plant.description ?? null, - plant.notificationsEnabled ? 1 : 0, - JSON.stringify(plant.healthChecks ?? []), - plant.id, - userId, - ], - ); - }, - - delete(userId: number, plantId: string): void { - getDb().runSync('DELETE FROM plants WHERE id = ? AND user_id = ?', [plantId, userId]); - }, -}; - -// ─── Lexicon Search History ──────────────────────────────────────────────────── - -const HISTORY_LIMIT = 10; - -const normalize = (v: string) => - v.toLowerCase().normalize('NFD').replace(/[\u0300-\u036f]/g, '').trim().replace(/\s+/g, ' '); - -export const LexiconHistoryDb = { - getAll(userId: number): string[] { - return getDb() - .getAllSync<{ query: string }>( - 'SELECT query FROM lexicon_search_history WHERE user_id = ? ORDER BY created_at DESC LIMIT ?', - [userId, HISTORY_LIMIT], - ) - .map((r) => r.query); - }, - - add(userId: number, query: string): void { - const trimmed = query.trim(); - if (!trimmed) return; - const db = getDb(); - // Duplikate entfernen - const normalized = normalize(trimmed); - const existing = db.getAllSync<{ id: number; query: string }>( - 'SELECT id, query FROM lexicon_search_history WHERE user_id = ?', - [userId], - ); - for (const row of existing) { - if (normalize(row.query) === normalized) { - db.runSync('DELETE FROM lexicon_search_history WHERE id = ?', [row.id]); - } - } - db.runSync( - 'INSERT INTO lexicon_search_history (user_id, query) VALUES (?, ?)', - [userId, trimmed], - ); - // Limit halten - const oldest = db.getAllSync<{ id: number }>( - 'SELECT id FROM lexicon_search_history WHERE user_id = ? ORDER BY created_at DESC LIMIT -1 OFFSET ?', - [userId, HISTORY_LIMIT], - ); - for (const row of oldest) { - db.runSync('DELETE FROM lexicon_search_history WHERE id = ?', [row.id]); - } - }, - - clear(userId: number): void { - getDb().runSync('DELETE FROM lexicon_search_history WHERE user_id = ?', [userId]); - }, -}; +import * as SQLite from 'expo-sqlite'; +import { Plant, CareInfo, Language, AppearanceMode, ColorPalette } from '../types'; + +// ─── DB-Instanz ──────────────────────────────────────────────────────────────── + +let _db: SQLite.SQLiteDatabase | null = null; +let _isDatabaseInitialized = false; + +export const getDb = (): SQLite.SQLiteDatabase => { + if (!_db) _db = SQLite.openDatabaseSync('greenlens.db'); + return _db; +}; + +// ─── Schema ──────────────────────────────────────────────────────────────────── + +export const initDatabase = (): void => { + if (_isDatabaseInitialized) return; + + const db = getDb(); + + try { + db.execSync(` + PRAGMA foreign_keys = ON; + PRAGMA journal_mode = WAL; + + CREATE TABLE IF NOT EXISTS users ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + 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')) + ); + + CREATE TABLE IF NOT EXISTS user_settings ( + user_id INTEGER PRIMARY KEY REFERENCES users(id) ON DELETE CASCADE, + language TEXT NOT NULL DEFAULT 'de', + language_set INTEGER NOT NULL DEFAULT 0, + appearance_mode TEXT NOT NULL DEFAULT 'system', + color_palette TEXT NOT NULL DEFAULT 'forest', + profile_image TEXT, + onboarding_done INTEGER NOT NULL DEFAULT 0 + ); + + CREATE TABLE IF NOT EXISTS plants ( + id TEXT PRIMARY KEY, + user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE, + name TEXT NOT NULL, + botanical_name TEXT NOT NULL DEFAULT '', + image_uri TEXT NOT NULL DEFAULT '', + date_added TEXT NOT NULL, + care_info TEXT NOT NULL DEFAULT '{}', + last_watered TEXT NOT NULL, + watering_history TEXT NOT NULL DEFAULT '[]', + gallery TEXT NOT NULL DEFAULT '[]', + description TEXT, + notifications_enabled INTEGER NOT NULL DEFAULT 0, + health_checks TEXT NOT NULL DEFAULT '[]' + ); + + CREATE TABLE IF NOT EXISTS lexicon_search_history ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE, + query TEXT NOT NULL, + created_at TEXT NOT NULL DEFAULT (datetime('now')) + ); + + CREATE TABLE IF NOT EXISTS app_meta ( + key TEXT PRIMARY KEY, + value TEXT NOT NULL + ); + `); + _isDatabaseInitialized = true; + } catch (error) { + console.error('Failed to initialize SQLite schema.', error); + throw error; + } + + // Migration: add language_set column to existing databases + try { + db.runSync('ALTER TABLE user_settings ADD COLUMN language_set INTEGER NOT NULL DEFAULT 0'); + } catch (_) { /* column already exists */ } +}; + +// ─── App Meta ───────────────────────────────────────────────────────────────── + +export const AppMetaDb = { + get(key: string): string | null { + const row = getDb().getFirstSync<{ value: string }>( + 'SELECT value FROM app_meta WHERE key = ?', + [key], + ); + return row?.value ?? null; + }, + + set(key: string, value: string): void { + getDb().runSync( + 'INSERT INTO app_meta (key, value) VALUES (?, ?) ON CONFLICT(key) DO UPDATE SET value = excluded.value', + [key, value], + ); + }, +}; + +// ─── Auth ────────────────────────────────────────────────────────────────────── +// Credential management has moved to the server (server/lib/auth.js + JWT). +// AuthDb only manages the local device user (id=1) used for plants/settings queries. + +export interface DbUser { + id: number; + email: string; + name: string; +} + +export const AuthDb = { + // Ensures a local device user exists. Maps email to a unique local ID. + ensureLocalUser(email: string, name: string): { id: number } { + const db = getDb(); + const normalizedEmail = email.trim().toLowerCase(); + + // Check if this specific email already has a local account + const existing = db.getFirstSync<{ id: number }>('SELECT id FROM users WHERE email = ?', [normalizedEmail]); + + if (existing) { + // Update name just in case it changed on server + db.runSync('UPDATE users SET name = ? WHERE id = ?', [name.trim(), existing.id]); + return { id: existing.id }; + } + + // Create a new local user if it doesn't exist + const result = db.runSync( + 'INSERT INTO users (email, name, password_hash) VALUES (?, ?, ?)', + [normalizedEmail, name.trim(), 'server-auth'], + ); + + const newUserId = result.lastInsertRowId; + db.runSync('INSERT OR IGNORE INTO user_settings (user_id) VALUES (?)', [newUserId]); + + return { id: newUserId }; + }, + + getUserById(id: number): DbUser | null { + const db = getDb(); + const user = db.getFirstSync( + 'SELECT id, email, name FROM users WHERE id = ?', + [id], + ); + return user || null; + }, +}; + +// ─── Settings ────────────────────────────────────────────────────────────────── + +export const SettingsDb = { + get(userId: number) { + const db = getDb(); + db.runSync('INSERT OR IGNORE INTO user_settings (user_id) VALUES (?)', [userId]); + return db.getFirstSync<{ + language: string; + language_set: number; + appearance_mode: string; + color_palette: string; + profile_image: string | null; + onboarding_done: number; + }>('SELECT * FROM user_settings WHERE user_id = ?', [userId])!; + }, + + setLanguage(userId: number, lang: Language) { + getDb().runSync('UPDATE user_settings SET language = ?, language_set = 1 WHERE user_id = ?', [lang, userId]); + }, + + setAppearanceMode(userId: number, mode: AppearanceMode) { + getDb().runSync('UPDATE user_settings SET appearance_mode = ? WHERE user_id = ?', [mode, userId]); + }, + + setColorPalette(userId: number, palette: ColorPalette) { + getDb().runSync('UPDATE user_settings SET color_palette = ? WHERE user_id = ?', [palette, userId]); + }, + + setProfileImage(userId: number, uri: string | null) { + getDb().runSync('UPDATE user_settings SET profile_image = ? WHERE user_id = ?', [uri, userId]); + }, + + setOnboardingDone(userId: number, done: boolean) { + getDb().runSync( + 'UPDATE user_settings SET onboarding_done = ? WHERE user_id = ?', + [done ? 1 : 0, userId], + ); + }, + + setName(userId: number, name: string) { + getDb().runSync('UPDATE users SET name = ? WHERE id = ?', [name.trim(), userId]); + }, +}; + +// ─── Plants ──────────────────────────────────────────────────────────────────── + +const DEFAULT_CARE_INFO: CareInfo = { + waterIntervalDays: 7, + light: 'Bright indirect light', + temp: '18-25 C', +}; + +const safeJsonParse = (value: unknown, fallback: T, fieldName: string, plantId: string): T => { + if (typeof value !== 'string' || !value.trim()) return fallback; + + try { + return JSON.parse(value) as T; + } catch (error) { + console.warn('Failed to parse plant JSON field. Falling back to defaults.', { + plantId, + fieldName, + error: error instanceof Error ? error.message : String(error), + }); + return fallback; + } +}; + +const parsePlant = (row: any): Plant => ({ + id: row.id, + name: row.name, + botanicalName: row.botanical_name, + imageUri: row.image_uri, + dateAdded: row.date_added, + careInfo: safeJsonParse(row.care_info, DEFAULT_CARE_INFO, 'care_info', row.id), + lastWatered: row.last_watered, + wateringHistory: safeJsonParse(row.watering_history, [], 'watering_history', row.id), + gallery: safeJsonParse(row.gallery, [], 'gallery', row.id), + description: row.description ?? undefined, + notificationsEnabled: row.notifications_enabled === 1, + healthChecks: safeJsonParse(row.health_checks, [], 'health_checks', row.id), +}); + +export const PlantsDb = { + getAll(userId: number): Plant[] { + const rows = getDb().getAllSync( + 'SELECT * FROM plants WHERE user_id = ? ORDER BY date_added DESC', + [userId], + ); + return rows.map(parsePlant); + }, + + insert(userId: number, plant: Plant): void { + getDb().runSync( + `INSERT INTO plants + (id, user_id, name, botanical_name, image_uri, date_added, + care_info, last_watered, watering_history, gallery, + description, notifications_enabled, health_checks) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, + [ + plant.id, + userId, + plant.name, + plant.botanicalName, + plant.imageUri, + plant.dateAdded, + JSON.stringify(plant.careInfo), + plant.lastWatered, + JSON.stringify(plant.wateringHistory ?? []), + JSON.stringify(plant.gallery ?? []), + plant.description ?? null, + plant.notificationsEnabled ? 1 : 0, + JSON.stringify(plant.healthChecks ?? []), + ], + ); + }, + + update(userId: number, plant: Plant): void { + getDb().runSync( + `UPDATE plants SET + name = ?, botanical_name = ?, image_uri = ?, + care_info = ?, last_watered = ?, watering_history = ?, + gallery = ?, description = ?, notifications_enabled = ?, health_checks = ? + WHERE id = ? AND user_id = ?`, + [ + plant.name, + plant.botanicalName, + plant.imageUri, + JSON.stringify(plant.careInfo), + plant.lastWatered, + JSON.stringify(plant.wateringHistory ?? []), + JSON.stringify(plant.gallery ?? []), + plant.description ?? null, + plant.notificationsEnabled ? 1 : 0, + JSON.stringify(plant.healthChecks ?? []), + plant.id, + userId, + ], + ); + }, + + delete(userId: number, plantId: string): void { + getDb().runSync('DELETE FROM plants WHERE id = ? AND user_id = ?', [plantId, userId]); + }, +}; + +// ─── Lexicon Search History ──────────────────────────────────────────────────── + +const HISTORY_LIMIT = 10; + +const normalize = (v: string) => + v.toLowerCase().normalize('NFD').replace(/[\u0300-\u036f]/g, '').trim().replace(/\s+/g, ' '); + +export const LexiconHistoryDb = { + getAll(userId: number): string[] { + return getDb() + .getAllSync<{ query: string }>( + 'SELECT query FROM lexicon_search_history WHERE user_id = ? ORDER BY created_at DESC LIMIT ?', + [userId, HISTORY_LIMIT], + ) + .map((r) => r.query); + }, + + add(userId: number, query: string): void { + const trimmed = query.trim(); + if (!trimmed) return; + const db = getDb(); + // Duplikate entfernen + const normalized = normalize(trimmed); + const existing = db.getAllSync<{ id: number; query: string }>( + 'SELECT id, query FROM lexicon_search_history WHERE user_id = ?', + [userId], + ); + for (const row of existing) { + if (normalize(row.query) === normalized) { + db.runSync('DELETE FROM lexicon_search_history WHERE id = ?', [row.id]); + } + } + db.runSync( + 'INSERT INTO lexicon_search_history (user_id, query) VALUES (?, ?)', + [userId, trimmed], + ); + // Limit halten + const oldest = db.getAllSync<{ id: number }>( + 'SELECT id FROM lexicon_search_history WHERE user_id = ? ORDER BY created_at DESC LIMIT -1 OFFSET ?', + [userId, HISTORY_LIMIT], + ); + for (const row of oldest) { + db.runSync('DELETE FROM lexicon_search_history WHERE id = ?', [row.id]); + } + }, + + clear(userId: number): void { + getDb().runSync('DELETE FROM lexicon_search_history WHERE user_id = ?', [userId]); + }, +}; diff --git a/services/imageCacheService.ts b/services/imageCacheService.ts index 2ce6ee2..ad73c4b 100644 --- a/services/imageCacheService.ts +++ b/services/imageCacheService.ts @@ -1,113 +1,113 @@ -import * as FileSystemLegacy from 'expo-file-system/legacy'; - - -const getCacheDir = (): string => { - const baseDir = FileSystemLegacy.documentDirectory ?? FileSystemLegacy.cacheDirectory; - if (!baseDir) { - throw new Error('No writable file system directory is available for image caching.'); - } - return `${baseDir}plant-images/`; -}; - -const ensureCacheDir = async (): Promise => { - const cacheDir = getCacheDir(); - const dirInfo = await FileSystemLegacy.getInfoAsync(cacheDir); - if (!dirInfo.exists) { - await FileSystemLegacy.makeDirectoryAsync(cacheDir, { intermediates: true }); - } - return cacheDir; -}; - -const hashString = (value: string): string => { - // FNV-1a 32-bit hash for stable cache file names. - let hash = 2166136261; - for (let index = 0; index < value.length; index += 1) { - hash ^= value.charCodeAt(index); - hash = Math.imul(hash, 16777619); - } - return (hash >>> 0).toString(36); -}; - -const getDataUriExtension = (uri: string): string => { - const mimeMatch = uri.match(/^data:(image\/[a-zA-Z0-9.+-]+);base64,/i); - const mimeType = mimeMatch?.[1]?.toLowerCase() || ''; - - if (mimeType.includes('png')) return 'png'; - if (mimeType.includes('webp')) return 'webp'; - if (mimeType.includes('gif')) return 'gif'; - if (mimeType.includes('heic')) return 'heic'; - if (mimeType.includes('heif')) return 'heif'; - return 'jpg'; -}; - -const getUriExtension = (uri: string): string => { - const cleanPath = uri.split(/[?#]/)[0]; - const extensionMatch = cleanPath.match(/\.([a-zA-Z0-9]+)$/); - return extensionMatch?.[1]?.toLowerCase() || 'jpg'; -}; - -const getFileName = (uri: string): string => { - const extension = uri.startsWith('data:') - ? getDataUriExtension(uri) - : getUriExtension(uri); - return `${hashString(uri)}.${extension}`; -}; - -export const ImageCacheService = { - /** - * Check if an image is already cached locally. - */ - isCached: async (uri: string): Promise<{ exists: boolean; localUri: string }> => { - const cacheDir = await ensureCacheDir(); - const fileName = getFileName(uri); - const localUri = `${cacheDir}${fileName}`; - const info = await FileSystemLegacy.getInfoAsync(localUri); - return { exists: info.exists, localUri }; - }, - - /** - * Cache an image (base64 data URI or remote URL) and return the local file path. - */ - cacheImage: async (uri: string): Promise => { - const cacheDir = await ensureCacheDir(); - - const fileName = getFileName(uri); - const localUri = `${cacheDir}${fileName}`; - const info = await FileSystemLegacy.getInfoAsync(localUri); - const exists = info.exists; - if (exists) return localUri; - - if (uri.startsWith('data:')) { - // Extract base64 content after the comma - const base64Data = uri.split(',')[1]; - if (!base64Data) throw new Error('Invalid base64 data URI'); - await FileSystemLegacy.writeAsStringAsync(localUri, base64Data, { - encoding: FileSystemLegacy.EncodingType.Base64, - }); - } else if (/^(file:\/\/|content:\/\/)/i.test(uri)) { - await FileSystemLegacy.copyAsync({ from: uri, to: localUri }); - } else { - // Remote URL - download it - const downloadResult = await FileSystemLegacy.downloadAsync(uri, localUri); - if (downloadResult.status !== 200) { - throw new Error(`Failed to download image: HTTP ${downloadResult.status}`); - } - } - - return localUri; - }, - - /** - * Delete a cached image by its local path. - */ - deleteCachedImage: async (localUri: string): Promise => { - try { - const info = await FileSystemLegacy.getInfoAsync(localUri); - if (info.exists) { - await FileSystemLegacy.deleteAsync(localUri, { idempotent: true }); - } - } catch (e) { - console.error('Failed to delete cached image', e); - } - }, -}; +import * as FileSystemLegacy from 'expo-file-system/legacy'; + + +const getCacheDir = (): string => { + const baseDir = FileSystemLegacy.documentDirectory ?? FileSystemLegacy.cacheDirectory; + if (!baseDir) { + throw new Error('No writable file system directory is available for image caching.'); + } + return `${baseDir}plant-images/`; +}; + +const ensureCacheDir = async (): Promise => { + const cacheDir = getCacheDir(); + const dirInfo = await FileSystemLegacy.getInfoAsync(cacheDir); + if (!dirInfo.exists) { + await FileSystemLegacy.makeDirectoryAsync(cacheDir, { intermediates: true }); + } + return cacheDir; +}; + +const hashString = (value: string): string => { + // FNV-1a 32-bit hash for stable cache file names. + let hash = 2166136261; + for (let index = 0; index < value.length; index += 1) { + hash ^= value.charCodeAt(index); + hash = Math.imul(hash, 16777619); + } + return (hash >>> 0).toString(36); +}; + +const getDataUriExtension = (uri: string): string => { + const mimeMatch = uri.match(/^data:(image\/[a-zA-Z0-9.+-]+);base64,/i); + const mimeType = mimeMatch?.[1]?.toLowerCase() || ''; + + if (mimeType.includes('png')) return 'png'; + if (mimeType.includes('webp')) return 'webp'; + if (mimeType.includes('gif')) return 'gif'; + if (mimeType.includes('heic')) return 'heic'; + if (mimeType.includes('heif')) return 'heif'; + return 'jpg'; +}; + +const getUriExtension = (uri: string): string => { + const cleanPath = uri.split(/[?#]/)[0]; + const extensionMatch = cleanPath.match(/\.([a-zA-Z0-9]+)$/); + return extensionMatch?.[1]?.toLowerCase() || 'jpg'; +}; + +const getFileName = (uri: string): string => { + const extension = uri.startsWith('data:') + ? getDataUriExtension(uri) + : getUriExtension(uri); + return `${hashString(uri)}.${extension}`; +}; + +export const ImageCacheService = { + /** + * Check if an image is already cached locally. + */ + isCached: async (uri: string): Promise<{ exists: boolean; localUri: string }> => { + const cacheDir = await ensureCacheDir(); + const fileName = getFileName(uri); + const localUri = `${cacheDir}${fileName}`; + const info = await FileSystemLegacy.getInfoAsync(localUri); + return { exists: info.exists, localUri }; + }, + + /** + * Cache an image (base64 data URI or remote URL) and return the local file path. + */ + cacheImage: async (uri: string): Promise => { + const cacheDir = await ensureCacheDir(); + + const fileName = getFileName(uri); + const localUri = `${cacheDir}${fileName}`; + const info = await FileSystemLegacy.getInfoAsync(localUri); + const exists = info.exists; + if (exists) return localUri; + + if (uri.startsWith('data:')) { + // Extract base64 content after the comma + const base64Data = uri.split(',')[1]; + if (!base64Data) throw new Error('Invalid base64 data URI'); + await FileSystemLegacy.writeAsStringAsync(localUri, base64Data, { + encoding: FileSystemLegacy.EncodingType.Base64, + }); + } else if (/^(file:\/\/|content:\/\/)/i.test(uri)) { + await FileSystemLegacy.copyAsync({ from: uri, to: localUri }); + } else { + // Remote URL - download it + const downloadResult = await FileSystemLegacy.downloadAsync(uri, localUri); + if (downloadResult.status !== 200) { + throw new Error(`Failed to download image: HTTP ${downloadResult.status}`); + } + } + + return localUri; + }, + + /** + * Delete a cached image by its local path. + */ + deleteCachedImage: async (localUri: string): Promise => { + try { + const info = await FileSystemLegacy.getInfoAsync(localUri); + if (info.exists) { + await FileSystemLegacy.deleteAsync(localUri, { idempotent: true }); + } + } catch (e) { + console.error('Failed to delete cached image', e); + } + }, +}; diff --git a/services/notificationService.ts b/services/notificationService.ts index 94ebebf..107fb22 100644 --- a/services/notificationService.ts +++ b/services/notificationService.ts @@ -1,43 +1,43 @@ -import * as Notifications from 'expo-notifications'; -import { Platform } from 'react-native'; -import { Plant } from '../types'; - -Notifications.setNotificationHandler({ - handleNotification: async () => ({ - shouldShowAlert: true, - shouldShowBanner: true, - shouldShowList: true, - shouldPlaySound: true, - shouldSetBadge: false, - }), -}); - -export async function requestPermissions(): Promise { - const { status: existing } = await Notifications.getPermissionsAsync(); - if (existing === 'granted') return true; - - const { status } = await Notifications.requestPermissionsAsync(); - return status === 'granted'; -} - -export async function scheduleWateringReminder(plant: Plant): Promise { - const intervalDays = plant.careInfo.waterIntervalDays; - - await Notifications.scheduleNotificationAsync({ - identifier: `water-${plant.id}`, - content: { - title: 'Watering Reminder 💧', - body: `Time to water your ${plant.name}!`, - data: { plantId: plant.id }, - }, - trigger: { - type: Notifications.SchedulableTriggerInputTypes.TIME_INTERVAL, - seconds: intervalDays * 24 * 60 * 60, - repeats: true, - }, - }); -} - -export async function cancelReminder(plantId: string): Promise { - await Notifications.cancelScheduledNotificationAsync(`water-${plantId}`); -} +import * as Notifications from 'expo-notifications'; +import { Platform } from 'react-native'; +import { Plant } from '../types'; + +Notifications.setNotificationHandler({ + handleNotification: async () => ({ + shouldShowAlert: true, + shouldShowBanner: true, + shouldShowList: true, + shouldPlaySound: true, + shouldSetBadge: false, + }), +}); + +export async function requestPermissions(): Promise { + const { status: existing } = await Notifications.getPermissionsAsync(); + if (existing === 'granted') return true; + + const { status } = await Notifications.requestPermissionsAsync(); + return status === 'granted'; +} + +export async function scheduleWateringReminder(plant: Plant): Promise { + const intervalDays = plant.careInfo.waterIntervalDays; + + await Notifications.scheduleNotificationAsync({ + identifier: `water-${plant.id}`, + content: { + title: 'Watering Reminder 💧', + body: `Time to water your ${plant.name}!`, + data: { plantId: plant.id }, + }, + trigger: { + type: Notifications.SchedulableTriggerInputTypes.TIME_INTERVAL, + seconds: intervalDays * 24 * 60 * 60, + repeats: true, + }, + }); +} + +export async function cancelReminder(plantId: string): Promise { + await Notifications.cancelScheduledNotificationAsync(`water-${plantId}`); +} diff --git a/services/plantDatabaseService.ts b/services/plantDatabaseService.ts index dc378c3..032e951 100644 --- a/services/plantDatabaseService.ts +++ b/services/plantDatabaseService.ts @@ -1,132 +1,132 @@ -import { IdentificationResult, Language } from '../types'; -import { resolveImageUri, tryResolveImageUri } from '../utils/imageUri'; -import { getConfiguredApiBaseUrl } from '../utils/backendUrl'; -import { backendApiClient } from './backend/backendApiClient'; -import { BackendDatabaseEntry, isBackendApiError } from './backend/contracts'; -import { createIdempotencyKey } from '../utils/idempotency'; -import { getMockCatalog, searchMockCatalog } from './backend/mockCatalog'; - -export interface DatabaseEntry extends IdentificationResult { - imageUri: string; - imageStatus?: 'ok' | 'missing' | 'invalid'; - categories: string[]; -} - -interface SearchOptions { - category?: string | null; - limit?: number; -} - -export type SemanticSearchStatus = 'success' | 'timeout' | 'provider_error' | 'no_results' | 'insufficient_credits'; - -export interface SemanticSearchResult { - status: SemanticSearchStatus; - results: DatabaseEntry[]; -} - -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 normalizeImageStatus = (status?: string, imageUri?: string): 'ok' | 'missing' | 'invalid' => { - if (status === 'ok' || status === 'missing' || status === 'invalid') return status; - const resolved = tryResolveImageUri(imageUri || ''); - if (resolved) return 'ok'; - return imageUri && imageUri.trim() ? 'invalid' : 'missing'; -}; - -const mapBackendEntry = (entry: Partial & { imageUri?: string | null }): DatabaseEntry => { - const imageStatus = normalizeImageStatus(entry.imageStatus, entry.imageUri || undefined); - const strictImageUri = tryResolveImageUri(entry.imageUri || undefined); - const imageUri = imageStatus === 'ok' - ? (strictImageUri || resolveImageUri(entry.imageUri)) - : (typeof entry.imageUri === 'string' ? entry.imageUri.trim() : ''); - - return { - name: entry.name || '', - botanicalName: entry.botanicalName || '', - confidence: typeof entry.confidence === 'number' ? entry.confidence : 0, - description: entry.description || '', - careInfo: entry.careInfo || { waterIntervalDays: 7, light: 'Unknown', temp: 'Unknown' }, - imageUri, - imageStatus, - categories: Array.isArray(entry.categories) ? entry.categories : [], - }; -}; - -export const PlantDatabaseService = { - async getAllPlants(lang: Language): Promise { - if (!hasConfiguredPlantBackend()) { - return getMockCatalog(lang).map(mapBackendEntry); - } - - try { - const response = await fetch(`${getConfiguredApiBaseUrl()}/plants?lang=${lang}`); - if (!response.ok) throw new Error('Network response was not ok'); - const data = await response.json(); - if (!Array.isArray(data)) return []; - return data.map(mapBackendEntry); - } catch (e) { - console.error('Failed to fetch plants', e); - return []; - } - }, - - async searchPlants(query: string, lang: Language, options: SearchOptions = {}): Promise { - const { category, limit = DEFAULT_SEARCH_LIMIT } = options; - - if (!hasConfiguredPlantBackend()) { - let results = searchMockCatalog(query || '', lang, limit); - if (category) { - results = results.filter(r => r.categories.includes(category)); - } - return results.map(mapBackendEntry); - } - - const url = new URL(`${getConfiguredApiBaseUrl()}/plants`); - url.searchParams.append('lang', lang); - if (query) url.searchParams.append('q', query); - if (category) url.searchParams.append('category', category); - if (limit) url.searchParams.append('limit', limit.toString()); - - try { - const response = await fetch(url.toString()); - if (!response.ok) throw new Error('Network response was not ok'); - const data = await response.json(); - if (!Array.isArray(data)) return []; - return data.map(mapBackendEntry); - } catch (e) { - console.error('Failed to search plants', e); - return []; - } - }, - - async semanticSearchDetailed(query: string, lang: Language): Promise { - const idempotencyKey = createIdempotencyKey(`semantic-${query}-${lang}`); - try { - const response = await backendApiClient.semanticSearch({ - query, - language: lang, - idempotencyKey, - }); - - const results: DatabaseEntry[] = (response.results as BackendDatabaseEntry[]).map(mapBackendEntry); - return { status: results.length > 0 ? 'success' : 'no_results', results }; - } catch (error) { - if (isBackendApiError(error)) { - if (error.code === 'INSUFFICIENT_CREDITS') { - return { status: 'insufficient_credits', results: [] }; - } - return { status: 'provider_error', results: [] }; - } - return { status: 'timeout', results: [] }; - } - }, -}; +import { IdentificationResult, Language } from '../types'; +import { resolveImageUri, tryResolveImageUri } from '../utils/imageUri'; +import { getConfiguredApiBaseUrl } from '../utils/backendUrl'; +import { backendApiClient } from './backend/backendApiClient'; +import { BackendDatabaseEntry, isBackendApiError } from './backend/contracts'; +import { createIdempotencyKey } from '../utils/idempotency'; +import { getMockCatalog, searchMockCatalog } from './backend/mockCatalog'; + +export interface DatabaseEntry extends IdentificationResult { + imageUri: string; + imageStatus?: 'ok' | 'missing' | 'invalid'; + categories: string[]; +} + +interface SearchOptions { + category?: string | null; + limit?: number; +} + +export type SemanticSearchStatus = 'success' | 'timeout' | 'provider_error' | 'no_results' | 'insufficient_credits'; + +export interface SemanticSearchResult { + status: SemanticSearchStatus; + results: DatabaseEntry[]; +} + +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 normalizeImageStatus = (status?: string, imageUri?: string): 'ok' | 'missing' | 'invalid' => { + if (status === 'ok' || status === 'missing' || status === 'invalid') return status; + const resolved = tryResolveImageUri(imageUri || ''); + if (resolved) return 'ok'; + return imageUri && imageUri.trim() ? 'invalid' : 'missing'; +}; + +const mapBackendEntry = (entry: Partial & { imageUri?: string | null }): DatabaseEntry => { + const imageStatus = normalizeImageStatus(entry.imageStatus, entry.imageUri || undefined); + const strictImageUri = tryResolveImageUri(entry.imageUri || undefined); + const imageUri = imageStatus === 'ok' + ? (strictImageUri || resolveImageUri(entry.imageUri)) + : (typeof entry.imageUri === 'string' ? entry.imageUri.trim() : ''); + + return { + name: entry.name || '', + botanicalName: entry.botanicalName || '', + confidence: typeof entry.confidence === 'number' ? entry.confidence : 0, + description: entry.description || '', + careInfo: entry.careInfo || { waterIntervalDays: 7, light: 'Unknown', temp: 'Unknown' }, + imageUri, + imageStatus, + categories: Array.isArray(entry.categories) ? entry.categories : [], + }; +}; + +export const PlantDatabaseService = { + async getAllPlants(lang: Language): Promise { + if (!hasConfiguredPlantBackend()) { + return getMockCatalog(lang).map(mapBackendEntry); + } + + try { + const response = await fetch(`${getConfiguredApiBaseUrl()}/plants?lang=${lang}`); + if (!response.ok) throw new Error('Network response was not ok'); + const data = await response.json(); + if (!Array.isArray(data)) return []; + return data.map(mapBackendEntry); + } catch (e) { + console.error('Failed to fetch plants', e); + return []; + } + }, + + async searchPlants(query: string, lang: Language, options: SearchOptions = {}): Promise { + const { category, limit = DEFAULT_SEARCH_LIMIT } = options; + + if (!hasConfiguredPlantBackend()) { + let results = searchMockCatalog(query || '', lang, limit); + if (category) { + results = results.filter(r => r.categories.includes(category)); + } + return results.map(mapBackendEntry); + } + + const url = new URL(`${getConfiguredApiBaseUrl()}/plants`); + url.searchParams.append('lang', lang); + if (query) url.searchParams.append('q', query); + if (category) url.searchParams.append('category', category); + if (limit) url.searchParams.append('limit', limit.toString()); + + try { + const response = await fetch(url.toString()); + if (!response.ok) throw new Error('Network response was not ok'); + const data = await response.json(); + if (!Array.isArray(data)) return []; + return data.map(mapBackendEntry); + } catch (e) { + console.error('Failed to search plants', e); + return []; + } + }, + + async semanticSearchDetailed(query: string, lang: Language): Promise { + const idempotencyKey = createIdempotencyKey(`semantic-${query}-${lang}`); + try { + const response = await backendApiClient.semanticSearch({ + query, + language: lang, + idempotencyKey, + }); + + const results: DatabaseEntry[] = (response.results as BackendDatabaseEntry[]).map(mapBackendEntry); + return { status: results.length > 0 ? 'success' : 'no_results', results }; + } catch (error) { + if (isBackendApiError(error)) { + if (error.code === 'INSUFFICIENT_CREDITS') { + return { status: 'insufficient_credits', results: [] }; + } + return { status: 'provider_error', results: [] }; + } + return { status: 'timeout', results: [] }; + } + }, +}; diff --git a/services/plantRecognitionService.ts b/services/plantRecognitionService.ts index 431f525..bed98c5 100644 --- a/services/plantRecognitionService.ts +++ b/services/plantRecognitionService.ts @@ -1,24 +1,24 @@ -import { IdentificationResult, Language } from '../types'; -import { backendApiClient } from './backend/backendApiClient'; -import { createIdempotencyKey } from '../utils/idempotency'; - -interface IdentifyOptions { - idempotencyKey?: string; -} - -export const PlantRecognitionService = { - identify: async ( - imageUri: string, - lang: Language = 'de', - options: IdentifyOptions = {}, - ): Promise => { - const idempotencyKey = options.idempotencyKey || createIdempotencyKey('scan'); - const response = await backendApiClient.scanPlant({ - idempotencyKey, - imageUri, - language: lang, - }); - - return response.result; - }, -}; +import { IdentificationResult, Language } from '../types'; +import { backendApiClient } from './backend/backendApiClient'; +import { createIdempotencyKey } from '../utils/idempotency'; + +interface IdentifyOptions { + idempotencyKey?: string; +} + +export const PlantRecognitionService = { + identify: async ( + imageUri: string, + lang: Language = 'de', + options: IdentifyOptions = {}, + ): Promise => { + const idempotencyKey = options.idempotencyKey || createIdempotencyKey('scan'); + const response = await backendApiClient.scanPlant({ + idempotencyKey, + imageUri, + language: lang, + }); + + return response.result; + }, +}; diff --git a/services/storageService.ts b/services/storageService.ts index f5578af..c9fd015 100644 --- a/services/storageService.ts +++ b/services/storageService.ts @@ -1,179 +1,179 @@ -import AsyncStorage from '@react-native-async-storage/async-storage'; -import { Plant, Language, AppearanceMode, ColorPalette } from '../types'; - -const STORAGE_KEY = 'greenlens_plants'; -const LANG_KEY = 'greenlens_language'; -const ONBOARDING_KEY = 'greenlens_onboarding_complete'; -const APPEARANCE_MODE_KEY = 'greenlens_appearance_mode'; -const COLOR_PALETTE_KEY = 'greenlens_color_palette'; -const PROFILE_IMAGE_KEY = 'greenlens_profile_image'; -const PROFILE_NAME_KEY = 'greenlens_profile_name'; -const LEXICON_SEARCH_HISTORY_KEY = 'greenlens_lexicon_search_history'; -const LEXICON_SEARCH_HISTORY_LIMIT = 10; -const DEFAULT_PROFILE_NAME = 'GreenLens User'; - -const isAppearanceMode = (value: string | null): value is AppearanceMode => - value === 'system' || value === 'light' || value === 'dark'; - -const isColorPalette = (value: string | null): value is ColorPalette => - value === 'forest' || value === 'ocean' || value === 'sunset' || value === 'mono'; - -const normalizeSearchQuery = (value: string): string => { - return value - .toLowerCase() - .normalize('NFD') - .replace(/[\u0300-\u036f]/g, '') - .trim() - .replace(/\s+/g, ' '); -}; - -export const StorageService = { - getPlants: async (): Promise => { - try { - const json = await AsyncStorage.getItem(STORAGE_KEY); - return json ? JSON.parse(json) : []; - } catch (e) { - console.error('Failed to load plants', e); - return []; - } - }, - - savePlant: async (plant: Plant): Promise => { - const plants = await StorageService.getPlants(); - const updatedPlants = [plant, ...plants]; - await AsyncStorage.setItem(STORAGE_KEY, JSON.stringify(updatedPlants)); - }, - - deletePlant: async (id: string): Promise => { - const plants = await StorageService.getPlants(); - const updatedPlants = plants.filter(p => p.id !== id); - await AsyncStorage.setItem(STORAGE_KEY, JSON.stringify(updatedPlants)); - }, - - updatePlant: async (updatedPlant: Plant): Promise => { - const plants = await StorageService.getPlants(); - const index = plants.findIndex(p => p.id === updatedPlant.id); - if (index !== -1) { - plants[index] = updatedPlant; - await AsyncStorage.setItem(STORAGE_KEY, JSON.stringify(plants)); - } - }, - - getLanguage: async (): Promise => { - try { - const lang = await AsyncStorage.getItem(LANG_KEY); - return (lang as Language) || 'en'; - } catch (e) { - return 'en'; - } - }, - - saveLanguage: async (lang: Language): Promise => { - await AsyncStorage.setItem(LANG_KEY, lang); - }, - - getAppearanceMode: async (): Promise => { - try { - const mode = await AsyncStorage.getItem(APPEARANCE_MODE_KEY); - return isAppearanceMode(mode) ? mode : 'system'; - } catch (e) { - return 'system'; - } - }, - - saveAppearanceMode: async (mode: AppearanceMode): Promise => { - await AsyncStorage.setItem(APPEARANCE_MODE_KEY, mode); - }, - - getColorPalette: async (): Promise => { - try { - const palette = await AsyncStorage.getItem(COLOR_PALETTE_KEY); - return isColorPalette(palette) ? palette : 'forest'; - } catch (e) { - return 'forest'; - } - }, - - saveColorPalette: async (palette: ColorPalette): Promise => { - await AsyncStorage.setItem(COLOR_PALETTE_KEY, palette); - }, - - getProfileImage: async (): Promise => { - try { - const imageUri = await AsyncStorage.getItem(PROFILE_IMAGE_KEY); - return imageUri || null; - } catch (e) { - return null; - } - }, - - saveProfileImage: async (imageUri: string | null): Promise => { - if (!imageUri) { - await AsyncStorage.removeItem(PROFILE_IMAGE_KEY); - return; - } - await AsyncStorage.setItem(PROFILE_IMAGE_KEY, imageUri); - }, - - getProfileName: async (): Promise => { - try { - const profileName = await AsyncStorage.getItem(PROFILE_NAME_KEY); - const normalized = profileName?.trim(); - return normalized || DEFAULT_PROFILE_NAME; - } catch (e) { - return DEFAULT_PROFILE_NAME; - } - }, - - saveProfileName: async (name: string): Promise => { - const normalized = name.trim(); - await AsyncStorage.setItem(PROFILE_NAME_KEY, normalized || DEFAULT_PROFILE_NAME); - }, - - getOnboardingComplete: async (): Promise => { - try { - const value = await AsyncStorage.getItem(ONBOARDING_KEY); - return value === 'true'; - } catch (e) { - return false; - } - }, - - setOnboardingComplete: async (complete: boolean): Promise => { - await AsyncStorage.setItem(ONBOARDING_KEY, complete ? 'true' : 'false'); - }, - - getLexiconSearchHistory: async (): Promise => { - try { - const value = await AsyncStorage.getItem(LEXICON_SEARCH_HISTORY_KEY); - if (!value) return []; - - const parsed = JSON.parse(value); - if (!Array.isArray(parsed)) return []; - - return parsed.filter((item): item is string => typeof item === 'string'); - } catch (e) { - console.error('Failed to load lexicon search history', e); - return []; - } - }, - - saveLexiconSearchQuery: async (query: string): Promise => { - const trimmed = query.trim(); - if (!trimmed) return; - - const history = await StorageService.getLexiconSearchHistory(); - const normalized = normalizeSearchQuery(trimmed); - - const deduped = history.filter( - item => normalizeSearchQuery(item) !== normalized - ); - - const updated = [trimmed, ...deduped].slice(0, LEXICON_SEARCH_HISTORY_LIMIT); - await AsyncStorage.setItem(LEXICON_SEARCH_HISTORY_KEY, JSON.stringify(updated)); - }, - - clearLexiconSearchHistory: async (): Promise => { - await AsyncStorage.removeItem(LEXICON_SEARCH_HISTORY_KEY); - }, -}; +import AsyncStorage from '@react-native-async-storage/async-storage'; +import { Plant, Language, AppearanceMode, ColorPalette } from '../types'; + +const STORAGE_KEY = 'greenlens_plants'; +const LANG_KEY = 'greenlens_language'; +const ONBOARDING_KEY = 'greenlens_onboarding_complete'; +const APPEARANCE_MODE_KEY = 'greenlens_appearance_mode'; +const COLOR_PALETTE_KEY = 'greenlens_color_palette'; +const PROFILE_IMAGE_KEY = 'greenlens_profile_image'; +const PROFILE_NAME_KEY = 'greenlens_profile_name'; +const LEXICON_SEARCH_HISTORY_KEY = 'greenlens_lexicon_search_history'; +const LEXICON_SEARCH_HISTORY_LIMIT = 10; +const DEFAULT_PROFILE_NAME = 'GreenLens User'; + +const isAppearanceMode = (value: string | null): value is AppearanceMode => + value === 'system' || value === 'light' || value === 'dark'; + +const isColorPalette = (value: string | null): value is ColorPalette => + value === 'forest' || value === 'ocean' || value === 'sunset' || value === 'mono'; + +const normalizeSearchQuery = (value: string): string => { + return value + .toLowerCase() + .normalize('NFD') + .replace(/[\u0300-\u036f]/g, '') + .trim() + .replace(/\s+/g, ' '); +}; + +export const StorageService = { + getPlants: async (): Promise => { + try { + const json = await AsyncStorage.getItem(STORAGE_KEY); + return json ? JSON.parse(json) : []; + } catch (e) { + console.error('Failed to load plants', e); + return []; + } + }, + + savePlant: async (plant: Plant): Promise => { + const plants = await StorageService.getPlants(); + const updatedPlants = [plant, ...plants]; + await AsyncStorage.setItem(STORAGE_KEY, JSON.stringify(updatedPlants)); + }, + + deletePlant: async (id: string): Promise => { + const plants = await StorageService.getPlants(); + const updatedPlants = plants.filter(p => p.id !== id); + await AsyncStorage.setItem(STORAGE_KEY, JSON.stringify(updatedPlants)); + }, + + updatePlant: async (updatedPlant: Plant): Promise => { + const plants = await StorageService.getPlants(); + const index = plants.findIndex(p => p.id === updatedPlant.id); + if (index !== -1) { + plants[index] = updatedPlant; + await AsyncStorage.setItem(STORAGE_KEY, JSON.stringify(plants)); + } + }, + + getLanguage: async (): Promise => { + try { + const lang = await AsyncStorage.getItem(LANG_KEY); + return (lang as Language) || 'en'; + } catch (e) { + return 'en'; + } + }, + + saveLanguage: async (lang: Language): Promise => { + await AsyncStorage.setItem(LANG_KEY, lang); + }, + + getAppearanceMode: async (): Promise => { + try { + const mode = await AsyncStorage.getItem(APPEARANCE_MODE_KEY); + return isAppearanceMode(mode) ? mode : 'system'; + } catch (e) { + return 'system'; + } + }, + + saveAppearanceMode: async (mode: AppearanceMode): Promise => { + await AsyncStorage.setItem(APPEARANCE_MODE_KEY, mode); + }, + + getColorPalette: async (): Promise => { + try { + const palette = await AsyncStorage.getItem(COLOR_PALETTE_KEY); + return isColorPalette(palette) ? palette : 'forest'; + } catch (e) { + return 'forest'; + } + }, + + saveColorPalette: async (palette: ColorPalette): Promise => { + await AsyncStorage.setItem(COLOR_PALETTE_KEY, palette); + }, + + getProfileImage: async (): Promise => { + try { + const imageUri = await AsyncStorage.getItem(PROFILE_IMAGE_KEY); + return imageUri || null; + } catch (e) { + return null; + } + }, + + saveProfileImage: async (imageUri: string | null): Promise => { + if (!imageUri) { + await AsyncStorage.removeItem(PROFILE_IMAGE_KEY); + return; + } + await AsyncStorage.setItem(PROFILE_IMAGE_KEY, imageUri); + }, + + getProfileName: async (): Promise => { + try { + const profileName = await AsyncStorage.getItem(PROFILE_NAME_KEY); + const normalized = profileName?.trim(); + return normalized || DEFAULT_PROFILE_NAME; + } catch (e) { + return DEFAULT_PROFILE_NAME; + } + }, + + saveProfileName: async (name: string): Promise => { + const normalized = name.trim(); + await AsyncStorage.setItem(PROFILE_NAME_KEY, normalized || DEFAULT_PROFILE_NAME); + }, + + getOnboardingComplete: async (): Promise => { + try { + const value = await AsyncStorage.getItem(ONBOARDING_KEY); + return value === 'true'; + } catch (e) { + return false; + } + }, + + setOnboardingComplete: async (complete: boolean): Promise => { + await AsyncStorage.setItem(ONBOARDING_KEY, complete ? 'true' : 'false'); + }, + + getLexiconSearchHistory: async (): Promise => { + try { + const value = await AsyncStorage.getItem(LEXICON_SEARCH_HISTORY_KEY); + if (!value) return []; + + const parsed = JSON.parse(value); + if (!Array.isArray(parsed)) return []; + + return parsed.filter((item): item is string => typeof item === 'string'); + } catch (e) { + console.error('Failed to load lexicon search history', e); + return []; + } + }, + + saveLexiconSearchQuery: async (query: string): Promise => { + const trimmed = query.trim(); + if (!trimmed) return; + + const history = await StorageService.getLexiconSearchHistory(); + const normalized = normalizeSearchQuery(trimmed); + + const deduped = history.filter( + item => normalizeSearchQuery(item) !== normalized + ); + + const updated = [trimmed, ...deduped].slice(0, LEXICON_SEARCH_HISTORY_LIMIT); + await AsyncStorage.setItem(LEXICON_SEARCH_HISTORY_KEY, JSON.stringify(updated)); + }, + + clearLexiconSearchHistory: async (): Promise => { + await AsyncStorage.removeItem(LEXICON_SEARCH_HISTORY_KEY); + }, +}; diff --git a/skills-lock.json b/skills-lock.json index 0a4bb6c..4bd337b 100644 --- a/skills-lock.json +++ b/skills-lock.json @@ -1,165 +1,165 @@ -{ - "version": 1, - "skills": { - "ab-test-setup": { - "source": "coreyhaines31/marketingskills", - "sourceType": "github", - "computedHash": "77524b67477802e6cfef718f32abf777da8100374baf8600cd8e5059c3a171cb" - }, - "ad-creative": { - "source": "coreyhaines31/marketingskills", - "sourceType": "github", - "computedHash": "31e23cda4aaf9877fc7cfdafae6c1249a56440d733d7d2e42a7788cd19bb70f7" - }, - "ai-seo": { - "source": "coreyhaines31/marketingskills", - "sourceType": "github", - "computedHash": "f53993e33de7a755602502030d0327ff02899c547a68a75fabcb8a0e3e2e1081" - }, - "analytics-tracking": { - "source": "coreyhaines31/marketingskills", - "sourceType": "github", - "computedHash": "9efe485c17f685451469164d9a4db7c60359fec64dc497dcdf49f2347cf4b67d" - }, - "churn-prevention": { - "source": "coreyhaines31/marketingskills", - "sourceType": "github", - "computedHash": "e9f19c55664af241bac4371d0088b341dce23c6164c5de4c90a509bdf891b83b" - }, - "cold-email": { - "source": "coreyhaines31/marketingskills", - "sourceType": "github", - "computedHash": "7fe88e3c53b3d2e10ad7748299d08a9df213d42268d36ebc05e019f8133df816" - }, - "competitor-alternatives": { - "source": "coreyhaines31/marketingskills", - "sourceType": "github", - "computedHash": "58e1eeceb03b7c7fe965dfb9c73c07fdd0e890bff3b50ef4910b8059217b62d3" - }, - "content-strategy": { - "source": "coreyhaines31/marketingskills", - "sourceType": "github", - "computedHash": "e9eebb0fd871ad3643ddf2a1440ed835efd7f8263282669f36b880885833b7db" - }, - "copy-editing": { - "source": "coreyhaines31/marketingskills", - "sourceType": "github", - "computedHash": "8fa9a2ca4c2761e65e8577951cc89678d233e9e772df13f835eda9783355d3ce" - }, - "copywriting": { - "source": "coreyhaines31/marketingskills", - "sourceType": "github", - "computedHash": "bd3a2e8bec64237aca86cd363fa5349a417eb86d3351447642cc1c5862089c47" - }, - "email-sequence": { - "source": "coreyhaines31/marketingskills", - "sourceType": "github", - "computedHash": "8aff0ca4a1fd1069a693482423155e0731fba4b4ace42a623c74709bf38332ea" - }, - "form-cro": { - "source": "coreyhaines31/marketingskills", - "sourceType": "github", - "computedHash": "3a2cd8fcf153e5e12cef8729241e8c79a433b82fe29b97af42d1764f7d433834" - }, - "free-tool-strategy": { - "source": "coreyhaines31/marketingskills", - "sourceType": "github", - "computedHash": "6e39eb687dbd019f09b3aaaa470c69b6165ebf5654cbc7ef3e2c55061f22b494" - }, - "launch-strategy": { - "source": "coreyhaines31/marketingskills", - "sourceType": "github", - "computedHash": "65670227c4199495634d2b3f8b451ae3cef6397b36db22130fabab89de6a4ba4" - }, - "marketing-ideas": { - "source": "coreyhaines31/marketingskills", - "sourceType": "github", - "computedHash": "b863d744ba010d7314aeb6a23d261971256b9e31e264d1d0a7aac299697c3063" - }, - "marketing-psychology": { - "source": "coreyhaines31/marketingskills", - "sourceType": "github", - "computedHash": "4099d985cf1f5beb26072924cae1e2815295842db72f7861443329adb5d760ce" - }, - "onboarding-cro": { - "source": "coreyhaines31/marketingskills", - "sourceType": "github", - "computedHash": "a7e7eb898095ae6a074158c5ce1d7a6354835ebac48ee416451c9e71f2f58cba" - }, - "page-cro": { - "source": "coreyhaines31/marketingskills", - "sourceType": "github", - "computedHash": "1a02571c4906e5edaf557d49cfc3dc55a6580faa5f0f41c739642172fe448a75" - }, - "paid-ads": { - "source": "coreyhaines31/marketingskills", - "sourceType": "github", - "computedHash": "32310721ddd7cdfd66ef357b7229733d86e11f8edd6fa409ab45c7d6ff2e8334" - }, - "paywall-upgrade-cro": { - "source": "coreyhaines31/marketingskills", - "sourceType": "github", - "computedHash": "1921f4c1077122a0be8bf4459962dae5f40e3e0a147b9ac57e6b7b645d6194d7" - }, - "popup-cro": { - "source": "coreyhaines31/marketingskills", - "sourceType": "github", - "computedHash": "999d0f84fffcac338262664c6a86abf3e5d63e6a68e493881d668274ab8d43d3" - }, - "pricing-strategy": { - "source": "coreyhaines31/marketingskills", - "sourceType": "github", - "computedHash": "5060f95f95db58873b835be2258dc50a959fb814d6466ac11e917cc4a3d632d2" - }, - "product-marketing-context": { - "source": "coreyhaines31/marketingskills", - "sourceType": "github", - "computedHash": "bb407005ef4e68b9b17b870d711ce1a9e09c03611a5fa01d69faf78a8f18eef9" - }, - "programmatic-seo": { - "source": "coreyhaines31/marketingskills", - "sourceType": "github", - "computedHash": "b675dbe0f0d25efbfa788f7b6e01a231d8f7333cacd19c1cf678cdbe7ea1514a" - }, - "referral-program": { - "source": "coreyhaines31/marketingskills", - "sourceType": "github", - "computedHash": "d2720b8a5e40947adad2bc02779e03a1573674268c23a0c41256f9c45123dfad" - }, - "revops": { - "source": "coreyhaines31/marketingskills", - "sourceType": "github", - "computedHash": "8c862ea72ee996f036076badea64178fc0b14a2e4ed56980c90a198321fe1348" - }, - "sales-enablement": { - "source": "coreyhaines31/marketingskills", - "sourceType": "github", - "computedHash": "d37d3b0c74bc74b1bfb584c0bc788a69840bb09ca96a1bd1968235d4f1e91f27" - }, - "schema-markup": { - "source": "coreyhaines31/marketingskills", - "sourceType": "github", - "computedHash": "e6bc10a2a493b85ced75e3db37a1c2a188bb000ba917639414dd56ac2d9cf7d3" - }, - "seo-audit": { - "source": "coreyhaines31/marketingskills", - "sourceType": "github", - "computedHash": "1c7e3a6fb4173f4e505d69cb4c3861af3287d0eeca7a6797a60a0707b5961a96" - }, - "signup-flow-cro": { - "source": "coreyhaines31/marketingskills", - "sourceType": "github", - "computedHash": "3e0d9c47a37593ecac415bc5120ea1d4e478a12bd90258965d89aa4b1b6566c1" - }, - "site-architecture": { - "source": "coreyhaines31/marketingskills", - "sourceType": "github", - "computedHash": "eed0be7862737aa7ef0da29b16fc01c07013b2b03812a9d6d7b93513f1555099" - }, - "social-content": { - "source": "coreyhaines31/marketingskills", - "sourceType": "github", - "computedHash": "9ed34ccfb465a526f2a737129c933a1054985932e64d0055dfd74ed645d86f88" - } - } -} +{ + "version": 1, + "skills": { + "ab-test-setup": { + "source": "coreyhaines31/marketingskills", + "sourceType": "github", + "computedHash": "77524b67477802e6cfef718f32abf777da8100374baf8600cd8e5059c3a171cb" + }, + "ad-creative": { + "source": "coreyhaines31/marketingskills", + "sourceType": "github", + "computedHash": "31e23cda4aaf9877fc7cfdafae6c1249a56440d733d7d2e42a7788cd19bb70f7" + }, + "ai-seo": { + "source": "coreyhaines31/marketingskills", + "sourceType": "github", + "computedHash": "f53993e33de7a755602502030d0327ff02899c547a68a75fabcb8a0e3e2e1081" + }, + "analytics-tracking": { + "source": "coreyhaines31/marketingskills", + "sourceType": "github", + "computedHash": "9efe485c17f685451469164d9a4db7c60359fec64dc497dcdf49f2347cf4b67d" + }, + "churn-prevention": { + "source": "coreyhaines31/marketingskills", + "sourceType": "github", + "computedHash": "e9f19c55664af241bac4371d0088b341dce23c6164c5de4c90a509bdf891b83b" + }, + "cold-email": { + "source": "coreyhaines31/marketingskills", + "sourceType": "github", + "computedHash": "7fe88e3c53b3d2e10ad7748299d08a9df213d42268d36ebc05e019f8133df816" + }, + "competitor-alternatives": { + "source": "coreyhaines31/marketingskills", + "sourceType": "github", + "computedHash": "58e1eeceb03b7c7fe965dfb9c73c07fdd0e890bff3b50ef4910b8059217b62d3" + }, + "content-strategy": { + "source": "coreyhaines31/marketingskills", + "sourceType": "github", + "computedHash": "e9eebb0fd871ad3643ddf2a1440ed835efd7f8263282669f36b880885833b7db" + }, + "copy-editing": { + "source": "coreyhaines31/marketingskills", + "sourceType": "github", + "computedHash": "8fa9a2ca4c2761e65e8577951cc89678d233e9e772df13f835eda9783355d3ce" + }, + "copywriting": { + "source": "coreyhaines31/marketingskills", + "sourceType": "github", + "computedHash": "bd3a2e8bec64237aca86cd363fa5349a417eb86d3351447642cc1c5862089c47" + }, + "email-sequence": { + "source": "coreyhaines31/marketingskills", + "sourceType": "github", + "computedHash": "8aff0ca4a1fd1069a693482423155e0731fba4b4ace42a623c74709bf38332ea" + }, + "form-cro": { + "source": "coreyhaines31/marketingskills", + "sourceType": "github", + "computedHash": "3a2cd8fcf153e5e12cef8729241e8c79a433b82fe29b97af42d1764f7d433834" + }, + "free-tool-strategy": { + "source": "coreyhaines31/marketingskills", + "sourceType": "github", + "computedHash": "6e39eb687dbd019f09b3aaaa470c69b6165ebf5654cbc7ef3e2c55061f22b494" + }, + "launch-strategy": { + "source": "coreyhaines31/marketingskills", + "sourceType": "github", + "computedHash": "65670227c4199495634d2b3f8b451ae3cef6397b36db22130fabab89de6a4ba4" + }, + "marketing-ideas": { + "source": "coreyhaines31/marketingskills", + "sourceType": "github", + "computedHash": "b863d744ba010d7314aeb6a23d261971256b9e31e264d1d0a7aac299697c3063" + }, + "marketing-psychology": { + "source": "coreyhaines31/marketingskills", + "sourceType": "github", + "computedHash": "4099d985cf1f5beb26072924cae1e2815295842db72f7861443329adb5d760ce" + }, + "onboarding-cro": { + "source": "coreyhaines31/marketingskills", + "sourceType": "github", + "computedHash": "a7e7eb898095ae6a074158c5ce1d7a6354835ebac48ee416451c9e71f2f58cba" + }, + "page-cro": { + "source": "coreyhaines31/marketingskills", + "sourceType": "github", + "computedHash": "1a02571c4906e5edaf557d49cfc3dc55a6580faa5f0f41c739642172fe448a75" + }, + "paid-ads": { + "source": "coreyhaines31/marketingskills", + "sourceType": "github", + "computedHash": "32310721ddd7cdfd66ef357b7229733d86e11f8edd6fa409ab45c7d6ff2e8334" + }, + "paywall-upgrade-cro": { + "source": "coreyhaines31/marketingskills", + "sourceType": "github", + "computedHash": "1921f4c1077122a0be8bf4459962dae5f40e3e0a147b9ac57e6b7b645d6194d7" + }, + "popup-cro": { + "source": "coreyhaines31/marketingskills", + "sourceType": "github", + "computedHash": "999d0f84fffcac338262664c6a86abf3e5d63e6a68e493881d668274ab8d43d3" + }, + "pricing-strategy": { + "source": "coreyhaines31/marketingskills", + "sourceType": "github", + "computedHash": "5060f95f95db58873b835be2258dc50a959fb814d6466ac11e917cc4a3d632d2" + }, + "product-marketing-context": { + "source": "coreyhaines31/marketingskills", + "sourceType": "github", + "computedHash": "bb407005ef4e68b9b17b870d711ce1a9e09c03611a5fa01d69faf78a8f18eef9" + }, + "programmatic-seo": { + "source": "coreyhaines31/marketingskills", + "sourceType": "github", + "computedHash": "b675dbe0f0d25efbfa788f7b6e01a231d8f7333cacd19c1cf678cdbe7ea1514a" + }, + "referral-program": { + "source": "coreyhaines31/marketingskills", + "sourceType": "github", + "computedHash": "d2720b8a5e40947adad2bc02779e03a1573674268c23a0c41256f9c45123dfad" + }, + "revops": { + "source": "coreyhaines31/marketingskills", + "sourceType": "github", + "computedHash": "8c862ea72ee996f036076badea64178fc0b14a2e4ed56980c90a198321fe1348" + }, + "sales-enablement": { + "source": "coreyhaines31/marketingskills", + "sourceType": "github", + "computedHash": "d37d3b0c74bc74b1bfb584c0bc788a69840bb09ca96a1bd1968235d4f1e91f27" + }, + "schema-markup": { + "source": "coreyhaines31/marketingskills", + "sourceType": "github", + "computedHash": "e6bc10a2a493b85ced75e3db37a1c2a188bb000ba917639414dd56ac2d9cf7d3" + }, + "seo-audit": { + "source": "coreyhaines31/marketingskills", + "sourceType": "github", + "computedHash": "1c7e3a6fb4173f4e505d69cb4c3861af3287d0eeca7a6797a60a0707b5961a96" + }, + "signup-flow-cro": { + "source": "coreyhaines31/marketingskills", + "sourceType": "github", + "computedHash": "3e0d9c47a37593ecac415bc5120ea1d4e478a12bd90258965d89aa4b1b6566c1" + }, + "site-architecture": { + "source": "coreyhaines31/marketingskills", + "sourceType": "github", + "computedHash": "eed0be7862737aa7ef0da29b16fc01c07013b2b03812a9d6d7b93513f1555099" + }, + "social-content": { + "source": "coreyhaines31/marketingskills", + "sourceType": "github", + "computedHash": "9ed34ccfb465a526f2a737129c933a1054985932e64d0055dfd74ed645d86f88" + } + } +} diff --git a/tsconfig.json b/tsconfig.json index 750e573..fc048d1 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,20 +1,20 @@ -{ - "extends": "expo/tsconfig.base", - "compilerOptions": { - "strict": true, - "paths": { - "@/*": [ - "./*" - ] - } - }, - "include": [ - "**/*.ts", - "**/*.tsx" - ], - "exclude": [ - "greenlns-landing", - "server", - "landing" - ] +{ + "extends": "expo/tsconfig.base", + "compilerOptions": { + "strict": true, + "paths": { + "@/*": [ + "./*" + ] + } + }, + "include": [ + "**/*.ts", + "**/*.tsx" + ], + "exclude": [ + "greenlns-landing", + "server", + "landing" + ] } \ No newline at end of file diff --git a/twitter_30_day_viral_plan.md b/twitter_30_day_viral_plan.md index 16e0ced..aaf3a8c 100644 --- a/twitter_30_day_viral_plan.md +++ b/twitter_30_day_viral_plan.md @@ -1,529 +1,529 @@ -# GreenLens X/Twitter 30-Tage Plan - -Stand: 9. Maerz 2026 - -## Kanalentscheidung - -Primaer auf dem eigenen X-Account posten. - -Warum: -- X ist account-first, nicht community-first. -- Reichweite entsteht ueber starke Singles, Threads, Replies und Quote-Posts. -- Communities sind nur fuer sekundaeres Seeding und Research sinnvoll. -- Harte Promo in Communities wird oft entfernt oder ignoriert. - -## Positionierung - -Nicht als allgemeine Plant-Care-App auftreten. - -Scharfer Wedge: -- Plant ER fuer urbane Pflanzen-Anfaenger -- Diagnose bei Panikmomenten -- Symptome in klare naechste Schritte uebersetzen - -Core Promise: -- Weniger raten. Schneller verstehen, was deiner Pflanze fehlt. - -## Verifizierte Seeding-Orte - -Diese Orte sind eher fuer native, hilfreiche Teilnahme geeignet als fuer Promo-Links. - -1. X eigener Account -- Hauptkanal fuer alle Posts, Threads und Serien -- Pinned Post mit klarer Panic-CTA - -2. Replies unter passenden X-Accounts -- Plant-Creator -- Home-Decor / Urban Jungle -- Beginner Gardening -- AI-App / Consumer-App / Build-in-Public Accounts - -3. Reddit r/plantclinic -- Nur fuer echte Hilfsbeitraege und Diagnose-Faelle -- Kontext ist Pflicht: Dauer, Licht, Wasser, Erde -- Sick-plant-only Fokus - -4. Reddit r/houseplants -- Eher fuer Diskussion und allgemeine Fragen -- Selbstpromo ist ungern gesehen - -5. Reddit r/IndoorGarden -- Aktuell kein verlaesslicher Kanal, weil die Community als privat gelistet wurde -- Nicht fuer kurzfristiges Seeding einplanen - -6. Reddit r/monstera, r/succulents, r/cactus -- Nur wenn der Post exakt zum Pflanzentyp passt -- Spezial-Communities eher fuer Research und hilfreiche Antworten - -## Community-Regel - -Wenn du extern postest: -- Kein Copy-Paste vom Tweet -- Kein direkter App-Pitch im ersten Absatz -- Erst Diagnose oder Hilfe liefern -- Link nur, wenn die Community es erlaubt und der Post ohne Link schon Wert hat - -## Profil-Setup vor Tag 1 - -1. Bio: -- AI Plant ER fuer Zimmerpflanzen -- Ich zeige, wie du gelbe Blaetter, braune Spitzen und Pflegefehler schneller erkennst - -2. Pinned Post: -- Wer du bist -- Fuer wen GreenLens ist -- 1 klarer CTA: Profil folgen oder Diagnose-Thread lesen - -3. Link: -- auf eine einfache Landing mit einem einzigen Ziel -- ideal: Scan your dying plant now - -## KPI-Ziele - -Minimum: -- 75k Monatsviews -- 3 Posts ueber 5k -- 150 Profilbesuche - -Soll: -- 250k Monatsviews -- 6 bis 10 Posts ueber 10k -- 400 Profilbesuche - -Stretch: -- 1 Mio Monatsviews -- 1 bis 2 Breakout-Posts ueber 50k -- starke Winner-Serien plus Reply-Distribution - -## Tagesrhythmus - -Mo-Fr: -- 2 originare Posts -- 15 bis 25 qualifizierte Replies - -Sa-So: -- 1 originarer Post -- 10 bis 15 Replies - -Jede Woche: -- 3 Threads -- 2 Proof-Posts mit Bild, Screenshot oder Vorher/Nachher - -## 30 Tage mit fertigen Posts - -Hinweis: -- Posts leicht pointiert formuliert -- bei Bedarf deutsch oder englisch spiegeln -- CTA sparsam einsetzen - -### Tag 1 - -Post 1: -Die meisten Zimmerpflanzen sterben nicht ploetzlich. -Sie senden erst 2 bis 3 kleine Warnsignale. -Die meisten Menschen sehen sie nur zu spaet. - -Post 2: -Gelbe Blaetter bedeuten nicht automatisch: -"mehr Wasser". -Oft ist genau das der Fehler. - -### Tag 2 - -Post 1: -Wenn deine Monstera haengt, ist das Problem oft nicht Gießen. -Es ist meistens ein Mix aus Licht, Timing und zu viel Aktionismus. - -Post 2: -3 Symptome, die wie Wassermangel aussehen, aber keine sind: -1. weiche Stiele -2. muffige Erde -3. gelb + matschig statt trocken + knusprig - -### Tag 3 - -Post 1: -Pflanzen-Anfaenger machen oft denselben Denkfehler: -Sie behandeln jedes Symptom sofort. -Statt erst die Ursache einzugrenzen. - -Post 2: -Braune Blattspitzen sind keine "Pflanze ist kaputt"-Diagnose. -Sie sind ein Hinweis. -Nicht das Urteil. - -### Tag 4 - -Post 1: -Unpopulaere Meinung: -Viele ueberpflegen ihre Zimmerpflanzen in den Tod. - -Post 2: -Wenn du nur 3 Dinge pruefen willst, bevor du irgendetwas aenderst: -1. Licht -2. Erdfeuchte -3. Drainage - -### Tag 5 - -Post 1: -Der schnellste Weg, eine Pflanze zu verlieren: -Jeden Tag etwas Neues ausprobieren. - -Post 2: -Panik-Gießen ist wahrscheinlich der teuerste Pflegefehler bei Zimmerpflanzen. - -### Tag 6 - -Post 1: -Thread: -7 Warnsignale, dass deine Zimmerpflanze nicht "einfach nur muede" ist - -1. neue gelbe Blaetter -2. schlaffe Blattstiele -3. schwarze weiche Stellen -4. dauerhaft nasse Erde -5. fauliger Geruch -6. neues Blatt stoppt komplett -7. Flecken werden groesser - -Wenn 3 davon gleichzeitig auftreten, brauchst du keine Motivation. -Du brauchst Diagnose. - -Post 2: -Wenn du Pflanzen liebst, musst du lernen: -Nicht jedes Problem ist ein Wasserproblem. - -### Tag 7 - -Post 1: -Mein Lieblings-Shortcut bei kranken Zimmerpflanzen: -Nicht fragen "Was fehlt?" -Sondern: -"Was habe ich in den letzten 14 Tagen veraendert?" - -Post 2: -Die Pflanze ist selten "ploetzlich schwierig". -Meistens hat sich ihr Setup veraendert. - -### Tag 8 - -Post 1: -Viele gießen nach Kalender. -Gesunde Pflanzen werden aber nicht nach Kalender gepflegt. - -Post 2: -Wenn die Erde oben trocken ist, sagt das fast nichts. -Entscheidend ist, was tiefer im Topf passiert. - -### Tag 9 - -Post 1: -3 Gruende, warum "mehr Licht" keine universelle Loesung ist: -1. Hitzestress -2. Standortwechsel -3. falsches Timing bei geschwaechter Pflanze - -Post 2: -Eine Pflanze mit Stress sofort umzustellen, ist oft wie ein Patient mit Fieber in einen Sprint zu schicken. - -### Tag 10 - -Post 1: -Build in public: -Je mehr kranke Pflanzenfaelle ich anschaue, desto klarer wird: -Menschen brauchen keine 100 Tipps. -Sie brauchen den naechsten richtigen Schritt. - -Post 2: -Das Problem bei Plant Care Content: -Zu viel allgemeiner Rat. -Zu wenig Symptom -> Ursache -> Handlung. - -### Tag 11 - -Post 1: -Wenn Blaetter gelb werden, frage ich immer zuerst: -gleichmaessig gelb oder fleckig? -weich oder trocken? -alt oder neu? - -Post 2: -Gute Diagnose beginnt nicht mit einem Duenger. -Sondern mit besseren Fragen. - -### Tag 12 - -Post 1: -Thread: -So wuerde ich eine kranke Zimmerpflanze in 5 Minuten triagieren - -1. Pflanze isolieren -2. Erdfeuchte pruefen -3. Blaetter Vorder- und Rueckseite checken -4. Standort notieren -5. erst dann handeln - -Post 2: -Die meisten Pflanzenprobleme eskalieren, weil Menschen zu frueh behandeln und zu spaet beobachten. - -### Tag 13 - -Post 1: -Hot take: -"Easy care" ist fuer Anfaenger oft irrefuehrend. -Easy fuer wen? - -Post 2: -Die beste Anfaengerpflanze ist nicht die "haerteste". -Sondern die, deren Signale du frueh lesen lernst. - -### Tag 14 - -Post 1: -Wenn du Thripse erst bemerkst, wenn das Blatt schlimm aussieht, bist du schon spaet. - -Post 2: -Viele Schaedlinge sehen am Anfang nicht nach Schaedlingen aus. -Sie sehen aus wie "komische Flecken". - -### Tag 15 - -Post 1: -Thread: -5 Pflegefehler, die wie Pech aussehen - -1. Topf ohne echte Drainage -2. Uebertopf mit Restwasser -3. Gießen nach Gewohnheit -4. sofortiges Umtopfen bei Stress -5. zu viele Mittel gleichzeitig - -Post 2: -Pflanzenpflege fuehlt sich chaotisch an, wenn dir ein Diagnose-System fehlt. - -### Tag 16 - -Post 1: -Ich traue Pflanzentipps ohne Kontext nicht mehr. -Ohne Licht, Wasser, Erde und Zeitachse ist fast jede Antwort zu allgemein. - -Post 2: -Fotos helfen. -Aber Kontext rettet die Diagnose. - -### Tag 17 - -Post 1: -Die Frage ist nicht: -"Soll ich gießen?" -Die bessere Frage ist: -"Warum sieht sie heute so aus?" - -Post 2: -Wer Symptome nur mit mehr Pflege beantwortet, verdoppelt oft den Fehler. - -### Tag 18 - -Post 1: -Build in public: -GreenLens sollte nie wie eine generische Plant-App wirken. -Eher wie: -Plant ER fuer Momente, in denen du Angst hast, die Pflanze zu verlieren. - -Post 2: -Das staerkste Produktversprechen ist gerade nicht: -"Pflege deine Pflanzen besser." -Sondern: -"Finde schneller raus, was gerade schiefläuft." - -### Tag 19 - -Post 1: -Thread: -3 Symptome, bei denen ich nicht mehr abwarte - -1. schwarzer weicher Stamm -2. fauliger Geruch aus dem Topf -3. schneller Verfall bei neuem Wachstum - -Post 2: -Nicht jedes Problem braucht Geduld. -Manche brauchen eine schnelle Eskalation. - -### Tag 20 - -Post 1: -Wenn du 4 verschiedene Tipps bekommst, ist das oft kein Zeichen fuer Komplexitaet. -Sondern fuer fehlende Diagnose. - -Post 2: -Menschen wollen bei Pflanzenproblemen Sicherheit. -Deshalb fuehlen sich klare naechste Schritte so wertvoll an. - -### Tag 21 - -Post 1: -Unterschaetzter Fehler: -Zu viele Apps, Tipps und Stimmen gleichzeitig. -Das erzeugt Aktivitaet. -Nicht Klarheit. - -Post 2: -Eine gute Diagnose reduziert Optionen. -Eine schlechte vergroessert Panik. - -### Tag 22 - -Post 1: -Thread: -So erkennst du, ob "mehr Wasser" die Lage verschlimmern wuerde - -1. Erde ist unten noch nass -2. Blatt wird weich statt trocken -3. Gelb kommt vor Braun -4. es riecht dumpf - -Post 2: -Viele Pflanzen sehen durstig aus, wenn ihre Wurzeln eigentlich schon zu viel Wasser hatten. - -### Tag 23 - -Post 1: -Wenn ich Plant Care Content schreibe, denke ich nicht an Hobby. -Ich denke an Triage. - -Post 2: -Das Veraendern von 5 Dingen gleichzeitig ist der schnellste Weg, nie zu verstehen, was geholfen hat. - -### Tag 24 - -Post 1: -Vorher/Nachher-Post: -Vorher: -"Meine Monstera stirbt" -Nachher: -"Es war kein Wassermangel. Es war dauerhaft nasse Erde + zu wenig Licht." - -Post 2: -Viele "Rettungen" beginnen nicht mit dem perfekten Tipp. -Sondern mit dem ersten ausgeschlossenen Fehler. - -### Tag 25 - -Post 1: -Die beste Gewohnheit fuer Pflanzen-Anfaenger: -Beobachtung vor Intervention. - -Post 2: -Ein Diagnosefoto ohne Zeitachse ist wie ein Arztbesuch ohne Vorgeschichte. - -### Tag 26 - -Post 1: -Thread: -Wenn deine Pflanze ploetzlich schlechter aussieht, pruefe diese Reihenfolge - -1. Was hat sich veraendert? -2. Wie nass ist die Erde wirklich? -3. Gibt es Schaedlingsspuren? -4. Ist neues Wachstum betroffen? -5. Was musst du heute nicht tun? - -Post 2: -Oft rettet nicht die perfekte Massnahme. -Sondern das Vermeiden der falschen. - -### Tag 27 - -Post 1: -Kontroverse Meinung: -Die meisten Menschen brauchen keinen weiteren Plant Hack. -Sie brauchen weniger Widerspruch und mehr Priorisierung. - -Post 2: -Wer Pflanzen retten will, muss lernen, zwischen Symptom und Ursache zu unterscheiden. - -### Tag 28 - -Post 1: -Build in public: -Je schaerfer ich GreenLens auf "dying plant moments" fokussiere, desto klarer wird auch der Content. - -Post 2: -Generische Reichweite ist billig. -Relevante Reichweite beginnt mit einem scharfen Problem. - -### Tag 29 - -Post 1: -Thread: -Die 5 haeufigsten Denkfehler bei sterbenden Zimmerpflanzen - -1. mehr Wasser = mehr Hilfe -2. gelb = trocken -3. neues Blatt = alles okay -4. Duenger als erste Reaktion -5. alle Tipps gleichzeitig umsetzen - -Post 2: -Gute Pflanzenpflege fuehlt sich ruhiger an. -Nicht hektischer. - -### Tag 30 - -Post 1: -Wenn ich nur einen Satz fuer Pflanzen-Anfaenger lassen duerfte: -Behandle erst die Ursache. -Nicht nur das sichtbare Problem. - -Post 2: -Falls du eine Pflanze hast, bei der du gerade nur noch raetst: -Genau dort beginnt der eigentliche Wert von guter Diagnose. - -## 3 wiederkehrende CTA-Muster - -1. -Wenn du willst, mache ich Teil 2 mit den haeufigsten Monstera-Fehlern. - -2. -Soll ich daraus eine 5-Minuten-Checkliste machen? - -3. -Welche Symptome werden deiner Meinung nach am haeufigsten falsch gelesen? - -## Reply-Playbooks fuer Distribution - -1. -Stimmt. Der entscheidende Punkt ist oft nicht das Symptom, sondern was in den letzten 7 bis 14 Tagen geaendert wurde. - -2. -Viele verwechseln hier Durst mit Wurzelstress. Sieht aehnlich aus, braucht aber eine ganz andere Reaktion. - -3. -Genau deshalb finde ich Kontext wichtiger als einzelne Fotos: Licht, Wasser, Drainage und Zeitachse veraendern die Diagnose komplett. - -4. -Wuerde ich aehnlich sehen. Mich interessiert nur, ob die Erde unten noch nass war. Das kippt die Interpretation oft. - -5. -Das ist ein gutes Beispiel dafuer, warum "mehr Pflege" nicht immer mehr hilft. - -## Kill-Regeln - -Nach 7 Tagen stoppen: -- Formate mit sehr niedriger View-to-Engagement-Rate -- zu breite Plant-Care-Posts ohne akutes Problem -- Posts, die Likes bekommen, aber keine Profilbesuche ausloesen - -Nach 14 Tagen verdoppeln: -- jede Serie mit ueberdurchschnittlicher Reichweite -- Symptom-Posts mit vielen Replies -- Threads, aus denen sich 3 bis 5 Singles extrahieren lassen - -## Quellen fuer Community-Einschaetzung - -- X erlaubt u. a. das Anpassen des Profils und das Anpinnen eines Posts, was fuer den eigenen Account-Funnel relevant ist: https://help.x.com/nl/managing-your-account/how-to-customize-your-profile -- r/plantclinic zeigt in aktuellen AutoModerator-Hinweisen, dass Kontext wie Licht, Wasser, Erde und Problemhistorie Pflicht ist und Posts auf kranke Pflanzen fokussiert sind: https://www.reddit.com/r/plantclinic/comments/1rmntey/how_to_revive_this_plant/ ; https://www.reddit.com/r/plantclinic/comments/1rn67f1/removed/ -- r/houseplants verweist in Moderationsdiskussionen explizit auf eine Regel gegen Selbstpromo: https://www.reddit.com/r/houseplants/comments/h0wdse ; https://www.reddit.com/r/houseplants/comments/ljpkrg -- r/IndoorGarden wurde als privat gelistet und ist daher kein stabiler Seeding-Ort: https://www.reddit.com/r/SubredditMonitor/comments/14iu3v1 +# GreenLens X/Twitter 30-Tage Plan + +Stand: 9. Maerz 2026 + +## Kanalentscheidung + +Primaer auf dem eigenen X-Account posten. + +Warum: +- X ist account-first, nicht community-first. +- Reichweite entsteht ueber starke Singles, Threads, Replies und Quote-Posts. +- Communities sind nur fuer sekundaeres Seeding und Research sinnvoll. +- Harte Promo in Communities wird oft entfernt oder ignoriert. + +## Positionierung + +Nicht als allgemeine Plant-Care-App auftreten. + +Scharfer Wedge: +- Plant ER fuer urbane Pflanzen-Anfaenger +- Diagnose bei Panikmomenten +- Symptome in klare naechste Schritte uebersetzen + +Core Promise: +- Weniger raten. Schneller verstehen, was deiner Pflanze fehlt. + +## Verifizierte Seeding-Orte + +Diese Orte sind eher fuer native, hilfreiche Teilnahme geeignet als fuer Promo-Links. + +1. X eigener Account +- Hauptkanal fuer alle Posts, Threads und Serien +- Pinned Post mit klarer Panic-CTA + +2. Replies unter passenden X-Accounts +- Plant-Creator +- Home-Decor / Urban Jungle +- Beginner Gardening +- AI-App / Consumer-App / Build-in-Public Accounts + +3. Reddit r/plantclinic +- Nur fuer echte Hilfsbeitraege und Diagnose-Faelle +- Kontext ist Pflicht: Dauer, Licht, Wasser, Erde +- Sick-plant-only Fokus + +4. Reddit r/houseplants +- Eher fuer Diskussion und allgemeine Fragen +- Selbstpromo ist ungern gesehen + +5. Reddit r/IndoorGarden +- Aktuell kein verlaesslicher Kanal, weil die Community als privat gelistet wurde +- Nicht fuer kurzfristiges Seeding einplanen + +6. Reddit r/monstera, r/succulents, r/cactus +- Nur wenn der Post exakt zum Pflanzentyp passt +- Spezial-Communities eher fuer Research und hilfreiche Antworten + +## Community-Regel + +Wenn du extern postest: +- Kein Copy-Paste vom Tweet +- Kein direkter App-Pitch im ersten Absatz +- Erst Diagnose oder Hilfe liefern +- Link nur, wenn die Community es erlaubt und der Post ohne Link schon Wert hat + +## Profil-Setup vor Tag 1 + +1. Bio: +- AI Plant ER fuer Zimmerpflanzen +- Ich zeige, wie du gelbe Blaetter, braune Spitzen und Pflegefehler schneller erkennst + +2. Pinned Post: +- Wer du bist +- Fuer wen GreenLens ist +- 1 klarer CTA: Profil folgen oder Diagnose-Thread lesen + +3. Link: +- auf eine einfache Landing mit einem einzigen Ziel +- ideal: Scan your dying plant now + +## KPI-Ziele + +Minimum: +- 75k Monatsviews +- 3 Posts ueber 5k +- 150 Profilbesuche + +Soll: +- 250k Monatsviews +- 6 bis 10 Posts ueber 10k +- 400 Profilbesuche + +Stretch: +- 1 Mio Monatsviews +- 1 bis 2 Breakout-Posts ueber 50k +- starke Winner-Serien plus Reply-Distribution + +## Tagesrhythmus + +Mo-Fr: +- 2 originare Posts +- 15 bis 25 qualifizierte Replies + +Sa-So: +- 1 originarer Post +- 10 bis 15 Replies + +Jede Woche: +- 3 Threads +- 2 Proof-Posts mit Bild, Screenshot oder Vorher/Nachher + +## 30 Tage mit fertigen Posts + +Hinweis: +- Posts leicht pointiert formuliert +- bei Bedarf deutsch oder englisch spiegeln +- CTA sparsam einsetzen + +### Tag 1 + +Post 1: +Die meisten Zimmerpflanzen sterben nicht ploetzlich. +Sie senden erst 2 bis 3 kleine Warnsignale. +Die meisten Menschen sehen sie nur zu spaet. + +Post 2: +Gelbe Blaetter bedeuten nicht automatisch: +"mehr Wasser". +Oft ist genau das der Fehler. + +### Tag 2 + +Post 1: +Wenn deine Monstera haengt, ist das Problem oft nicht Gießen. +Es ist meistens ein Mix aus Licht, Timing und zu viel Aktionismus. + +Post 2: +3 Symptome, die wie Wassermangel aussehen, aber keine sind: +1. weiche Stiele +2. muffige Erde +3. gelb + matschig statt trocken + knusprig + +### Tag 3 + +Post 1: +Pflanzen-Anfaenger machen oft denselben Denkfehler: +Sie behandeln jedes Symptom sofort. +Statt erst die Ursache einzugrenzen. + +Post 2: +Braune Blattspitzen sind keine "Pflanze ist kaputt"-Diagnose. +Sie sind ein Hinweis. +Nicht das Urteil. + +### Tag 4 + +Post 1: +Unpopulaere Meinung: +Viele ueberpflegen ihre Zimmerpflanzen in den Tod. + +Post 2: +Wenn du nur 3 Dinge pruefen willst, bevor du irgendetwas aenderst: +1. Licht +2. Erdfeuchte +3. Drainage + +### Tag 5 + +Post 1: +Der schnellste Weg, eine Pflanze zu verlieren: +Jeden Tag etwas Neues ausprobieren. + +Post 2: +Panik-Gießen ist wahrscheinlich der teuerste Pflegefehler bei Zimmerpflanzen. + +### Tag 6 + +Post 1: +Thread: +7 Warnsignale, dass deine Zimmerpflanze nicht "einfach nur muede" ist + +1. neue gelbe Blaetter +2. schlaffe Blattstiele +3. schwarze weiche Stellen +4. dauerhaft nasse Erde +5. fauliger Geruch +6. neues Blatt stoppt komplett +7. Flecken werden groesser + +Wenn 3 davon gleichzeitig auftreten, brauchst du keine Motivation. +Du brauchst Diagnose. + +Post 2: +Wenn du Pflanzen liebst, musst du lernen: +Nicht jedes Problem ist ein Wasserproblem. + +### Tag 7 + +Post 1: +Mein Lieblings-Shortcut bei kranken Zimmerpflanzen: +Nicht fragen "Was fehlt?" +Sondern: +"Was habe ich in den letzten 14 Tagen veraendert?" + +Post 2: +Die Pflanze ist selten "ploetzlich schwierig". +Meistens hat sich ihr Setup veraendert. + +### Tag 8 + +Post 1: +Viele gießen nach Kalender. +Gesunde Pflanzen werden aber nicht nach Kalender gepflegt. + +Post 2: +Wenn die Erde oben trocken ist, sagt das fast nichts. +Entscheidend ist, was tiefer im Topf passiert. + +### Tag 9 + +Post 1: +3 Gruende, warum "mehr Licht" keine universelle Loesung ist: +1. Hitzestress +2. Standortwechsel +3. falsches Timing bei geschwaechter Pflanze + +Post 2: +Eine Pflanze mit Stress sofort umzustellen, ist oft wie ein Patient mit Fieber in einen Sprint zu schicken. + +### Tag 10 + +Post 1: +Build in public: +Je mehr kranke Pflanzenfaelle ich anschaue, desto klarer wird: +Menschen brauchen keine 100 Tipps. +Sie brauchen den naechsten richtigen Schritt. + +Post 2: +Das Problem bei Plant Care Content: +Zu viel allgemeiner Rat. +Zu wenig Symptom -> Ursache -> Handlung. + +### Tag 11 + +Post 1: +Wenn Blaetter gelb werden, frage ich immer zuerst: +gleichmaessig gelb oder fleckig? +weich oder trocken? +alt oder neu? + +Post 2: +Gute Diagnose beginnt nicht mit einem Duenger. +Sondern mit besseren Fragen. + +### Tag 12 + +Post 1: +Thread: +So wuerde ich eine kranke Zimmerpflanze in 5 Minuten triagieren + +1. Pflanze isolieren +2. Erdfeuchte pruefen +3. Blaetter Vorder- und Rueckseite checken +4. Standort notieren +5. erst dann handeln + +Post 2: +Die meisten Pflanzenprobleme eskalieren, weil Menschen zu frueh behandeln und zu spaet beobachten. + +### Tag 13 + +Post 1: +Hot take: +"Easy care" ist fuer Anfaenger oft irrefuehrend. +Easy fuer wen? + +Post 2: +Die beste Anfaengerpflanze ist nicht die "haerteste". +Sondern die, deren Signale du frueh lesen lernst. + +### Tag 14 + +Post 1: +Wenn du Thripse erst bemerkst, wenn das Blatt schlimm aussieht, bist du schon spaet. + +Post 2: +Viele Schaedlinge sehen am Anfang nicht nach Schaedlingen aus. +Sie sehen aus wie "komische Flecken". + +### Tag 15 + +Post 1: +Thread: +5 Pflegefehler, die wie Pech aussehen + +1. Topf ohne echte Drainage +2. Uebertopf mit Restwasser +3. Gießen nach Gewohnheit +4. sofortiges Umtopfen bei Stress +5. zu viele Mittel gleichzeitig + +Post 2: +Pflanzenpflege fuehlt sich chaotisch an, wenn dir ein Diagnose-System fehlt. + +### Tag 16 + +Post 1: +Ich traue Pflanzentipps ohne Kontext nicht mehr. +Ohne Licht, Wasser, Erde und Zeitachse ist fast jede Antwort zu allgemein. + +Post 2: +Fotos helfen. +Aber Kontext rettet die Diagnose. + +### Tag 17 + +Post 1: +Die Frage ist nicht: +"Soll ich gießen?" +Die bessere Frage ist: +"Warum sieht sie heute so aus?" + +Post 2: +Wer Symptome nur mit mehr Pflege beantwortet, verdoppelt oft den Fehler. + +### Tag 18 + +Post 1: +Build in public: +GreenLens sollte nie wie eine generische Plant-App wirken. +Eher wie: +Plant ER fuer Momente, in denen du Angst hast, die Pflanze zu verlieren. + +Post 2: +Das staerkste Produktversprechen ist gerade nicht: +"Pflege deine Pflanzen besser." +Sondern: +"Finde schneller raus, was gerade schiefläuft." + +### Tag 19 + +Post 1: +Thread: +3 Symptome, bei denen ich nicht mehr abwarte + +1. schwarzer weicher Stamm +2. fauliger Geruch aus dem Topf +3. schneller Verfall bei neuem Wachstum + +Post 2: +Nicht jedes Problem braucht Geduld. +Manche brauchen eine schnelle Eskalation. + +### Tag 20 + +Post 1: +Wenn du 4 verschiedene Tipps bekommst, ist das oft kein Zeichen fuer Komplexitaet. +Sondern fuer fehlende Diagnose. + +Post 2: +Menschen wollen bei Pflanzenproblemen Sicherheit. +Deshalb fuehlen sich klare naechste Schritte so wertvoll an. + +### Tag 21 + +Post 1: +Unterschaetzter Fehler: +Zu viele Apps, Tipps und Stimmen gleichzeitig. +Das erzeugt Aktivitaet. +Nicht Klarheit. + +Post 2: +Eine gute Diagnose reduziert Optionen. +Eine schlechte vergroessert Panik. + +### Tag 22 + +Post 1: +Thread: +So erkennst du, ob "mehr Wasser" die Lage verschlimmern wuerde + +1. Erde ist unten noch nass +2. Blatt wird weich statt trocken +3. Gelb kommt vor Braun +4. es riecht dumpf + +Post 2: +Viele Pflanzen sehen durstig aus, wenn ihre Wurzeln eigentlich schon zu viel Wasser hatten. + +### Tag 23 + +Post 1: +Wenn ich Plant Care Content schreibe, denke ich nicht an Hobby. +Ich denke an Triage. + +Post 2: +Das Veraendern von 5 Dingen gleichzeitig ist der schnellste Weg, nie zu verstehen, was geholfen hat. + +### Tag 24 + +Post 1: +Vorher/Nachher-Post: +Vorher: +"Meine Monstera stirbt" +Nachher: +"Es war kein Wassermangel. Es war dauerhaft nasse Erde + zu wenig Licht." + +Post 2: +Viele "Rettungen" beginnen nicht mit dem perfekten Tipp. +Sondern mit dem ersten ausgeschlossenen Fehler. + +### Tag 25 + +Post 1: +Die beste Gewohnheit fuer Pflanzen-Anfaenger: +Beobachtung vor Intervention. + +Post 2: +Ein Diagnosefoto ohne Zeitachse ist wie ein Arztbesuch ohne Vorgeschichte. + +### Tag 26 + +Post 1: +Thread: +Wenn deine Pflanze ploetzlich schlechter aussieht, pruefe diese Reihenfolge + +1. Was hat sich veraendert? +2. Wie nass ist die Erde wirklich? +3. Gibt es Schaedlingsspuren? +4. Ist neues Wachstum betroffen? +5. Was musst du heute nicht tun? + +Post 2: +Oft rettet nicht die perfekte Massnahme. +Sondern das Vermeiden der falschen. + +### Tag 27 + +Post 1: +Kontroverse Meinung: +Die meisten Menschen brauchen keinen weiteren Plant Hack. +Sie brauchen weniger Widerspruch und mehr Priorisierung. + +Post 2: +Wer Pflanzen retten will, muss lernen, zwischen Symptom und Ursache zu unterscheiden. + +### Tag 28 + +Post 1: +Build in public: +Je schaerfer ich GreenLens auf "dying plant moments" fokussiere, desto klarer wird auch der Content. + +Post 2: +Generische Reichweite ist billig. +Relevante Reichweite beginnt mit einem scharfen Problem. + +### Tag 29 + +Post 1: +Thread: +Die 5 haeufigsten Denkfehler bei sterbenden Zimmerpflanzen + +1. mehr Wasser = mehr Hilfe +2. gelb = trocken +3. neues Blatt = alles okay +4. Duenger als erste Reaktion +5. alle Tipps gleichzeitig umsetzen + +Post 2: +Gute Pflanzenpflege fuehlt sich ruhiger an. +Nicht hektischer. + +### Tag 30 + +Post 1: +Wenn ich nur einen Satz fuer Pflanzen-Anfaenger lassen duerfte: +Behandle erst die Ursache. +Nicht nur das sichtbare Problem. + +Post 2: +Falls du eine Pflanze hast, bei der du gerade nur noch raetst: +Genau dort beginnt der eigentliche Wert von guter Diagnose. + +## 3 wiederkehrende CTA-Muster + +1. +Wenn du willst, mache ich Teil 2 mit den haeufigsten Monstera-Fehlern. + +2. +Soll ich daraus eine 5-Minuten-Checkliste machen? + +3. +Welche Symptome werden deiner Meinung nach am haeufigsten falsch gelesen? + +## Reply-Playbooks fuer Distribution + +1. +Stimmt. Der entscheidende Punkt ist oft nicht das Symptom, sondern was in den letzten 7 bis 14 Tagen geaendert wurde. + +2. +Viele verwechseln hier Durst mit Wurzelstress. Sieht aehnlich aus, braucht aber eine ganz andere Reaktion. + +3. +Genau deshalb finde ich Kontext wichtiger als einzelne Fotos: Licht, Wasser, Drainage und Zeitachse veraendern die Diagnose komplett. + +4. +Wuerde ich aehnlich sehen. Mich interessiert nur, ob die Erde unten noch nass war. Das kippt die Interpretation oft. + +5. +Das ist ein gutes Beispiel dafuer, warum "mehr Pflege" nicht immer mehr hilft. + +## Kill-Regeln + +Nach 7 Tagen stoppen: +- Formate mit sehr niedriger View-to-Engagement-Rate +- zu breite Plant-Care-Posts ohne akutes Problem +- Posts, die Likes bekommen, aber keine Profilbesuche ausloesen + +Nach 14 Tagen verdoppeln: +- jede Serie mit ueberdurchschnittlicher Reichweite +- Symptom-Posts mit vielen Replies +- Threads, aus denen sich 3 bis 5 Singles extrahieren lassen + +## Quellen fuer Community-Einschaetzung + +- X erlaubt u. a. das Anpassen des Profils und das Anpinnen eines Posts, was fuer den eigenen Account-Funnel relevant ist: https://help.x.com/nl/managing-your-account/how-to-customize-your-profile +- r/plantclinic zeigt in aktuellen AutoModerator-Hinweisen, dass Kontext wie Licht, Wasser, Erde und Problemhistorie Pflicht ist und Posts auf kranke Pflanzen fokussiert sind: https://www.reddit.com/r/plantclinic/comments/1rmntey/how_to_revive_this_plant/ ; https://www.reddit.com/r/plantclinic/comments/1rn67f1/removed/ +- r/houseplants verweist in Moderationsdiskussionen explizit auf eine Regel gegen Selbstpromo: https://www.reddit.com/r/houseplants/comments/h0wdse ; https://www.reddit.com/r/houseplants/comments/ljpkrg +- r/IndoorGarden wurde als privat gelistet und ist daher kein stabiler Seeding-Ort: https://www.reddit.com/r/SubredditMonitor/comments/14iu3v1 diff --git a/twitter_30_day_viral_plan_en.md b/twitter_30_day_viral_plan_en.md index 2aa04a0..6738148 100644 --- a/twitter_30_day_viral_plan_en.md +++ b/twitter_30_day_viral_plan_en.md @@ -1,529 +1,529 @@ -# GreenLens X/Twitter 30-Day Plan - -Updated: March 9, 2026 - -## Channel Decision - -Post primarily on your own X account. - -Why: -- X is account-first, not community-first. -- Reach comes from strong singles, threads, replies, and quote posts. -- Communities are useful for secondary seeding and research only. -- Hard promo in communities usually gets ignored or removed. - -## Positioning - -Do not show up as a generic plant-care app. - -Sharp wedge: -- Plant ER for urban plant beginners -- Diagnosis in panic moments -- Turn symptoms into clear next steps - -Core promise: -- Less guessing. Faster clarity on what your plant actually needs. - -## Verified Seeding Places - -These places are better for native, helpful participation than for promo links. - -1. Your own X account -- Main channel for all posts, threads, and series -- Pinned post with a clear panic CTA - -2. Replies under relevant X accounts -- Plant creators -- Home decor / urban jungle -- Beginner gardening -- AI app / consumer app / build-in-public accounts - -3. Reddit r/plantclinic -- Only for real help and diagnosis cases -- Context is required: timeline, light, watering, soil -- Sick-plant-only focus - -4. Reddit r/houseplants -- Better for discussion and general questions -- Self-promo is usually unwelcome - -5. Reddit r/IndoorGarden -- Not a reliable channel right now because the community is listed as private -- Do not depend on it for short-term seeding - -6. Reddit r/monstera, r/succulents, r/cactus -- Only if the post fits the exact plant type -- Better for research and helpful answers than broad promotion - -## Community Rule - -If you post externally: -- Do not copy-paste the tweet -- Do not lead with an app pitch -- Deliver diagnosis or help first -- Only add a link if the community allows it and the post already has standalone value - -## Profile Setup Before Day 1 - -1. Bio: -- AI Plant ER for houseplants -- I show you how to spot yellow leaves, brown tips, and care mistakes faster - -2. Pinned post: -- Who you are -- Who GreenLens is for -- One clear CTA: follow the profile or read the diagnosis thread - -3. Link: -- Send traffic to a simple landing page with one goal -- Ideal: scan your dying plant now - -## KPI Targets - -Minimum: -- 75k monthly views -- 3 posts above 5k -- 150 profile visits - -Target: -- 250k monthly views -- 6 to 10 posts above 10k -- 400 profile visits - -Stretch: -- 1M monthly views -- 1 to 2 breakout posts above 50k -- Strong winner series plus reply distribution - -## Daily Rhythm - -Mon-Fri: -- 2 original posts -- 15 to 25 qualified replies - -Sat-Sun: -- 1 original post -- 10 to 15 replies - -Every week: -- 3 threads -- 2 proof posts with image, screenshot, or before/after - -## 30 Days of Ready-to-Post Content - -Notes: -- Posts are intentionally sharp -- Mirror into German only if needed -- Use CTAs sparingly - -### Day 1 - -Post 1: -Most houseplants do not die suddenly. -They send 2 or 3 small warning signs first. -Most people just see them too late. - -Post 2: -Yellow leaves do not automatically mean: -"give it more water." -That is often the exact mistake. - -### Day 2 - -Post 1: -If your Monstera is drooping, the issue is often not watering. -It is usually a mix of light, timing, and too much panic-driven action. - -Post 2: -3 symptoms that look like underwatering but are not: -1. soft stems -2. sour-smelling soil -3. yellow + mushy instead of dry + crispy - -### Day 3 - -Post 1: -Plant beginners make the same mistake over and over: -They treat the symptom immediately. -Instead of narrowing down the cause first. - -Post 2: -Brown leaf tips are not a "your plant is doomed" diagnosis. -They are a clue. -Not the verdict. - -### Day 4 - -Post 1: -Unpopular opinion: -Many people over-care their houseplants to death. - -Post 2: -If you only check 3 things before changing anything: -1. light -2. soil moisture -3. drainage - -### Day 5 - -Post 1: -The fastest way to lose a plant: -Try something new every single day. - -Post 2: -Panic watering is probably the most expensive plant-care mistake beginners make. - -### Day 6 - -Post 1: -Thread: -7 warning signs your houseplant is not "just tired" - -1. new yellow leaves -2. limp stems -3. black soft spots -4. constantly wet soil -5. rotten smell -6. new growth completely stalls -7. spots keep spreading - -If 3 of these show up at once, you do not need motivation. -You need diagnosis. - -Post 2: -If you love plants, you have to learn this: -Not every problem is a watering problem. - -### Day 7 - -Post 1: -My favorite shortcut with sick houseplants: -Do not ask "what does it need?" -Ask: -"what changed in the last 14 days?" - -Post 2: -The plant is rarely "suddenly difficult." -Usually the setup changed. - -### Day 8 - -Post 1: -Many people water by calendar. -Healthy plants are not cared for by calendar. - -Post 2: -If the top layer of soil looks dry, that tells you almost nothing. -What matters is deeper in the pot. - -### Day 9 - -Post 1: -3 reasons "more light" is not a universal fix: -1. heat stress -2. sudden relocation -3. bad timing on an already stressed plant - -Post 2: -Moving a stressed plant immediately is often like sending a feverish patient into a sprint. - -### Day 10 - -Post 1: -Build in public: -The more sick plant cases I look at, the clearer this gets: -People do not need 100 tips. -They need the next right step. - -Post 2: -The problem with plant-care content: -Too much generic advice. -Not enough symptom -> cause -> action. - -### Day 11 - -Post 1: -When leaves turn yellow, I always ask first: -even yellow or patchy? -soft or dry? -old leaves or new? - -Post 2: -Good diagnosis does not start with fertilizer. -It starts with better questions. - -### Day 12 - -Post 1: -Thread: -How I would triage a sick houseplant in 5 minutes - -1. isolate the plant -2. check soil moisture -3. inspect both sides of the leaves -4. note the location -5. act only after that - -Post 2: -Most plant problems escalate because people treat too early and observe too late. - -### Day 13 - -Post 1: -Hot take: -"Easy care" is often misleading for beginners. -Easy for who? - -Post 2: -The best beginner plant is not the toughest one. -It is the one whose signals you learn to read early. - -### Day 14 - -Post 1: -If you notice thrips only when the leaf already looks bad, you are late. - -Post 2: -Many pests do not look like pests at first. -They look like "weird marks." - -### Day 15 - -Post 1: -Thread: -5 plant-care mistakes that look like bad luck - -1. pot with no real drainage -2. decorative pot holding leftover water -3. watering by habit -4. immediate repotting under stress -5. too many treatments at once - -Post 2: -Plant care feels chaotic when you do not have a diagnosis system. - -### Day 16 - -Post 1: -I do not trust plant advice without context anymore. -Without light, watering, soil, and timeline, almost every answer is too general. - -Post 2: -Photos help. -Context saves the diagnosis. - -### Day 17 - -Post 1: -The question is not: -"Should I water?" -The better question is: -"Why does it look like this today?" - -Post 2: -If you answer every symptom with "more care," you often double the mistake. - -### Day 18 - -Post 1: -Build in public: -GreenLens should never feel like a generic plant app. -More like: -Plant ER for the moment you think you might lose the plant. - -Post 2: -The strongest product promise is not: -"take better care of your plants." -It is: -"find out faster what is actually going wrong." - -### Day 19 - -Post 1: -Thread: -3 symptoms I would not wait on - -1. black soft stem -2. rotten smell from the pot -3. fast decline in new growth - -Post 2: -Not every plant problem needs patience. -Some need fast escalation. - -### Day 20 - -Post 1: -If you get 4 different plant tips, that is often not a sign of complexity. -It is a sign of missing diagnosis. - -Post 2: -People want certainty when a plant is struggling. -That is why clear next steps feel so valuable. - -### Day 21 - -Post 1: -Underrated mistake: -Too many apps, tips, and voices at once. -That creates activity. -Not clarity. - -Post 2: -A good diagnosis reduces options. -A bad one increases panic. - -### Day 22 - -Post 1: -Thread: -How to tell if "more water" would make things worse - -1. the lower soil is still wet -2. the leaf feels soft, not dry -3. yellow comes before brown -4. the pot smells dull or sour - -Post 2: -Many plants look thirsty when their roots have actually had too much water. - -### Day 23 - -Post 1: -When I write plant-care content, I do not think in terms of hobby. -I think in terms of triage. - -Post 2: -Changing 5 things at once is the fastest way to never know what actually helped. - -### Day 24 - -Post 1: -Before/after post: -Before: -"My Monstera is dying" -After: -"It was not underwatering. It was constantly wet soil + too little light." - -Post 2: -Most plant rescues do not start with the perfect tip. -They start with the first ruled-out mistake. - -### Day 25 - -Post 1: -The best habit for plant beginners: -Observation before intervention. - -Post 2: -A diagnosis photo without a timeline is like a doctor visit with no history. - -### Day 26 - -Post 1: -Thread: -If your plant suddenly looks worse, check in this order - -1. what changed? -2. how wet is the soil really? -3. are there signs of pests? -4. is new growth affected? -5. what should you not do today? - -Post 2: -Often the rescue does not come from the perfect move. -It comes from avoiding the wrong one. - -### Day 27 - -Post 1: -Controversial opinion: -Most people do not need another plant hack. -They need less contradiction and more prioritization. - -Post 2: -If you want to save plants, you have to learn the difference between symptom and cause. - -### Day 28 - -Post 1: -Build in public: -The sharper I position GreenLens around dying-plant moments, the clearer the content becomes. - -Post 2: -Generic reach is cheap. -Relevant reach starts with a sharp problem. - -### Day 29 - -Post 1: -Thread: -The 5 most common thinking mistakes with dying houseplants - -1. more water = more help -2. yellow = dry -3. new leaf = everything is fine -4. fertilizer as the first reaction -5. applying every tip at once - -Post 2: -Good plant care feels calmer. -Not more hectic. - -### Day 30 - -Post 1: -If I could leave plant beginners with only one sentence: -Treat the cause first. -Not just the visible problem. - -Post 2: -If you have a plant right now and you are still guessing: -That is exactly where better diagnosis starts to matter. - -## 3 Repeatable CTA Patterns - -1. -If you want, I will do part 2 with the most common Monstera mistakes. - -2. -Want me to turn this into a 5-minute checklist? - -3. -Which plant symptoms do you think people misread most often? - -## Reply Playbooks for Distribution - -1. -True. The key is often not the symptom itself, but what changed in the last 7 to 14 days. - -2. -Many people confuse thirst with root stress here. Looks similar. Needs a completely different response. - -3. -This is exactly why context matters more than a single photo: light, watering, drainage, and timeline can completely change the diagnosis. - -4. -I would mostly agree. I would just want to know whether the soil was still wet at the bottom. That usually changes the interpretation. - -5. -This is a great example of why "more care" does not always mean more help. - -## Kill Rules - -After 7 days, stop: -- formats with very low view-to-engagement rate -- broad plant-care posts without an acute problem -- posts that get likes but do not create profile visits - -After 14 days, double down on: -- every series with above-average reach -- symptom posts that generate replies -- threads that can be broken into 3 to 5 strong singles - -## Sources for Community Assessment - -- X profile customization and pinning support the account-first funnel: https://help.x.com/en/managing-your-account/how-to-customize-your-profile -- r/plantclinic AutoModerator examples show that context such as light, watering, soil, and problem history is required and the subreddit is focused on sick plants: https://www.reddit.com/r/plantclinic/comments/1rmntey/how_to_revive_this_plant/ ; https://www.reddit.com/r/plantclinic/comments/1rn67f1/removed/ -- r/houseplants moderation discussions explicitly point to a no-self-promo rule: https://www.reddit.com/r/houseplants/comments/h0wdse ; https://www.reddit.com/r/houseplants/comments/ljpkrg -- r/IndoorGarden was listed as private and is not a stable seeding place: https://www.reddit.com/r/SubredditMonitor/comments/14iu3v1 +# GreenLens X/Twitter 30-Day Plan + +Updated: March 9, 2026 + +## Channel Decision + +Post primarily on your own X account. + +Why: +- X is account-first, not community-first. +- Reach comes from strong singles, threads, replies, and quote posts. +- Communities are useful for secondary seeding and research only. +- Hard promo in communities usually gets ignored or removed. + +## Positioning + +Do not show up as a generic plant-care app. + +Sharp wedge: +- Plant ER for urban plant beginners +- Diagnosis in panic moments +- Turn symptoms into clear next steps + +Core promise: +- Less guessing. Faster clarity on what your plant actually needs. + +## Verified Seeding Places + +These places are better for native, helpful participation than for promo links. + +1. Your own X account +- Main channel for all posts, threads, and series +- Pinned post with a clear panic CTA + +2. Replies under relevant X accounts +- Plant creators +- Home decor / urban jungle +- Beginner gardening +- AI app / consumer app / build-in-public accounts + +3. Reddit r/plantclinic +- Only for real help and diagnosis cases +- Context is required: timeline, light, watering, soil +- Sick-plant-only focus + +4. Reddit r/houseplants +- Better for discussion and general questions +- Self-promo is usually unwelcome + +5. Reddit r/IndoorGarden +- Not a reliable channel right now because the community is listed as private +- Do not depend on it for short-term seeding + +6. Reddit r/monstera, r/succulents, r/cactus +- Only if the post fits the exact plant type +- Better for research and helpful answers than broad promotion + +## Community Rule + +If you post externally: +- Do not copy-paste the tweet +- Do not lead with an app pitch +- Deliver diagnosis or help first +- Only add a link if the community allows it and the post already has standalone value + +## Profile Setup Before Day 1 + +1. Bio: +- AI Plant ER for houseplants +- I show you how to spot yellow leaves, brown tips, and care mistakes faster + +2. Pinned post: +- Who you are +- Who GreenLens is for +- One clear CTA: follow the profile or read the diagnosis thread + +3. Link: +- Send traffic to a simple landing page with one goal +- Ideal: scan your dying plant now + +## KPI Targets + +Minimum: +- 75k monthly views +- 3 posts above 5k +- 150 profile visits + +Target: +- 250k monthly views +- 6 to 10 posts above 10k +- 400 profile visits + +Stretch: +- 1M monthly views +- 1 to 2 breakout posts above 50k +- Strong winner series plus reply distribution + +## Daily Rhythm + +Mon-Fri: +- 2 original posts +- 15 to 25 qualified replies + +Sat-Sun: +- 1 original post +- 10 to 15 replies + +Every week: +- 3 threads +- 2 proof posts with image, screenshot, or before/after + +## 30 Days of Ready-to-Post Content + +Notes: +- Posts are intentionally sharp +- Mirror into German only if needed +- Use CTAs sparingly + +### Day 1 + +Post 1: +Most houseplants do not die suddenly. +They send 2 or 3 small warning signs first. +Most people just see them too late. + +Post 2: +Yellow leaves do not automatically mean: +"give it more water." +That is often the exact mistake. + +### Day 2 + +Post 1: +If your Monstera is drooping, the issue is often not watering. +It is usually a mix of light, timing, and too much panic-driven action. + +Post 2: +3 symptoms that look like underwatering but are not: +1. soft stems +2. sour-smelling soil +3. yellow + mushy instead of dry + crispy + +### Day 3 + +Post 1: +Plant beginners make the same mistake over and over: +They treat the symptom immediately. +Instead of narrowing down the cause first. + +Post 2: +Brown leaf tips are not a "your plant is doomed" diagnosis. +They are a clue. +Not the verdict. + +### Day 4 + +Post 1: +Unpopular opinion: +Many people over-care their houseplants to death. + +Post 2: +If you only check 3 things before changing anything: +1. light +2. soil moisture +3. drainage + +### Day 5 + +Post 1: +The fastest way to lose a plant: +Try something new every single day. + +Post 2: +Panic watering is probably the most expensive plant-care mistake beginners make. + +### Day 6 + +Post 1: +Thread: +7 warning signs your houseplant is not "just tired" + +1. new yellow leaves +2. limp stems +3. black soft spots +4. constantly wet soil +5. rotten smell +6. new growth completely stalls +7. spots keep spreading + +If 3 of these show up at once, you do not need motivation. +You need diagnosis. + +Post 2: +If you love plants, you have to learn this: +Not every problem is a watering problem. + +### Day 7 + +Post 1: +My favorite shortcut with sick houseplants: +Do not ask "what does it need?" +Ask: +"what changed in the last 14 days?" + +Post 2: +The plant is rarely "suddenly difficult." +Usually the setup changed. + +### Day 8 + +Post 1: +Many people water by calendar. +Healthy plants are not cared for by calendar. + +Post 2: +If the top layer of soil looks dry, that tells you almost nothing. +What matters is deeper in the pot. + +### Day 9 + +Post 1: +3 reasons "more light" is not a universal fix: +1. heat stress +2. sudden relocation +3. bad timing on an already stressed plant + +Post 2: +Moving a stressed plant immediately is often like sending a feverish patient into a sprint. + +### Day 10 + +Post 1: +Build in public: +The more sick plant cases I look at, the clearer this gets: +People do not need 100 tips. +They need the next right step. + +Post 2: +The problem with plant-care content: +Too much generic advice. +Not enough symptom -> cause -> action. + +### Day 11 + +Post 1: +When leaves turn yellow, I always ask first: +even yellow or patchy? +soft or dry? +old leaves or new? + +Post 2: +Good diagnosis does not start with fertilizer. +It starts with better questions. + +### Day 12 + +Post 1: +Thread: +How I would triage a sick houseplant in 5 minutes + +1. isolate the plant +2. check soil moisture +3. inspect both sides of the leaves +4. note the location +5. act only after that + +Post 2: +Most plant problems escalate because people treat too early and observe too late. + +### Day 13 + +Post 1: +Hot take: +"Easy care" is often misleading for beginners. +Easy for who? + +Post 2: +The best beginner plant is not the toughest one. +It is the one whose signals you learn to read early. + +### Day 14 + +Post 1: +If you notice thrips only when the leaf already looks bad, you are late. + +Post 2: +Many pests do not look like pests at first. +They look like "weird marks." + +### Day 15 + +Post 1: +Thread: +5 plant-care mistakes that look like bad luck + +1. pot with no real drainage +2. decorative pot holding leftover water +3. watering by habit +4. immediate repotting under stress +5. too many treatments at once + +Post 2: +Plant care feels chaotic when you do not have a diagnosis system. + +### Day 16 + +Post 1: +I do not trust plant advice without context anymore. +Without light, watering, soil, and timeline, almost every answer is too general. + +Post 2: +Photos help. +Context saves the diagnosis. + +### Day 17 + +Post 1: +The question is not: +"Should I water?" +The better question is: +"Why does it look like this today?" + +Post 2: +If you answer every symptom with "more care," you often double the mistake. + +### Day 18 + +Post 1: +Build in public: +GreenLens should never feel like a generic plant app. +More like: +Plant ER for the moment you think you might lose the plant. + +Post 2: +The strongest product promise is not: +"take better care of your plants." +It is: +"find out faster what is actually going wrong." + +### Day 19 + +Post 1: +Thread: +3 symptoms I would not wait on + +1. black soft stem +2. rotten smell from the pot +3. fast decline in new growth + +Post 2: +Not every plant problem needs patience. +Some need fast escalation. + +### Day 20 + +Post 1: +If you get 4 different plant tips, that is often not a sign of complexity. +It is a sign of missing diagnosis. + +Post 2: +People want certainty when a plant is struggling. +That is why clear next steps feel so valuable. + +### Day 21 + +Post 1: +Underrated mistake: +Too many apps, tips, and voices at once. +That creates activity. +Not clarity. + +Post 2: +A good diagnosis reduces options. +A bad one increases panic. + +### Day 22 + +Post 1: +Thread: +How to tell if "more water" would make things worse + +1. the lower soil is still wet +2. the leaf feels soft, not dry +3. yellow comes before brown +4. the pot smells dull or sour + +Post 2: +Many plants look thirsty when their roots have actually had too much water. + +### Day 23 + +Post 1: +When I write plant-care content, I do not think in terms of hobby. +I think in terms of triage. + +Post 2: +Changing 5 things at once is the fastest way to never know what actually helped. + +### Day 24 + +Post 1: +Before/after post: +Before: +"My Monstera is dying" +After: +"It was not underwatering. It was constantly wet soil + too little light." + +Post 2: +Most plant rescues do not start with the perfect tip. +They start with the first ruled-out mistake. + +### Day 25 + +Post 1: +The best habit for plant beginners: +Observation before intervention. + +Post 2: +A diagnosis photo without a timeline is like a doctor visit with no history. + +### Day 26 + +Post 1: +Thread: +If your plant suddenly looks worse, check in this order + +1. what changed? +2. how wet is the soil really? +3. are there signs of pests? +4. is new growth affected? +5. what should you not do today? + +Post 2: +Often the rescue does not come from the perfect move. +It comes from avoiding the wrong one. + +### Day 27 + +Post 1: +Controversial opinion: +Most people do not need another plant hack. +They need less contradiction and more prioritization. + +Post 2: +If you want to save plants, you have to learn the difference between symptom and cause. + +### Day 28 + +Post 1: +Build in public: +The sharper I position GreenLens around dying-plant moments, the clearer the content becomes. + +Post 2: +Generic reach is cheap. +Relevant reach starts with a sharp problem. + +### Day 29 + +Post 1: +Thread: +The 5 most common thinking mistakes with dying houseplants + +1. more water = more help +2. yellow = dry +3. new leaf = everything is fine +4. fertilizer as the first reaction +5. applying every tip at once + +Post 2: +Good plant care feels calmer. +Not more hectic. + +### Day 30 + +Post 1: +If I could leave plant beginners with only one sentence: +Treat the cause first. +Not just the visible problem. + +Post 2: +If you have a plant right now and you are still guessing: +That is exactly where better diagnosis starts to matter. + +## 3 Repeatable CTA Patterns + +1. +If you want, I will do part 2 with the most common Monstera mistakes. + +2. +Want me to turn this into a 5-minute checklist? + +3. +Which plant symptoms do you think people misread most often? + +## Reply Playbooks for Distribution + +1. +True. The key is often not the symptom itself, but what changed in the last 7 to 14 days. + +2. +Many people confuse thirst with root stress here. Looks similar. Needs a completely different response. + +3. +This is exactly why context matters more than a single photo: light, watering, drainage, and timeline can completely change the diagnosis. + +4. +I would mostly agree. I would just want to know whether the soil was still wet at the bottom. That usually changes the interpretation. + +5. +This is a great example of why "more care" does not always mean more help. + +## Kill Rules + +After 7 days, stop: +- formats with very low view-to-engagement rate +- broad plant-care posts without an acute problem +- posts that get likes but do not create profile visits + +After 14 days, double down on: +- every series with above-average reach +- symptom posts that generate replies +- threads that can be broken into 3 to 5 strong singles + +## Sources for Community Assessment + +- X profile customization and pinning support the account-first funnel: https://help.x.com/en/managing-your-account/how-to-customize-your-profile +- r/plantclinic AutoModerator examples show that context such as light, watering, soil, and problem history is required and the subreddit is focused on sick plants: https://www.reddit.com/r/plantclinic/comments/1rmntey/how_to_revive_this_plant/ ; https://www.reddit.com/r/plantclinic/comments/1rn67f1/removed/ +- r/houseplants moderation discussions explicitly point to a no-self-promo rule: https://www.reddit.com/r/houseplants/comments/h0wdse ; https://www.reddit.com/r/houseplants/comments/ljpkrg +- r/IndoorGarden was listed as private and is not a stable seeding place: https://www.reddit.com/r/SubredditMonitor/comments/14iu3v1 diff --git a/types.ts b/types.ts index e62cc72..71a3a78 100644 --- a/types.ts +++ b/types.ts @@ -1,82 +1,82 @@ - -export interface LocalizedPlantContent { - name: string; - description: string; - light: string; -} - -export interface MultilingualPlantEntry { - botanicalName: string; - confidence: number; - careInfo: { - waterIntervalDays: number; - temp: string; - }; - imageUri: string; - categories: string[]; - translations: { - de: LocalizedPlantContent; - en: LocalizedPlantContent; - es: LocalizedPlantContent; - }; -} - -export interface CareInfo { - waterIntervalDays: number; - light: string; - temp: string; -} - -export interface PlantHealthIssue { - title: string; - confidence: number; - details: string; -} - -export interface PlantHealthCheck { - generatedAt: string; - overallHealthScore: number; - status: 'healthy' | 'watch' | 'critical'; - likelyIssues: PlantHealthIssue[]; - actionsNow: string[]; - plan7Days: string[]; - creditsCharged: number; - imageUri?: string; -} - -export interface Plant { - id: string; - name: string; - botanicalName: string; - imageUri: string; - dateAdded: string; // Serialized Date - careInfo: CareInfo; - lastWatered: string; // Serialized Date - wateringHistory?: string[]; // Array of serialized dates - gallery?: string[]; // Array of image URIs - description?: string; - notificationsEnabled?: boolean; - healthChecks?: PlantHealthCheck[]; -} - -export interface IdentificationResult { - name: string; - botanicalName: string; - confidence: number; - careInfo: CareInfo; - description?: string; -} - -export enum Tab { - HOME = 'home', - SEARCH = 'search', - SETTINGS = 'settings', -} - -export type Language = 'de' | 'en' | 'es'; - -export type AppearanceMode = 'system' | 'light' | 'dark'; - -export type AppColorScheme = 'light' | 'dark'; - -export type ColorPalette = 'forest' | 'ocean' | 'sunset' | 'mono'; + +export interface LocalizedPlantContent { + name: string; + description: string; + light: string; +} + +export interface MultilingualPlantEntry { + botanicalName: string; + confidence: number; + careInfo: { + waterIntervalDays: number; + temp: string; + }; + imageUri: string; + categories: string[]; + translations: { + de: LocalizedPlantContent; + en: LocalizedPlantContent; + es: LocalizedPlantContent; + }; +} + +export interface CareInfo { + waterIntervalDays: number; + light: string; + temp: string; +} + +export interface PlantHealthIssue { + title: string; + confidence: number; + details: string; +} + +export interface PlantHealthCheck { + generatedAt: string; + overallHealthScore: number; + status: 'healthy' | 'watch' | 'critical'; + likelyIssues: PlantHealthIssue[]; + actionsNow: string[]; + plan7Days: string[]; + creditsCharged: number; + imageUri?: string; +} + +export interface Plant { + id: string; + name: string; + botanicalName: string; + imageUri: string; + dateAdded: string; // Serialized Date + careInfo: CareInfo; + lastWatered: string; // Serialized Date + wateringHistory?: string[]; // Array of serialized dates + gallery?: string[]; // Array of image URIs + description?: string; + notificationsEnabled?: boolean; + healthChecks?: PlantHealthCheck[]; +} + +export interface IdentificationResult { + name: string; + botanicalName: string; + confidence: number; + careInfo: CareInfo; + description?: string; +} + +export enum Tab { + HOME = 'home', + SEARCH = 'search', + SETTINGS = 'settings', +} + +export type Language = 'de' | 'en' | 'es'; + +export type AppearanceMode = 'system' | 'light' | 'dark'; + +export type AppColorScheme = 'light' | 'dark'; + +export type ColorPalette = 'forest' | 'ocean' | 'sunset' | 'mono'; diff --git a/utils/backendUrl.ts b/utils/backendUrl.ts index 3e04161..fb0b895 100644 --- a/utils/backendUrl.ts +++ b/utils/backendUrl.ts @@ -1,42 +1,42 @@ -const DEFAULT_API_BASE_URL = 'http://localhost:3000/api'; - -const normalizeHttpUrl = (value?: string | null): string | null => { - const trimmed = String(value || '').trim(); - if (!trimmed) return null; - - try { - const parsed = new URL(trimmed); - return `${parsed.origin}${parsed.pathname}`.replace(/\/+$/, ''); - } catch { - return null; - } -}; - -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`; - } - - return DEFAULT_API_BASE_URL; -}; - -export const getConfiguredAssetBaseUrl = (): string => { - const apiBaseUrl = getConfiguredApiBaseUrl(); - - try { - const parsed = new URL(apiBaseUrl); - const pathname = parsed.pathname.replace(/\/+$/, ''); - const assetPath = pathname.endsWith('/api') - ? pathname.slice(0, -4) - : pathname; - return `${parsed.origin}${assetPath}`.replace(/\/+$/, ''); - } catch { - return 'http://localhost:3000'; - } -}; +const DEFAULT_API_BASE_URL = 'http://localhost:3000/api'; + +const normalizeHttpUrl = (value?: string | null): string | null => { + const trimmed = String(value || '').trim(); + if (!trimmed) return null; + + try { + const parsed = new URL(trimmed); + return `${parsed.origin}${parsed.pathname}`.replace(/\/+$/, ''); + } catch { + return null; + } +}; + +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`; + } + + return DEFAULT_API_BASE_URL; +}; + +export const getConfiguredAssetBaseUrl = (): string => { + const apiBaseUrl = getConfiguredApiBaseUrl(); + + try { + const parsed = new URL(apiBaseUrl); + const pathname = parsed.pathname.replace(/\/+$/, ''); + const assetPath = pathname.endsWith('/api') + ? pathname.slice(0, -4) + : pathname; + return `${parsed.origin}${assetPath}`.replace(/\/+$/, ''); + } catch { + return 'http://localhost:3000'; + } +}; diff --git a/utils/hybridSearch.ts b/utils/hybridSearch.ts index d385449..a3ac7b4 100644 --- a/utils/hybridSearch.ts +++ b/utils/hybridSearch.ts @@ -1,213 +1,213 @@ -import { CareInfo } from '../types'; - -const { SEARCH_INTENT_CONFIG } = require('../constants/searchIntentConfig'); - -type SearchIntentConfig = { - aliases?: string[]; - entryHints?: string[]; - lightHints?: string[]; -}; - -export interface HybridSearchEntryLike { - name: string; - botanicalName?: string; - description?: string; - categories?: string[]; - careInfo?: Partial | null; -} - -interface RankedEntry { - entry: T; - score: number; -} - -const normalizeArray = (values: string[]): string[] => { - return [...new Set(values.map((value) => normalizeSearchText(value)).filter(Boolean))]; -}; - -export const normalizeSearchText = (value: string): string => { - return value - .toLowerCase() - .normalize('NFD') - .replace(/[\u0300-\u036f]/g, '') - .trim() - .replace(/[^a-z0-9\s_-]+/g, ' ') - .replace(/[_-]+/g, ' ') - .replace(/\s+/g, ' '); -}; - -const tokenize = (normalizedValue: string): string[] => { - return normalizedValue.split(' ').filter(Boolean); -}; - -const tokenSetFromQuery = (normalizedQuery: string): Set => { - const rawTokens = tokenize(normalizedQuery); - const noise = new Set(SEARCH_INTENT_CONFIG.noiseTokens.map((token: string) => normalizeSearchText(token))); - return new Set(rawTokens.filter((token) => !noise.has(token))); -}; - -const includesPhrase = (normalizedQuery: string, normalizedAlias: string, queryTokens: Set): boolean => { - if (!normalizedAlias) return false; - if (normalizedQuery.includes(normalizedAlias)) return true; - - const aliasTokens = tokenize(normalizedAlias); - if (aliasTokens.length <= 1) return queryTokens.has(normalizedAlias); - return aliasTokens.every((token) => queryTokens.has(token)); -}; - -const detectQueryIntents = (normalizedQuery: string): string[] => { - const queryTokens = tokenSetFromQuery(normalizedQuery); - const intents = (Object.entries(SEARCH_INTENT_CONFIG.intents) as Array<[string, SearchIntentConfig]>) - .filter(([, value]) => - (value.aliases || []).some((alias) => includesPhrase(normalizedQuery, normalizeSearchText(alias), queryTokens))) - .map(([intentId]) => intentId); - return intents; -}; - -const getLevenshteinDistance = (left: string, right: string): number => { - const rows = left.length + 1; - const cols = right.length + 1; - const matrix: number[][] = Array.from({ length: rows }, (_, rowIndex) => [rowIndex]); - - for (let col = 0; col < cols; col += 1) { - matrix[0][col] = col; - } - - for (let row = 1; row < rows; row += 1) { - for (let col = 1; col < cols; col += 1) { - const cost = left[row - 1] === right[col - 1] ? 0 : 1; - matrix[row][col] = Math.min( - matrix[row - 1][col] + 1, - matrix[row][col - 1] + 1, - matrix[row - 1][col - 1] + cost, - ); - } - } - - return matrix[left.length][right.length]; -}; - -const fuzzyBonus = (normalizedQuery: string, candidates: string[]): number => { - if (normalizedQuery.length < 3 || normalizedQuery.length > 32) return 0; - - let best = Number.POSITIVE_INFINITY; - candidates.forEach((candidate) => { - if (!candidate) return; - tokenize(candidate).forEach((token) => { - best = Math.min(best, getLevenshteinDistance(normalizedQuery, token)); - }); - best = Math.min(best, getLevenshteinDistance(normalizedQuery, candidate)); - }); - - if (best === 1) return 14; - if (best === 2) return 8; - return 0; -}; - -const scoreTextMatch = (normalizedQuery: string, normalizedTarget: string, exact: number, prefix: number, contains: number): number => { - if (!normalizedQuery || !normalizedTarget) return 0; - if (normalizedTarget === normalizedQuery) return exact; - if (normalizedTarget.startsWith(normalizedQuery)) return prefix; - if (normalizedTarget.includes(normalizedQuery)) return contains; - return 0; -}; - -const buildDerivedIntentSignals = (entry: HybridSearchEntryLike): string[] => { - const normalizedDescription = normalizeSearchText(entry.description || ''); - const normalizedLight = normalizeSearchText(entry.careInfo?.light || ''); - - const derivedSignals = new Set(); - const normalizedCategories = (entry.categories || []).map((category) => normalizeSearchText(category)); - normalizedCategories.forEach((category) => derivedSignals.add(category)); - - (Object.entries(SEARCH_INTENT_CONFIG.intents) as Array<[string, SearchIntentConfig]>).forEach(([intentId, intentConfig]) => { - const entryHints = normalizeArray(intentConfig.entryHints || []); - if (entryHints.some((hint) => normalizedDescription.includes(hint))) { - derivedSignals.add(intentId); - } - - const lightHints = normalizeArray(intentConfig.lightHints || []); - if (lightHints.some((hint) => normalizedLight.includes(hint))) { - derivedSignals.add(intentId); - } - }); - - return [...derivedSignals]; -}; - -export const scoreHybridEntry = (entry: HybridSearchEntryLike, query: string): number => { - const normalizedQuery = normalizeSearchText(query); - if (!normalizedQuery) return 0; - - const normalizedName = normalizeSearchText(entry.name || ''); - const normalizedBotanical = normalizeSearchText(entry.botanicalName || ''); - const normalizedDescription = normalizeSearchText(entry.description || ''); - const normalizedCategories = (entry.categories || []).map((category) => normalizeSearchText(category)); - const derivedSignals = buildDerivedIntentSignals(entry); - const requestedIntents = detectQueryIntents(normalizedQuery); - - let score = 0; - score += Math.max( - scoreTextMatch(normalizedQuery, normalizedName, 140, 100, 64), - scoreTextMatch(normalizedQuery, normalizedBotanical, 130, 96, 58), - ); - - if (normalizedDescription.includes(normalizedQuery)) { - score += 24; - } - - score += fuzzyBonus(normalizedQuery, [normalizedName, normalizedBotanical, ...normalizedCategories]); - - let matchedIntentCount = 0; - requestedIntents.forEach((intentId) => { - const categoryHit = normalizedCategories.includes(intentId); - const derivedHit = derivedSignals.includes(intentId); - if (categoryHit) { - score += 92; - matchedIntentCount += 1; - return; - } - if (derivedHit) { - score += 56; - matchedIntentCount += 1; - } - }); - - if (matchedIntentCount >= 2) { - score += 38 * matchedIntentCount; - } else if (matchedIntentCount === 1) { - score += 10; - } - - const queryTokens = [...tokenSetFromQuery(normalizedQuery)]; - if (queryTokens.length > 1) { - const searchableText = [normalizedName, normalizedBotanical, normalizedDescription, ...normalizedCategories, ...derivedSignals].join(' '); - const tokenHits = queryTokens.filter((token) => searchableText.includes(token)).length; - score += tokenHits * 8; - if (tokenHits === queryTokens.length && queryTokens.length > 0) { - score += 16; - } - } - - return score; -}; - -export const rankHybridEntries = ( - entries: T[], - query: string, - limit = 30, -): RankedEntry[] => { - const normalizedQuery = normalizeSearchText(query); - if (!normalizedQuery) { - return entries.slice(0, limit).map((entry) => ({ entry, score: 0 })); - } - - return entries - .map((entry) => ({ entry, score: scoreHybridEntry(entry, normalizedQuery) })) - .filter((candidate) => candidate.score > 0) - .sort((left, right) => - right.score - left.score || - left.entry.name.length - right.entry.name.length || - left.entry.name.localeCompare(right.entry.name)) - .slice(0, limit); -}; +import { CareInfo } from '../types'; + +const { SEARCH_INTENT_CONFIG } = require('../constants/searchIntentConfig'); + +type SearchIntentConfig = { + aliases?: string[]; + entryHints?: string[]; + lightHints?: string[]; +}; + +export interface HybridSearchEntryLike { + name: string; + botanicalName?: string; + description?: string; + categories?: string[]; + careInfo?: Partial | null; +} + +interface RankedEntry { + entry: T; + score: number; +} + +const normalizeArray = (values: string[]): string[] => { + return [...new Set(values.map((value) => normalizeSearchText(value)).filter(Boolean))]; +}; + +export const normalizeSearchText = (value: string): string => { + return value + .toLowerCase() + .normalize('NFD') + .replace(/[\u0300-\u036f]/g, '') + .trim() + .replace(/[^a-z0-9\s_-]+/g, ' ') + .replace(/[_-]+/g, ' ') + .replace(/\s+/g, ' '); +}; + +const tokenize = (normalizedValue: string): string[] => { + return normalizedValue.split(' ').filter(Boolean); +}; + +const tokenSetFromQuery = (normalizedQuery: string): Set => { + const rawTokens = tokenize(normalizedQuery); + const noise = new Set(SEARCH_INTENT_CONFIG.noiseTokens.map((token: string) => normalizeSearchText(token))); + return new Set(rawTokens.filter((token) => !noise.has(token))); +}; + +const includesPhrase = (normalizedQuery: string, normalizedAlias: string, queryTokens: Set): boolean => { + if (!normalizedAlias) return false; + if (normalizedQuery.includes(normalizedAlias)) return true; + + const aliasTokens = tokenize(normalizedAlias); + if (aliasTokens.length <= 1) return queryTokens.has(normalizedAlias); + return aliasTokens.every((token) => queryTokens.has(token)); +}; + +const detectQueryIntents = (normalizedQuery: string): string[] => { + const queryTokens = tokenSetFromQuery(normalizedQuery); + const intents = (Object.entries(SEARCH_INTENT_CONFIG.intents) as Array<[string, SearchIntentConfig]>) + .filter(([, value]) => + (value.aliases || []).some((alias) => includesPhrase(normalizedQuery, normalizeSearchText(alias), queryTokens))) + .map(([intentId]) => intentId); + return intents; +}; + +const getLevenshteinDistance = (left: string, right: string): number => { + const rows = left.length + 1; + const cols = right.length + 1; + const matrix: number[][] = Array.from({ length: rows }, (_, rowIndex) => [rowIndex]); + + for (let col = 0; col < cols; col += 1) { + matrix[0][col] = col; + } + + for (let row = 1; row < rows; row += 1) { + for (let col = 1; col < cols; col += 1) { + const cost = left[row - 1] === right[col - 1] ? 0 : 1; + matrix[row][col] = Math.min( + matrix[row - 1][col] + 1, + matrix[row][col - 1] + 1, + matrix[row - 1][col - 1] + cost, + ); + } + } + + return matrix[left.length][right.length]; +}; + +const fuzzyBonus = (normalizedQuery: string, candidates: string[]): number => { + if (normalizedQuery.length < 3 || normalizedQuery.length > 32) return 0; + + let best = Number.POSITIVE_INFINITY; + candidates.forEach((candidate) => { + if (!candidate) return; + tokenize(candidate).forEach((token) => { + best = Math.min(best, getLevenshteinDistance(normalizedQuery, token)); + }); + best = Math.min(best, getLevenshteinDistance(normalizedQuery, candidate)); + }); + + if (best === 1) return 14; + if (best === 2) return 8; + return 0; +}; + +const scoreTextMatch = (normalizedQuery: string, normalizedTarget: string, exact: number, prefix: number, contains: number): number => { + if (!normalizedQuery || !normalizedTarget) return 0; + if (normalizedTarget === normalizedQuery) return exact; + if (normalizedTarget.startsWith(normalizedQuery)) return prefix; + if (normalizedTarget.includes(normalizedQuery)) return contains; + return 0; +}; + +const buildDerivedIntentSignals = (entry: HybridSearchEntryLike): string[] => { + const normalizedDescription = normalizeSearchText(entry.description || ''); + const normalizedLight = normalizeSearchText(entry.careInfo?.light || ''); + + const derivedSignals = new Set(); + const normalizedCategories = (entry.categories || []).map((category) => normalizeSearchText(category)); + normalizedCategories.forEach((category) => derivedSignals.add(category)); + + (Object.entries(SEARCH_INTENT_CONFIG.intents) as Array<[string, SearchIntentConfig]>).forEach(([intentId, intentConfig]) => { + const entryHints = normalizeArray(intentConfig.entryHints || []); + if (entryHints.some((hint) => normalizedDescription.includes(hint))) { + derivedSignals.add(intentId); + } + + const lightHints = normalizeArray(intentConfig.lightHints || []); + if (lightHints.some((hint) => normalizedLight.includes(hint))) { + derivedSignals.add(intentId); + } + }); + + return [...derivedSignals]; +}; + +export const scoreHybridEntry = (entry: HybridSearchEntryLike, query: string): number => { + const normalizedQuery = normalizeSearchText(query); + if (!normalizedQuery) return 0; + + const normalizedName = normalizeSearchText(entry.name || ''); + const normalizedBotanical = normalizeSearchText(entry.botanicalName || ''); + const normalizedDescription = normalizeSearchText(entry.description || ''); + const normalizedCategories = (entry.categories || []).map((category) => normalizeSearchText(category)); + const derivedSignals = buildDerivedIntentSignals(entry); + const requestedIntents = detectQueryIntents(normalizedQuery); + + let score = 0; + score += Math.max( + scoreTextMatch(normalizedQuery, normalizedName, 140, 100, 64), + scoreTextMatch(normalizedQuery, normalizedBotanical, 130, 96, 58), + ); + + if (normalizedDescription.includes(normalizedQuery)) { + score += 24; + } + + score += fuzzyBonus(normalizedQuery, [normalizedName, normalizedBotanical, ...normalizedCategories]); + + let matchedIntentCount = 0; + requestedIntents.forEach((intentId) => { + const categoryHit = normalizedCategories.includes(intentId); + const derivedHit = derivedSignals.includes(intentId); + if (categoryHit) { + score += 92; + matchedIntentCount += 1; + return; + } + if (derivedHit) { + score += 56; + matchedIntentCount += 1; + } + }); + + if (matchedIntentCount >= 2) { + score += 38 * matchedIntentCount; + } else if (matchedIntentCount === 1) { + score += 10; + } + + const queryTokens = [...tokenSetFromQuery(normalizedQuery)]; + if (queryTokens.length > 1) { + const searchableText = [normalizedName, normalizedBotanical, normalizedDescription, ...normalizedCategories, ...derivedSignals].join(' '); + const tokenHits = queryTokens.filter((token) => searchableText.includes(token)).length; + score += tokenHits * 8; + if (tokenHits === queryTokens.length && queryTokens.length > 0) { + score += 16; + } + } + + return score; +}; + +export const rankHybridEntries = ( + entries: T[], + query: string, + limit = 30, +): RankedEntry[] => { + const normalizedQuery = normalizeSearchText(query); + if (!normalizedQuery) { + return entries.slice(0, limit).map((entry) => ({ entry, score: 0 })); + } + + return entries + .map((entry) => ({ entry, score: scoreHybridEntry(entry, normalizedQuery) })) + .filter((candidate) => candidate.score > 0) + .sort((left, right) => + right.score - left.score || + left.entry.name.length - right.entry.name.length || + left.entry.name.localeCompare(right.entry.name)) + .slice(0, limit); +}; diff --git a/utils/idempotency.ts b/utils/idempotency.ts index 895f95e..cdff916 100644 --- a/utils/idempotency.ts +++ b/utils/idempotency.ts @@ -1,17 +1,17 @@ -const sanitizeSeed = (value: string): string => { - return value - .toLowerCase() - .replace(/[^a-z0-9]+/g, '-') - .replace(/^-+|-+$/g, '') - .slice(0, 36); -}; - -export const createIdempotencyKey = (scope: string, seed?: string): string => { - const base = sanitizeSeed(scope || 'action') || 'action'; - const seedPart = seed ? sanitizeSeed(seed) : ''; - const timestamp = Date.now().toString(36); - const random = Math.random().toString(36).slice(2, 10); - return seedPart - ? `${base}-${seedPart}-${timestamp}-${random}` - : `${base}-${timestamp}-${random}`; -}; +const sanitizeSeed = (value: string): string => { + return value + .toLowerCase() + .replace(/[^a-z0-9]+/g, '-') + .replace(/^-+|-+$/g, '') + .slice(0, 36); +}; + +export const createIdempotencyKey = (scope: string, seed?: string): string => { + const base = sanitizeSeed(scope || 'action') || 'action'; + const seedPart = seed ? sanitizeSeed(seed) : ''; + const timestamp = Date.now().toString(36); + const random = Math.random().toString(36).slice(2, 10); + return seedPart + ? `${base}-${seedPart}-${timestamp}-${random}` + : `${base}-${timestamp}-${random}`; +}; diff --git a/utils/imageUri.ts b/utils/imageUri.ts index 581a807..59a2948 100644 --- a/utils/imageUri.ts +++ b/utils/imageUri.ts @@ -1,217 +1,217 @@ -import { getConfiguredAssetBaseUrl } from './backendUrl'; - -const WIKIMEDIA_FILEPATH_SEGMENT = 'Special:FilePath/'; -const WIKIMEDIA_REDIRECT_BASE = 'https://commons.wikimedia.org/wiki/Special:FilePath/'; - -export const DEFAULT_PLANT_IMAGE_URI = - 'https://upload.wikimedia.org/wikipedia/commons/thumb/2/2e/Monstera_deliciosa2.jpg/330px-Monstera_deliciosa2.jpg'; - -// Verified working fallback images per category (from main database URLs) -const CATEGORY_FALLBACK_IMAGES: Record = { - succulent: 'https://upload.wikimedia.org/wikipedia/commons/thumb/0/05/Aloe_Vera_houseplant.jpg/330px-Aloe_Vera_houseplant.jpg', - flowering: 'https://upload.wikimedia.org/wikipedia/commons/thumb/8/8b/AnthuriumAndraenum.jpg/330px-AnthuriumAndraenum.jpg', - medicinal: 'https://upload.wikimedia.org/wikipedia/commons/thumb/4/40/Lavandula_angustifolia_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-087.jpg/330px-Lavandula_angustifolia_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-087.jpg', - tree: 'https://upload.wikimedia.org/wikipedia/commons/thumb/2/25/Ficus_benjamina.jpg/330px-Ficus_benjamina.jpg', - hanging: 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/62/Money_Plant_%28Epipremnum_aureum%29_4.jpg/330px-Money_Plant_%28Epipremnum_aureum%29_4.jpg', - patterned: 'https://upload.wikimedia.org/wikipedia/commons/thumb/e/e7/Starr_080716-9470_Calathea_crotalifera.jpg/330px-Starr_080716-9470_Calathea_crotalifera.jpg', - pet_friendly: 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/6c/Chlorophytum_comosum_01.jpg/330px-Chlorophytum_comosum_01.jpg', - high_humidity: 'https://upload.wikimedia.org/wikipedia/commons/thumb/b/bd/Spathiphyllum_cochlearispathum_RTBG.jpg/330px-Spathiphyllum_cochlearispathum_RTBG.jpg', - air_purifier: 'https://upload.wikimedia.org/wikipedia/commons/thumb/f/fb/Snake_Plant_%28Sansevieria_trifasciata_%27Laurentii%27%29.jpg/330px-Snake_Plant_%28Sansevieria_trifasciata_%27Laurentii%27%29.jpg', - sun: 'https://upload.wikimedia.org/wikipedia/commons/thumb/8/85/Echeveria_elegans_-_1.jpg/330px-Echeveria_elegans_-_1.jpg', - low_light: 'https://upload.wikimedia.org/wikipedia/commons/thumb/c/cf/Zamioculcas_zamiifolia_1.jpg/330px-Zamioculcas_zamiifolia_1.jpg', - easy: 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/6d/Pilea_peperomioides_Chinese_money_plant.jpg/330px-Pilea_peperomioides_Chinese_money_plant.jpg', - large: 'https://upload.wikimedia.org/wikipedia/commons/thumb/b/ba/Strelitzia_nicolai_3.jpg/330px-Strelitzia_nicolai_3.jpg', -}; - -const CATEGORY_PRIORITY = [ - 'succulent', 'flowering', 'medicinal', 'tree', 'hanging', - 'patterned', 'pet_friendly', 'high_humidity', 'air_purifier', - 'sun', 'low_light', 'easy', 'large', -]; - -export const getCategoryFallbackImage = (categories: string[]): string => { - for (const cat of CATEGORY_PRIORITY) { - if (categories.includes(cat) && CATEGORY_FALLBACK_IMAGES[cat]) { - return CATEGORY_FALLBACK_IMAGES[cat]; - } - } - return DEFAULT_PLANT_IMAGE_URI; -}; - -const tryDecode = (value: string): string => { - try { - return decodeURIComponent(value); - } catch { - return value; - } -}; - -const decodeRepeatedly = (value: string, rounds = 3): string => { - let current = value; - for (let index = 0; index < rounds; index += 1) { - const decoded = tryDecode(current); - if (decoded === current) break; - current = decoded; - } - return current; -}; - -type PlantManifestItem = { - localImageUri?: string; - sourceUri?: string; -}; - -let manifestSourceByLocalUriCache: Map | null = null; -let wikimediaSearchCache: Record | null = null; - -const normalizePlantAssetPath = (value?: string | null): string | null => { - const trimmed = String(value || '').trim(); - if (!trimmed) return null; - - const withoutQuery = trimmed.split(/[?#]/)[0].replace(/\\/g, '/'); - const normalizedPath = withoutQuery.startsWith('/') ? withoutQuery : `/${withoutQuery}`; - if (!normalizedPath.startsWith('/plants/')) return null; - if (normalizedPath.includes('..')) return null; - return normalizedPath; -}; - -const loadManifestSourceByLocalUri = (): Map => { - if (manifestSourceByLocalUriCache) return manifestSourceByLocalUriCache; - - const nextCache = new Map(); - try { - const manifest = require('../server/public/plants/manifest.json') as { items?: PlantManifestItem[] }; - const items = Array.isArray(manifest?.items) ? manifest.items : []; - for (const item of items) { - const localImageUri = normalizePlantAssetPath(item?.localImageUri); - const sourceUri = String(item?.sourceUri || '').trim(); - if (!localImageUri || !sourceUri) continue; - nextCache.set(localImageUri, sourceUri); - } - } catch { - // Keep empty cache when manifest is unavailable. - } - - manifestSourceByLocalUriCache = nextCache; - return nextCache; -}; - -const loadWikimediaSearchCache = (): Record => { - if (wikimediaSearchCache) return wikimediaSearchCache; - - try { - wikimediaSearchCache = require('../server/public/plants/wikimedia-search-cache.json') as Record; - } catch { - wikimediaSearchCache = {}; - } - - return wikimediaSearchCache; -}; - -const resolveServerAssetPath = (rawPath: string): string | null => { - const normalizedPath = normalizePlantAssetPath(rawPath); - if (!normalizedPath) return null; - - return `${getConfiguredAssetBaseUrl()}${normalizedPath}`; -}; - -const unwrapMarkdownLink = (value: string): string => { - const markdownLink = value.match(/^\[[^\]]+]\((https?:\/\/[^)]+)\)(.*)$/i); - if (!markdownLink) return value; - const [, url, suffix] = markdownLink; - return `${url}${suffix || ''}`; -}; - -const convertWikimediaFilePathUrl = (value: string): string | null => { - 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(); - const encodedFileName = encodeURIComponent(decodedFileName).replace(/%2F/g, '/'); - return `${WIKIMEDIA_REDIRECT_BASE}${encodedFileName}`; -}; - -export const getWikimediaFilePathFromThumbnailUrl = (url: string): string | null => { - if (!url.includes('upload.wikimedia.org/wikipedia/commons/thumb/')) return null; - - // Example: https://upload.wikimedia.org/wikipedia/commons/thumb/2/2e/Monstera_deliciosa2.jpg/330px-Monstera_deliciosa2.jpg - // The filename is the segment between the second-to-last and last slash (in many cases) - // or use a more robust regex - const parts = url.split('/'); - // Filter out empty parts from trailing slashes - const filtered = parts.filter(p => !!p); - if (filtered.length < 5) return null; - - // For thumb URLs, the filename is typically the part before the last part (which is the px-filename) - // but let's be careful. - const lastName = filtered[filtered.length - 1]; - const secondLastName = filtered[filtered.length - 2]; - - // In thumb URLs, the last part is usually "330px-Filename.jpg" - // The second to last is "Filename.jpg" - if (lastName.includes('px-') && lastName.endsWith(secondLastName)) { - try { - return decodeURIComponent(secondLastName); - } catch { - return secondLastName; - } - } - - return null; -}; - -export const getPlantImageSourceFallbackUri = (rawUri?: string | null): string | null => { - const localImageUri = normalizePlantAssetPath(rawUri); - if (!localImageUri) return null; - - const sourceUri = loadManifestSourceByLocalUri().get(localImageUri); - if (!sourceUri) return null; - - if (/^https?:\/\//i.test(sourceUri)) { - return tryResolveImageUri(sourceUri); - } - - if (!sourceUri.startsWith('wikimedia-search:')) { - return null; - } - - const rawQuery = sourceUri.slice('wikimedia-search:'.length).trim(); - const decodedQuery = decodeRepeatedly(rawQuery); - if (!decodedQuery) return null; - - const searchCache = loadWikimediaSearchCache(); - const cachedUrl = searchCache[decodedQuery] - || searchCache[rawQuery] - || searchCache[encodeURIComponent(decodedQuery)] - || null; - - return cachedUrl ? tryResolveImageUri(cachedUrl) : null; -}; - -export const tryResolveImageUri = (rawUri?: string | null): string | null => { - if (!rawUri) return null; - - const trimmed = rawUri.trim(); - if (!trimmed) return null; - - const localAssetUri = resolveServerAssetPath(trimmed); - if (localAssetUri) return localAssetUri; - - const normalized = unwrapMarkdownLink(trimmed); - const converted = convertWikimediaFilePathUrl(normalized); - const candidate = (converted || normalized).replace(/^http:\/\//i, 'https://'); - - if (!/^(https?:\/\/|file:\/\/|content:\/\/|data:image\/|blob:)/i.test(candidate)) { - return null; - } - - return candidate; -}; - -export const resolveImageUri = (rawUri?: string | null): string => { - return tryResolveImageUri(rawUri) || DEFAULT_PLANT_IMAGE_URI; -}; +import { getConfiguredAssetBaseUrl } from './backendUrl'; + +const WIKIMEDIA_FILEPATH_SEGMENT = 'Special:FilePath/'; +const WIKIMEDIA_REDIRECT_BASE = 'https://commons.wikimedia.org/wiki/Special:FilePath/'; + +export const DEFAULT_PLANT_IMAGE_URI = + 'https://upload.wikimedia.org/wikipedia/commons/thumb/2/2e/Monstera_deliciosa2.jpg/330px-Monstera_deliciosa2.jpg'; + +// Verified working fallback images per category (from main database URLs) +const CATEGORY_FALLBACK_IMAGES: Record = { + succulent: 'https://upload.wikimedia.org/wikipedia/commons/thumb/0/05/Aloe_Vera_houseplant.jpg/330px-Aloe_Vera_houseplant.jpg', + flowering: 'https://upload.wikimedia.org/wikipedia/commons/thumb/8/8b/AnthuriumAndraenum.jpg/330px-AnthuriumAndraenum.jpg', + medicinal: 'https://upload.wikimedia.org/wikipedia/commons/thumb/4/40/Lavandula_angustifolia_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-087.jpg/330px-Lavandula_angustifolia_-_K%C3%B6hler%E2%80%93s_Medizinal-Pflanzen-087.jpg', + tree: 'https://upload.wikimedia.org/wikipedia/commons/thumb/2/25/Ficus_benjamina.jpg/330px-Ficus_benjamina.jpg', + hanging: 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/62/Money_Plant_%28Epipremnum_aureum%29_4.jpg/330px-Money_Plant_%28Epipremnum_aureum%29_4.jpg', + patterned: 'https://upload.wikimedia.org/wikipedia/commons/thumb/e/e7/Starr_080716-9470_Calathea_crotalifera.jpg/330px-Starr_080716-9470_Calathea_crotalifera.jpg', + pet_friendly: 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/6c/Chlorophytum_comosum_01.jpg/330px-Chlorophytum_comosum_01.jpg', + high_humidity: 'https://upload.wikimedia.org/wikipedia/commons/thumb/b/bd/Spathiphyllum_cochlearispathum_RTBG.jpg/330px-Spathiphyllum_cochlearispathum_RTBG.jpg', + air_purifier: 'https://upload.wikimedia.org/wikipedia/commons/thumb/f/fb/Snake_Plant_%28Sansevieria_trifasciata_%27Laurentii%27%29.jpg/330px-Snake_Plant_%28Sansevieria_trifasciata_%27Laurentii%27%29.jpg', + sun: 'https://upload.wikimedia.org/wikipedia/commons/thumb/8/85/Echeveria_elegans_-_1.jpg/330px-Echeveria_elegans_-_1.jpg', + low_light: 'https://upload.wikimedia.org/wikipedia/commons/thumb/c/cf/Zamioculcas_zamiifolia_1.jpg/330px-Zamioculcas_zamiifolia_1.jpg', + easy: 'https://upload.wikimedia.org/wikipedia/commons/thumb/6/6d/Pilea_peperomioides_Chinese_money_plant.jpg/330px-Pilea_peperomioides_Chinese_money_plant.jpg', + large: 'https://upload.wikimedia.org/wikipedia/commons/thumb/b/ba/Strelitzia_nicolai_3.jpg/330px-Strelitzia_nicolai_3.jpg', +}; + +const CATEGORY_PRIORITY = [ + 'succulent', 'flowering', 'medicinal', 'tree', 'hanging', + 'patterned', 'pet_friendly', 'high_humidity', 'air_purifier', + 'sun', 'low_light', 'easy', 'large', +]; + +export const getCategoryFallbackImage = (categories: string[]): string => { + for (const cat of CATEGORY_PRIORITY) { + if (categories.includes(cat) && CATEGORY_FALLBACK_IMAGES[cat]) { + return CATEGORY_FALLBACK_IMAGES[cat]; + } + } + return DEFAULT_PLANT_IMAGE_URI; +}; + +const tryDecode = (value: string): string => { + try { + return decodeURIComponent(value); + } catch { + return value; + } +}; + +const decodeRepeatedly = (value: string, rounds = 3): string => { + let current = value; + for (let index = 0; index < rounds; index += 1) { + const decoded = tryDecode(current); + if (decoded === current) break; + current = decoded; + } + return current; +}; + +type PlantManifestItem = { + localImageUri?: string; + sourceUri?: string; +}; + +let manifestSourceByLocalUriCache: Map | null = null; +let wikimediaSearchCache: Record | null = null; + +const normalizePlantAssetPath = (value?: string | null): string | null => { + const trimmed = String(value || '').trim(); + if (!trimmed) return null; + + const withoutQuery = trimmed.split(/[?#]/)[0].replace(/\\/g, '/'); + const normalizedPath = withoutQuery.startsWith('/') ? withoutQuery : `/${withoutQuery}`; + if (!normalizedPath.startsWith('/plants/')) return null; + if (normalizedPath.includes('..')) return null; + return normalizedPath; +}; + +const loadManifestSourceByLocalUri = (): Map => { + if (manifestSourceByLocalUriCache) return manifestSourceByLocalUriCache; + + const nextCache = new Map(); + try { + const manifest = require('../server/public/plants/manifest.json') as { items?: PlantManifestItem[] }; + const items = Array.isArray(manifest?.items) ? manifest.items : []; + for (const item of items) { + const localImageUri = normalizePlantAssetPath(item?.localImageUri); + const sourceUri = String(item?.sourceUri || '').trim(); + if (!localImageUri || !sourceUri) continue; + nextCache.set(localImageUri, sourceUri); + } + } catch { + // Keep empty cache when manifest is unavailable. + } + + manifestSourceByLocalUriCache = nextCache; + return nextCache; +}; + +const loadWikimediaSearchCache = (): Record => { + if (wikimediaSearchCache) return wikimediaSearchCache; + + try { + wikimediaSearchCache = require('../server/public/plants/wikimedia-search-cache.json') as Record; + } catch { + wikimediaSearchCache = {}; + } + + return wikimediaSearchCache; +}; + +const resolveServerAssetPath = (rawPath: string): string | null => { + const normalizedPath = normalizePlantAssetPath(rawPath); + if (!normalizedPath) return null; + + return `${getConfiguredAssetBaseUrl()}${normalizedPath}`; +}; + +const unwrapMarkdownLink = (value: string): string => { + const markdownLink = value.match(/^\[[^\]]+]\((https?:\/\/[^)]+)\)(.*)$/i); + if (!markdownLink) return value; + const [, url, suffix] = markdownLink; + return `${url}${suffix || ''}`; +}; + +const convertWikimediaFilePathUrl = (value: string): string | null => { + 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(); + const encodedFileName = encodeURIComponent(decodedFileName).replace(/%2F/g, '/'); + return `${WIKIMEDIA_REDIRECT_BASE}${encodedFileName}`; +}; + +export const getWikimediaFilePathFromThumbnailUrl = (url: string): string | null => { + if (!url.includes('upload.wikimedia.org/wikipedia/commons/thumb/')) return null; + + // Example: https://upload.wikimedia.org/wikipedia/commons/thumb/2/2e/Monstera_deliciosa2.jpg/330px-Monstera_deliciosa2.jpg + // The filename is the segment between the second-to-last and last slash (in many cases) + // or use a more robust regex + const parts = url.split('/'); + // Filter out empty parts from trailing slashes + const filtered = parts.filter(p => !!p); + if (filtered.length < 5) return null; + + // For thumb URLs, the filename is typically the part before the last part (which is the px-filename) + // but let's be careful. + const lastName = filtered[filtered.length - 1]; + const secondLastName = filtered[filtered.length - 2]; + + // In thumb URLs, the last part is usually "330px-Filename.jpg" + // The second to last is "Filename.jpg" + if (lastName.includes('px-') && lastName.endsWith(secondLastName)) { + try { + return decodeURIComponent(secondLastName); + } catch { + return secondLastName; + } + } + + return null; +}; + +export const getPlantImageSourceFallbackUri = (rawUri?: string | null): string | null => { + const localImageUri = normalizePlantAssetPath(rawUri); + if (!localImageUri) return null; + + const sourceUri = loadManifestSourceByLocalUri().get(localImageUri); + if (!sourceUri) return null; + + if (/^https?:\/\//i.test(sourceUri)) { + return tryResolveImageUri(sourceUri); + } + + if (!sourceUri.startsWith('wikimedia-search:')) { + return null; + } + + const rawQuery = sourceUri.slice('wikimedia-search:'.length).trim(); + const decodedQuery = decodeRepeatedly(rawQuery); + if (!decodedQuery) return null; + + const searchCache = loadWikimediaSearchCache(); + const cachedUrl = searchCache[decodedQuery] + || searchCache[rawQuery] + || searchCache[encodeURIComponent(decodedQuery)] + || null; + + return cachedUrl ? tryResolveImageUri(cachedUrl) : null; +}; + +export const tryResolveImageUri = (rawUri?: string | null): string | null => { + if (!rawUri) return null; + + const trimmed = rawUri.trim(); + if (!trimmed) return null; + + const localAssetUri = resolveServerAssetPath(trimmed); + if (localAssetUri) return localAssetUri; + + const normalized = unwrapMarkdownLink(trimmed); + const converted = convertWikimediaFilePathUrl(normalized); + const candidate = (converted || normalized).replace(/^http:\/\//i, 'https://'); + + if (!/^(https?:\/\/|file:\/\/|content:\/\/|data:image\/|blob:)/i.test(candidate)) { + return null; + } + + return candidate; +}; + +export const resolveImageUri = (rawUri?: string | null): string => { + return tryResolveImageUri(rawUri) || DEFAULT_PLANT_IMAGE_URI; +}; diff --git a/utils/translations.ts b/utils/translations.ts index 3d51658..46f0b9e 100644 --- a/utils/translations.ts +++ b/utils/translations.ts @@ -1,590 +1,689 @@ - -import { Language } from '../types'; - -export const translations = { - de: { - // Tabs - tabPlants: 'Pflanzen', - tabSearch: 'Suche', - tabProfile: 'Profil', - - // Headers - myPlants: 'Meine Pflanzen', - searchTitle: 'Suche', - settingsTitle: 'Einstellungen', - - // Settings - darkMode: 'Dark Mode', - language: 'Sprache', - appearance: 'Design', - appearanceMode: 'Modus', - colorPalette: 'Farbpalette', - themeSystem: 'System', - themeLight: 'Hell', - themeDark: 'Dunkel', - paletteForest: 'Forest', - paletteOcean: 'Ocean', - paletteSunset: 'Sunset', - paletteMono: 'Mono', - - // Info - noPlants: 'Noch keine Pflanzen.', - nextStepsTitle: 'Deine nächsten Schritte', - stepScan: 'Erste Pflanze scannen', - stepLexicon: 'Pflanzenlexikon erkunden', - stepTheme: 'Design anpassen', - - // Filters - allGood: 'Alles gut', - toWater: 'Zu gießen', - - // Search - searchPlaceholder: 'Pflanzen suchen...', - categories: 'Kategorien entdecken', - resultsInPlants: 'Ergebnisse in "Meine Pflanzen"', - noResults: 'Keine Pflanzen gefunden.', - searchMyPlants: 'Meine Pflanzen', - searchLexicon: 'Lexikon', - searchAiSection: 'AI Deep Search', - searchDeepAction: 'Deep Search (AI)', - searchNoLocalResults: 'Keine Treffer in deiner Sammlung.', - searchNoLexiconResults: 'Keine Treffer im Lexikon.', - searchAiLoading: 'AI durchsucht den Katalog...', - searchAiNoResults: 'AI hat keine passenden Pflanzen gefunden.', - searchAiUnavailable: 'AI-Suche ist aktuell nicht verfügbar.', - searchHistory: 'Suchverlauf', - clearHistory: 'Verlauf löschen', - - // Categories - catCareEasy: "Pflegeleicht", - catSucculents: "Sukkulenten", - catLowLight: "Wenig Licht", - catPetFriendly: "Tierfreundlich", - catAirPurifier: "Luftreiniger", - catFlowering: "Blühend", - catBrightLight: "Helles Licht", - catSun: "Sonnig", - catHighHumidity: "Hohe Luftfeuchte", - catHanging: "Hängend", - catPatterned: "Gemustert", - catTree: "Bäume", - catLarge: "Groß", - catMedicinal: "Heilpflanzen", - - // Dictionary - lexiconTitle: "Pflanzen-Lexikon", - lexiconDesc: "Durchsuche unsere Datenbank und finde die perfekte Ergänzung für dein Zuhause.", - lexiconSearchPlaceholder: "Lexikon durchsuchen...", - browseLexicon: "Im Lexikon stöbern", - backToSearch: "Zurück zur Suche", - - // Misc - comingSoon: 'Bald verfügbar', - gallery: 'Galerie', - help: 'Hilfe', - scanner: 'Scanner', - analyzing: 'Pflanze wird analysiert...', - localProcessing: "Lokale Verarbeitung", - registerToSave: "Registrieren zum Speichern", - - // Scan Stages - scanStage1: "Bildqualität wird geprüft...", - scanStage2: "Blattstrukturen werden analysiert...", - scanStage3: "Abgleich mit Pflanzendatenbank...", - - // Dashboard - greetingMorning: 'Guten Morgen,', - greetingAfternoon: 'Guten Tag,', - greetingEvening: 'Guten Abend,', - creditsLabel: 'Credits', - needsWaterToday: 'Heute gießen', - viewSchedule: 'Plan anzeigen', - all: 'Alle', - today: 'Heute', - week: 'Woche', - healthy: 'Gesund', - dormant: 'Ruhe', - thirsty: 'Durstig', - healthyStatus: 'Gesund', - nextWaterLabel: 'Gießen', - noneInFilter: 'Keine Pflanzen in diesem Filter.', - reminderTitle: 'Erinnerungen', - reminderNone: 'Heute ist keine Pflanze fällig.', - reminderDue: '{0} Pflanzen brauchen heute Wasser.', - plantsThirsty: '{0} deiner Pflanzen brauchen heute Wasser!', - collectionCount: '{0} Pflanzen', - more: 'weitere', - collectionTitle: 'Sammlung', - emptyCollectionTitle: 'Deine Sammlung ist noch leer', - emptyCollectionHint: 'Scanne deine erste Pflanze und starte deine digitale Sammlung.', - scanFirstPlant: 'Erste Pflanze scannen', - - // Plant Card / Detail / Result - result: "Ergebnis", - match: "Übereinstimmung", - careCheck: "Pflege-Check", - showDetails: "Details anzeigen", - hideDetails: "Details verbergen", - dataSavedLocally: "Daten werden lokal gespeichert", - addToPlants: "Zu meinen Pflanzen hinzufügen", - aboutPlant: "Über die Pflanze", - noDescription: "Keine Beschreibung verfügbar.", - careTips: "Pflegehinweise", - addedOn: "Hinzugefügt am", - plantAddedSuccess: "Pflanze erfolgreich hinzugefügt", - - // Detailed Care - detailedCare: "Detaillierte Pflege", - careTextWater: "Bodenfeuchtigkeit alle {0} Tage prüfen.", - careTextLight: "Ideal für Standorte: {0}.", - careTextTemp: "Wohlfühltemperatur: {0}.", - - // Care Attributes - water: "Gießen", - light: "Licht", - temp: "Temperatur", - - // Care Values (UI Helper) - waterModerate: "Mäßig", - waterLittle: "Wenig", - waterEveryXDays: "Alle {0} Tage", - waterToday: "Heute gießen", - inXDays: "In {0} Tagen", - nextWatering: "Nächstes Gießen: {0}", - days: "Tage", - - // Actions - delete: "Löschen", - edit: "Bearbeiten", - share: "Teilen", - waterNow: "Jetzt gießen", - watered: "Gegossen", - wateredSuccess: "Pflanze wurde gegossen!", - plantDeleted: "Pflanze entfernt.", - deleteConfirmTitle: "Pflanze löschen?", - deleteConfirmMessage: "Möchtest du diese Pflanze wirklich aus deiner Sammlung entfernen? Dies kann nicht rückgängig gemacht werden.", - cancel: "Abbrechen", - confirm: "Löschen", - lastWateredDate: "Zuletzt gegossen: {0}", - - // History - wateringHistory: "Gießhistorie", - noHistory: "Noch keine Einträge.", - - // Reminder - reminder: "Erinnerung", - reminderDesc: "Benachrichtigung am Stichtag", - reminderOn: "Aktiviert", - reminderOff: "Deaktiviert", - reminderPermissionNeeded: "Berechtigung für Benachrichtigungen erforderlich.", - - // Gallery - galleryTitle: "Galerie", - addPhoto: "Foto hinzufügen", - noPhotos: "Noch keine Fotos", - - // Tour - tourFabTitle: "📷 Pflanze scannen", - tourFabDesc: "Tippe hier um eine Pflanze zu fotografieren — die KI erkennt sie sofort.", - tourSearchTitle: "🔍 Pflanzenlexikon", - tourSearchDesc: "Durchsuche tausende Pflanzen oder lass die KI nach der perfekten suchen.", - tourProfileTitle: "👤 Dein Profil", - tourProfileDesc: "Passe Design, Sprache und Benachrichtigungen ganz nach deinem Geschmack an.", - - // Onboarding - onboardingTitle1: "Pflanzen-Scanner", - onboardingTitle2: "Pflanzenpflege", - onboardingTitle3: "Dein Garten", - onboardingDesc1: "Scanne jede Pflanze und identifiziere sie sofort mit KI", - onboardingDesc2: "Erhalte personalisierte Pflegetipps und Gießerinnerungen", - onboardingDesc3: "Baue deine digitale Pflanzensammlung auf", - onboardingNext: "Weiter", - onboardingStart: "Los geht's", - onboardingTagline: "Deine Pflanzen. Deine Welt.", - onboardingFeatureScan: "Pflanzen scannen & erkennen", - onboardingFeatureReminder: "Gießerinnerungen & Pflege", - onboardingFeatureLexicon: "Digitales Pflanzen-Lexikon", - onboardingScanBtn: "Pflanze scannen", - onboardingRegister: "Registrieren", - onboardingLogin: "Anmelden", - onboardingDisclaimer: "Deine Daten bleiben privat und lokal auf deinem Gerät.", - }, - en: { - tabPlants: 'Plants', - tabSearch: 'Search', - tabProfile: 'Profile', - myPlants: 'My Plants', - searchTitle: 'Search', - settingsTitle: 'Settings', - darkMode: 'Dark Mode', - language: 'Language', - appearance: 'Appearance', - appearanceMode: 'Mode', - colorPalette: 'Color Palette', - themeSystem: 'System', - themeLight: 'Light', - themeDark: 'Dark', - paletteForest: 'Forest', - paletteOcean: 'Ocean', - paletteSunset: 'Sunset', - paletteMono: 'Mono', - noPlants: 'No plants yet.', - nextStepsTitle: 'Your next steps', - stepScan: 'Scan first plant', - stepLexicon: 'Explore plant lexicon', - stepTheme: 'Customize design', - allGood: 'All good', - toWater: 'To water', - searchPlaceholder: 'Search plants...', - categories: 'Discover Categories', - resultsInPlants: 'Results in "My Plants"', - noResults: 'No plants found.', - searchMyPlants: 'My Plants', - searchLexicon: 'Lexicon', - searchAiSection: 'AI Deep Search', - searchDeepAction: 'Deep Search (AI)', - searchNoLocalResults: 'No matches in your collection.', - searchNoLexiconResults: 'No matches in the lexicon.', - searchAiLoading: 'AI is searching the catalog...', - searchAiNoResults: 'AI found no matching plants.', - searchAiUnavailable: 'AI search is currently unavailable.', - searchHistory: 'Search history', - clearHistory: 'Clear history', - - catCareEasy: "Easy Care", - catSucculents: "Succulents", - catLowLight: "Low Light", - catPetFriendly: "Pet Friendly", - catAirPurifier: "Air Purifier", - catFlowering: "Flowering", - catBrightLight: "Bright Light", - catSun: "Sunny", - catHighHumidity: "High Humidity", - catHanging: "Hanging", - catPatterned: "Patterned", - catTree: "Trees", - catLarge: "Large", - catMedicinal: "Medicinal", - - lexiconTitle: "Plant Encyclopedia", - lexiconDesc: "Browse our database and find the perfect addition for your home.", - lexiconSearchPlaceholder: "Search encyclopedia...", - browseLexicon: "Browse Encyclopedia", - backToSearch: "Back to Search", -// Misc -comingSoon: 'Coming Soon', -gallery: 'Gallery', -help: 'Help', -scanner: 'Scanner', -analyzing: 'Analyzing plant...', -localProcessing: "Local Processing", -registerToSave: "Sign up to save", - - // Scan Stages - scanStage1: "Checking image quality...", - scanStage2: "Analyzing leaf structures...", - scanStage3: "Matching with plant database...", - - // Dashboard - greetingMorning: 'Good morning,', - greetingAfternoon: 'Good afternoon,', - greetingEvening: 'Good evening,', - creditsLabel: 'Credits', - needsWaterToday: 'Needs water today', - viewSchedule: 'View Schedule', - all: 'All', - today: 'Today', - week: 'Week', - healthy: 'Healthy', - dormant: 'Dormant', - thirsty: 'Thirsty', - healthyStatus: 'Healthy', - nextWaterLabel: 'Water', - noneInFilter: 'No plants in this filter.', - reminderTitle: 'Reminders', - reminderNone: 'No plants are due today.', - reminderDue: '{0} plants need water today.', - plantsThirsty: '{0} of your plants are feeling thirsty!', - collectionCount: '{0} plants', - more: 'more', - collectionTitle: 'Collection', - emptyCollectionTitle: 'Your collection is still empty', - emptyCollectionHint: 'Scan your first plant to start building your digital garden.', - scanFirstPlant: 'Scan first plant', - - result: "Result", - match: "Match", - careCheck: "Care Check", - showDetails: "Show Details", - hideDetails: "Hide Details", - dataSavedLocally: "Data is saved locally", - addToPlants: "Add to my plants", - aboutPlant: "About the plant", - noDescription: "No description available.", - careTips: "Care Tips", - addedOn: "Added on", - plantAddedSuccess: "Plant successfully added", - - detailedCare: "Detailed Care", - careTextWater: "Check soil moisture every {0} days.", - careTextLight: "Ideal location: {0}.", - careTextTemp: "Ideal temperature: {0}.", - - water: "Water", - light: "Light", - temp: "Temperature", - - waterModerate: "Moderate", - waterLittle: "Little", - waterEveryXDays: "Every {0} days", - waterToday: "Water today", - inXDays: "In {0} days", - nextWatering: "Next watering: {0}", - days: "Days", - - delete: "Delete", - edit: "Edit", - share: "Share", - waterNow: "Water Now", - watered: "Watered", - wateredSuccess: "Plant watered!", - plantDeleted: "Plant removed.", - deleteConfirmTitle: "Delete plant?", - deleteConfirmMessage: "Do you really want to remove this plant from your collection? This cannot be undone.", - cancel: "Cancel", - confirm: "Delete", - lastWateredDate: "Last watered: {0}", - - // History - wateringHistory: "Watering History", - noHistory: "No entries yet.", - - // Reminder - reminder: "Reminder", - reminderDesc: "Notification on due date", - reminderOn: "Enabled", - reminderOff: "Disabled", - reminderPermissionNeeded: "Notification permission required.", - - // Gallery - galleryTitle: "Gallery", - addPhoto: "Add Photo", - noPhotos: "No photos yet", - - // Tour - tourFabTitle: "📷 Scan Plant", - tourFabDesc: "Tap here to photograph a plant — the AI recognizes it instantly.", - tourSearchTitle: "🔍 Plant Encyclopedia", - tourSearchDesc: "Search thousands of plants or let the AI find the perfect one.", - tourProfileTitle: "👤 Your Profile", - tourProfileDesc: "Customize design, language, and notifications to your liking.", - - // Onboarding - onboardingTitle1: "Plant Scanner", - onboardingTitle2: "Plant Care", - onboardingTitle3: "Your Garden", - onboardingDesc1: "Scan any plant and identify it instantly with AI", - onboardingDesc2: "Get personalized care tips and watering reminders", - onboardingDesc3: "Build your digital plant collection", - onboardingNext: "Next", - onboardingStart: "Get Started", - onboardingTagline: "Your plants. Your world.", - onboardingFeatureScan: "Scan & identify plants", - onboardingFeatureReminder: "Watering reminders & care", - onboardingFeatureLexicon: "Digital plant encyclopedia", - onboardingScanBtn: "Scan Plant", - onboardingRegister: "Sign Up", - onboardingLogin: "Log In", - onboardingDisclaimer: "Your data stays private and local on your device.", - }, - es: { - tabPlants: 'Plantas', - tabSearch: 'Buscar', - tabProfile: 'Perfil', - myPlants: 'Mis Plantas', - searchTitle: 'Buscar', - settingsTitle: 'Ajustes', - darkMode: 'Modo Oscuro', - language: 'Idioma', - appearance: 'Apariencia', - appearanceMode: 'Modo', - colorPalette: 'Paleta', - themeSystem: 'Sistema', - themeLight: 'Claro', - themeDark: 'Oscuro', - paletteForest: 'Forest', - paletteOcean: 'Ocean', - paletteSunset: 'Sunset', - paletteMono: 'Mono', - noPlants: 'Aún no hay plantas.', - nextStepsTitle: 'Tus próximos pasos', - stepScan: 'Escanear primera planta', - stepLexicon: 'Explorar enciclopedia', - stepTheme: 'Personalizar diseño', - allGood: 'Todo bien', - toWater: 'Regar', - searchPlaceholder: 'Buscar plantas...', - categories: 'Descubrir Categorías', - resultsInPlants: 'Resultados en "Mis Plantas"', - noResults: 'No se encontraron plantas.', - searchMyPlants: 'Mis Plantas', - searchLexicon: 'Enciclopedia', - searchAiSection: 'Busqueda profunda AI', - searchDeepAction: 'Busqueda profunda (AI)', - searchNoLocalResults: 'No hay coincidencias en tu coleccion.', - searchNoLexiconResults: 'No hay coincidencias en la enciclopedia.', - searchAiLoading: 'AI esta buscando en el catalogo...', - searchAiNoResults: 'AI no encontro plantas compatibles.', - searchAiUnavailable: 'La busqueda AI no esta disponible ahora.', - searchHistory: 'Busquedas recientes', - clearHistory: 'Borrar historial', - - catCareEasy: "Fácil Cuidado", - catSucculents: "Suculentas", - catLowLight: "Poca Luz", - catPetFriendly: "Pet Friendly", - catAirPurifier: "Purificador", - catFlowering: "Con Flores", - catBrightLight: "Luz Brillante", - catSun: "Sol", - catHighHumidity: "Alta Humedad", - catHanging: "Colgante", - catPatterned: "Con Patrón", - catTree: "Árboles", - catLarge: "Grande", - catMedicinal: "Medicinal", - - lexiconTitle: "Enciclopedia", - lexiconDesc: "Explora nuestra base de datos y encuentra la adición perfecta para tu hogar.", - lexiconSearchPlaceholder: "Buscar en enciclopedia...", - browseLexicon: "Explorar Enciclopedia", - backToSearch: "Volver a Buscar", -// Misc -comingSoon: 'Próximamente', -gallery: 'Galería', -help: 'Ayuda', -scanner: 'Escáner', -analyzing: 'Analizando planta...', -localProcessing: "Procesamiento Local", -registerToSave: "Regístrate para guardar", - - // Scan Stages - scanStage1: "Verificando calidad de imagen...", - scanStage2: "Analizando estructuras...", - scanStage3: "Comparando con base de datos...", - - // Dashboard - greetingMorning: 'Buenos dias,', - greetingAfternoon: 'Buenas tardes,', - greetingEvening: 'Buenas noches,', - creditsLabel: 'Creditos', - needsWaterToday: 'Necesitan agua hoy', - viewSchedule: 'Ver horario', - all: 'Todas', - today: 'Hoy', - week: 'Semana', - healthy: 'Saludables', - dormant: 'Dormantes', - thirsty: 'Sedienta', - healthyStatus: 'Saludable', - nextWaterLabel: 'Riego', - noneInFilter: 'No hay plantas en este filtro.', - reminderTitle: 'Recordatorios', - reminderNone: 'No hay plantas pendientes para hoy.', - reminderDue: '{0} plantas necesitan agua hoy.', - plantsThirsty: '¡{0} de tus plantas tienen sed hoy!', - collectionCount: '{0} plantas', - more: 'más', - collectionTitle: 'Coleccion', - emptyCollectionTitle: 'Tu coleccion esta vacia', - emptyCollectionHint: 'Escanea tu primera planta para empezar tu coleccion digital.', - scanFirstPlant: 'Escanear primera planta', - - result: "Resultado", - match: "Coincidencia", - careCheck: "Chequeo de Cuidados", - showDetails: "Ver Detalles", - hideDetails: "Ocultar Detalles", - dataSavedLocally: "Datos guardados localmente", - addToPlants: "Añadir a mis plantas", - aboutPlant: "Sobre la planta", - noDescription: "Sin descripción disponible.", - careTips: "Consejos de Cuidado", - addedOn: "Añadido el", - plantAddedSuccess: "Planta añadida con éxito", - - detailedCare: "Cuidado Detallado", - careTextWater: "Revisar humedad cada {0} días.", - careTextLight: "Ubicación ideal: {0}.", - careTextTemp: "Temperatura ideal: {0}.", - - water: "Riego", - light: "Luz", - temp: "Temperatura", - - waterModerate: "Moderado", - waterLittle: "Poco", - waterEveryXDays: "Cada {0} días", - waterToday: "Regar hoy", - inXDays: "En {0} días", - nextWatering: "Próximo riego: {0}", - days: "Días", - - delete: "Eliminar", - edit: "Editar", - share: "Compartir", - waterNow: "Regar ahora", - watered: "Regada", - wateredSuccess: "¡Planta regada!", - plantDeleted: "Planta eliminada.", - deleteConfirmTitle: "¿Eliminar planta?", - deleteConfirmMessage: "¿Realmente quieres eliminar esta planta de tu colección? Esto no se puede deshacer.", - cancel: "Cancelar", - confirm: "Eliminar", - lastWateredDate: "Último riego: {0}", - - // History - wateringHistory: "Historial de Riego", - noHistory: "Sin entradas aún.", - - // Reminder - reminder: "Recordatorio", - reminderDesc: "Notificación el día de riego", - reminderOn: "Activado", - reminderOff: "Desactivado", - reminderPermissionNeeded: "Permiso de notificación requerido.", - - // Gallery - galleryTitle: "Galería", - addPhoto: "Añadir Foto", - noPhotos: "Sin fotos aún", - - // Tour - tourFabTitle: "📷 Escanear Planta", - tourFabDesc: "Toca aquí para fotografiar una planta — la IA la reconoce al instante.", - tourSearchTitle: "🔍 Enciclopedia", - tourSearchDesc: "Busca en miles de plantas o deja que la IA encuentre la perfecta.", - tourProfileTitle: "👤 Tu Perfil", - tourProfileDesc: "Personaliza diseño, idioma y notificaciones a tu gusto.", - - // Onboarding - onboardingTitle1: "Escáner de Plantas", - onboardingTitle2: "Cuidado de Plantas", - onboardingTitle3: "Tu Jardín", - onboardingDesc1: "Escanea cualquier planta e identifícala al instante con IA", - onboardingDesc2: "Obtén consejos de cuidado personalizados y recordatorios de riego", - onboardingDesc3: "Construye tu colección digital de plantas", - onboardingNext: "Siguiente", - onboardingStart: "Empezar", - onboardingTagline: "Tus plantas. Tu mundo.", - onboardingFeatureScan: "Escanea e identifica plantas", - onboardingFeatureReminder: "Recordatorios de riego y cuidado", - onboardingFeatureLexicon: "Enciclopedia digital de plantas", - onboardingScanBtn: "Escanear Planta", - onboardingRegister: "Registrarse", - onboardingLogin: "Iniciar sesión", - onboardingDisclaimer: "Tus datos permanecen privados y locales en tu dispositivo.", - } -}; - -export const getTranslation = (lang: Language) => translations[lang]; + +import { Language } from '../types'; + +export const translations = { + de: { + // Tabs + tabPlants: 'Pflanzen', + tabSearch: 'Suche', + tabProfile: 'Profil', + + // Headers + myPlants: 'Meine Pflanzen', + searchTitle: 'Suche', + settingsTitle: 'Einstellungen', + + // Settings + darkMode: 'Dark Mode', + language: 'Sprache', + appearance: 'Design', + appearanceMode: 'Modus', + colorPalette: 'Farbpalette', + themeSystem: 'System', + themeLight: 'Hell', + themeDark: 'Dunkel', + paletteForest: 'Forest', + paletteOcean: 'Ocean', + paletteSunset: 'Sunset', + paletteMono: 'Mono', + + // Info + noPlants: 'Noch keine Pflanzen.', + nextStepsTitle: 'Deine nächsten Schritte', + stepScan: 'Erste Pflanze scannen', + stepLexicon: 'Pflanzenlexikon erkunden', + stepTheme: 'Design anpassen', + + // Filters + allGood: 'Alles gut', + toWater: 'Zu gießen', + + // Search + searchPlaceholder: 'Pflanzen suchen...', + categories: 'Kategorien entdecken', + resultsInPlants: 'Ergebnisse in "Meine Pflanzen"', + noResults: 'Keine Pflanzen gefunden.', + searchMyPlants: 'Meine Pflanzen', + searchLexicon: 'Lexikon', + searchAiSection: 'AI Deep Search', + searchDeepAction: 'Deep Search (AI)', + searchNoLocalResults: 'Keine Treffer in deiner Sammlung.', + searchNoLexiconResults: 'Keine Treffer im Lexikon.', + searchAiLoading: 'AI durchsucht den Katalog...', + searchAiNoResults: 'AI hat keine passenden Pflanzen gefunden.', + searchAiUnavailable: 'AI-Suche ist aktuell nicht verfügbar.', + searchHistory: 'Suchverlauf', + clearHistory: 'Verlauf löschen', + + // Categories + catCareEasy: "Pflegeleicht", + catSucculents: "Sukkulenten", + catLowLight: "Wenig Licht", + catPetFriendly: "Tierfreundlich", + catAirPurifier: "Luftreiniger", + catFlowering: "Blühend", + catBrightLight: "Helles Licht", + catSun: "Sonnig", + catHighHumidity: "Hohe Luftfeuchte", + catHanging: "Hängend", + catPatterned: "Gemustert", + catTree: "Bäume", + catLarge: "Groß", + catMedicinal: "Heilpflanzen", + + // Dictionary + lexiconTitle: "Pflanzen-Lexikon", + lexiconDesc: "Durchsuche unsere Datenbank und finde die perfekte Ergänzung für dein Zuhause.", + lexiconSearchPlaceholder: "Lexikon durchsuchen...", + browseLexicon: "Im Lexikon stöbern", + backToSearch: "Zurück zur Suche", + + // Misc + comingSoon: 'Bald verfügbar', + gallery: 'Galerie', + help: 'Hilfe', + scanner: 'Scanner', + analyzing: 'Pflanze wird analysiert...', + aiProcessing: "KI-Analyse", + registerToSave: "Registrieren zum Speichern", + + // Scan Stages + scanStage1: "Bildqualität wird geprüft...", + scanStage2: "Blattstrukturen werden analysiert...", + scanStage3: "Abgleich mit Pflanzendatenbank...", + + // Dashboard + greetingMorning: 'Guten Morgen,', + greetingAfternoon: 'Guten Tag,', + greetingEvening: 'Guten Abend,', + creditsLabel: 'Credits', + needsWaterToday: 'Heute gießen', + viewSchedule: 'Plan anzeigen', + all: 'Alle', + today: 'Heute', + week: 'Woche', + healthy: 'Gesund', + dormant: 'Ruhe', + thirsty: 'Durstig', + healthyStatus: 'Gesund', + nextWaterLabel: 'Gießen', + noneInFilter: 'Keine Pflanzen in diesem Filter.', + reminderTitle: 'Erinnerungen', + reminderNone: 'Heute ist keine Pflanze fällig.', + reminderDue: '{0} Pflanzen brauchen heute Wasser.', + plantsThirsty: '{0} deiner Pflanzen brauchen heute Wasser!', + collectionCount: '{0} Pflanzen', + more: 'weitere', + collectionTitle: 'Sammlung', + emptyCollectionTitle: 'Deine Sammlung ist noch leer', + emptyCollectionHint: 'Scanne deine erste Pflanze und starte deine digitale Sammlung.', + scanFirstPlant: 'Erste Pflanze scannen', + + // Plant Card / Detail / Result + result: "Ergebnis", + match: "Übereinstimmung", + careCheck: "Pflege-Check", + showDetails: "Details anzeigen", + hideDetails: "Details verbergen", + dataSavedLocally: "Daten werden lokal gespeichert", + addToPlants: "Zu meinen Pflanzen hinzufügen", + aboutPlant: "Über die Pflanze", + noDescription: "Keine Beschreibung verfügbar.", + careTips: "Pflegehinweise", + addedOn: "Hinzugefügt am", + plantAddedSuccess: "Pflanze erfolgreich hinzugefügt", + + // Detailed Care + detailedCare: "Detaillierte Pflege", + careTextWater: "Bodenfeuchtigkeit alle {0} Tage prüfen.", + careTextLight: "Ideal für Standorte: {0}.", + careTextTemp: "Wohlfühltemperatur: {0}.", + + // Care Attributes + water: "Gießen", + light: "Licht", + temp: "Temperatur", + + // Care Values (UI Helper) + waterModerate: "Mäßig", + waterLittle: "Wenig", + waterEveryXDays: "Alle {0} Tage", + waterToday: "Heute gießen", + inXDays: "In {0} Tagen", + nextWatering: "Nächstes Gießen: {0}", + days: "Tage", + + // Actions + delete: "Löschen", + edit: "Bearbeiten", + share: "Teilen", + waterNow: "Jetzt gießen", + watered: "Gegossen", + wateredSuccess: "Pflanze wurde gegossen!", + plantDeleted: "Pflanze entfernt.", + deleteConfirmTitle: "Pflanze löschen?", + deleteConfirmMessage: "Möchtest du diese Pflanze wirklich aus deiner Sammlung entfernen? Dies kann nicht rückgängig gemacht werden.", + cancel: "Abbrechen", + confirm: "Löschen", + lastWateredDate: "Zuletzt gegossen: {0}", + + // History + wateringHistory: "Gießhistorie", + noHistory: "Noch keine Einträge.", + + // Reminder + reminder: "Erinnerung", + reminderDesc: "Benachrichtigung am Stichtag", + reminderOn: "Aktiviert", + reminderOff: "Deaktiviert", + reminderPermissionNeeded: "Berechtigung für Benachrichtigungen erforderlich.", + + // Gallery + galleryTitle: "Galerie", + addPhoto: "Foto hinzufügen", + noPhotos: "Noch keine Fotos", + + // Tour + tourFabTitle: "📷 Pflanze scannen", + tourFabDesc: "Tippe hier um eine Pflanze zu fotografieren — die KI erkennt sie sofort.", + tourSearchTitle: "🔍 Pflanzenlexikon", + tourSearchDesc: "Durchsuche tausende Pflanzen oder lass die KI nach der perfekten suchen.", + tourProfileTitle: "👤 Dein Profil", + tourProfileDesc: "Passe Design, Sprache und Benachrichtigungen ganz nach deinem Geschmack an.", + coachSkip: "Ueberspringen", + coachNext: "Weiter", + coachDone: "Fertig", + + // Onboarding + onboardingTitle1: "Pflanzen-Scanner", + onboardingTitle2: "Pflanzenpflege", + onboardingTitle3: "Dein Garten", + onboardingDesc1: "Scanne jede Pflanze und identifiziere sie sofort mit KI", + onboardingDesc2: "Erhalte personalisierte Pflegetipps und Gießerinnerungen", + onboardingDesc3: "Baue deine digitale Pflanzensammlung auf", + onboardingNext: "Weiter", + onboardingStart: "Los geht's", + onboardingTagline: "Deine Pflanzen. Deine Welt.", + onboardingFeatureScan: "Pflanzen scannen & erkennen", + onboardingFeatureReminder: "Gießerinnerungen & Pflege", + onboardingFeatureLexicon: "Digitales Pflanzen-Lexikon", + onboardingScanBtn: "Pflanze scannen", + onboardingRegister: "Registrieren", + onboardingLogin: "Anmelden", + onboardingDisclaimer: "Deine Daten bleiben privat und lokal auf deinem Gerät.", + + // Auth + createAccount: "Konto erstellen", + welcomeBack: "Willkommen zurück", + namePlaceholder: "Dein Name", + emailPlaceholder: "deine@email.de", + passwordLabel: "Passwort", + passwordPlaceholder: "Mindestens 6 Zeichen", + confirmPasswordLabel: "Passwort bestätigen", + confirmPasswordPlaceholder: "Passwort wiederholen", + alreadyHaveAccount: "Bereits ein Konto?", + noAccountYet: "Noch kein Konto?", + orDivider: "oder", + strengthTooShort: "Zu kurz", + strengthWeak: "Schwach", + strengthMedium: "Mittel", + strengthStrong: "Stark", + pendingPlantHint: "Deine gescannte Pflanze ({0}) wird nach der Registrierung automatisch in deinem Profil gespeichert.", + errFillAllFields: "Bitte alle Felder ausfüllen.", + errNameRequired: "Bitte gib deinen Namen ein.", + errEmailInvalid: "Bitte gib eine gültige E-Mail ein.", + errPasswordShort: "Das Passwort muss mindestens 6 Zeichen haben.", + errPasswordMismatch: "Die Passwörter stimmen nicht überein.", + errEmailTaken: "Diese E-Mail ist bereits registriert.", + errNetworkError: "Server nicht erreichbar. Bitte versuche es erneut.", + errServerError: "Server-Fehler. Bitte versuche es später erneut.", + errAuthError: "Registrierung fehlgeschlagen. Bitte versuche es erneut.", + errUserNotFound: "Kein Konto mit dieser E-Mail gefunden.", + errWrongPassword: "Falsches Passwort.", + errLoginFailed: "Anmeldung fehlgeschlagen. Bitte versuche es erneut.", + }, + en: { + tabPlants: 'Plants', + tabSearch: 'Search', + tabProfile: 'Profile', + myPlants: 'My Plants', + searchTitle: 'Search', + settingsTitle: 'Settings', + darkMode: 'Dark Mode', + language: 'Language', + appearance: 'Appearance', + appearanceMode: 'Mode', + colorPalette: 'Color Palette', + themeSystem: 'System', + themeLight: 'Light', + themeDark: 'Dark', + paletteForest: 'Forest', + paletteOcean: 'Ocean', + paletteSunset: 'Sunset', + paletteMono: 'Mono', + noPlants: 'No plants yet.', + nextStepsTitle: 'Your next steps', + stepScan: 'Scan first plant', + stepLexicon: 'Explore plant lexicon', + stepTheme: 'Customize design', + allGood: 'All good', + toWater: 'To water', + searchPlaceholder: 'Search plants...', + categories: 'Discover Categories', + resultsInPlants: 'Results in "My Plants"', + noResults: 'No plants found.', + searchMyPlants: 'My Plants', + searchLexicon: 'Lexicon', + searchAiSection: 'AI Deep Search', + searchDeepAction: 'Deep Search (AI)', + searchNoLocalResults: 'No matches in your collection.', + searchNoLexiconResults: 'No matches in the lexicon.', + searchAiLoading: 'AI is searching the catalog...', + searchAiNoResults: 'AI found no matching plants.', + searchAiUnavailable: 'AI search is currently unavailable.', + searchHistory: 'Search history', + clearHistory: 'Clear history', + + catCareEasy: "Easy Care", + catSucculents: "Succulents", + catLowLight: "Low Light", + catPetFriendly: "Pet Friendly", + catAirPurifier: "Air Purifier", + catFlowering: "Flowering", + catBrightLight: "Bright Light", + catSun: "Sunny", + catHighHumidity: "High Humidity", + catHanging: "Hanging", + catPatterned: "Patterned", + catTree: "Trees", + catLarge: "Large", + catMedicinal: "Medicinal", + + lexiconTitle: "Plant Encyclopedia", + lexiconDesc: "Browse our database and find the perfect addition for your home.", + lexiconSearchPlaceholder: "Search encyclopedia...", + browseLexicon: "Browse Encyclopedia", + backToSearch: "Back to Search", +// Misc +comingSoon: 'Coming Soon', +gallery: 'Gallery', +help: 'Help', +scanner: 'Scanner', +analyzing: 'Analyzing plant...', +aiProcessing: "AI Analysis", +registerToSave: "Sign up to save", + + // Scan Stages + scanStage1: "Checking image quality...", + scanStage2: "Analyzing leaf structures...", + scanStage3: "Matching with plant database...", + + // Dashboard + greetingMorning: 'Good morning,', + greetingAfternoon: 'Good afternoon,', + greetingEvening: 'Good evening,', + creditsLabel: 'Credits', + needsWaterToday: 'Needs water today', + viewSchedule: 'View Schedule', + all: 'All', + today: 'Today', + week: 'Week', + healthy: 'Healthy', + dormant: 'Dormant', + thirsty: 'Thirsty', + healthyStatus: 'Healthy', + nextWaterLabel: 'Water', + noneInFilter: 'No plants in this filter.', + reminderTitle: 'Reminders', + reminderNone: 'No plants are due today.', + reminderDue: '{0} plants need water today.', + plantsThirsty: '{0} of your plants are feeling thirsty!', + collectionCount: '{0} plants', + more: 'more', + collectionTitle: 'Collection', + emptyCollectionTitle: 'Your collection is still empty', + emptyCollectionHint: 'Scan your first plant to start building your digital garden.', + scanFirstPlant: 'Scan first plant', + + result: "Result", + match: "Match", + careCheck: "Care Check", + showDetails: "Show Details", + hideDetails: "Hide Details", + dataSavedLocally: "Data is saved locally", + addToPlants: "Add to my plants", + aboutPlant: "About the plant", + noDescription: "No description available.", + careTips: "Care Tips", + addedOn: "Added on", + plantAddedSuccess: "Plant successfully added", + + detailedCare: "Detailed Care", + careTextWater: "Check soil moisture every {0} days.", + careTextLight: "Ideal location: {0}.", + careTextTemp: "Ideal temperature: {0}.", + + water: "Water", + light: "Light", + temp: "Temperature", + + waterModerate: "Moderate", + waterLittle: "Little", + waterEveryXDays: "Every {0} days", + waterToday: "Water today", + inXDays: "In {0} days", + nextWatering: "Next watering: {0}", + days: "Days", + + delete: "Delete", + edit: "Edit", + share: "Share", + waterNow: "Water Now", + watered: "Watered", + wateredSuccess: "Plant watered!", + plantDeleted: "Plant removed.", + deleteConfirmTitle: "Delete plant?", + deleteConfirmMessage: "Do you really want to remove this plant from your collection? This cannot be undone.", + cancel: "Cancel", + confirm: "Delete", + lastWateredDate: "Last watered: {0}", + + // History + wateringHistory: "Watering History", + noHistory: "No entries yet.", + + // Reminder + reminder: "Reminder", + reminderDesc: "Notification on due date", + reminderOn: "Enabled", + reminderOff: "Disabled", + reminderPermissionNeeded: "Notification permission required.", + + // Gallery + galleryTitle: "Gallery", + addPhoto: "Add Photo", + noPhotos: "No photos yet", + + // Tour + tourFabTitle: "📷 Scan Plant", + tourFabDesc: "Tap here to photograph a plant — the AI recognizes it instantly.", + tourSearchTitle: "🔍 Plant Encyclopedia", + tourSearchDesc: "Search thousands of plants or let the AI find the perfect one.", + tourProfileTitle: "👤 Your Profile", + tourProfileDesc: "Customize design, language, and notifications to your liking.", + coachSkip: "Skip", + coachNext: "Next", + coachDone: "Done", + + // Onboarding + onboardingTitle1: "Plant Scanner", + onboardingTitle2: "Plant Care", + onboardingTitle3: "Your Garden", + onboardingDesc1: "Scan any plant and identify it instantly with AI", + onboardingDesc2: "Get personalized care tips and watering reminders", + onboardingDesc3: "Build your digital plant collection", + onboardingNext: "Next", + onboardingStart: "Get Started", + onboardingTagline: "Your plants. Your world.", + onboardingFeatureScan: "Scan & identify plants", + onboardingFeatureReminder: "Watering reminders & care", + onboardingFeatureLexicon: "Digital plant encyclopedia", + onboardingScanBtn: "Scan Plant", + onboardingRegister: "Sign Up", + onboardingLogin: "Log In", + onboardingDisclaimer: "Your data stays private and local on your device.", + + // Auth + createAccount: "Create Account", + welcomeBack: "Welcome back", + namePlaceholder: "Your name", + emailPlaceholder: "your@email.com", + passwordLabel: "Password", + passwordPlaceholder: "At least 6 characters", + confirmPasswordLabel: "Confirm Password", + confirmPasswordPlaceholder: "Repeat password", + alreadyHaveAccount: "Already have an account?", + noAccountYet: "No account yet?", + orDivider: "or", + strengthTooShort: "Too short", + strengthWeak: "Weak", + strengthMedium: "Medium", + strengthStrong: "Strong", + pendingPlantHint: "Your scanned plant ({0}) will be saved to your profile after registration.", + errFillAllFields: "Please fill in all fields.", + errNameRequired: "Please enter your name.", + errEmailInvalid: "Please enter a valid email address.", + errPasswordShort: "Password must be at least 6 characters.", + errPasswordMismatch: "Passwords do not match.", + errEmailTaken: "This email is already registered.", + errNetworkError: "Server unreachable. Please try again.", + errServerError: "Server error. Please try again later.", + errAuthError: "Registration failed. Please try again.", + errUserNotFound: "No account found with this email.", + errWrongPassword: "Wrong password.", + errLoginFailed: "Login failed. Please try again.", + }, + es: { + tabPlants: 'Plantas', + tabSearch: 'Buscar', + tabProfile: 'Perfil', + myPlants: 'Mis Plantas', + searchTitle: 'Buscar', + settingsTitle: 'Ajustes', + darkMode: 'Modo Oscuro', + language: 'Idioma', + appearance: 'Apariencia', + appearanceMode: 'Modo', + colorPalette: 'Paleta', + themeSystem: 'Sistema', + themeLight: 'Claro', + themeDark: 'Oscuro', + paletteForest: 'Forest', + paletteOcean: 'Ocean', + paletteSunset: 'Sunset', + paletteMono: 'Mono', + noPlants: 'Aún no hay plantas.', + nextStepsTitle: 'Tus próximos pasos', + stepScan: 'Escanear primera planta', + stepLexicon: 'Explorar enciclopedia', + stepTheme: 'Personalizar diseño', + allGood: 'Todo bien', + toWater: 'Regar', + searchPlaceholder: 'Buscar plantas...', + categories: 'Descubrir Categorías', + resultsInPlants: 'Resultados en "Mis Plantas"', + noResults: 'No se encontraron plantas.', + searchMyPlants: 'Mis Plantas', + searchLexicon: 'Enciclopedia', + searchAiSection: 'Busqueda profunda AI', + searchDeepAction: 'Busqueda profunda (AI)', + searchNoLocalResults: 'No hay coincidencias en tu coleccion.', + searchNoLexiconResults: 'No hay coincidencias en la enciclopedia.', + searchAiLoading: 'AI esta buscando en el catalogo...', + searchAiNoResults: 'AI no encontro plantas compatibles.', + searchAiUnavailable: 'La busqueda AI no esta disponible ahora.', + searchHistory: 'Busquedas recientes', + clearHistory: 'Borrar historial', + + catCareEasy: "Fácil Cuidado", + catSucculents: "Suculentas", + catLowLight: "Poca Luz", + catPetFriendly: "Pet Friendly", + catAirPurifier: "Purificador", + catFlowering: "Con Flores", + catBrightLight: "Luz Brillante", + catSun: "Sol", + catHighHumidity: "Alta Humedad", + catHanging: "Colgante", + catPatterned: "Con Patrón", + catTree: "Árboles", + catLarge: "Grande", + catMedicinal: "Medicinal", + + lexiconTitle: "Enciclopedia", + lexiconDesc: "Explora nuestra base de datos y encuentra la adición perfecta para tu hogar.", + lexiconSearchPlaceholder: "Buscar en enciclopedia...", + browseLexicon: "Explorar Enciclopedia", + backToSearch: "Volver a Buscar", +// Misc +comingSoon: 'Próximamente', +gallery: 'Galería', +help: 'Ayuda', +scanner: 'Escáner', +analyzing: 'Analizando planta...', +aiProcessing: "Análisis IA", +registerToSave: "Regístrate para guardar", + + // Scan Stages + scanStage1: "Verificando calidad de imagen...", + scanStage2: "Analizando estructuras...", + scanStage3: "Comparando con base de datos...", + + // Dashboard + greetingMorning: 'Buenos dias,', + greetingAfternoon: 'Buenas tardes,', + greetingEvening: 'Buenas noches,', + creditsLabel: 'Creditos', + needsWaterToday: 'Necesitan agua hoy', + viewSchedule: 'Ver horario', + all: 'Todas', + today: 'Hoy', + week: 'Semana', + healthy: 'Saludables', + dormant: 'Dormantes', + thirsty: 'Sedienta', + healthyStatus: 'Saludable', + nextWaterLabel: 'Riego', + noneInFilter: 'No hay plantas en este filtro.', + reminderTitle: 'Recordatorios', + reminderNone: 'No hay plantas pendientes para hoy.', + reminderDue: '{0} plantas necesitan agua hoy.', + plantsThirsty: '¡{0} de tus plantas tienen sed hoy!', + collectionCount: '{0} plantas', + more: 'más', + collectionTitle: 'Coleccion', + emptyCollectionTitle: 'Tu coleccion esta vacia', + emptyCollectionHint: 'Escanea tu primera planta para empezar tu coleccion digital.', + scanFirstPlant: 'Escanear primera planta', + + result: "Resultado", + match: "Coincidencia", + careCheck: "Chequeo de Cuidados", + showDetails: "Ver Detalles", + hideDetails: "Ocultar Detalles", + dataSavedLocally: "Datos guardados localmente", + addToPlants: "Añadir a mis plantas", + aboutPlant: "Sobre la planta", + noDescription: "Sin descripción disponible.", + careTips: "Consejos de Cuidado", + addedOn: "Añadido el", + plantAddedSuccess: "Planta añadida con éxito", + + detailedCare: "Cuidado Detallado", + careTextWater: "Revisar humedad cada {0} días.", + careTextLight: "Ubicación ideal: {0}.", + careTextTemp: "Temperatura ideal: {0}.", + + water: "Riego", + light: "Luz", + temp: "Temperatura", + + waterModerate: "Moderado", + waterLittle: "Poco", + waterEveryXDays: "Cada {0} días", + waterToday: "Regar hoy", + inXDays: "En {0} días", + nextWatering: "Próximo riego: {0}", + days: "Días", + + delete: "Eliminar", + edit: "Editar", + share: "Compartir", + waterNow: "Regar ahora", + watered: "Regada", + wateredSuccess: "¡Planta regada!", + plantDeleted: "Planta eliminada.", + deleteConfirmTitle: "¿Eliminar planta?", + deleteConfirmMessage: "¿Realmente quieres eliminar esta planta de tu colección? Esto no se puede deshacer.", + cancel: "Cancelar", + confirm: "Eliminar", + lastWateredDate: "Último riego: {0}", + + // History + wateringHistory: "Historial de Riego", + noHistory: "Sin entradas aún.", + + // Reminder + reminder: "Recordatorio", + reminderDesc: "Notificación el día de riego", + reminderOn: "Activado", + reminderOff: "Desactivado", + reminderPermissionNeeded: "Permiso de notificación requerido.", + + // Gallery + galleryTitle: "Galería", + addPhoto: "Añadir Foto", + noPhotos: "Sin fotos aún", + + // Tour + tourFabTitle: "📷 Escanear Planta", + tourFabDesc: "Toca aquí para fotografiar una planta — la IA la reconoce al instante.", + tourSearchTitle: "🔍 Enciclopedia", + tourSearchDesc: "Busca en miles de plantas o deja que la IA encuentre la perfecta.", + tourProfileTitle: "👤 Tu Perfil", + tourProfileDesc: "Personaliza diseño, idioma y notificaciones a tu gusto.", + coachSkip: "Saltar", + coachNext: "Siguiente", + coachDone: "Listo", + + // Onboarding + onboardingTitle1: "Escáner de Plantas", + onboardingTitle2: "Cuidado de Plantas", + onboardingTitle3: "Tu Jardín", + onboardingDesc1: "Escanea cualquier planta e identifícala al instante con IA", + onboardingDesc2: "Obtén consejos de cuidado personalizados y recordatorios de riego", + onboardingDesc3: "Construye tu colección digital de plantas", + onboardingNext: "Siguiente", + onboardingStart: "Empezar", + onboardingTagline: "Tus plantas. Tu mundo.", + onboardingFeatureScan: "Escanea e identifica plantas", + onboardingFeatureReminder: "Recordatorios de riego y cuidado", + onboardingFeatureLexicon: "Enciclopedia digital de plantas", + onboardingScanBtn: "Escanear Planta", + onboardingRegister: "Registrarse", + onboardingLogin: "Iniciar sesión", + onboardingDisclaimer: "Tus datos permanecen privados y locales en tu dispositivo.", + + // Auth + createAccount: "Crear cuenta", + welcomeBack: "Bienvenido de vuelta", + namePlaceholder: "Tu nombre", + emailPlaceholder: "tu@email.com", + passwordLabel: "Contraseña", + passwordPlaceholder: "Mínimo 6 caracteres", + confirmPasswordLabel: "Confirmar contraseña", + confirmPasswordPlaceholder: "Repetir contraseña", + alreadyHaveAccount: "¿Ya tienes una cuenta?", + noAccountYet: "¿Sin cuenta todavía?", + orDivider: "o", + strengthTooShort: "Muy corta", + strengthWeak: "Débil", + strengthMedium: "Media", + strengthStrong: "Fuerte", + pendingPlantHint: "Tu planta escaneada ({0}) se guardará en tu perfil tras el registro.", + errFillAllFields: "Por favor completa todos los campos.", + errNameRequired: "Por favor ingresa tu nombre.", + errEmailInvalid: "Por favor ingresa un email válido.", + errPasswordShort: "La contraseña debe tener al menos 6 caracteres.", + errPasswordMismatch: "Las contraseñas no coinciden.", + errEmailTaken: "Este email ya está registrado.", + errNetworkError: "Servidor no disponible. Por favor intenta de nuevo.", + errServerError: "Error del servidor. Por favor intenta más tarde.", + errAuthError: "Registro fallido. Por favor intenta de nuevo.", + errUserNotFound: "No se encontró cuenta con este email.", + errWrongPassword: "Contraseña incorrecta.", + errLoginFailed: "Inicio de sesión fallido. Por favor intenta de nuevo.", + } +}; + +export const getTranslation = (lang: Language) => translations[lang];